diff --git a/Lib/distutils/archive_util.py b/Lib/distutils/archive_util.py
index 4c5641b..58d9a06 100644
--- a/Lib/distutils/archive_util.py
+++ b/Lib/distutils/archive_util.py
@@ -31,7 +31,7 @@
     compress_ext = { 'gzip': ".gz",
                      'bzip2': '.bz2',
                      'compress': ".Z" }
-    
+
     # flags for compression program, each element of list will be an argument
     compress_flags = {'gzip': ["-f9"],
                       'compress': ["-f"],
@@ -85,7 +85,7 @@
             import zipfile
         except ImportError:
             raise DistutilsExecError, \
-                  ("unable to create zip file '%s': " + 
+                  ("unable to create zip file '%s': " +
                    "could neither find a standalone zip utility nor " +
                    "import the 'zipfile' module") % zip_filename
 
@@ -152,7 +152,7 @@
 
     kwargs = { 'verbose': verbose,
                'dry_run': dry_run }
-    
+
     try:
         format_info = ARCHIVE_FORMATS[format]
     except KeyError:
diff --git a/Lib/distutils/bcppcompiler.py b/Lib/distutils/bcppcompiler.py
index 5c0fae8..9ebba2d 100644
--- a/Lib/distutils/bcppcompiler.py
+++ b/Lib/distutils/bcppcompiler.py
@@ -102,7 +102,7 @@
             compile_opts.extend (self.compile_options_debug)
         else:
             compile_opts.extend (self.compile_options)
-        
+
         for i in range (len (sources)):
             src = sources[i] ; obj = objects[i]
             ext = (os.path.splitext (src))[1]
@@ -130,11 +130,11 @@
                     input_opt = ""
                 elif ext in self._cpp_extensions:
                     input_opt = "-P"
-                else: 
+                else:
                     # Unknown file type -- no extra options.  The compiler
                     # will probably fail, but let it just in case this is a
                     # file the compiler recognizes even if we don't.
-                    input_opt = ""                              
+                    input_opt = ""
 
                 output_opt = "-o" + obj
 
@@ -174,17 +174,17 @@
             if extra_postargs:
                 lib_args.extend (extra_postargs)
             try:
-               self.spawn ([self.lib] + lib_args)
+                self.spawn ([self.lib] + lib_args)
             except DistutilsExecError, msg:
-               raise LibError, msg
+                raise LibError, msg
         else:
             self.announce ("skipping %s (up-to-date)" % output_filename)
 
     # create_static_lib ()
-    
-    
+
+
     def link (self,
-              target_desc,        
+              target_desc,
               objects,
               output_filename,
               output_dir=None,
@@ -254,14 +254,14 @@
                     resources.append(file)
                 else:
                     objects.append(file)
-            
-            
+
+
             for l in library_dirs:
-                ld_args.append("/L%s" % os.path.normpath(l)) 
+                ld_args.append("/L%s" % os.path.normpath(l))
             ld_args.append("/L.") # we sometimes use relative paths
 
-            # list of object files                
-            ld_args.extend(objects)     
+            # list of object files
+            ld_args.extend(objects)
 
             # XXX the command-line syntax for Borland C++ is a bit wonky;
             # certain filenames are jammed together in one big string, but
@@ -275,11 +275,11 @@
 
             # name of dll/exe file
             ld_args.extend([',',output_filename])
-            # no map file and start libraries 
+            # no map file and start libraries
             ld_args.append(',,')
 
             for lib in libraries:
-                # see if we find it and if there is a bcpp specific lib 
+                # see if we find it and if there is a bcpp specific lib
                 # (xxx_bcpp.lib)
                 libfile = self.find_library_file(library_dirs, lib, debug)
                 if libfile is None:
@@ -300,7 +300,7 @@
             ld_args.append(',')
             ld_args.extend(resources)
 
-            
+
             if extra_preargs:
                 ld_args[:0] = extra_preargs
             if extra_postargs:
diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py
index 4efd934..21bf0c17 100644
--- a/Lib/distutils/ccompiler.py
+++ b/Lib/distutils/ccompiler.py
@@ -61,7 +61,7 @@
     #     different versions of libfoo.a in different locations.  I
     #     think this is useless without the ability to null out the
     #     library search path anyways.
-    
+
 
     # Subclasses that rely on the standard filename generation methods
     # implemented below should override these; see the comment near
@@ -159,7 +159,7 @@
             setattr(self, key, split_quoted(value))
         else:
             setattr(self, key, value)
-        
+
 
 
     def _find_macro (self, name):
@@ -352,7 +352,7 @@
         else:
             raise TypeError, \
                   "'include_dirs' (if supplied) must be a list of strings"
-                    
+
         return (output_dir, macros, include_dirs)
 
     # _fix_compile_args ()
@@ -364,7 +364,7 @@
         list of all object files and a dictionary telling which source
         files can be skipped.
         """
-        # Get the list of expected output (object) files 
+        # Get the list of expected output (object) files
         objects = self.object_filenames (sources,
                                          strip_dir=1,
                                          output_dir=output_dir)
@@ -401,7 +401,7 @@
             raise TypeError, \
                   "'objects' must be a list or tuple of strings"
         objects = list (objects)
-            
+
         if output_dir is None:
             output_dir = self.output_dir
         elif type (output_dir) is not StringType:
@@ -560,7 +560,7 @@
         Raises LibError on failure.
         """
         pass
-    
+
 
     # values for target_desc parameter in link()
     SHARED_OBJECT = "shared_object"
@@ -621,7 +621,7 @@
         """
         raise NotImplementedError
 
-    
+
     # Old 'link_*()' methods, rewritten to use the new 'link()' method.
 
     def link_shared_lib (self,
@@ -636,13 +636,13 @@
                          extra_preargs=None,
                          extra_postargs=None,
                          build_temp=None):
-        self.link(CCompiler.SHARED_LIBRARY, objects, 
+        self.link(CCompiler.SHARED_LIBRARY, objects,
                   self.library_filename(output_libname, lib_type='shared'),
                   output_dir,
                   libraries, library_dirs, runtime_library_dirs,
                   export_symbols, debug,
                   extra_preargs, extra_postargs, build_temp)
-    
+
 
     def link_shared_object (self,
                             objects,
@@ -673,9 +673,9 @@
                          debug=0,
                          extra_preargs=None,
                          extra_postargs=None):
-        self.link(CCompiler.EXECUTABLE, objects, 
+        self.link(CCompiler.EXECUTABLE, objects,
                   self.executable_filename(output_progname), output_dir,
-                  libraries, library_dirs, runtime_library_dirs, None, 
+                  libraries, library_dirs, runtime_library_dirs, None,
                   debug, extra_preargs, extra_postargs, None)
 
 
@@ -846,12 +846,12 @@
     # on a cygwin built python we can use gcc like an ordinary UNIXish
     # compiler
     ('cygwin.*', 'unix'),
-    
+
     # OS name mappings
     ('posix', 'unix'),
     ('nt', 'msvc'),
     ('mac', 'mwerks'),
-    
+
     )
 
 def get_default_compiler(osname=None, platform=None):
@@ -901,7 +901,7 @@
     # XXX this "knows" that the compiler option it's describing is
     # "--compiler", which just happens to be the case for the three
     # commands that use it.
-    from distutils.fancy_getopt import FancyGetopt 
+    from distutils.fancy_getopt import FancyGetopt
     compilers = []
     for compiler in compiler_class.keys():
         compilers.append(("compiler="+compiler, None,
@@ -909,7 +909,7 @@
     compilers.sort()
     pretty_printer = FancyGetopt(compilers)
     pretty_printer.print_help("List of available compilers:")
-    
+
 
 def new_compiler (plat=None,
                   compiler=None,
@@ -932,14 +932,14 @@
     try:
         if compiler is None:
             compiler = get_default_compiler(plat)
-        
+
         (module_name, class_name, long_description) = compiler_class[compiler]
     except KeyError:
         msg = "don't know how to compile C/C++ code on platform '%s'" % plat
         if compiler is not None:
             msg = msg + " with '%s' compiler" % compiler
         raise DistutilsPlatformError, msg
-              
+
     try:
         module_name = "distutils." + module_name
         __import__ (module_name)
diff --git a/Lib/distutils/cmd.py b/Lib/distutils/cmd.py
index 85a7f46..65060d6 100644
--- a/Lib/distutils/cmd.py
+++ b/Lib/distutils/cmd.py
@@ -41,7 +41,7 @@
     # current situation.  (Eg. we "install_headers" is only applicable if
     # we have any C header files to install.)  If 'predicate' is None,
     # that command is always applicable.
-    # 
+    #
     # 'sub_commands' is usually defined at the *end* of a class, because
     # predicates can be unbound methods, so they must already have been
     # defined.  The canonical example is the "install" command.
@@ -111,7 +111,7 @@
         if not self.finalized:
             self.finalize_options()
         self.finalized = 1
-        
+
 
     # Subclasses must define:
     #   initialize_options()
@@ -133,12 +133,12 @@
         command-line.  Thus, this is not the place to code dependencies
         between options; generally, 'initialize_options()' implementations
         are just a bunch of "self.foo = None" assignments.
-           
+
         This method must be implemented by all command classes.
         """
         raise RuntimeError, \
               "abstract method -- subclass %s must override" % self.__class__
-        
+
     def finalize_options (self):
         """Set final values for all the options that this command supports.
         This is always called as late as possible, ie.  after any option
@@ -198,12 +198,12 @@
         if DEBUG:
             print msg
             sys.stdout.flush()
-        
+
 
 
     # -- Option validation methods -------------------------------------
     # (these are very handy in writing the 'finalize_options()' method)
-    # 
+    #
     # NB. the general philosophy here is to ensure that a particular option
     # value meets certain type and value constraints.  If not, we try to
     # force it into conformance (eg. if we expect a list but have a string,
@@ -252,7 +252,7 @@
                 raise DistutilsOptionError, \
                       "'%s' must be a list of strings (got %s)" % \
                       (option, `val`)
-        
+
     def _ensure_tested_string (self, option, tester,
                                what, error_fmt, default=None):
         val = self._ensure_stringlike(option, what, default)
@@ -382,7 +382,7 @@
         and force flags.
         """
         return dir_util.copy_tree(
-            infile, outfile, 
+            infile, outfile,
             preserve_mode,preserve_times,preserve_symlinks,
             not self.force,
             self.verbose >= level,
@@ -426,7 +426,7 @@
                        (outfile, string.join(infiles, ', '))
         if skip_msg is None:
             skip_msg = "skipping %s (inputs unchanged)" % outfile
-        
+
 
         # Allow 'infiles' to be a single string
         if type(infiles) is StringType:
@@ -459,7 +459,7 @@
     """Common base class for installing some files in a subdirectory.
     Currently used by install_data and install_scripts.
     """
-    
+
     user_options = [('install-dir=', 'd', "directory to install the files to")]
 
     def initialize_options (self):
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index 2aab7c4..97a741c 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -108,7 +108,7 @@
     # Find and parse the config file(s): they will override options from
     # the setup script, but be overridden by the command line.
     dist.parse_config_files()
-    
+
     if DEBUG:
         print "options (after parsing config files):"
         dist.dump_option_dicts()
@@ -146,7 +146,7 @@
                 raise
             else:
                 raise SystemExit, error
-            
+
         except (DistutilsExecError,
                 DistutilsFileError,
                 DistutilsOptionError,
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
index 07e1665..1d97282 100644
--- a/Lib/distutils/cygwinccompiler.py
+++ b/Lib/distutils/cygwinccompiler.py
@@ -18,28 +18,28 @@
 #
 #   see also http://starship.python.net/crew/kernr/mingw32/Notes.html
 #
-# * We put export_symbols in a def-file, and don't use 
+# * We put export_symbols in a def-file, and don't use
 #   --export-all-symbols because it doesn't worked reliable in some
 #   tested configurations. And because other windows compilers also
 #   need their symbols specified this no serious problem.
 #
 # tested configurations:
-#   
-# * cygwin gcc 2.91.57/ld 2.9.4/dllwrap 0.2.4 works 
+#
+# * cygwin gcc 2.91.57/ld 2.9.4/dllwrap 0.2.4 works
 #   (after patching python's config.h and for C++ some other include files)
 #   see also http://starship.python.net/crew/kernr/mingw32/Notes.html
-# * mingw32 gcc 2.95.2/ld 2.9.4/dllwrap 0.2.4 works 
-#   (ld doesn't support -shared, so we use dllwrap)   
+# * mingw32 gcc 2.95.2/ld 2.9.4/dllwrap 0.2.4 works
+#   (ld doesn't support -shared, so we use dllwrap)
 # * cygwin gcc 2.95.2/ld 2.10.90/dllwrap 2.10.90 works now
 #   - its dllwrap doesn't work, there is a bug in binutils 2.10.90
 #     see also http://sources.redhat.com/ml/cygwin/2000-06/msg01274.html
-#   - using gcc -mdll instead dllwrap doesn't work without -static because 
+#   - using gcc -mdll instead dllwrap doesn't work without -static because
 #     it tries to link against dlls instead their import libraries. (If
 #     it finds the dll first.)
-#     By specifying -static we force ld to link against the import libraries, 
-#     this is windows standard and there are normally not the necessary symbols 
+#     By specifying -static we force ld to link against the import libraries,
+#     this is windows standard and there are normally not the necessary symbols
 #     in the dlls.
-#   *** only the version of June 2000 shows these problems 
+#   *** only the version of June 2000 shows these problems
 
 # created 2000/05/05, Rene Liebscher
 
@@ -60,7 +60,7 @@
     static_lib_format = "lib%s%s"
     shared_lib_format = "%s%s"
     exe_extension = ".exe"
-   
+
     def __init__ (self,
                   verbose=0,
                   dry_run=0,
@@ -76,20 +76,20 @@
                 "Python's pyconfig.h doesn't seem to support your compiler.  " +
                 ("Reason: %s." % details) +
                 "Compiling may fail because of undefined preprocessor macros.")
-        
+
         (self.gcc_version, self.ld_version, self.dllwrap_version) = \
             get_versions()
         self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" %
-                         (self.gcc_version, 
-                          self.ld_version, 
+                         (self.gcc_version,
+                          self.ld_version,
                           self.dllwrap_version) )
 
-        # ld_version >= "2.10.90" should also be able to use 
+        # ld_version >= "2.10.90" should also be able to use
         # gcc -mdll instead of dllwrap
-        # Older dllwraps had own version numbers, newer ones use the 
+        # Older dllwraps had own version numbers, newer ones use the
         # same as the rest of binutils ( also ld )
         # dllwrap 2.10.90 is buggy
-        if self.ld_version >= "2.10.90": 
+        if self.ld_version >= "2.10.90":
             self.linker_dll = "gcc"
         else:
             self.linker_dll = "dllwrap"
@@ -102,22 +102,22 @@
                              linker_so=('%s -mcygwin -mdll -static' %
                                         self.linker_dll))
 
-        # cygwin and mingw32 need different sets of libraries 
+        # cygwin and mingw32 need different sets of libraries
         if self.gcc_version == "2.91.57":
             # cygwin shouldn't need msvcrt, but without the dlls will crash
             # (gcc version 2.91.57) -- perhaps something about initialization
             self.dll_libraries=["msvcrt"]
-            self.warn( 
+            self.warn(
                 "Consider upgrading to a newer version of gcc")
         else:
             self.dll_libraries=[]
-        
+
     # __init__ ()
 
     # not much different of the compile method in UnixCCompiler,
     # but we have to insert some lines in the middle of it, so
     # we put here a adapted version of it.
-    # (If we would call compile() in the base class, it would do some 
+    # (If we would call compile() in the base class, it would do some
     # initializations a second time, this is why all is done here.)
     def compile (self,
                  sources,
@@ -143,7 +143,7 @@
             extra_postargs = []
 
         # Compile all source files that weren't eliminated by
-        # '_prep_compile()'.        
+        # '_prep_compile()'.
         for i in range (len (sources)):
             src = sources[i] ; obj = objects[i]
             ext = (os.path.splitext (src))[1]
@@ -157,7 +157,7 @@
                         self.spawn (["windres","-i",src,"-o",obj])
                     except DistutilsExecError, msg:
                         raise CompileError, msg
-                else: # for other files use the C-compiler 
+                else: # for other files use the C-compiler
                     try:
                         self.spawn (self.compiler_so + cc_args +
                                 [src, '-o', obj] +
@@ -184,12 +184,12 @@
               extra_preargs=None,
               extra_postargs=None,
               build_temp=None):
-        
+
         # use separate copies, so we can modify the lists
         extra_preargs = copy.copy(extra_preargs or [])
         libraries = copy.copy(libraries or [])
         objects = copy.copy(objects or [])
-                
+
         # Additional libraries
         libraries.extend(self.dll_libraries)
 
@@ -199,10 +199,10 @@
             (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
             # (The linker doesn't do anything if output is up-to-date.
             # So it would probably better to check if we really need this,
-            # but for this we had to insert some unchanged parts of 
-            # UnixCCompiler, and this is not what we want.) 
+            # but for this we had to insert some unchanged parts of
+            # UnixCCompiler, and this is not what we want.)
 
-            # we want to put some files in the same directory as the 
+            # we want to put some files in the same directory as the
             # object files are, build_temp doesn't help much
             # where are the object files
             temp_dir = os.path.dirname(objects[0])
@@ -214,7 +214,7 @@
             def_file = os.path.join(temp_dir, dll_name + ".def")
             exp_file = os.path.join(temp_dir, dll_name + ".exp")
             lib_file = os.path.join(temp_dir, 'lib' + dll_name + ".a")
-       
+
             # Generate .def file
             contents = [
                 "LIBRARY %s" % os.path.basename(output_filename),
@@ -237,21 +237,21 @@
             else:
                 # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
                 #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
-                # for gcc/ld the def-file is specified as any other object files    
+                # for gcc/ld the def-file is specified as any other object files
                 objects.append(def_file)
 
         #end: if ((export_symbols is not None) and
         #        (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
-                                                 
+
         # who wants symbols and a many times larger output file
-        # should explicitly switch the debug mode on 
+        # should explicitly switch the debug mode on
         # otherwise we let dllwrap/ld strip the output file
-        # (On my machine: 10KB < stripped_file < ??100KB 
+        # (On my machine: 10KB < stripped_file < ??100KB
         #   unstripped_file = stripped_file + XXX KB
-        #  ( XXX=254 for a typical python extension)) 
-        if not debug: 
-            extra_preargs.append("-s") 
-        
+        #  ( XXX=254 for a typical python extension))
+        if not debug:
+            extra_preargs.append("-s")
+
         UnixCCompiler.link(self,
                            target_desc,
                            objects,
@@ -265,7 +265,7 @@
                            extra_preargs,
                            extra_postargs,
                            build_temp)
-        
+
     # link ()
 
     # -- Miscellaneous methods -----------------------------------------
@@ -288,7 +288,7 @@
                 base = os.path.basename (base)
             if ext == '.res' or ext == '.rc':
                 # these need to be compiled to object files
-                obj_names.append (os.path.join (output_dir, 
+                obj_names.append (os.path.join (output_dir,
                                             base + ext + self.obj_extension))
             else:
                 obj_names.append (os.path.join (output_dir,
@@ -311,7 +311,7 @@
                   force=0):
 
         CygwinCCompiler.__init__ (self, verbose, dry_run, force)
-        
+
         # A real mingw32 doesn't need to specify a different entry point,
         # but cygwin 2.91.57 in no-cygwin-mode needs it.
         if self.gcc_version <= "2.91.57":
@@ -322,15 +322,15 @@
         self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
                              compiler_so='gcc -mno-cygwin -mdll -O -Wall',
                              linker_exe='gcc -mno-cygwin',
-                             linker_so='%s -mno-cygwin -mdll -static %s' 
+                             linker_so='%s -mno-cygwin -mdll -static %s'
                                         % (self.linker_dll, entry_point))
         # Maybe we should also append -mthreads, but then the finished
         # dlls need another dll (mingwm10.dll see Mingw32 docs)
-        # (-mthreads: Support thread-safe exception handling on `Mingw32')       
-        
-        # no additional libraries needed 
+        # (-mthreads: Support thread-safe exception handling on `Mingw32')
+
+        # no additional libraries needed
         self.dll_libraries=[]
-        
+
     # __init__ ()
 
 # class Mingw32CCompiler
@@ -370,15 +370,15 @@
     # GCC, and the pyconfig.h file should be OK
     if string.find(sys.version,"GCC") >= 0:
         return (CONFIG_H_OK, "sys.version mentions 'GCC'")
-    
+
     fn = sysconfig.get_config_h_filename()
     try:
         # It would probably better to read single lines to search.
-        # But we do this only once, and it is fast enough 
+        # But we do this only once, and it is fast enough
         f = open(fn)
         s = f.read()
         f.close()
-        
+
     except IOError, exc:
         # if we can't read this file, we cannot say it is wrong
         # the compiler will complain later about this file as missing
@@ -401,7 +401,7 @@
     from distutils.version import StrictVersion
     from distutils.spawn import find_executable
     import re
-        
+
     gcc_exe = find_executable('gcc')
     if gcc_exe:
         out = os.popen(gcc_exe + ' -dumpversion','r')
@@ -439,4 +439,3 @@
     else:
         dllwrap_version = None
     return (gcc_version, ld_version, dllwrap_version)
-
diff --git a/Lib/distutils/dep_util.py b/Lib/distutils/dep_util.py
index 4b93ed0..9edba4c 100644
--- a/Lib/distutils/dep_util.py
+++ b/Lib/distutils/dep_util.py
@@ -70,7 +70,7 @@
     # If the target doesn't even exist, then it's definitely out-of-date.
     if not os.path.exists(target):
         return 1
-   
+
     # Otherwise we have to find out the hard way: if *any* source file
     # is more recent than 'target', then 'target' is out-of-date and
     # we can immediately return true.  If we fall through to the end
@@ -80,12 +80,12 @@
     for source in sources:
         if not os.path.exists(source):
             if missing == 'error':      # blow up when we stat() the file
-                pass                    
-            elif missing == 'ignore':   # missing source dropped from 
+                pass
+            elif missing == 'ignore':   # missing source dropped from
                 continue                #  target's dependency list
             elif missing == 'newer':    # missing source means target is
                 return 1                #  out-of-date
-            
+
         source_mtime = os.stat(source)[ST_MTIME]
         if source_mtime > target_mtime:
             return 1
diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py
index a1578be..77007c9 100644
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -49,7 +49,7 @@
 
     (head, tail) = os.path.split(name)
     tails = [tail]                      # stack of lone dirs to create
-    
+
     while head and tail and not os.path.isdir(head):
         #print "splitting '%s': " % head,
         (head, tail) = os.path.split(head)
@@ -140,7 +140,7 @@
 
     if not dry_run and not os.path.isdir(src):
         raise DistutilsFileError, \
-              "cannot copy tree '%s': not a directory" % src    
+              "cannot copy tree '%s': not a directory" % src
     try:
         names = os.listdir(src)
     except os.error, (errno, errstr):
@@ -166,7 +166,7 @@
             if not dry_run:
                 os.symlink(link_dest, dst_name)
             outputs.append(dst_name)
-            
+
         elif os.path.isdir(src_name):
             outputs.extend(
                 copy_tree(src_name, dst_name,
diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py
index d5bfa05..b648f24 100644
--- a/Lib/distutils/dist.py
+++ b/Lib/distutils/dist.py
@@ -97,7 +97,7 @@
 
 
     # -- Creation/initialization methods -------------------------------
-    
+
     def __init__ (self, attrs=None):
         """Construct a new Distribution instance: initialize all the
         attributes of a Distribution, and then use 'attrs' (a dictionary
@@ -208,7 +208,7 @@
                           "invalid distribution option '%s'" % key
 
         self.finalize_options()
-        
+
     # __init__ ()
 
 
@@ -251,7 +251,7 @@
                     print indent + "  " + line
 
     # dump_option_dicts ()
-            
+
 
 
     # -- Config file finding/parsing methods ---------------------------
@@ -378,7 +378,7 @@
             cmdlist = self.get_command_list()
             self.script_args = EasyDialogs.GetArgv(
                 self.global_options + self.display_options, cmdlist)
- 
+
         # We have to parse the command line a bit at a time -- global
         # options, then the first command, then its options, and so on --
         # because each command will be handled by a different class, and
@@ -396,7 +396,7 @@
         # for display options we return immediately
         if self.handle_display_options(option_order):
             return
-            
+
         while args:
             args = self._parse_command_opts(parser, args)
             if args is None:            # user asked for help (and got it)
@@ -508,7 +508,7 @@
                             "must be a callable object (function, etc.)"
                             % (`func`, help_option))
 
-            if help_option_found: 
+            if help_option_found:
                 return
 
         # Put the options from the command-line into their official
@@ -801,7 +801,7 @@
         (from 'self.command_options').
         """
         from distutils.core import DEBUG
-        
+
         command_name = command_obj.get_command_name()
         if option_dict is None:
             option_dict = self.get_option_dict(command_name)
@@ -841,7 +841,7 @@
         user-supplied values from the config files and command line.
         You'll have to re-finalize the command object (by calling
         'finalize_options()' or 'ensure_finalized()') before using it for
-        real.  
+        real.
 
         'command' should be a command name (string) or command object.  If
         'reinit_subcommands' is true, also reinitializes the command's
@@ -868,11 +868,11 @@
 
         if reinit_subcommands:
             for sub in command.get_sub_commands():
-                self.reinitialize_command(sub, reinit_subcommands)            
+                self.reinitialize_command(sub, reinit_subcommands)
 
         return command
 
-        
+
     # -- Methods that operate on the Distribution ----------------------
 
     def announce (self, msg, level=1):
@@ -976,7 +976,7 @@
         self.long_description = None
         self.keywords = None
         self.platforms = None
-        
+
     def write_pkg_info (self, base_dir):
         """Write the PKG-INFO file into the release tree.
         """
@@ -1003,9 +1003,9 @@
             pkg_info.write('Platform: %s\n' % platform )
 
         pkg_info.close()
-        
+
     # write_pkg_info ()
-    
+
     # -- Metadata query methods ----------------------------------------
 
     def get_name (self):
@@ -1045,7 +1045,7 @@
     def get_license(self):
         return self.license or "UNKNOWN"
     get_licence = get_license
-    
+
     def get_description(self):
         return self.description or "UNKNOWN"
 
diff --git a/Lib/distutils/extension.py b/Lib/distutils/extension.py
index a63ede2..fbae7c5 100644
--- a/Lib/distutils/extension.py
+++ b/Lib/distutils/extension.py
@@ -16,7 +16,7 @@
 # module is already big enough, and I want to make this class a bit more
 # complex to simplify some common cases ("foo" module in "foo.c") and do
 # better error-checking ("foo.c" actually exists).
-# 
+#
 # Also, putting this in build_ext.py means every setup script would have to
 # import that large-ish module (indirectly, through distutils.core) in
 # order to do anything.
@@ -211,7 +211,7 @@
         #extensions[module] = { 'sources': source_files,
         #                       'cpp_args': cpp_args,
         #                       'lib_args': library_args }
-        
+
     return extensions
 
 # read_setup_file ()
diff --git a/Lib/distutils/fancy_getopt.py b/Lib/distutils/fancy_getopt.py
index 83d0721..e65302f 100644
--- a/Lib/distutils/fancy_getopt.py
+++ b/Lib/distutils/fancy_getopt.py
@@ -73,7 +73,7 @@
         # 'negative_alias' keeps track of options that are the boolean
         # opposite of some other option
         self.negative_alias = {}
-        
+
         # These keep track of the information in the option table.  We
         # don't actually populate these structures until we're ready to
         # parse the command-line, since the 'option_table' passed in here
@@ -90,7 +90,7 @@
         self.option_order = []
 
     # __init__ ()
-    
+
 
     def _build_index (self):
         self.option_index.clear()
@@ -117,7 +117,7 @@
         return self.option_index.has_key(long_option)
 
     def get_attr_name (self, long_option):
-        """Translate long option name 'long_option' to the form it 
+        """Translate long option name 'long_option' to the form it
         has as an attribute of some object: ie., translate hyphens
         to underscores."""
         return string.translate(long_option, longopt_xlate)
@@ -134,7 +134,7 @@
                 raise DistutilsGetoptError, \
                       ("invalid %s '%s': "
                        "aliased option '%s' not defined") % (what, alias, opt)
-        
+
     def set_aliases (self, alias):
         """Set the aliases for this option parser."""
         self._check_alias_dict(alias, "alias")
@@ -476,7 +476,7 @@
     changing "-" to "_".
     """
     return string.translate(opt, longopt_xlate)
-        
+
 
 class OptionDummy:
     """Dummy class just used as a place to hold command-line option
@@ -489,7 +489,7 @@
             setattr(self, opt, None)
 
 # class OptionDummy
-    
+
 
 if __name__ == "__main__":
     text = """\
diff --git a/Lib/distutils/file_util.py b/Lib/distutils/file_util.py
index 991d835..526e4cf 100644
--- a/Lib/distutils/file_util.py
+++ b/Lib/distutils/file_util.py
@@ -35,20 +35,20 @@
         except os.error, (errno, errstr):
             raise DistutilsFileError, \
                   "could not open '%s': %s" % (src, errstr)
-        
+
         try:
             fdst = open(dst, 'wb')
         except os.error, (errno, errstr):
             raise DistutilsFileError, \
                   "could not create '%s': %s" % (dst, errstr)
-        
+
         while 1:
             try:
                 buf = fsrc.read(buffer_size)
             except os.error, (errno, errstr):
                 raise DistutilsFileError, \
                       "could not read from '%s': %s" % (src, errstr)
-            
+
             if not buf:
                 break
 
@@ -57,7 +57,7 @@
             except os.error, (errno, errstr):
                 raise DistutilsFileError, \
                       "could not write to '%s': %s" % (dst, errstr)
-            
+
     finally:
         if fdst:
             fdst.close()
@@ -134,7 +134,7 @@
             print "%s %s -> %s" % (action, src, dir)
         else:
             print "%s %s -> %s" % (action, src, dst)
-            
+
     if dry_run:
         return (dst, 1)
 
@@ -146,7 +146,7 @@
         except os.error, exc:
             raise DistutilsFileError, \
                   "could not copy '%s' to '%s': %s" % (src, dst, exc[-1])
-    
+
     # If linking (hard or symbolic), use the appropriate system call
     # (Unix only, of course, but that's the caller's responsibility)
     elif link == 'hard':
@@ -189,7 +189,7 @@
     """
     from os.path import exists, isfile, isdir, basename, dirname
     import errno
-    
+
     if verbose:
         print "moving %s -> %s" % (src, dst)
 
@@ -232,7 +232,7 @@
             except os.error:
                 pass
             raise DistutilsFileError, \
-                  ("couldn't move '%s' to '%s' by copy/delete: " + 
+                  ("couldn't move '%s' to '%s' by copy/delete: " +
                    "delete '%s' failed: %s") % \
                   (src, dst, src, msg)
 
diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py
index 211b65f..f7222fd 100644
--- a/Lib/distutils/filelist.py
+++ b/Lib/distutils/filelist.py
@@ -7,7 +7,7 @@
 # created 2000/07/17, Rene Liebscher (as template.py)
 # most parts taken from commands/sdist.py
 # renamed 2000/07/29 (to filelist.py) and officially added to
-#  the Distutils source, Greg Ward 
+#  the Distutils source, Greg Ward
 
 __revision__ = "$Id$"
 
@@ -34,8 +34,8 @@
         filtering applied)
     """
 
-    def __init__(self, 
-                 warn=None, 
+    def __init__(self,
+                 warn=None,
                  debug_print=None):
         # use standard warning and debug functions if no other given
         self.warn = warn or self.__warn
@@ -53,10 +53,10 @@
 
 
     # -- Fallback warning/debug functions ------------------------------
-    
+
     def __warn (self, msg):
         sys.stderr.write("warning: %s\n" % msg)
-        
+
     def __debug_print (self, msg):
         """Print 'msg' to stdout if the global DEBUG (taken from the
         DISTUTILS_DEBUG environment variable) flag is true.
@@ -93,7 +93,7 @@
 
 
     # -- "File template" methods ---------------------------------------
-    
+
     def _parse_template_line (self, line):
         words = string.split(line)
         action = words[0]
@@ -129,9 +129,9 @@
         return (action, patterns, dir, dir_pattern)
 
     # _parse_template_line ()
-    
 
-    def process_template_line (self, line):    
+
+    def process_template_line (self, line):
 
         # Parse the line: split it up, make sure the right number of words
         # is there, and return the relevant words.  'action' is always
@@ -190,7 +190,7 @@
                     self.warn(("no previously-included files matching '%s' " +
                                "found under directory '%s'") %
                               (pattern, dir))
-                    
+
         elif action == 'graft':
             self.debug_print("graft " + dir_pattern)
             if not self.include_pattern(None, prefix=dir_pattern):
@@ -251,7 +251,7 @@
                 self.debug_print(" adding " + name)
                 self.files.append(name)
                 files_found = 1
-    
+
         return files_found
 
     # include_pattern ()
@@ -261,7 +261,7 @@
                          anchor=1, prefix=None, is_regex=0):
         """Remove strings (presumably filenames) from 'files' that match
         'pattern'.  Other parameters are the same as for
-        'include_pattern()', above.  
+        'include_pattern()', above.
         The list 'self.files' is modified in place.
         Return 1 if files are found.
         """
@@ -274,7 +274,7 @@
                 self.debug_print(" removing " + self.files[i])
                 del self.files[i]
                 files_found = 1
-    
+
         return files_found
 
     # exclude_pattern ()
@@ -354,14 +354,14 @@
         pattern_re = glob_to_re(pattern)
     else:
         pattern_re = ''
-        
+
     if prefix is not None:
         prefix_re = (glob_to_re(prefix))[0:-1] # ditch trailing $
         pattern_re = "^" + os.path.join(prefix_re, ".*" + pattern_re)
     else:                               # no prefix -- respect anchor flag
         if anchor:
             pattern_re = "^" + pattern_re
-        
+
     return re.compile(pattern_re)
 
 # translate_pattern ()
diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py
index 0325b48..8a67dfc 100644
--- a/Lib/distutils/msvccompiler.py
+++ b/Lib/distutils/msvccompiler.py
@@ -50,8 +50,8 @@
     HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE
     HKEY_CURRENT_USER = hkey_mod.HKEY_CURRENT_USER
     HKEY_USERS = hkey_mod.HKEY_USERS
-    
-    
+
+
 
 def get_devstudio_versions ():
     """Get list of devstudio versions from the Windows registry.  Return a
@@ -93,7 +93,7 @@
     """Get a list of devstudio directories (include, lib or path).  Return
        a list of strings; will be empty list if unable to access the
        registry or appropriate registry keys not found."""
-       
+
     if not _can_read_reg:
         return []
 
@@ -149,7 +149,7 @@
         if os.path.isfile(fn):
             return fn
 
-    return exe                          # last desperate hope 
+    return exe                          # last desperate hope
 
 
 def set_path_env_var (name, version_number):
@@ -294,7 +294,7 @@
             compile_opts.extend (self.compile_options_debug)
         else:
             compile_opts.extend (self.compile_options)
-        
+
         for i in range (len (sources)):
             src = sources[i] ; obj = objects[i]
             ext = (os.path.splitext (src))[1]
@@ -390,12 +390,12 @@
                 self.spawn ([self.lib] + lib_args)
             except DistutilsExecError, msg:
                 raise LibError, msg
-                
+
         else:
             self.announce ("skipping %s (up-to-date)" % output_filename)
 
     # create_static_lib ()
-    
+
     def link (self,
               target_desc,
               objects,
@@ -417,7 +417,7 @@
         if runtime_library_dirs:
             self.warn ("I don't know what to do with 'runtime_library_dirs': "
                        + str (runtime_library_dirs))
-        
+
         lib_opts = gen_lib_options (self,
                                     library_dirs, runtime_library_dirs,
                                     libraries)
@@ -441,7 +441,7 @@
             for sym in (export_symbols or []):
                 export_opts.append("/EXPORT:" + sym)
 
-            ld_args = (ldflags + lib_opts + export_opts + 
+            ld_args = (ldflags + lib_opts + export_opts +
                        objects + ['/OUT:' + output_filename])
 
             # The MSVC linker generates .lib and .exp files, which cannot be
diff --git a/Lib/distutils/mwerkscompiler.py b/Lib/distutils/mwerkscompiler.py
index e759456..7c77b8b 100644
--- a/Lib/distutils/mwerkscompiler.py
+++ b/Lib/distutils/mwerkscompiler.py
@@ -52,8 +52,8 @@
                   force=0):
 
         CCompiler.__init__ (self, verbose, dry_run, force)
-        
-        
+
+
     def compile (self,
                  sources,
                  output_dir=None,
@@ -62,14 +62,14 @@
                  debug=0,
                  extra_preargs=None,
                  extra_postargs=None):
-         (output_dir, macros, include_dirs) = \
-            self._fix_compile_args (output_dir, macros, include_dirs)
-         self.__sources = sources
-         self.__macros = macros
-         self.__include_dirs = include_dirs
-         # Don't need extra_preargs and extra_postargs for CW
-         return []
-         
+        (output_dir, macros, include_dirs) = \
+           self._fix_compile_args (output_dir, macros, include_dirs)
+        self.__sources = sources
+        self.__macros = macros
+        self.__include_dirs = include_dirs
+        # Don't need extra_preargs and extra_postargs for CW
+        return []
+
     def link (self,
               target_desc,
               objects,
@@ -198,7 +198,7 @@
         if self.verbose:
             print '\tBuild project'
         mkcwproject.buildproject(projectfilename)
-        
+
     def _filename_to_abs(self, filename):
         # Some filenames seem to be unix-like. Convert to Mac names.
 ##        if '/' in filename and ':' in filename:
@@ -207,13 +207,11 @@
 ##           filename = macurl2path(filename)
         filename = distutils.util.convert_path(filename)
         if not os.path.isabs(filename):
-           curdir = os.getcwd()
-           filename = os.path.join(curdir, filename)
+            curdir = os.getcwd()
+            filename = os.path.join(curdir, filename)
         # Finally remove .. components
         components = string.split(filename, ':')
         for i in range(1, len(components)):
-           if components[i] == '..':
-              components[i] = ''
+            if components[i] == '..':
+                components[i] = ''
         return string.join(components, ':')
-        
-        
diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py
index 1eed7a8..07dc814 100644
--- a/Lib/distutils/spawn.py
+++ b/Lib/distutils/spawn.py
@@ -71,7 +71,7 @@
     cmd = _nt_quote_args(cmd)
     if search_path:
         # either we find one or it stays the same
-        executable = find_executable(executable) or executable 
+        executable = find_executable(executable) or executable
     if verbose:
         print string.join([executable] + cmd[1:], ' ')
     if not dry_run:
@@ -87,7 +87,7 @@
             raise DistutilsExecError, \
                   "command '%s' failed with exit status %d" % (cmd[0], rc)
 
-                
+
 def _spawn_posix (cmd,
                   search_path=1,
                   verbose=0,
@@ -110,11 +110,11 @@
             sys.stderr.write("unable to execute %s: %s\n" %
                              (cmd[0], e.strerror))
             os._exit(1)
-            
+
         sys.stderr.write("unable to execute %s for unknown reasons" % cmd[0])
         os._exit(1)
 
-    
+
     else:                               # in the parent
         # Loop until the child either exits or is terminated by a signal
         # (ie. keep waiting if it's merely stopped)
@@ -133,7 +133,7 @@
                     raise DistutilsExecError, \
                           "command '%s' failed with exit status %d" % \
                           (cmd[0], exit_status)
-        
+
             elif os.WIFSTOPPED(status):
                 continue
 
@@ -166,4 +166,4 @@
     else:
         return executable
 
-# find_executable()    
+# find_executable()
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index 935372c..feaf318 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -48,7 +48,7 @@
 
     If 'prefix' is supplied, use it instead of sys.prefix or
     sys.exec_prefix -- i.e., ignore 'plat_specific'.
-    """    
+    """
     if prefix is None:
         prefix = plat_specific and EXEC_PREFIX or PREFIX
     if os.name == "posix":
@@ -318,7 +318,7 @@
     # the scripts are in another directory.
     if python_build:
         g['LDSHARED'] = g['BLDSHARED']
-        
+
     elif sys.version < '2.1':
         # The following two branches are for 1.5.2 compatibility.
         if sys.platform == 'aix4':          # what about AIX 3.x ?
@@ -337,7 +337,7 @@
             python_lib = get_python_lib(standard_lib=1)
             linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0])
             linkerscript = os.path.join(python_lib, 'config', linkerscript_name)
-            
+
             # XXX this isn't the right place to do this: adding the Python
             # library to the link, if needed, should be in the "build_ext"
             # command.  (It's also needed for non-MS compilers on Windows, and
@@ -345,7 +345,7 @@
             # method.)
             g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
                              (linkerscript, PREFIX, sys.version[0:3]))
-            
+
     global _config_vars
     _config_vars = g
 
diff --git a/Lib/distutils/text_file.py b/Lib/distutils/text_file.py
index 37bffe6..7086b1a 100644
--- a/Lib/distutils/text_file.py
+++ b/Lib/distutils/text_file.py
@@ -86,7 +86,7 @@
 
         if filename is None and file is None:
             raise RuntimeError, \
-                  "you must supply either or both of 'filename' and 'file'" 
+                  "you must supply either or both of 'filename' and 'file'"
 
         # set values for all options -- either from client option hash
         # or fallback to default_options
@@ -113,7 +113,7 @@
         # actually read from the file; it's only populated by an
         # 'unreadline()' operation
         self.linebuf = []
-        
+
 
     def open (self, filename):
         """Open a new file named 'filename'.  This overrides both the
@@ -213,7 +213,7 @@
                     # EOF; I think that's OK.)
                     eol = (line[-1] == '\n') and '\n' or ''
                     line = line[0:pos] + eol
-                    
+
                     # If all that's left is whitespace, then skip line
                     # *now*, before we try to join it to 'buildup_line' --
                     # that way constructs like
@@ -226,7 +226,7 @@
 
                 else:                   # it's an escaped "#"
                     line = string.replace (line, "\\#", "#")
-                
+
 
             # did previous line end with a backslash? then accumulate
             if self.join_lines and buildup_line:
@@ -256,7 +256,7 @@
                     self.current_line = self.current_line[1] + 1
                 else:
                     self.current_line = self.current_line + 1
-                
+
 
             # strip whitespace however the client wants (leading and
             # trailing, or one or the other, or neither)
@@ -351,7 +351,7 @@
             print expected_result
             print "** received:"
             print result
-            
+
 
     filename = "test.txt"
     out_file = open (filename, "w")
@@ -382,4 +382,3 @@
     test_input (6, "join lines with collapsing", in_file, result6)
 
     os.remove (filename)
-    
diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
index a4f0ac4..a9b5de5 100644
--- a/Lib/distutils/unixccompiler.py
+++ b/Lib/distutils/unixccompiler.py
@@ -103,8 +103,8 @@
             pp_args.extend(extra_postargs)
 
         # We need to preprocess: either we're being forced to, or we're
-	# generating output to stdout, or there's a target output file and 
-	# the source file is newer than the target (or the target doesn't
+        # generating output to stdout, or there's a target output file and
+        # the source file is newer than the target (or the target doesn't
         # exist).
         if self.force or output_file is None or newer(source, output_file):
             if output_file:
@@ -139,7 +139,7 @@
             extra_postargs = []
 
         # Compile all source files that weren't eliminated by
-        # '_prep_compile()'.        
+        # '_prep_compile()'.
         for i in range(len(sources)):
             src = sources[i] ; obj = objects[i]
             if skip_sources[src]:
@@ -157,7 +157,7 @@
         return objects
 
     # compile ()
-    
+
 
     def create_static_lib (self,
                            objects,
@@ -193,7 +193,7 @@
 
 
     def link (self,
-              target_desc,    
+              target_desc,
               objects,
               output_filename,
               output_dir=None,
@@ -219,7 +219,7 @@
             output_filename = os.path.join(output_dir, output_filename)
 
         if self._need_link(objects, output_filename):
-            ld_args = (objects + self.objects + 
+            ld_args = (objects + self.objects +
                        lib_opts + ['-o', output_filename])
             if debug:
                 ld_args[:0] = ['-g']
@@ -229,7 +229,7 @@
                 ld_args.extend(extra_postargs)
             self.mkpath(os.path.dirname(output_filename))
             try:
-                if target_desc == CCompiler.EXECUTABLE:    
+                if target_desc == CCompiler.EXECUTABLE:
                     self.spawn(self.linker_exe + ld_args)
                 else:
                     self.spawn(self.linker_so + ld_args)
@@ -244,7 +244,7 @@
     # -- Miscellaneous methods -----------------------------------------
     # These are all used by the 'gen_lib_options() function, in
     # ccompiler.py.
-    
+
     def library_dir_option (self, dir):
         return "-L" + dir
 
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index 25ddbdf..1541e02 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -30,7 +30,7 @@
        solaris-2.6-sun4u
        irix-5.3
        irix64-6.2
-       
+
     For non-POSIX platforms, currently just returns 'sys.platform'.
     """
     if os.name != "posix" or not hasattr(os, 'uname'):
@@ -44,9 +44,9 @@
 
     # Convert the OS name to lowercase and remove '/' characters
     # (to accommodate BSD/OS)
-    osname = string.lower(osname) 
+    osname = string.lower(osname)
     osname = string.replace(osname, '/', '')
-    
+
     if osname[:5] == "linux":
         # At least on Linux/Intel, 'machine' is the processor --
         # i386, etc.
@@ -59,7 +59,7 @@
         # fall through to standard osname-release-machine representation
     elif osname[:4] == "irix":              # could be "irix64"!
         return "%s-%s" % (osname, release)
-    elif osname[:3] == "aix":              
+    elif osname[:3] == "aix":
         return "%s-%s.%s" % (osname, version, release)
     elif osname[:6] == "cygwin":
         osname = "cygwin"
@@ -67,7 +67,7 @@
         m = rel_re.match(release)
         if m:
             release = m.group()
-            
+
     return "%s-%s-%s" % (osname, release, machine)
 
 # get_platform ()
@@ -280,7 +280,7 @@
     # Generate a message if we weren't passed one
     if msg is None:
         msg = "%s%s" % (func.__name__, `args`)
-        if msg[-2:] == ',)':        # correct for singleton tuple 
+        if msg[-2:] == ',)':        # correct for singleton tuple
             msg = msg[0:-2] + ')'
 
     # Print it if verbosity level is high enough
@@ -403,7 +403,7 @@
         spawn(cmd, verbose=verbose, dry_run=dry_run)
         execute(os.remove, (script_name,), "removing %s" % script_name,
                 verbose=verbose, dry_run=dry_run)
-        
+
     # "Direct" byte-compilation: use the py_compile module to compile
     # right here, right now.  Note that the script generated in indirect
     # mode simply calls 'byte_compile()' in direct mode, a weird sort of
@@ -453,5 +453,3 @@
     lines = map(string.strip, lines)
     header = string.join(lines, '\n' + 8*' ')
     return header
-
-
diff --git a/Lib/distutils/version.py b/Lib/distutils/version.py
index 9d3d172..02502da 100644
--- a/Lib/distutils/version.py
+++ b/Lib/distutils/version.py
@@ -98,7 +98,7 @@
     The rationale for this version numbering system will be explained
     in the distutils documentation.
     """
-    
+
     version_re = re.compile(r'^(\d+) \. (\d+) (\. (\d+))? ([ab](\d+))?$',
                             re.VERBOSE)
 
@@ -123,7 +123,7 @@
 
 
     def __str__ (self):
-        
+
         if self.version[2] == 0:
             vstring = string.join(map(str, self.version[0:2]), '.')
         else:
@@ -133,7 +133,7 @@
             vstring = vstring + self.prerelease[0] + str(self.prerelease[1])
 
         return vstring
-    
+
 
     def __cmp__ (self, other):
         if isinstance(other, StringType):
@@ -170,7 +170,7 @@
 # 2) sequences of letters are part of the tuple for comparison and are
 #    compared lexicographically
 # 3) recognize the numeric components may have leading zeroes
-# 
+#
 # The LooseVersion class below implements these rules: a version number
 # string is split up into a tuple of integer and string components, and
 # comparison is a simple tuple comparison.  This means that version
@@ -185,7 +185,7 @@
 #   - indicating a post-release patch ('p', 'pl', 'patch')
 # but of course this can't cover all version number schemes, and there's
 # no way to know what a programmer means without asking him.
-# 
+#
 # The problem is what to do with letters (and other non-numeric
 # characters) in a version number.  The current implementation does the
 # obvious and predictable thing: keep them as strings and compare
@@ -208,7 +208,7 @@
 # version numbering scheme to its domination.  The free-thinking
 # anarchists in the lot will never give in, though, and something needs
 # to be done to accommodate them.
-# 
+#
 # Perhaps a "moderately strict" version class could be implemented that
 # lets almost anything slide (syntactically), and makes some heuristic
 # assumptions about non-digits in version number strings.  This could
@@ -217,7 +217,7 @@
 # somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is
 # just as happy dealing with things like "2g6" and "1.13++".  I don't
 # think I'm smart enough to do it right though.
-# 
+#
 # In any case, I've coded the test suite for this module (see
 # ../test/test_version.py) specifically to fail on things like comparing
 # "1.2a2" and "1.2".  That's not because the *code* is doing anything
@@ -296,6 +296,6 @@
             other = LooseVersion(other)
 
         return cmp(self.version, other.version)
-        
+
 
 # end class LooseVersion
