diff --git a/Doc/library/internet.rst b/Doc/library/internet.rst
index 288ea7b..6fa7873 100644
--- a/Doc/library/internet.rst
+++ b/Doc/library/internet.rst
@@ -36,7 +36,6 @@
    smtpd.rst
    telnetlib.rst
    uuid.rst
-   ipaddr.rst
    socketserver.rst
    http.server.rst
    http.cookies.rst
diff --git a/Doc/library/ipaddr.rst b/Doc/library/ipaddr.rst
deleted file mode 100644
index 2ac5c7c..0000000
--- a/Doc/library/ipaddr.rst
+++ /dev/null
@@ -1,428 +0,0 @@
-:mod:`ipaddr` --- IP address manipulation library
-=================================================
-
-.. module:: ipaddr
-   :synopsis: IPv4 and IPv6 network address manipulation classes.
-.. moduleauthor:: Google, Inc.
-.. sectionauthor:: Gregory P. Smith <greg@krypto.org>
-
-
-.. versionadded:: 3.1
-
-.. index::
-   single: IP address, IPv4, IPv6, netmask
-
-This module implements classes for working with IP host and network addresses,
-both IPv4 and IPv6.
-
-
-.. _ipaddr_examples:
-
-Examples
---------
-
-Netmask.
-
-   >>> ipaddr.IP('1.1.1.1/255.255.255.0')
-   IPv4('1.1.1.1/24')
-   >>> ipaddr.IP('1080::200C:417B/96')
-   IPv6('1080::200c:417b/96')
-
-Hostmask.
-
-   >>> ipaddr.IPv4('1.1.1.1/0.0.0.255')
-   IPv4('1.1.1.1/24')
-
-Prefix length.
-
-   >>> addr = ipaddr.IPv4('1.1.1.1/24')
-   >>> addr.prefixlen
-   24
-
-Individual addresses.
-
-   >>> ipaddr.IP('1.1.1.1')
-   IPv4('1.1.1.1/32')
-
-Many standard Python operations are also supported.
-
-Comparison.
-
-   >>> ipaddr.IPv4('1.1.1.1') == ipaddr.IPv4('1.1.1.2')
-   False
-   >>> ipaddr.IPv4('1.1.1.1') < ipaddr.IPv4('1.1.1.2')
-   True
-
-Inclusion.
-
-   >>> ipaddr.IPv4('1.1.1.1') in ipaddr.IPv4("1.0.0.0/8")
-   True
-
-Sorting.
-
-   >>> a = ipaddr.IPv4('1.1.1.10')
-   >>> b = ipaddr.IPv4('1.10.1.10')
-   >>> c = ipaddr.IPv4('1.1.10.10')
-   >>> d = ipaddr.IPv4('1.1.1.1')
-   >>> sorted([a, b, c, d])
-   [IPv4('1.1.1.1/32'), IPv4('1.1.1.10/32'), IPv4('1.1.10.10/32'), IPv4('1.10.1.10/32')]
-
-Conversion to string and integer forms.
-
-   >>> spam = ipaddr.IPv4('192.168.1.254'))
-   >>> str(spam)
-   '192.168.1.254/32'
-   >>> spam.ip_ext
-   '192.168.1.254'
-   >>> int(spam)
-   3232236030
-   >>> eggs = ipaddr.IPv6('ffff::1/120')
-   >>> int(eggs)
-   340277174624079928635746076935438991361
-
-Additionally, there are quite a few network-specific features available to
-ipaddr.
-
-   >>> ipaddr.IPv4('10.0.0.0/8').supernet()
-   IPv4('10.0.0.0/7')
-   >>> ipaddr.IPv4('10.0.0.0/8').subnet()
-   [IPv4('10.0.0.0/9'), IPv4('10.128.0.0/9')]
-   # This returns networks with a prefix length of /10
-   >>> ipaddr.IPv4('10.0.0.0/8').subnet(prefixlen_diff=2)
-   [IPv4('10.0.0.0/10'), IPv4('10.64.0.0/10'), IPv4('10.128.0.0/10'), IPv4('10.192.0.0/10')]
-   # Remove an address from a superblock.
-   >>> ipaddr.IP('10.0.0.0/24').address_exclude(ipaddr.IP('10.0.0.0/28'))
-   [IPv4('10.0.0.16/28'), IPv4('10.0.0.32/27'), IPv4('10.0.0.64/26'), IPv4('10.0.0.128/25')]
-
-
-.. _ipaddr_funcs_and_classes:
-
-Functions And Classes
----------------------
-
-.. function:: IP(ipaddr)
-
-   Take an IP string or int and return an object of the correct type.  Returns
-   an :class:`IPv4` or :class:`IPv6` object.
-
-   The *ipaddr* parameter must be a string, bytes or integer representing the
-   IP address in ascii, network byte order or as a number respectively.  Either
-   IPv4 or IPv6 addresses may be supplied.  Integers less than 2**32 will be
-   considered to be IPv4.
-
-   Raises :exc:`ValueError` if the *ipaddr* passed is not either an IPv4 or an
-   IPv6 address.
-
-
-.. function:: collapse_address_list(addresses)
-
-   Collapse a sequence of :class:`IPv4` or :class:`IPv6` objects into the most
-   concise representation.  Returns a list of :class:`IPv4` or :class:`IPv6`
-   objects.
-
-   Example usage::
-
-      >>> collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')])
-      [IPv4('1.1.0.0/23')]
-
-
-.. class:: BaseIP()
-
-   A generic IP address object.  This base class defines the API and contains
-   common code.  Most authors should either use the :func:`IP` function or
-   create :class:`IPv4` or :class:`IPv6` objects directly rather than using this
-   base class.
-
-   IP address objects support the following python operators:
-   ``=``, ``!=``, ``<``, ``>``, ``<=``, ``>=``, and ``in``.
-
-   An IP address object may be used as a sequence index or as a hash key and can
-   be converted back to an integer representation using :func:`int`.  It may
-   also be used as a sequence that yields the string representation of every IP
-   address within the object's subnet.
-
-   The following properties are available on all IP address objects:
-
-   .. attribute:: broadcast
-
-      Integer representation of the broadcast address.  Read only.
-
-   .. attribute:: broadcast_ext
-
-      Dotted decimal or colon string version of the broadcast address.  Read
-      only.
-
-   .. attribute:: hostmask
-
-      Integer representation of the hostmask.  Read only.
-
-   .. attribute:: hostmask_ext
-
-      Dotted decimal or colon string version of the hostmask.  Read only.
-
-   .. attribute:: ip
-
-      Integer representation of the IP address.  Read only.
-
-   .. attribute:: ip_ext
-
-      Dotted decimal or colon string version of the IP address.  Read only.
-
-   .. attribute:: ip_ext_full
-
-      Canonical string version of the IP address.  Read only.
-
-   .. attribute:: is_loopback
-
-      True if the address is a loopback address as defined in IPv4 :rfc:`3330`
-      or IPv6 :rfc:`2373` section 2.5.3.
-
-   .. attribute:: is_link_local
-
-      True if the address is a link-local address as defined in IPv4 :rfc:`3927`
-      or IPv6 :rfc:`4291`.
-
-   .. attribute:: is_multicast
-
-      True if the address is reserved for multicast use.  See IPv4 :rfc:`3171`
-      or IPv6 :rfc:`2373` section 2.7 for details.
-
-   .. attribute:: is_private
-
-      True if the address is reserved for private networks as defined in IPv4
-      :rfc:`1918` or IPv6 :rfc:`4193`.
-
-   .. attribute:: netmask
-
-      Integer representation of the netmask.  Read only.
-
-   .. attribute:: netmask_ext
-
-      Dotted decimal or colon string version of the netmask.  Read only.
-
-   .. attribute:: network
-
-      Integer representation of the network.  Read only.
-
-   .. attribute:: network_ext
-
-      Dotted decimal or colon string version of the network.  Read only.
-
-   .. attribute:: numhosts
-
-      Number of hosts in the current subnet.  Read only.
-
-   .. attribute:: packed
-
-      The packed network byte order representation of this network address.
-      Read only.
-
-   .. attribute:: prefixlen
-
-      A property to get and set the prefix length.  Readable and writeable.
-
-   .. attribute:: version
-
-      Integer IP version number.  Read only.
-
-
-   The following methods are available on all IP address objects:
-
-   .. method:: address_exclude(other)
-
-      Remove an address from within a larger block.  Returns a sorted list of IP
-      address objects representing networks.
-
-      Examples::
-
-         >>> addr1 = IP('10.1.1.0/24')
-         >>> addr2 = IP('10.1.1.0/26')
-         >>> addr1.address_exclude(addr2)
-         [IP('10.1.1.64/26'), IP('10.1.1.128/25')]
-
-         >>> addr1 = IP('::1/32')
-         >>> addr2 = IP('::1/128')
-         >>> addr1.address_exclude(addr2)
-         [IP('::0/128'), IP('::2/127'), IP('::4/126'), IP('::8/125'), IP('0:0:8000::/33')]
-
-      Raises :exc:`ValueError` if *other* is not completely contained by *self*.
-
-
-   .. method:: compare_networks(other)
-
-      Compare this IP object's network to another IP network.
-      Returns -1, 0 or 1.
-
-      This compares the integer representation of the network addresses.  The
-      host bits are not considered by this method.  If you want to compare host
-      bits, you can use ``host_a.ip < host_b.ip``.
-
-      If the IP versions of self and other are the same, returns:
-
-      -1 if self < other
-        eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
-
-        IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
-
-      0 if self == other
-        eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
-
-        IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
-
-      1 if self > other
-        eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
-
-        IPv6('1080::1:200C:417A/112') > IPv6('1080::0:200C:417A/112')
-
-      If the IP versions of self and other are different, returns:
-
-      -1 if self.version < other.version
-        eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
-
-      1 if self.version > other.version
-        eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
-
-      .. note::
-
-         To sort networks with :func:`sorted`, :func:`min`, :func:`max` and
-         other tools with a *key* argument, use the :func:`operator.attrgetter`
-         function to extract the relevant fields::
-
-            >>> from operator import attrgetter
-            >>> s = [IPv6('::1/128'), IPv4('255.255.255.0/24')]
-            >>> sorted(s, key=attrgetter('version', 'network', 'netmask'))
-            [IPv4('255.255.255.0/24'), IPv6('::1/128')]
-
-   .. method:: subnet(prefixlen_diff=1)
-
-      Returns a list of subnets which when joined make up the current subnet.
-
-      The optional *prefixlen_diff* argument specifies how many bits the prefix
-      length should be increased by.  Given a /24 network and
-      ``prefixlen_diff=3``, for example, 8 subnets of size /27 will be returned.
-
-      If called on a host IP address rather than a network, a list containing
-      the host itself will be returned.
-
-      Raises :exc:`PrefixlenDiffInvalidError` if the *prefixlen_diff* is out of
-      range.
-
-
-   .. method:: supernet(prefixlen_diff=1)
-
-      Returns a single IP object representing the supernet containing the
-      current network.
-
-      The optional *prefixlen_diff* argument specifies how many bits the prefix
-      length should be decreased by.  Given a /24 network and
-      ``prefixlen_diff=3``, for example, a supernet with a 21 bit netmask is
-      returned.
-
-      Raises :exc:`PrefixlenDiffInvalidError` if the prefixlen_diff is out of
-      range.
-
-
-.. class:: IPv4()
-
-   This class represents and manipulates 32-bit IPv4 addresses.
-
-   Attributes::
-
-      # These examples for IPv4('1.2.3.4/27')
-      .ip: 16909060
-      .ip_ext: '1.2.3.4'
-      .ip_ext_full: '1.2.3.4'
-      .network: 16909056
-      .network_ext: '1.2.3.0'
-      .hostmask: 31 (0x1F)
-      .hostmask_ext: '0.0.0.31'
-      .broadcast: 16909087 (0x102031F)
-      .broadcast_ext: '1.2.3.31'
-      .netmask: 4294967040 (0xFFFFFFE0)
-      .netmask_ext: '255.255.255.224'
-      .prefixlen: 27
-
-
-.. class:: IPv6()
-
-   This class respresents and manipulates 128-bit IPv6 addresses.
-
-   Attributes::
-
-      # These examples are for IPv6('2001:658:22A:CAFE:200::1/64')
-      .ip: 42540616829182469433547762482097946625
-      .ip_ext: '2001:658:22a:cafe:200::1'
-      .ip_ext_full: '2001:0658:022a:cafe:0200:0000:0000:0001'
-      .network: 42540616829182469433403647294022090752
-      .network_ext: '2001:658:22a:cafe::'
-      .hostmask: 18446744073709551615
-      .hostmask_ext: '::ffff:ffff:ffff:ffff'
-      .broadcast: 42540616829182469451850391367731642367
-      .broadcast_ext: '2001:658:22a:cafe:ffff:ffff:ffff:ffff'
-      .netmask: 340282366920938463444927863358058659840
-      .netmask_ext: 64
-      .prefixlen: 64
-
-   .. attribute:: is_site_local
-
-      True if the address was reserved as site-local in :rfc:`3513` section
-      2.5.6.
-
-      .. note::
-
-         The IPv6 site-local address space has been deprecated by :rfc:`3879`.
-         Use :data:`is_private` to test if this address is in the space of
-         unique local addresses as defined by :rfc:`4193`.
-
-   .. attribute:: is_unspecified
-
-      True if this is the unspecified address as defined in :rfc:`2373` section
-      2.5.2.
-
-
-.. _ipaddr_exceptions:
-
-Exceptions
-----------
-
-The following exceptions are defined by this module:
-
-.. exception:: Error
-
-   Base class for all exceptions defined in this module.
-
-.. exception:: IPTypeError
-
-   Tried to perform a v4 action on v6 object or vice versa.
-
-.. exception:: IPAddressExclusionError
-
-   An Error we should never see occurred in address exclusion.
-
-.. exception:: IPv4IpValidationError
-
-   Raised when an IPv4 address is invalid.
-
-.. exception:: IPv4NetmaskValidationError
-
-   Raised when a netmask is invalid.
-
-.. exception:: IPv6IpValidationError
-
-   Raised when an IPv6 address is invalid.
-
-.. exception:: IPv6NetmaskValidationError
-
-   Raised when an IPv6 netmask is invalid.
-
-.. exception:: PrefixlenDiffInvalidError
-
-   Raised when :meth:`BaseIP.subnet` or :meth:`BaseIP.supernet` is called with a
-   bad ``prefixlen_diff``.
-
-
-.. seealso::
-
-   http://code.google.com/p/ipaddr-py/
-      The original source of this module and a place to download it as a package
-      for use on earlier versions of Python.
diff --git a/Lib/ipaddr.py b/Lib/ipaddr.py
deleted file mode 100644
index 940741c..0000000
--- a/Lib/ipaddr.py
+++ /dev/null
@@ -1,1388 +0,0 @@
-# Copyright 2007 Google Inc.
-#  Licensed to PSF under a Contributor Agreement.
-#
-# See also: http://code.google.com/p/ipaddr-py/
-
-"""An IPv4/IPv6 manipulation library in Python.
-
-This library is used to create/poke/manipulate IPv4 and IPv6 addresses
-and prefixes.
-
-"""
-
-__version__ = '1.1.1'
-
-import struct
-
-
-class Error(Exception):
-
-    """Base class for exceptions."""
-
-
-class IPTypeError(Error):
-
-    """Tried to perform a v4 action on v6 object or vice versa."""
-
-
-class IPAddressExclusionError(Error):
-
-    """An Error we should never see occurred in address exclusion."""
-
-
-class IPv4IpValidationError(Error):
-
-    """Raised when an IPv4 address is invalid."""
-
-    def __init__(self, ip):
-        Error.__init__(self)
-        self.ip = ip
-
-    def __str__(self):
-        return repr(self.ip) + ' is not a valid IPv4 address'
-
-
-class IPv4NetmaskValidationError(Error):
-
-    """Raised when a netmask is invalid."""
-
-    def __init__(self, netmask):
-        Error.__init__(self)
-        self.netmask = netmask
-
-    def __str__(self):
-        return repr(self.netmask) + ' is not a valid IPv4 netmask'
-
-
-class IPv6IpValidationError(Error):
-
-    """Raised when an IPv6 address is invalid."""
-
-    def __init__(self, ip):
-        Error.__init__(self)
-        self.ip = ip
-
-    def __str__(self):
-        return repr(self.ip) + ' is not a valid IPv6 address'
-
-
-class IPv6NetmaskValidationError(Error):
-
-    """Raised when an IPv6 netmask is invalid."""
-
-    def __init__(self, netmask):
-        Error.__init__(self)
-        self.netmask = netmask
-
-    def __str__(self):
-        return repr(self.netmask) + ' is not a valid IPv6 netmask'
-
-
-class PrefixlenDiffInvalidError(Error):
-
-    """Raised when Sub/Supernets is called with a bad prefixlen_diff."""
-
-    def __init__(self, error_str):
-        Error.__init__(self)
-        self.error_str = error_str
-
-
-def IP(ipaddr):
-    """Take an IP string/int and return an object of the correct type.
-
-    Args:
-        ipaddr: A string or integer, the IP address.  Either IPv4 or
-          IPv6 addresses may be supplied; integers less than 2**32 will
-          be considered to be IPv4.
-
-    Returns:
-        An IPv4 or IPv6 object.
-
-    Raises:
-        ValueError: if the string passed isn't either a v4 or a v6
-          address.
-
-    """
-
-    try:
-        return IPv4(ipaddr)
-    except (IPv4IpValidationError, IPv4NetmaskValidationError):
-        pass
-
-    try:
-        return IPv6(ipaddr)
-    except (IPv6IpValidationError, IPv6NetmaskValidationError):
-        pass
-
-    raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
-                     ipaddr)
-
-
-def _collapse_address_list_recursive(addresses):
-    """Loops through the addresses, collapsing concurrent netblocks.
-
-    Example:
-
-    >>> ip1 = IPv4('1.1.0.0/24')
-    >>> ip2 = IPv4('1.1.1.0/24')
-    >>> ip3 = IPv4('1.1.2.0/24')
-    >>> ip4 = IPv4('1.1.3.0/24')
-    >>> ip5 = IPv4('1.1.4.0/24')
-    >>> ip6 = IPv4('1.1.0.1/22')
-
-    >>> _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6])
-    [IPv4('1.1.0.0/22'), IPv4('1.1.4.0/24'), IPv4('1.1.0.1/22')]
-
-    Notes:
-        This shouldn't be called directly; it is called via
-          collapse_address_list([]).
-
-    Args:
-        addresses: A list of IPv4 or IPv6 objects.
-
-    Returns:
-        A list of IPv4 or IPv6 objects depending on what we were passed.
-
-    """
-    ret_array = []
-    optimized = False
-
-    for cur_addr in addresses:
-        if not ret_array:
-            ret_array.append(cur_addr)
-            continue
-        if cur_addr in ret_array[-1]:
-            optimized = True
-        elif cur_addr == ret_array[-1].supernet().subnet()[1]:
-            ret_array.append(ret_array.pop().supernet())
-            optimized = True
-        else:
-            ret_array.append(cur_addr)
-
-    if optimized:
-        return _collapse_address_list_recursive(ret_array)
-
-    return ret_array
-
-
-def collapse_address_list(addresses):
-    """Collapse a list of IP objects.
-
-    Example:
-
-    >>> collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')])
-    [IPv4('1.1.0.0/23')]
-
-    Args:
-        addresses: A list of IPv4 or IPv6 objects.
-
-    Returns:
-        A list of IPv4 or IPv6 objects depending on what we were passed.
-
-    """
-    return _collapse_address_list_recursive(
-        sorted(addresses, key=BaseIP._get_networks_key))
-
-
-class BaseIP(object):
-
-    """A generic IP object.
-
-    This IP class contains most of the methods which are used by
-    the IPv4 and IPv6 classes.
-
-    """
-
-    def __getitem__(self, n):
-        if n >= 0:
-            if self.network + n > self.broadcast:
-                raise IndexError
-            return self._string_from_ip_int(self.network + n)
-        else:
-            n += 1
-            if self.broadcast + n < self.network:
-                raise IndexError
-            return self._string_from_ip_int(self.broadcast + n)
-
-    def __lt__(self, other):
-        try:
-            if self.version != other.version:
-                return self.version < other.version
-            if self.ip != other.ip:
-                return self.ip < other.ip
-            if self.netmask != other.netmask:
-                return self.netmask < other.netmask
-            return False
-        except AttributeError:
-            return NotImplemented
-
-    def __gt__(self, other):
-        try:
-            if self.version != other.version:
-                return self.version > other.version
-            if self.ip != other.ip:
-                return self.ip > other.ip
-            if self.netmask != other.netmask:
-                return self.netmask > other.netmask
-            return False
-        except AttributeError:
-            return NotImplemented
-
-    def __eq__(self, other):
-        try:
-            return (self.version == other.version
-                    and self.ip == other.ip
-                    and self.netmask == other.netmask)
-        except AttributeError:
-            return NotImplemented
-
-    def __ne__(self, other):
-        eq = self.__eq__(other)
-        if eq is NotImplemented:
-            return NotImplemented
-        return not eq
-
-    def __le__(self, other):
-        gt = self.__gt__(other)
-        if gt is NotImplemented:
-            return NotImplemented
-        return not gt
-
-    def __ge__(self, other):
-        lt = self.__lt__(other)
-        if lt is NotImplemented:
-            return NotImplemented
-        return not lt
-
-    def __repr__(self):
-        return '%s(%r)' % (self.__class__.__name__, str(self))
-
-    def __index__(self):
-        return self.ip
-
-    def __int__(self):
-        return self.ip
-
-    def address_exclude(self, other):
-        """Remove an address from a larger block.
-
-        For example:
-
-        >>> addr1 = IP('10.1.1.0/24')
-        >>> addr2 = IP('10.1.1.0/26')
-        >>> addr1.address_exclude(addr2)
-        [IPv4('10.1.1.64/26'), IPv4('10.1.1.128/25')]
-
-        or IPv6:
-
-        >>> addr1 = IP('::1/32')
-        >>> addr2 = IP('::1/128')
-        >>> s = addr1.address_exclude(addr2)
-        >>> s[:4]
-        [IPv6('::/128'), IPv6('::2/127'), IPv6('::4/126'), IPv6('::8/125')]
-        >>> s[-1]
-        IPv6('0:0:8000::/33')
-
-        Args:
-            other: An IP object of the same type.
-
-        Returns:
-            A sorted list of IP objects addresses which is self minus
-            other.
-
-        Raises:
-            IPTypeError: If self and other are of difffering address
-              versions.
-            IPAddressExclusionError: There was some unknown error in the
-              address exclusion process.  This likely points to a bug
-              elsewhere in this code.
-            ValueError: If other is not completely contained by self.
-
-        """
-        if not self.version == other.version:
-            raise IPTypeError("%s and %s aren't of the same version" % (
-                str(self), str(other)))
-
-        if other not in self:
-            raise ValueError('%s not contained in %s' % (str(other),
-                                                         str(self)))
-
-        ret_addrs = []
-
-        # Make sure we're comparing the network of other.
-        other = IP(other.network_ext + '/' + str(other.prefixlen))
-
-        s1, s2 = self.subnet()
-        while s1 != other and s2 != other:
-            if other in s1:
-                ret_addrs.append(s2)
-                s1, s2 = s1.subnet()
-            elif other in s2:
-                ret_addrs.append(s1)
-                s1, s2 = s2.subnet()
-            else:
-                # If we got here, there's a bug somewhere.
-                raise IPAddressExclusionError('Error performing exclusion: '
-                                              's1: %s s2: %s other: %s' %
-                                              (str(s1), str(s2), str(other)))
-        if s1 == other:
-            ret_addrs.append(s2)
-        elif s2 == other:
-            ret_addrs.append(s1)
-        else:
-            # If we got here, there's a bug somewhere.
-            raise IPAddressExclusionError('Error performing exclusion: '
-                                          's1: %s s2: %s other: %s' %
-                                          (str(s1), str(s2), str(other)))
-
-        return sorted(ret_addrs, key=BaseIP._get_networks_key)
-
-    def compare_networks(self, other):
-        """Compare two IP objects.
-
-        This is only concerned about the comparison of the integer
-        representation of the network addresses.  This means that the
-        host bits aren't considered at all in this method.  If you want
-        to compare host bits, you can easily enough do a
-        'HostA.ip < HostB.ip'
-
-        Args:
-            other: An IP object.
-
-        Returns:
-            If the IP versions of self and other are the same, returns:
-
-            -1 if self < other:
-              eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24')
-              IPv6('1080::200C:417A') < IPv6('1080::200B:417B')
-            0 if self == other
-              eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24')
-              IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96')
-            1 if self > other
-              eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24')
-              IPv6('1080::1:200C:417A/112') >
-              IPv6('1080::0:200C:417A/112')
-
-            If the IP versions of self and other are different, returns:
-
-            -1 if self.version < other.version
-              eg: IPv4('10.0.0.1/24') < IPv6('::1/128')
-            1 if self.version > other.version
-              eg: IPv6('::1/128') > IPv4('255.255.255.0/24')
-
-        To sort networks with sorted(), min(), max() and other tools with a
-        *key* argument, use the operator.attrgetter() function to extract the
-        relevant fields:
-
-            >>> from operator import attrgetter
-            >>> s = [IPv6('::1/128'), IPv4('255.255.255.0/24')]
-            >>> sorted(s, key=attrgetter('version', 'network', 'netmask'))
-            [IPv4('255.255.255.0/24'), IPv6('::1/128')]
-
-        """
-        if self.version < other.version:
-            return -1
-        if self.version > other.version:
-            return 1
-        # self.version == other.version below here:
-        if self.network < other.network:
-            return -1
-        if self.network > other.network:
-            return 1
-        # self.network == other.network below here:
-        if self.netmask < other.netmask:
-            return -1
-        if self.netmask > other.netmask:
-            return 1
-        # self.network == other.network and self.netmask == other.netmask
-        return 0
-
-    def _get_networks_key(self):
-        """Network-only key function.
-
-        Returns an object that identifies this address' network and
-        netmask. This function is a suitable "key" argument for sorted()
-        and list.sort().
-
-        """
-        return (self.version, self.network, self.netmask)
-
-    prefixlen = property(
-        fget=lambda self: self._prefixlen,
-        fset=lambda self, prefixlen: self._set_prefix(prefixlen))
-
-    def __str__(self):
-        return  '%s/%s' % (self._string_from_ip_int(self.ip),
-                           str(self.prefixlen))
-
-    def __hash__(self):
-        return hash(self.ip ^ self.netmask)
-
-    def __contains__(self, other):
-        return self.network <= other.ip and self.broadcast >= other.broadcast
-
-    @property
-    def ip_ext(self):
-        """Dotted decimal or colon string version of the IP address."""
-        return self._string_from_ip_int(self.ip)
-
-    @property
-    def ip_ext_full(self):
-        """Canonical string version of the IP address."""
-        return self.ip_ext
-
-    @property
-    def broadcast(self):
-        """Integer representation of the broadcast address."""
-        return self.ip | self.hostmask
-
-    @property
-    def broadcast_ext(self):
-        """Dotted decimal or colon string version of the broadcast."""
-        return self._string_from_ip_int(self.broadcast)
-
-    @property
-    def hostmask(self):
-        """Integer representation of the hostmask."""
-        return self.netmask ^ self._ALL_ONES
-
-    @property
-    def hostmask_ext(self):
-        """Dotted decimal or colon string version of the hostmask."""
-        return self._string_from_ip_int(self.hostmask)
-
-    @property
-    def network(self):
-        """Integer representation of the network."""
-        return self.ip & self.netmask
-
-    @property
-    def network_ext(self):
-        """Dotted decimal or colon string version of the network."""
-        return self._string_from_ip_int(self.network)
-
-    @property
-    def netmask_ext(self):
-        """Dotted decimal or colon string version of the netmask."""
-        return self._string_from_ip_int(self.netmask)
-
-    @property
-    def numhosts(self):
-        """Number of hosts in the current subnet."""
-        return self.broadcast - self.network + 1
-
-    @property
-    def version(self):
-        raise NotImplementedError('BaseIP has no version')
-
-    def _ip_int_from_prefix(self, prefixlen=None):
-        """Turn the prefix length netmask into a int for comparison.
-
-        Args:
-            prefixlen: An integer, the prefix length.
-
-        Returns:
-            An integer.
-
-        """
-        if not prefixlen and prefixlen != 0:
-            prefixlen = self.prefixlen
-        return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
-
-    def _prefix_from_ip_int(self, ip_int, mask=32):
-        """Return prefix length from the decimal netmask.
-
-        Args:
-            ip_int: An integer, the IP address.
-            mask: The netmask.  Defaults to 32.
-
-        Returns:
-            An integer, the prefix length.
-
-        """
-        while mask:
-            if ip_int & 1 == 1:
-                break
-            ip_int >>= 1
-            mask -= 1
-
-        return mask
-
-    def _ip_string_from_prefix(self, prefixlen=None):
-        """Turn a prefix length into a dotted decimal string.
-
-        Args:
-            prefixlen: An integer, the netmask prefix length.
-
-        Returns:
-            A string, the dotted decimal netmask string.
-
-        """
-        if not prefixlen:
-            prefixlen = self.prefixlen
-        return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen))
-
-
-class IPv4(BaseIP):
-
-    """This class represents and manipulates 32-bit IPv4 addresses.
-
-    >>> addr = IPv4('1.2.3.4/27')
-    >>> for attr in ['ip', 'ip_ext', 'ip_ext_full', 'network', 'network_ext',
-    ...              'hostmask', 'hostmask_ext', 'broadcast', 'broadcast_ext',
-    ...              'netmask', 'netmask_ext', 'prefixlen']:
-    ...     print(attr, '=', getattr(addr, attr))
-    ip = 16909060
-    ip_ext = 1.2.3.4
-    ip_ext_full = 1.2.3.4
-    network = 16909056
-    network_ext = 1.2.3.0
-    hostmask = 31
-    hostmask_ext = 0.0.0.31
-    broadcast = 16909087
-    broadcast_ext = 1.2.3.31
-    netmask = 4294967264
-    netmask_ext = 255.255.255.224
-    prefixlen = 27
-
-    """
-
-    # Equivalent to 255.255.255.255 or 32 bits of 1's.
-    _ALL_ONES = 0xffffffff
-    _version = 4
-
-    def __init__(self, ipaddr):
-        """Instantiate a new IPv4 object.
-
-        Args:
-            ipaddr: A string or integer representing the IP [& network].
-              '192.168.1.1/32'
-              '192.168.1.1/255.255.255.255'
-              '192.168.1.1/0.0.0.255'
-              '192.168.1.1'
-              are all functionally the same in IPv4. That is to say,
-              failing to provide a subnetmask will create an object with
-              a mask of /32. A netmask of '255.255.255.255' is assumed
-              to be /32 and '0.0.0.0' is assumed to be /0, even though
-              other netmasks can be expressed both as host- and
-              net-masks. (255.0.0.0 == 0.255.255.255)
-
-              Additionally, an integer can be passed, so
-                  IPv4('192.168.1.1') == IPv4(3232235777).
-              or, more generally
-                  IPv4(IPv4('192.168.1.1').ip) == IPv4('192.168.1.1')
-
-        Raises:
-            IPv4IpValidationError: If ipaddr isn't a valid IPv4 address.
-            IPv4NetmaskValidationError: If the netmask isn't valid for
-              an IPv4 address.
-
-        """
-        BaseIP.__init__(self)
-
-        # Efficient constructor from integer.
-        if isinstance(ipaddr, int):
-            self.ip = ipaddr
-            self._prefixlen = 32
-            self.netmask = self._ALL_ONES
-            if ipaddr < 0 or ipaddr > self._ALL_ONES:
-                raise IPv4IpValidationError(ipaddr)
-            return
-
-        # Constructing from a packed address
-        if isinstance(ipaddr, (bytes, bytearray)) and len(ipaddr) == 4:
-            self.ip = struct.unpack('!I', ipaddr)[0]
-            self._prefixlen = 32
-            self.netmask = self._ALL_ONES
-            return
-
-        # Assume input argument to be string or any object representation
-        # which converts into a formatted IP prefix string.
-        addr = str(ipaddr).split('/')
-
-        if len(addr) > 2:
-            raise IPv4IpValidationError(ipaddr)
-
-        if not self._is_valid_ip(addr[0]):
-            raise IPv4IpValidationError(addr[0])
-
-        self.ip = self._ip_int_from_string(addr[0])
-
-        if len(addr) == 2:
-            mask = addr[1].split('.')
-            if len(mask) == 4:
-                # We have dotted decimal netmask.
-                if not self._is_valid_netmask(addr[1]):
-                    raise IPv4NetmaskValidationError(addr[1])
-                if self._is_hostmask(addr[1]):
-                    self.netmask = (
-                        self._ip_int_from_string(addr[1]) ^ self._ALL_ONES)
-                else:
-                    self.netmask = self._ip_int_from_string(addr[1])
-                self._prefixlen = self._prefix_from_ip_int(self.netmask)
-            else:
-                # We have a netmask in prefix length form.
-                if not self._is_valid_netmask(addr[1]):
-                    raise IPv4NetmaskValidationError(addr[1])
-                self._prefixlen = int(addr[1])
-                self.netmask = self._ip_int_from_prefix(self._prefixlen)
-        else:
-            self._prefixlen = 32
-            self.netmask = self._ip_int_from_prefix(self._prefixlen)
-
-    def _set_prefix(self, prefixlen):
-        """Change the prefix length.
-
-        Args:
-            prefixlen: An integer, the new prefix length.
-
-        Raises:
-            IPv4NetmaskValidationError: If prefixlen is out of bounds.
-
-        """
-        if not 0 <= prefixlen <= 32:
-            raise IPv4NetmaskValidationError(prefixlen)
-        self._prefixlen = prefixlen
-        self.netmask = self._ip_int_from_prefix(self._prefixlen)
-
-    def subnet(self, prefixlen_diff=1):
-        """The subnets which join to make the current subnet.
-
-        In the case that self contains only one IP
-        (self._prefixlen == 32), return a list with just ourself.
-
-        Args:
-            prefixlen_diff: An integer, the amount the prefix length
-              should be increased by.  Given a /24 network and a
-              prefixlen_diff of 3, for example, 8 subnets of size /27
-              will be returned.  The default value of 1 splits the
-              current network into two halves.
-
-        Returns:
-            A list of IPv4 objects.
-
-        Raises:
-            PrefixlenDiffInvalidError: The prefixlen_diff is too small
-              or too large.
-
-        """
-        if self._prefixlen == 32:
-            return [self]
-
-        if prefixlen_diff < 0:
-            raise PrefixlenDiffInvalidError('prefix length diff must be > 0')
-        new_prefixlen = self.prefixlen + prefixlen_diff
-
-        if not self._is_valid_netmask(str(new_prefixlen)):
-            raise PrefixlenDiffInvalidError(
-                'prefix length diff %d is invalid for netblock %s' % (
-                    new_prefixlen, str(self)))
-
-        first = IPv4(
-            self._string_from_ip_int(self.network) + '/' +
-            str(self._prefixlen + prefixlen_diff))
-        subnets = [first]
-        current = first
-        while True:
-            broadcast = current.broadcast
-            if broadcast == self.broadcast:
-                break
-            current = IPv4(self._string_from_ip_int(broadcast + 1) + '/' +
-                           str(new_prefixlen))
-            subnets.append(current)
-
-        return subnets
-
-    def supernet(self, prefixlen_diff=1):
-        """The supernet containing the current network.
-
-        Args:
-            prefixlen_diff: An integer, the amount the prefix length of
-              the network should be decreased by.  For example, given a
-              /24 network and a prefixlen_diff of 3, a supernet with a
-              /21 netmask is returned.
-
-        Returns:
-            An IPv4 object.
-
-        Raises:
-            PrefixlenDiffInvalidError: If
-              self.prefixlen - prefixlen_diff < 0. I.e., you have a
-              negative prefix length.
-
-        """
-        if self.prefixlen == 0:
-            return self
-        if self.prefixlen - prefixlen_diff < 0:
-            raise PrefixlenDiffInvalidError(
-                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
-                (self.prefixlen, prefixlen_diff))
-        return IPv4(self.ip_ext + '/' + str(self.prefixlen - prefixlen_diff))
-
-    @property
-    def is_private(self):
-        """Test if this address is allocated for private networks.
-
-        Returns:
-            A boolean, True if the address is reserved per RFC 1918.
-
-        """
-        for network in _IPV4_RFC1918_NETWORKS:
-            if self in network:
-                return True
-        return False
-
-    @property
-    def is_multicast(self):
-        """Test if the address is reserved for multicast use.
-
-        Returns:
-            A boolean, True if the address is multicast.
-            See RFC 3171 for details.
-
-        """
-        return self in _IPV4_RFC3171_MULTICAST
-
-    @property
-    def is_loopback(self):
-        """Test if the address is a loopback adddress.
-
-        Returns:
-            A boolean, True if the address is a loopback per RFC 3330.
-
-        """
-        return self in _IPV4_RFC3330_LOOPBACK
-
-    @property
-    def is_link_local(self):
-        """Test if the address is reserved for link-local.
-
-        Returns:
-            A boolean, True if the address is link-local per RFC 3927.
-
-        """
-        return self in _IPV4_RFC3927_LINK_LOCAL
-
-    @property
-    def version(self):
-        return self._version
-
-    @property
-    def packed(self):
-        """The binary representation of this address."""
-        return struct.pack('!I', self.ip)
-
-    def _is_hostmask(self, ip_str):
-        """Test if the IP string is a hostmask (rather than a netmask).
-
-        Args:
-            ip_str: A string, the potential hostmask.
-
-        Returns:
-            A boolean, True if the IP string is a hostmask.
-
-        """
-        parts = [int(x) for x in ip_str.split('.')]
-        if parts[0] < parts[-1]:
-            return True
-        return False
-
-    def _ip_int_from_string(self, ip_str):
-        """Turn the given IP string into an integer for comparison.
-
-        Args:
-            ip_str: A string, the IP address.
-
-        Returns:
-            The IP address as an integer.
-
-        """
-        packed_ip = 0
-        for oc in ip_str.split('.'):
-            packed_ip = (packed_ip << 8) | int(oc)
-        return packed_ip
-
-    def _string_from_ip_int(self, ip_int):
-        """Turns a 32-bit integer into dotted decimal notation.
-
-        Args:
-            ip_int: An integer, the IP address.
-
-        Returns:
-            The IP address as a string in dotted decimal notation.
-
-        """
-        octets = []
-        for _ in range(4):
-            octets.insert(0, str(ip_int & 0xFF))
-            ip_int >>= 8
-        return '.'.join(octets)
-
-    def _is_valid_ip(self, ip_str):
-        """Validate the dotted decimal notation IP/netmask string.
-
-        Args:
-            ip_str: A string, the IP address.
-
-        Returns:
-            A boolean, True if the string is a valid dotted decimal IP
-            string.
-
-        """
-        octets = ip_str.split('.')
-        if len(octets) == 1:
-            # We have an integer rather than a dotted decimal IP.
-            try:
-                return int(ip_str) >= 0 and int(ip_str) <= self._ALL_ONES
-            except ValueError:
-                return False
-
-        if len(octets) != 4:
-            return False
-
-        for octet in octets:
-            try:
-                if not 0 <= int(octet) <= 255:
-                    return False
-            except ValueError:
-                return False
-        return True
-
-    def _is_valid_netmask(self, netmask):
-        """Verify that the netmask is valid.
-
-        Args:
-            netmask: A string, either a prefix or dotted decimal
-              netmask.
-
-        Returns:
-            A boolean, True if the prefix represents a valid IPv4
-            netmask.
-
-        """
-        if len(netmask.split('.')) == 4:
-            return self._is_valid_ip(netmask)
-        try:
-            netmask = int(netmask)
-        except ValueError:
-            return False
-        return 0 <= netmask <= 32
-
-
-class IPv6(BaseIP):
-
-    """This class respresents and manipulates 128-bit IPv6 addresses.
-
-    >>> addr = IPv6('2001:658:22A:CAFE:200::1/64')
-    >>> for attr in ['ip', 'ip_ext', 'ip_ext_full', 'network', 'network_ext',
-    ...              'hostmask', 'hostmask_ext', 'broadcast', 'broadcast_ext',
-    ...              'netmask', 'netmask_ext', 'prefixlen']:
-    ...     print(attr, '=', getattr(addr, attr))
-    ip = 42540616829182469433547762482097946625
-    ip_ext = 2001:658:22a:cafe:200::1
-    ip_ext_full = 2001:0658:022a:cafe:0200:0000:0000:0001
-    network = 42540616829182469433403647294022090752
-    network_ext = 2001:658:22a:cafe::
-    hostmask = 18446744073709551615
-    hostmask_ext = ::ffff:ffff:ffff:ffff
-    broadcast = 42540616829182469451850391367731642367
-    broadcast_ext = 2001:658:22a:cafe:ffff:ffff:ffff:ffff
-    netmask = 340282366920938463444927863358058659840
-    netmask_ext = 64
-    prefixlen = 64
-
-    """
-
-    _ALL_ONES = (2**128) - 1
-    _version = 6
-
-    def __init__(self, ipaddr):
-        """Instantiate a new IPv6 object.
-
-        Args:
-            ipaddr: A string or integer representing the IP or the IP
-              and prefix/netmask.
-              '2001:4860::/128'
-              '2001:4860:0000:0000:0000:0000:0000:0000/128'
-              '2001:4860::'
-              are all functionally the same in IPv6.  That is to say,
-              failing to provide a subnetmask will create an object with
-              a mask of /128.
-
-              Additionally, an integer can be passed, so
-                  IPv6('2001:4860::') ==
-                  IPv6(42541956101370907050197289607612071936L).
-              or, more generally
-                  IPv6(IPv6('2001:4860::').ip) == IPv6('2001:4860::')
-
-        Raises:
-            IPv6IpValidationError: If ipaddr isn't a valid IPv6 address.
-            IPv6NetmaskValidationError: If the netmask isn't valid for
-              an IPv6 address.
-
-        """
-        BaseIP.__init__(self)
-
-        # Efficient constructor from integer.
-        if isinstance(ipaddr, int):
-            self.ip = ipaddr
-            self._prefixlen = 128
-            self.netmask = self._ALL_ONES
-            if ipaddr < 0 or ipaddr > self._ALL_ONES:
-                raise IPv6IpValidationError(ipaddr)
-            return
-
-        # Constructing from a packed address
-        if isinstance(ipaddr, (bytes, bytearray)) and len(ipaddr) == 16:
-            tmp = struct.unpack('!QQ', ipaddr)
-            self.ip = (tmp[0] << 64) | tmp[1]
-            self._prefixlen = 128
-            self.netmask = self._ALL_ONES
-            return
-
-        # Assume input argument to be string or any object representation
-        # which converts into a formatted IP prefix string.
-        addr_str = str(ipaddr)
-        if not addr_str:
-            raise IPv6IpValidationError('')
-        addr = addr_str.split('/')
-        if len(addr) > 1:
-            if self._is_valid_netmask(addr[1]):
-                self._prefixlen = int(addr[1])
-            else:
-                raise IPv6NetmaskValidationError(addr[1])
-        else:
-            self._prefixlen = 128
-
-        self.netmask = self._ip_int_from_prefix(self._prefixlen)
-
-        if not self._is_valid_ip(addr[0]):
-            raise IPv6IpValidationError(addr[0])
-
-        self.ip = self._ip_int_from_string(addr[0])
-
-    @property
-    def ip_ext_full(self):
-        """Returns the expanded version of the IPv6 string."""
-        return self._explode_shorthand_ip_string(self.ip_ext)
-
-    def _set_prefix(self, prefixlen):
-        """Change the prefix length.
-
-        Args:
-            prefixlen: An integer, the new prefix length.
-
-        Raises:
-            IPv6NetmaskValidationError: If prefixlen is out of bounds.
-
-        """
-        if not 0 <= prefixlen <= 128:
-            raise IPv6NetmaskValidationError(prefixlen)
-        self._prefixlen = prefixlen
-        self.netmask = self._ip_int_from_prefix(self.prefixlen)
-
-    def subnet(self, prefixlen_diff=1):
-        """The subnets which join to make the current subnet.
-
-        In the case that self contains only one IP
-        (self._prefixlen == 128), return a list with just ourself.
-
-        Args:
-            prefixlen_diff: An integer, the amount the prefix length
-              should be increased by.
-
-        Returns:
-            A list of IPv6 objects.
-
-        Raises:
-            PrefixlenDiffInvalidError: The prefixlen_diff is too small
-              or too large.
-
-        """
-        # Preserve original functionality (return [self] if
-        # self.prefixlen == 128).
-        if self.prefixlen == 128:
-            return [self]
-
-        if prefixlen_diff < 0:
-            raise PrefixlenDiffInvalidError('Prefix length diff must be > 0')
-        new_prefixlen = self.prefixlen + prefixlen_diff
-        if not self._is_valid_netmask(str(new_prefixlen)):
-            raise PrefixlenDiffInvalidError(
-                'Prefix length diff %d is invalid for netblock %s' % (
-                new_prefixlen, str(self)))
-        first = IPv6(
-            self._string_from_ip_int(self.network) + '/' +
-            str(self._prefixlen + prefixlen_diff))
-        subnets = [first]
-        current = first
-        while True:
-            broadcast = current.broadcast
-            if current.broadcast == self.broadcast:
-                break
-            current = IPv6(self._string_from_ip_int(broadcast + 1) + '/' +
-                           str(new_prefixlen))
-            subnets.append(current)
-
-        return subnets
-
-    def supernet(self, prefixlen_diff=1):
-        """The supernet containing the current network.
-
-        Args:
-            prefixlen_diff: An integer, the amount the prefix length of the
-              network should be decreased by.  For example, given a /96
-              network and a prefixlen_diff of 3, a supernet with a /93
-              netmask is returned.
-
-        Returns:
-            An IPv6 object.
-
-        Raises:
-            PrefixlenDiffInvalidError: If
-              self._prefixlen - prefixlen_diff < 0. I.e., you have a
-              negative prefix length.
-
-        """
-        if self.prefixlen == 0:
-            return self
-        if self.prefixlen - prefixlen_diff < 0:
-            raise PrefixlenDiffInvalidError(
-                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
-                (self.prefixlen, prefixlen_diff))
-        return IPv6(self.ip_ext + '/' + str(self.prefixlen - prefixlen_diff))
-
-    @property
-    def is_multicast(self):
-        """Test if the address is reserved for multicast use.
-
-        Returns:
-            A boolean, True if the address is a multicast address.
-            See RFC 2373 2.7 for details.
-
-        """
-        return self in _IPV6_RFC2373_MULTICAST
-
-    @property
-    def is_unspecified(self):
-        """Test if the address is unspecified.
-
-        Returns:
-            A boolean, True if this is the unspecified address as defined in
-            RFC 2373 2.5.2.
-
-        """
-        return self == _IPV6_RFC2373_UNSPECIFIED
-
-    @property
-    def is_loopback(self):
-        """Test if the address is a loopback adddress.
-
-        Returns:
-            A boolean, True if the address is a loopback address as defined in
-            RFC 2373 2.5.3.
-
-        """
-        return self == _IPV6_RFC2373_LOOPBACK
-
-    @property
-    def is_link_local(self):
-        """Test if the address is reserved for link-local.
-
-        Returns:
-            A boolean, True if the address is reserved per RFC 4291.
-
-        """
-        return self in _IPV6_RFC4291_LINK_LOCAL
-
-    @property
-    def is_site_local(self):
-        """Test if the address is reserved for site-local.
-
-        Note that the site-local address space has been deprecated by RFC 3879.
-        Use is_private to test if this address is in the space of unique local
-        addresses as defined by RFC 4193.
-
-        Returns:
-            A boolean, True if the address is reserved per RFC 3513 2.5.6.
-
-        """
-        return self in _IPV6_RFC3513_SITE_LOCAL
-
-    @property
-    def is_private(self):
-        """Test if this address is allocated for private networks.
-
-        Returns:
-            A boolean, True if the address is reserved per RFC 4193.
-
-        """
-        return self in _IPV6_RFC4193_PRIVATE
-
-    @property
-    def version(self):
-        return self._version
-
-    @property
-    def packed(self):
-        """The binary representation of this address."""
-        return struct.pack('!QQ', self.ip >> 64, self.ip & (2**64 - 1))
-
-    def _is_shorthand_ip(self, ip_str=None):
-        """Determine if the address is shortened.
-
-        Args:
-            ip_str: A string, the IPv6 address.
-
-        Returns:
-            A boolean, True if the address is shortened.
-
-        """
-        if ip_str.count('::') == 1:
-            return True
-        return False
-
-    def _explode_shorthand_ip_string(self, ip_str):
-        """Expand a shortened IPv6 address.
-
-        Args:
-            ip_str: A string, the IPv6 address.
-
-        Returns:
-            A string, the expanded IPv6 address.
-
-        """
-        if self._is_shorthand_ip(ip_str):
-            new_ip = []
-            hextet = ip_str.split('::')
-            sep = len(hextet[0].split(':')) + len(hextet[1].split(':'))
-            new_ip = hextet[0].split(':')
-
-            for _ in range(8 - sep):
-                new_ip.append('0000')
-            new_ip += hextet[1].split(':')
-
-            # Now need to make sure every hextet is 4 lower case characters.
-            # If a hextet is < 4 characters, we've got missing leading 0's.
-            ret_ip = []
-            for hextet in new_ip:
-                ret_ip.append(('0' * (4 - len(hextet)) + hextet).lower())
-            return ':'.join(ret_ip)
-        # We've already got a longhand ip_str.
-        return ip_str
-
-    def _is_valid_ip(self, ip_str=None):
-        """Ensure we have a valid IPv6 address.
-
-        Probably not as exhaustive as it should be.
-
-        Args:
-            ip_str: A string, the IPv6 address.
-
-        Returns:
-            A boolean, True if this is a valid IPv6 address.
-
-        """
-        if not ip_str:
-            ip_str = self.ip_ext
-
-        # We need to have at least one ':'.
-        if ':' not in ip_str:
-            return False
-
-        # We can only have one '::' shortener.
-        if ip_str.count('::') > 1:
-            return False
-
-        # '::' should be encompassed by start, digits or end.
-        if ':::' in ip_str:
-            return False
-
-        # A single colon can neither start nor end an address.
-        if ((ip_str.startswith(':') and not ip_str.startswith('::')) or
-                (ip_str.endswith(':') and not ip_str.endswith('::'))):
-            return False
-
-        # If we have no concatenation, we need to have 8 fields with 7 ':'.
-        if '::' not in ip_str and ip_str.count(':') != 7:
-            # We might have an IPv4 mapped address.
-            if ip_str.count('.') != 3:
-                return False
-
-        ip_str = self._explode_shorthand_ip_string(ip_str)
-
-        # Now that we have that all squared away, let's check that each of the
-        # hextets are between 0x0 and 0xFFFF.
-        for hextet in ip_str.split(':'):
-            if hextet.count('.') == 3:
-                # If we have an IPv4 mapped address, the IPv4 portion has to be
-                # at the end of the IPv6 portion.
-                if not ip_str.split(':')[-1] == hextet:
-                    return False
-                try:
-                    IPv4(hextet)
-                except IPv4IpValidationError:
-                    return False
-            elif int(hextet, 16) < 0x0 or int(hextet, 16) > 0xFFFF:
-                return False
-        return True
-
-    def _is_valid_netmask(self, prefixlen):
-        """Verify that the netmask/prefixlen is valid.
-
-        Args:
-            prefixlen: A string, the netmask in prefix length format.
-
-        Returns:
-            A boolean, True if the prefix represents a valid IPv6
-            netmask.
-
-        """
-        try:
-            prefixlen = int(prefixlen)
-        except ValueError:
-            return False
-        return 0 <= prefixlen <= 128
-
-    def _ip_int_from_string(self, ip_str=None):
-        """Turn an IPv6 address into an integer.
-
-        Args:
-            ip_str: A string, the IPv6 address.
-
-        Returns:
-            A long, the IPv6 address.
-
-        """
-        if not ip_str:
-            ip_str = self.ip_ext
-
-        ip_int = 0
-
-        fields = self._explode_shorthand_ip_string(ip_str).split(':')
-
-        # Do we have an IPv4 mapped (::ffff:a.b.c.d) or compact (::a.b.c.d)
-        # address?
-        if fields[-1].count('.') == 3:
-            ipv4_string = fields.pop()
-            ipv4_int = IPv4(ipv4_string).ip
-            octets = []
-            for _ in range(2):
-                octets.append(hex(ipv4_int & 0xFFFF).lstrip('0x').rstrip('L'))
-                ipv4_int >>= 16
-            fields.extend(reversed(octets))
-
-        for field in fields:
-            ip_int = (ip_int << 16) + int(field, 16)
-
-        return ip_int
-
-    def _compress_hextets(self, hextets):
-        """Compresses a list of hextets.
-
-        Compresses a list of strings, replacing the longest continuous
-        sequence of "0" in the list with "" and adding empty strings at
-        the beginning or at the end of the string such that subsequently
-        calling ":".join(hextets) will produce the compressed version of
-        the IPv6 address.
-
-        Args:
-            hextets: A list of strings, the hextets to compress.
-
-        Returns:
-            A list of strings.
-
-        """
-        best_doublecolon_start = -1
-        best_doublecolon_len = 0
-        doublecolon_start = -1
-        doublecolon_len = 0
-        for index in range(len(hextets)):
-            if hextets[index] == '0':
-                doublecolon_len += 1
-                if doublecolon_start == -1:
-                    # Start of a sequence of zeros.
-                    doublecolon_start = index
-                if doublecolon_len > best_doublecolon_len:
-                    # This is the longest sequence of zeros so far.
-                    best_doublecolon_len = doublecolon_len
-                    best_doublecolon_start = doublecolon_start
-            else:
-                doublecolon_len = 0
-                doublecolon_start = -1
-
-        if best_doublecolon_len > 1:
-            best_doublecolon_end = (best_doublecolon_start +
-                                    best_doublecolon_len)
-            # For zeros at the end of the address.
-            if best_doublecolon_end == len(hextets):
-                hextets += ['']
-            hextets[best_doublecolon_start:best_doublecolon_end] = ['']
-            # For zeros at the beginning of the address.
-            if best_doublecolon_start == 0:
-                hextets = [''] + hextets
-
-        return hextets
-
-    def _string_from_ip_int(self, ip_int=None):
-        """Turns a 128-bit integer into hexadecimal notation.
-
-        Args:
-            ip_int: An integer, the IP address.
-
-        Returns:
-            A string, the hexadecimal representation of the address.
-
-        Raises:
-            ValueError: The address is bigger than 128 bits of all ones.
-
-        """
-        if not ip_int and ip_int != 0:
-            ip_int = self.ip
-
-        if ip_int > self._ALL_ONES:
-            raise ValueError('IPv6 address is too large')
-
-        hex_str = '%032x' % ip_int
-        hextets = []
-        for x in range(0, 32, 4):
-            hextets.append('%x' % int(hex_str[x:x+4], 16))
-
-        hextets = self._compress_hextets(hextets)
-        return ':'.join(hextets)
-
-    @property
-    def netmask_ext(self):
-        """IPv6 extended netmask.
-
-        We don't deal with netmasks in IPv6 like we do in IPv4.  This is
-        here strictly for IPv4 compatibility.  We simply return the
-        prefix length.
-
-        Returns:
-            An integer.
-
-        """
-        return self.prefixlen
-
-
-# IPv4 constants.
-_IPV4_RFC1918_NETWORKS = (IPv4('10.0.0.0/8'),
-                          IPv4('172.16.0.0/12'),
-                          IPv4('192.168.0.0/16'))
-_IPV4_RFC3171_MULTICAST = IPv4('224.0.0.0/4')
-_IPV4_RFC3330_LOOPBACK = IPv4('127.0.0.0/8')
-_IPV4_RFC3927_LINK_LOCAL = IPv4('169.254.0.0/16')
-
-# IPv6 constants.
-_IPV6_RFC2373_MULTICAST = IPv6('ff00::/8')
-_IPV6_RFC2373_UNSPECIFIED = IPv6('::')
-_IPV6_RFC2373_LOOPBACK = IPv6('::1')
-_IPV6_RFC4291_LINK_LOCAL = IPv6('fe80::/10')
-_IPV6_RFC3513_SITE_LOCAL = IPv6('fec0::/10')  # Deprecated by RFC3879.
-_IPV6_RFC4193_PRIVATE = IPv6('fc00::/7')
-
-if __name__ == '__main__':
-
-    import doctest
-    print(doctest.testmod())
diff --git a/Lib/test/test_ipaddr.py b/Lib/test/test_ipaddr.py
deleted file mode 100755
index a7799f7..0000000
--- a/Lib/test/test_ipaddr.py
+++ /dev/null
@@ -1,586 +0,0 @@
-# Copyright 2007 Google Inc.
-#  Licensed to PSF under a Contributor Agreement.
-#
-# See also:  http://code.google.com/p/ipaddr-py/
-
-"""Unittest for ipaddr module."""
-
-
-import unittest
-from test import support
-import ipaddr
-
-
-class IpaddrUnitTest(unittest.TestCase):
-
-    def setUp(self):
-        self.ipv4 = ipaddr.IPv4('1.2.3.4/24')
-        self.ipv4_hostmask = ipaddr.IPv4('10.0.0.1/0.255.255.255')
-        self.ipv6 = ipaddr.IPv6('2001:658:22a:cafe:200:0:0:1/64')
-
-    def test_repr(self):
-        self.assertEqual("IPv4('1.2.3.4/32')", repr(ipaddr.IPv4('1.2.3.4')))
-        self.assertEqual("IPv6('::1/128')", repr(ipaddr.IPv6('::1')))
-
-    def test_invalid_strings(self):
-        self.assertRaises(ValueError, ipaddr.IP, '')
-        self.assertRaises(ValueError, ipaddr.IP, 'www.google.com')
-        self.assertRaises(ValueError, ipaddr.IP, '1.2.3')
-        self.assertRaises(ValueError, ipaddr.IP, '1.2.3.4.5')
-        self.assertRaises(ValueError, ipaddr.IP, '301.2.2.2')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:6:7')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:6:7:')
-        self.assertRaises(ValueError, ipaddr.IP, ':2:3:4:5:6:7:8')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:6:7:8:9')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:6:7:8:')
-        self.assertRaises(ValueError, ipaddr.IP, '1::3:4:5:6::8')
-        self.assertRaises(ValueError, ipaddr.IP, 'a:')
-        self.assertRaises(ValueError, ipaddr.IP, ':')
-        self.assertRaises(ValueError, ipaddr.IP, ':::')
-        self.assertRaises(ValueError, ipaddr.IP, '::a:')
-        self.assertRaises(ValueError, ipaddr.IP, '1ffff::')
-        self.assertRaises(ValueError, ipaddr.IP, '0xa::')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:6:1a.2.3.4')
-        self.assertRaises(ValueError, ipaddr.IP, '1:2:3:4:5:1.2.3.4:8')
-        self.assertRaises(ipaddr.IPv4IpValidationError, ipaddr.IPv4, '')
-        self.assertRaises(ipaddr.IPv4IpValidationError, ipaddr.IPv4,
-                          'google.com')
-        self.assertRaises(ipaddr.IPv4IpValidationError, ipaddr.IPv4,
-                          '::1.2.3.4')
-        self.assertRaises(ipaddr.IPv6IpValidationError, ipaddr.IPv6, '')
-        self.assertRaises(ipaddr.IPv6IpValidationError, ipaddr.IPv6,
-                          'google.com')
-        self.assertRaises(ipaddr.IPv6IpValidationError, ipaddr.IPv6,
-                          '1.2.3.4')
-
-    def test_get_network(self):
-        self.assertEqual(self.ipv4.network, 16909056)
-        self.assertEqual(self.ipv4.network_ext, '1.2.3.0')
-        self.assertEqual(self.ipv4_hostmask.network_ext, '10.0.0.0')
-
-        self.assertEqual(self.ipv6.network,
-                         42540616829182469433403647294022090752)
-        self.assertEqual(self.ipv6.network_ext,
-                         '2001:658:22a:cafe::')
-        self.assertEqual(self.ipv6.hostmask_ext,
-                         '::ffff:ffff:ffff:ffff')
-
-    def test_ip_from_int(self):
-        self.assertEqual(self.ipv4.ip, ipaddr.IPv4(16909060).ip)
-        self.assertRaises(ipaddr.IPv4IpValidationError,
-                          ipaddr.IPv4, 2**32)
-        self.assertRaises(ipaddr.IPv4IpValidationError,
-                          ipaddr.IPv4, -1)
-
-        self.assertEqual(self.ipv6.ip,
-                         ipaddr.IPv6(42540616829182469433547762482097946625).ip)
-        self.assertRaises(ipaddr.IPv6IpValidationError,
-                          ipaddr.IPv6, 2**128)
-        self.assertRaises(ipaddr.IPv6IpValidationError,
-                          ipaddr.IPv6, -1)
-
-        self.assertEqual(ipaddr.IP(self.ipv4.ip).version, 4)
-        self.assertEqual(ipaddr.IP(self.ipv6.ip).version, 6)
-
-    def test_ip_from_packed(self):
-        ip = ipaddr.IP
-
-        self.assertEqual(self.ipv4.ip,
-                         ip(b'\x01\x02\x03\x04').ip)
-        self.assertEqual(ip('255.254.253.252'),
-                         ip(b'\xff\xfe\xfd\xfc'))
-        self.assertRaises(ValueError, ipaddr.IP, b'\x00' * 3)
-        self.assertRaises(ValueError, ipaddr.IP, b'\x00' * 5)
-        self.assertEqual(self.ipv6.ip,
-                         ip(b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
-                           b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
-        self.assertEqual(ip('ffff:2:3:4:ffff::'),
-                         ip(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
-                               b'\xff\xff' + b'\x00' * 6))
-        self.assertEqual(ip('::'),
-                         ip(b'\x00' * 16))
-        self.assertRaises(ValueError, ip, b'\x00' * 15)
-        self.assertRaises(ValueError, ip, b'\x00' * 17)
-
-    def test_get_ip(self):
-        self.assertEqual(self.ipv4.ip, 16909060)
-        self.assertEqual(self.ipv4.ip_ext, '1.2.3.4')
-        self.assertEqual(self.ipv4.ip_ext_full, '1.2.3.4')
-        self.assertEqual(self.ipv4_hostmask.ip_ext, '10.0.0.1')
-
-        self.assertEqual(self.ipv6.ip, 42540616829182469433547762482097946625)
-        self.assertEqual(self.ipv6.ip_ext,
-                         '2001:658:22a:cafe:200::1')
-        self.assertEqual(self.ipv6.ip_ext_full,
-                         '2001:0658:022a:cafe:0200:0000:0000:0001')
-
-    def test_get_netmask(self):
-        self.assertEqual(self.ipv4.netmask, 4294967040)
-        self.assertEqual(self.ipv4.netmask_ext, '255.255.255.0')
-        self.assertEqual(self.ipv4_hostmask.netmask_ext, '255.0.0.0')
-        self.assertEqual(self.ipv6.netmask,
-                         340282366920938463444927863358058659840)
-        self.assertEqual(self.ipv6.netmask_ext, 64)
-
-    def test_zero_netmask(self):
-        ipv4_zero_netmask = ipaddr.IPv4('1.2.3.4/0')
-        self.assertEqual(ipv4_zero_netmask.netmask, 0)
-        self.assert_(ipv4_zero_netmask._is_valid_netmask(str(0)))
-
-        ipv6_zero_netmask = ipaddr.IPv6('::1/0')
-        self.assertEqual(ipv6_zero_netmask.netmask, 0)
-        self.assert_(ipv6_zero_netmask._is_valid_netmask(str(0)))
-
-    def test_get_broadcast(self):
-        self.assertEqual(self.ipv4.broadcast, 16909311)
-        self.assertEqual(self.ipv4.broadcast_ext, '1.2.3.255')
-
-        self.assertEqual(self.ipv6.broadcast,
-                         42540616829182469451850391367731642367)
-        self.assertEqual(self.ipv6.broadcast_ext,
-                         '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
-
-    def test_get_prefixlen(self):
-        self.assertEqual(self.ipv4.prefixlen, 24)
-
-        self.assertEqual(self.ipv6.prefixlen, 64)
-
-    def test_get_supernet(self):
-        self.assertEqual(self.ipv4.supernet().prefixlen, 23)
-        self.assertEqual(self.ipv4.supernet().network_ext, '1.2.2.0')
-        self.assertEqual(ipaddr.IPv4('0.0.0.0/0').supernet(),
-                         ipaddr.IPv4('0.0.0.0/0'))
-
-        self.assertEqual(self.ipv6.supernet().prefixlen, 63)
-        self.assertEqual(self.ipv6.supernet().network_ext,
-                         '2001:658:22a:cafe::')
-        self.assertEqual(ipaddr.IPv6('::0/0').supernet(), ipaddr.IPv6('::0/0'))
-
-    def test_get_supernet3(self):
-        self.assertEqual(self.ipv4.supernet(3).prefixlen, 21)
-        self.assertEqual(self.ipv4.supernet(3).network_ext, '1.2.0.0')
-
-        self.assertEqual(self.ipv6.supernet(3).prefixlen, 61)
-        self.assertEqual(self.ipv6.supernet(3).network_ext,
-                         '2001:658:22a:caf8::')
-
-    def test_get_subnet(self):
-        self.assertEqual(self.ipv4.subnet()[0].prefixlen, 25)
-        self.assertEqual(self.ipv4.subnet()[0].network_ext, '1.2.3.0')
-        self.assertEqual(self.ipv4.subnet()[1].network_ext, '1.2.3.128')
-
-        self.assertEqual(self.ipv6.subnet()[0].prefixlen, 65)
-
-    def test_get_subnet_for_single32(self):
-        ip = ipaddr.IPv4('1.2.3.4/32')
-        subnets1 = [str(x) for x in ip.subnet()]
-        subnets2 = [str(x) for x in ip.subnet(2)]
-        self.assertEqual(subnets1, ['1.2.3.4/32'])
-        self.assertEqual(subnets1, subnets2)
-
-    def test_get_subnet_for_single128(self):
-        ip = ipaddr.IPv6('::1/128')
-        subnets1 = [str(x) for x in ip.subnet()]
-        subnets2 = [str(x) for x in ip.subnet(2)]
-        self.assertEqual(subnets1, ['::1/128'])
-        self.assertEqual(subnets1, subnets2)
-
-    def test_subnet2(self):
-        ips = [str(x) for x in self.ipv4.subnet(2)]
-        self.assertEqual(
-            ips,
-            ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
-
-        ipsv6 = [str(x) for x in self.ipv6.subnet(2)]
-        self.assertEqual(
-            ipsv6,
-            ['2001:658:22a:cafe::/66',
-             '2001:658:22a:cafe:4000::/66',
-             '2001:658:22a:cafe:8000::/66',
-             '2001:658:22a:cafe:c000::/66'])
-
-    def test_subnet_fails_for_large_cidr_diff(self):
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv4.subnet, 9)
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv6.subnet,
-                          65)
-
-    def test_supernet_fails_for_large_cidr_diff(self):
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv4.supernet,
-                          25)
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv6.supernet,
-                          65)
-
-    def test_subnet_fails_for_negative_cidr_diff(self):
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv4.subnet,
-                          -1)
-        self.assertRaises(ipaddr.PrefixlenDiffInvalidError, self.ipv6.subnet,
-                          -1)
-
-    def test_get_num_hosts(self):
-        self.assertEqual(self.ipv4.numhosts, 256)
-        self.assertEqual(self.ipv4.subnet()[0].numhosts, 128)
-        self.assertEqual(self.ipv4.supernet().numhosts, 512)
-
-        self.assertEqual(self.ipv6.numhosts, 18446744073709551616)
-        self.assertEqual(self.ipv6.subnet()[0].numhosts, 9223372036854775808)
-        self.assertEqual(self.ipv6.supernet().numhosts, 36893488147419103232)
-
-    def test_contains(self):
-        self.assertTrue(ipaddr.IPv4('1.2.3.128/25') in self.ipv4)
-        self.assertFalse(ipaddr.IPv4('1.2.4.1/24') in self.ipv4)
-        self.assertFalse(self.ipv4 in self.ipv6)
-        self.assertFalse(self.ipv6 in self.ipv4)
-        self.assertTrue(self.ipv4 in self.ipv4)
-        self.assertTrue(self.ipv6 in self.ipv6)
-
-    def test_bad_address(self):
-        self.assertRaises(ipaddr.IPv4IpValidationError, ipaddr.IPv4, 'poop')
-        self.assertRaises(ipaddr.IPv4IpValidationError,
-                          ipaddr.IPv4, '1.2.3.256')
-
-        self.assertRaises(ipaddr.IPv6IpValidationError, ipaddr.IPv6, 'poopv6')
-        self.assertRaises(ipaddr.IPv4IpValidationError,
-                          ipaddr.IPv4, '1.2.3.4/32/24')
-
-    def test_bad_net_mask(self):
-        self.assertRaises(ipaddr.IPv4NetmaskValidationError,
-                          ipaddr.IPv4, '1.2.3.4/')
-        self.assertRaises(ipaddr.IPv4NetmaskValidationError,
-                          ipaddr.IPv4, '1.2.3.4/33')
-        self.assertRaises(ipaddr.IPv4NetmaskValidationError,
-                          ipaddr.IPv4, '1.2.3.4/254.254.255.256')
-
-        self.assertRaises(ipaddr.IPv6NetmaskValidationError,
-                          ipaddr.IPv6, '::1/')
-        self.assertRaises(ipaddr.IPv6NetmaskValidationError,
-                          ipaddr.IPv6, '::1/129')
-
-    def test_nth(self):
-        self.assertEqual(self.ipv4[5], '1.2.3.5')
-        self.assertRaises(IndexError, self.ipv4.__getitem__, 256)
-
-        self.assertEqual(self.ipv6[5],
-                         '2001:658:22a:cafe::5')
-
-    def test_getitem(self):
-        # http://code.google.com/p/ipaddr-py/issues/detail?id=15
-        addr = ipaddr.IPv4('172.31.255.128/255.255.255.240')
-        self.assertEqual(28, addr.prefixlen)
-        addr_list = list(addr)
-        self.assertEqual('172.31.255.128', addr_list[0])
-        self.assertEqual('172.31.255.128', addr[0])
-        self.assertEqual('172.31.255.143', addr_list[-1])
-        self.assertEqual('172.31.255.143', addr[-1])
-        self.assertEqual(addr_list[-1], addr[-1])
-
-    def test_equals(self):
-        self.assertTrue(self.ipv4 == ipaddr.IPv4('1.2.3.4/24'))
-        self.assertFalse(self.ipv4 == ipaddr.IPv4('1.2.3.4/23'))
-        self.assertFalse(self.ipv4 == ipaddr.IPv4('1.2.3.5/24'))
-        self.assertFalse(self.ipv4 == ipaddr.IPv6('::1.2.3.4/24'))
-        self.assertFalse(self.ipv4 == '')
-        self.assertFalse(self.ipv4 == [])
-        self.assertFalse(self.ipv4 == 2)
-
-        self.assertTrue(self.ipv6 ==
-            ipaddr.IPv6('2001:658:22a:cafe:200::1/64'))
-        self.assertFalse(self.ipv6 ==
-            ipaddr.IPv6('2001:658:22a:cafe:200::1/63'))
-        self.assertFalse(self.ipv6 ==
-            ipaddr.IPv6('2001:658:22a:cafe:200::2/64'))
-        self.assertFalse(self.ipv6 == ipaddr.IPv4('1.2.3.4/23'))
-        self.assertFalse(self.ipv6 == '')
-        self.assertFalse(self.ipv6 == [])
-        self.assertFalse(self.ipv6 == 2)
-
-    def test_not_equals(self):
-        self.assertFalse(self.ipv4 != ipaddr.IPv4('1.2.3.4/24'))
-        self.assertTrue(self.ipv4 != ipaddr.IPv4('1.2.3.4/23'))
-        self.assertTrue(self.ipv4 != ipaddr.IPv4('1.2.3.5/24'))
-        self.assertTrue(self.ipv4 != ipaddr.IPv6('::1.2.3.4/24'))
-        self.assertTrue(self.ipv4 != '')
-        self.assertTrue(self.ipv4 != [])
-        self.assertTrue(self.ipv4 != 2)
-
-        self.assertFalse(self.ipv6 !=
-            ipaddr.IPv6('2001:658:22a:cafe:200::1/64'))
-        self.assertTrue(self.ipv6 !=
-            ipaddr.IPv6('2001:658:22a:cafe:200::1/63'))
-        self.assertTrue(self.ipv6 !=
-            ipaddr.IPv6('2001:658:22a:cafe:200::2/64'))
-        self.assertTrue(self.ipv6 != ipaddr.IPv4('1.2.3.4/23'))
-        self.assertTrue(self.ipv6 != '')
-        self.assertTrue(self.ipv6 != [])
-        self.assertTrue(self.ipv6 != 2)
-
-    def test_slash32_constructor(self):
-        self.assertEquals(str(ipaddr.IPv4('1.2.3.4/255.255.255.255')),
-                          '1.2.3.4/32')
-
-    def test_slash128_constructor(self):
-        self.assertEquals(str(ipaddr.IPv6('::1/128')),
-                                  '::1/128')
-
-    def test_slash0_constructor(self):
-        self.assertEquals(str(ipaddr.IPv4('1.2.3.4/0.0.0.0')), '1.2.3.4/0')
-
-    def test_collapsing(self):
-        ip1 = ipaddr.IPv4('1.1.0.0/24')
-        ip2 = ipaddr.IPv4('1.1.1.0/24')
-        ip3 = ipaddr.IPv4('1.1.2.0/24')
-        ip4 = ipaddr.IPv4('1.1.3.0/24')
-        ip5 = ipaddr.IPv4('1.1.4.0/24')
-        # stored in no particular order b/c we want CollapseAddr to call [].sort
-        ip6 = ipaddr.IPv4('1.1.0.0/22')
-        # check that addreses are subsumed properlly.
-        collapsed = ipaddr.collapse_address_list([ip1, ip2, ip3, ip4, ip5, ip6])
-        self.assertEqual(collapsed, [ipaddr.IPv4('1.1.0.0/22'),
-                                     ipaddr.IPv4('1.1.4.0/24')])
-        # test that two addresses are supernet'ed properlly
-        collapsed = ipaddr.collapse_address_list([ip1, ip2])
-        self.assertEqual(collapsed, [ipaddr.IPv4('1.1.0.0/23')])
-
-        ip_same1 = ip_same2 = ipaddr.IPv4('1.1.1.1/32')
-        self.assertEqual(ipaddr.collapse_address_list([ip_same1, ip_same2]),
-                         [ip_same1])
-        ip1 = ipaddr.IPv6('::2001:1/100')
-        ip2 = ipaddr.IPv6('::2002:1/120')
-        ip3 = ipaddr.IPv6('::2001:1/96')
-        # test that ipv6 addresses are subsumed properly.
-        collapsed = ipaddr.collapse_address_list([ip1, ip2, ip3])
-        self.assertEqual(collapsed, [ip3])
-
-    def test_network_comparison(self):
-        # ip1 and ip2 have the same network address
-        ip1 = ipaddr.IPv4('1.1.1.0/24')
-        ip2 = ipaddr.IPv4('1.1.1.1/24')
-        ip3 = ipaddr.IPv4('1.1.2.0/24')
-
-        self.assertTrue(ip1 < ip3)
-        self.assertTrue(ip3 > ip2)
-
-        self.assertEquals(ip1.compare_networks(ip2), 0)
-        self.assertTrue(ip1._get_networks_key() == ip2._get_networks_key())
-        self.assertEquals(ip1.compare_networks(ip3), -1)
-        self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
-
-        ip1 = ipaddr.IPv6('2001::2000/96')
-        ip2 = ipaddr.IPv6('2001::2001/96')
-        ip3 = ipaddr.IPv6('2001:ffff::2000/96')
-
-        self.assertTrue(ip1 < ip3)
-        self.assertTrue(ip3 > ip2)
-        self.assertEquals(ip1.compare_networks(ip2), 0)
-        self.assertTrue(ip1._get_networks_key() == ip2._get_networks_key())
-        self.assertEquals(ip1.compare_networks(ip3), -1)
-        self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
-
-        # Test comparing different protocols
-        ipv6 = ipaddr.IPv6('::/0')
-        ipv4 = ipaddr.IPv4('0.0.0.0/0')
-        self.assertTrue(ipv6 > ipv4)
-        self.assertTrue(ipv4 < ipv6)
-
-        # Regression test for issue6169 (ipaddr-py issue 19)
-        ip1 = ipaddr.IP('10.1.2.128/25')
-        self.assertFalse(ip1 < ip1)
-        self.assertFalse(ip1 > ip1)
-        ip2 = ipaddr.IP('10.1.3.0/24')
-        self.assertTrue(ip1 < ip2)
-        self.assertFalse(ip2 < ip1)
-        self.assertFalse(ip1 > ip2)
-        self.assertTrue(ip2 > ip1)
-        ip3 = ipaddr.IP('10.1.3.0/25')
-        self.assertTrue(ip2 < ip3)
-        self.assertFalse(ip3 < ip2)
-        self.assertFalse(ip2 > ip3)
-        self.assertTrue(ip3 > ip2)
-
-        # Confirm that relative comparisons to the wrong type fail properly.
-        self.assertRaises(TypeError, lambda: ipv4 < '')
-        self.assertRaises(TypeError, lambda: ipv4 > '')
-        self.assertRaises(TypeError, lambda: ipv4 >= '')
-        self.assertRaises(TypeError, lambda: ipv4 <= '')
-        self.assertRaises(TypeError, lambda: ipv6 < '')
-        self.assertRaises(TypeError, lambda: ipv6 > '')
-        self.assertRaises(TypeError, lambda: ipv6 >= '')
-        self.assertRaises(TypeError, lambda: ipv6 <= '')
-
-    def test_embedded_ipv4(self):
-        ipv4_string = '192.168.0.1'
-        ipv4 = ipaddr.IPv4(ipv4_string)
-        v4compat_ipv6 = ipaddr.IPv6('::%s' % ipv4_string)
-        self.assertEquals(v4compat_ipv6.ip, ipv4.ip)
-        v4mapped_ipv6 = ipaddr.IPv6('::ffff:%s' % ipv4_string)
-        self.assertNotEquals(v4mapped_ipv6.ip, ipv4.ip)
-        self.assertRaises(ipaddr.IPv6IpValidationError, ipaddr.IPv6,
-                          '2001:1.1.1.1:1.1.1.1')
-
-    def test_ip_version(self):
-        self.assertEqual(self.ipv4.version, 4)
-        self.assertEqual(self.ipv6.version, 6)
-
-    def test_packed(self):
-        self.assertEqual(self.ipv4.packed,
-                         b'\x01\x02\x03\x04')
-        self.assertEqual(ipaddr.IPv4('255.254.253.252').packed,
-                         b'\xff\xfe\xfd\xfc')
-        self.assertEqual(self.ipv6.packed,
-                         b'\x20\x01\x06\x58\x02\x2a\xca\xfe' +
-                         b'\x02\x00\x00\x00\x00\x00\x00\x01')
-        self.assertEqual(ipaddr.IPv6('ffff:2:3:4:ffff::').packed,
-                         b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
-                            + b'\x00' * 6)
-        self.assertEqual(ipaddr.IPv6('::1:0:0:0:0').packed,
-                         b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
-
-    def test_ip_str_from_prefixlen(self):
-        ipv4 = ipaddr.IPv4('1.2.3.4/24')
-        self.assertEquals(ipv4._ip_string_from_prefix(), '255.255.255.0')
-        self.assertEquals(ipv4._ip_string_from_prefix(28), '255.255.255.240')
-
-    def test_ip_type(self):
-        ipv4 = ipaddr.IP('1.2.3.4')
-        ipv6 = ipaddr.IP('::1.2.3.4')
-        self.assertEquals(ipaddr.IPv4, type(ipv4))
-        self.assertEquals(ipaddr.IPv6, type(ipv6))
-
-    def test_reserved_ipv4(self):
-        self.assertEquals(True, ipaddr.IP('224.1.1.1/31').is_multicast)
-        self.assertEquals(False, ipaddr.IP('240.0.0.0').is_multicast)
-
-        self.assertEquals(True, ipaddr.IP('192.168.1.1/17').is_private)
-        self.assertEquals(False, ipaddr.IP('192.169.0.0').is_private)
-        self.assertEquals(True, ipaddr.IP('10.255.255.255').is_private)
-        self.assertEquals(False, ipaddr.IP('11.0.0.0').is_private)
-        self.assertEquals(True, ipaddr.IP('172.31.255.255').is_private)
-        self.assertEquals(False, ipaddr.IP('172.32.0.0').is_private)
-
-        self.assertEquals(True, ipaddr.IP('169.254.100.200/24').is_link_local)
-        self.assertEquals(False, ipaddr.IP('169.255.100.200/24').is_link_local)
-
-        self.assertEquals(True, ipaddr.IP('127.100.200.254/32').is_loopback)
-        self.assertEquals(True, ipaddr.IP('127.42.0.0/16').is_loopback)
-        self.assertEquals(False, ipaddr.IP('128.0.0.0').is_loopback)
-
-    def test_reserved_ipv6(self):
-        ip = ipaddr.IP
-
-        self.assertEquals(True, ip('ffff::').is_multicast)
-        self.assertEquals(True, ip(2**128-1).is_multicast)
-        self.assertEquals(True, ip('ff00::').is_multicast)
-        self.assertEquals(False, ip('fdff::').is_multicast)
-
-        self.assertEquals(True, ip('fecf::').is_site_local)
-        self.assertEquals(True, ip('feff:ffff:ffff:ffff::').is_site_local)
-        self.assertEquals(False, ip('fbf:ffff::').is_site_local)
-        self.assertEquals(False, ip('ff00::').is_site_local)
-
-        self.assertEquals(True, ip('fc00::').is_private)
-        self.assertEquals(True, ip('fc00:ffff:ffff:ffff::').is_private)
-        self.assertEquals(False, ip('fbff:ffff::').is_private)
-        self.assertEquals(False, ip('fe00::').is_private)
-
-        self.assertEquals(True, ip('fea0::').is_link_local)
-        self.assertEquals(True, ip('febf:ffff::').is_link_local)
-        self.assertEquals(False, ip('fe7f:ffff::').is_link_local)
-        self.assertEquals(False, ip('fec0::').is_link_local)
-
-        self.assertEquals(True, ip('0:0::0:01').is_loopback)
-        self.assertEquals(False, ip('::1/127').is_loopback)
-        self.assertEquals(False, ip('::').is_loopback)
-        self.assertEquals(False, ip('::2').is_loopback)
-
-        self.assertEquals(True, ip('0::0').is_unspecified)
-        self.assertEquals(False, ip('::1').is_unspecified)
-        self.assertEquals(False, ip('::/127').is_unspecified)
-
-    def test_addr_exclude(self):
-        addr1 = ipaddr.IP('10.1.1.0/24')
-        addr2 = ipaddr.IP('10.1.1.0/26')
-        addr3 = ipaddr.IP('10.2.1.0/24')
-        self.assertEqual(addr1.address_exclude(addr2),
-                         [ipaddr.IP('10.1.1.64/26'),
-                          ipaddr.IP('10.1.1.128/25')])
-        self.assertRaises(ValueError, addr1.address_exclude, addr3)
-
-    def test_hash(self):
-        self.assertEquals(hash(ipaddr.IP('10.1.1.0/24')),
-                          hash(ipaddr.IP('10.1.1.0/24')))
-        dummy = {}
-        dummy[self.ipv4] = None
-        dummy[self.ipv6] = None
-        self.assertTrue(self.ipv4 in dummy)
-
-    def test_ipv4_prefix_from_int(self):
-        addr1 = ipaddr.IP('10.1.1.0/24')
-        addr2 = ipaddr.IPv4(addr1.ip)  # clone prefix
-        addr2.prefixlen = addr1.prefixlen
-        addr3 = ipaddr.IP(123456)
-
-        self.assertEqual(123456, addr3.ip)
-        self.assertRaises(ipaddr.IPv4NetmaskValidationError,
-                          addr2._set_prefix, -1)
-        self.assertEqual(addr1, addr2)
-        self.assertEqual(str(addr1), str(addr2))
-
-    def test_ipv6_prefix_from_int(self):
-        addr1 = ipaddr.IP('2001:0658:022a:cafe:0200::1/64')
-        addr2 = ipaddr.IPv6(addr1.ip)  # clone prefix
-        addr2.prefixlen = addr1.prefixlen
-        addr3 = ipaddr.IP(123456)
-
-        self.assertEqual(123456, addr3.ip)
-        self.assertRaises(ipaddr.IPv6NetmaskValidationError,
-                          addr2._set_prefix, -1)
-        self.assertEqual(addr1, addr2)
-        self.assertEqual(str(addr1), str(addr2))
-
-    def test_copy_constructor(self):
-        addr1 = ipaddr.IP('10.1.1.0/24')
-        addr2 = ipaddr.IP(addr1)
-        addr3 = ipaddr.IP('2001:658:22a:cafe:200::1/64')
-        addr4 = ipaddr.IP(addr3)
-
-        self.assertEqual(addr1, addr2)
-        self.assertEqual(addr3, addr4)
-
-    def test_compress_ipv6_address(self):
-        test_addresses = {
-            '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
-            '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
-            '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
-            '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
-            '2001:0::3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
-            '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
-            '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
-            '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
-            '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
-            '0:0:0:0:0:0:0:0': '::/128',
-            '0:0:0:0:0:0:0:0/0': '::/0',
-            '0:0:0:0:0:0:0:1': '::1/128',
-            '2001:0658:022a:cafe:0000:0000:0000:0000/66':
-            '2001:658:22a:cafe::/66',
-            }
-        for uncompressed, compressed in test_addresses.items():
-            self.assertEquals(compressed, str(ipaddr.IPv6(uncompressed)))
-
-    def test_explode_short_hand_ip_str(self):
-        addr1 = ipaddr.IPv6('2001::1')
-        self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001',
-                         addr1._explode_shorthand_ip_string(addr1.ip_ext))
-
-    def test_int_representation(self):
-        self.assertEqual(16909060, int(self.ipv4))
-        self.assertEqual(42540616829182469433547762482097946625, int(self.ipv6))
-
-    def test_hex_representation(self):
-        self.assertEqual(hex(0x1020304), hex(self.ipv4))
-
-        self.assertEqual(hex(0x20010658022ACAFE0200000000000001),
-                         hex(self.ipv6))
-
-
-if __name__ == '__main__':
-    support.run_unittest(IpaddrUnitTest)
-    support.run_doctest(ipaddr, True)
diff --git a/Misc/NEWS b/Misc/NEWS
index 27e9c84..d540c9c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@
 Library
 -------
 
+- Removed the ipaddr module.
+
 - Issue #3613: base64.{encode,decode}string are now called
   base64.{encode,decode}bytes which reflects what type they accept and return.
   The old names are still there as deprecated aliases.
