Whitespace normalization.
diff --git a/Lib/netrc.py b/Lib/netrc.py
index 679669f..6bc0292 100644
--- a/Lib/netrc.py
+++ b/Lib/netrc.py
@@ -1,6 +1,6 @@
 """An object-oriented interface to .netrc files."""
 
-# Module and documentation by Eric S. Raymond, 21 Dec 1998 
+# Module and documentation by Eric S. Raymond, 21 Dec 1998
 
 import os, shlex
 
@@ -12,7 +12,7 @@
         self.hosts = {}
         self.macros = {}
         lexer = shlex.shlex(fp)
-	# Allows @ in hostnames.  Not a big deal...
+        # Allows @ in hostnames.  Not a big deal...
         lexer.wordchars = lexer.wordchars + '.-@'
         while 1:
             # Look for a machine, default, or macdef top-level keyword
@@ -23,7 +23,7 @@
                 entryname = lexer.get_token()
             elif tt == 'default':
                 entryname = 'default'
-            elif tt == 'macdef':		# Just skip to end of macdefs
+            elif tt == 'macdef':                # Just skip to end of macdefs
                 entryname = lexer.get_token()
                 self.macros[entryname] = []
                 lexer.whitepace = ' \t'
@@ -36,7 +36,7 @@
                     self.macros[entryname].append(line)
             else:
                 raise SyntaxError, "bad toplevel token %s, file %s, line %d" \
-            				% (tt, file, lexer.lineno) 
+                                        % (tt, file, lexer.lineno)
 
             # We're looking at start of an entry for a named machine or default.
             if toplevel == 'machine':
@@ -87,6 +87,5 @@
             rep = rep + "\n"
         return rep
 
-if __name__ == '__main__': 
+if __name__ == '__main__':
     print netrc()
-
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index 526677a..16716ec 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -34,36 +34,36 @@
 import string
 
 
-
+
 # Exceptions raised when an error or invalid response is received
 class NNTPError(Exception):
-	"""Base class for all nntplib exceptions"""
-	def __init__(self, *args):
-		apply(Exception.__init__, (self,)+args)
-		try:
-			self.response = args[0]
-		except IndexError:
-			self.response = 'No response given'
+    """Base class for all nntplib exceptions"""
+    def __init__(self, *args):
+        apply(Exception.__init__, (self,)+args)
+        try:
+            self.response = args[0]
+        except IndexError:
+            self.response = 'No response given'
 
 class NNTPReplyError(NNTPError):
-	"""Unexpected [123]xx reply"""
-	pass
+    """Unexpected [123]xx reply"""
+    pass
 
 class NNTPTemporaryError(NNTPError):
-	"""4xx errors"""
-	pass
+    """4xx errors"""
+    pass
 
 class NNTPPermanentError(NNTPError):
-	"""5xx errors"""
-	pass
+    """5xx errors"""
+    pass
 
 class NNTPProtocolError(NNTPError):
-	"""Response does not begin with [1-5]"""
-	pass
+    """Response does not begin with [1-5]"""
+    pass
 
 class NNTPDataError(NNTPError):
-	"""Error in response data"""
-	pass
+    """Error in response data"""
+    pass
 
 # for backwards compatibility
 error_reply = NNTPReplyError
@@ -73,7 +73,7 @@
 error_data = NNTPDataError
 
 
-
+
 # Standard port used by NNTP servers
 NNTP_PORT = 119
 
@@ -86,450 +86,450 @@
 CRLF = '\r\n'
 
 
-
+
 # The class itself
 class NNTP:
-	def __init__(self, host, port=NNTP_PORT, user=None, password=None,
-		     readermode=None):
-		"""Initialize an instance.  Arguments:
-		- host: hostname to connect to
-		- port: port to connect to (default the standard NNTP port)
-		- user: username to authenticate with
-		- password: password to use with username
-		- readermode: if true, send 'mode reader' command after
-		              connecting.
+    def __init__(self, host, port=NNTP_PORT, user=None, password=None,
+                 readermode=None):
+        """Initialize an instance.  Arguments:
+        - host: hostname to connect to
+        - port: port to connect to (default the standard NNTP port)
+        - user: username to authenticate with
+        - password: password to use with username
+        - readermode: if true, send 'mode reader' command after
+                      connecting.
 
-	        readermode is sometimes necessary if you are connecting to an
-	        NNTP server on the local machine and intend to call
-	        reader-specific comamnds, such as `group'.  If you get
-	        unexpected NNTPPermanentErrors, you might need to set
-	        readermode.
-		"""
-		self.host = host
-		self.port = port
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self.sock.connect((self.host, self.port))
-		self.file = self.sock.makefile('rb')
-		self.debugging = 0
-		self.welcome = self.getresp()
-		if readermode:
-			try:
-				self.welcome = self.shortcmd('mode reader')
-			except NNTPPermanentError:
-				# error 500, probably 'not implemented'
-				pass
-		if user:
-			resp = self.shortcmd('authinfo user '+user)
-			if resp[:3] == '381':
-				if not password:
-					raise NNTPReplyError(resp)
-				else:
-					resp = self.shortcmd(
-						'authinfo pass '+password)
-					if resp[:3] != '281':
-						raise NNTPPermanentError(resp)
+        readermode is sometimes necessary if you are connecting to an
+        NNTP server on the local machine and intend to call
+        reader-specific comamnds, such as `group'.  If you get
+        unexpected NNTPPermanentErrors, you might need to set
+        readermode.
+        """
+        self.host = host
+        self.port = port
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.sock.connect((self.host, self.port))
+        self.file = self.sock.makefile('rb')
+        self.debugging = 0
+        self.welcome = self.getresp()
+        if readermode:
+            try:
+                self.welcome = self.shortcmd('mode reader')
+            except NNTPPermanentError:
+                # error 500, probably 'not implemented'
+                pass
+        if user:
+            resp = self.shortcmd('authinfo user '+user)
+            if resp[:3] == '381':
+                if not password:
+                    raise NNTPReplyError(resp)
+                else:
+                    resp = self.shortcmd(
+                            'authinfo pass '+password)
+                    if resp[:3] != '281':
+                        raise NNTPPermanentError(resp)
 
-	# Get the welcome message from the server
-	# (this is read and squirreled away by __init__()).
-	# If the response code is 200, posting is allowed;
-	# if it 201, posting is not allowed
+    # Get the welcome message from the server
+    # (this is read and squirreled away by __init__()).
+    # If the response code is 200, posting is allowed;
+    # if it 201, posting is not allowed
 
-	def getwelcome(self):
-		"""Get the welcome message from the server
-		(this is read and squirreled away by __init__()).
-		If the response code is 200, posting is allowed;
-		if it 201, posting is not allowed."""
+    def getwelcome(self):
+        """Get the welcome message from the server
+        (this is read and squirreled away by __init__()).
+        If the response code is 200, posting is allowed;
+        if it 201, posting is not allowed."""
 
-		if self.debugging: print '*welcome*', `self.welcome`
-		return self.welcome
+        if self.debugging: print '*welcome*', `self.welcome`
+        return self.welcome
 
-	def set_debuglevel(self, level):
-		"""Set the debugging level.  Argument 'level' means:
-		0: no debugging output (default)
-		1: print commands and responses but not body text etc.
-		2: also print raw lines read and sent before stripping CR/LF"""
+    def set_debuglevel(self, level):
+        """Set the debugging level.  Argument 'level' means:
+        0: no debugging output (default)
+        1: print commands and responses but not body text etc.
+        2: also print raw lines read and sent before stripping CR/LF"""
 
-		self.debugging = level
-	debug = set_debuglevel
+        self.debugging = level
+    debug = set_debuglevel
 
-	def putline(self, line):
-		"""Internal: send one line to the server, appending CRLF."""
-		line = line + CRLF
-		if self.debugging > 1: print '*put*', `line`
-		self.sock.send(line)
+    def putline(self, line):
+        """Internal: send one line to the server, appending CRLF."""
+        line = line + CRLF
+        if self.debugging > 1: print '*put*', `line`
+        self.sock.send(line)
 
-	def putcmd(self, line):
-		"""Internal: send one command to the server (through putline())."""
-		if self.debugging: print '*cmd*', `line`
-		self.putline(line)
+    def putcmd(self, line):
+        """Internal: send one command to the server (through putline())."""
+        if self.debugging: print '*cmd*', `line`
+        self.putline(line)
 
-	def getline(self):
-		"""Internal: return one line from the server, stripping CRLF.
-		Raise EOFError if the connection is closed."""
-		line = self.file.readline()
-		if self.debugging > 1:
-			print '*get*', `line`
-		if not line: raise EOFError
-		if line[-2:] == CRLF: line = line[:-2]
-		elif line[-1:] in CRLF: line = line[:-1]
-		return line
+    def getline(self):
+        """Internal: return one line from the server, stripping CRLF.
+        Raise EOFError if the connection is closed."""
+        line = self.file.readline()
+        if self.debugging > 1:
+            print '*get*', `line`
+        if not line: raise EOFError
+        if line[-2:] == CRLF: line = line[:-2]
+        elif line[-1:] in CRLF: line = line[:-1]
+        return line
 
-	def getresp(self):
-		"""Internal: get a response from the server.
-		Raise various errors if the response indicates an error."""
-		resp = self.getline()
-		if self.debugging: print '*resp*', `resp`
-		c = resp[:1]
-		if c == '4':
-			raise NNTPTemporaryError(resp)
-		if c == '5':
-			raise NNTPPermanentError(resp)
-		if c not in '123':
-			raise NNTPProtocolError(resp)
-		return resp
+    def getresp(self):
+        """Internal: get a response from the server.
+        Raise various errors if the response indicates an error."""
+        resp = self.getline()
+        if self.debugging: print '*resp*', `resp`
+        c = resp[:1]
+        if c == '4':
+            raise NNTPTemporaryError(resp)
+        if c == '5':
+            raise NNTPPermanentError(resp)
+        if c not in '123':
+            raise NNTPProtocolError(resp)
+        return resp
 
-	def getlongresp(self):
-		"""Internal: get a response plus following text from the server.
-		Raise various errors if the response indicates an error."""
-		resp = self.getresp()
-		if resp[:3] not in LONGRESP:
-			raise NNTPReplyError(resp)
-		list = []
-		while 1:
-			line = self.getline()
-			if line == '.':
-				break
-			if line[:2] == '..':
-				line = line[1:]
-			list.append(line)
-		return resp, list
+    def getlongresp(self):
+        """Internal: get a response plus following text from the server.
+        Raise various errors if the response indicates an error."""
+        resp = self.getresp()
+        if resp[:3] not in LONGRESP:
+            raise NNTPReplyError(resp)
+        list = []
+        while 1:
+            line = self.getline()
+            if line == '.':
+                break
+            if line[:2] == '..':
+                line = line[1:]
+            list.append(line)
+        return resp, list
 
-	def shortcmd(self, line):
-		"""Internal: send a command and get the response."""
-		self.putcmd(line)
-		return self.getresp()
+    def shortcmd(self, line):
+        """Internal: send a command and get the response."""
+        self.putcmd(line)
+        return self.getresp()
 
-	def longcmd(self, line):
-		"""Internal: send a command and get the response plus following text."""
-		self.putcmd(line)
-		return self.getlongresp()
+    def longcmd(self, line):
+        """Internal: send a command and get the response plus following text."""
+        self.putcmd(line)
+        return self.getlongresp()
 
-	def newgroups(self, date, time):
-		"""Process a NEWGROUPS command.  Arguments:
-		- date: string 'yymmdd' indicating the date
-		- time: string 'hhmmss' indicating the time
-		Return:
-		- resp: server response if successful
-		- list: list of newsgroup names"""
+    def newgroups(self, date, time):
+        """Process a NEWGROUPS command.  Arguments:
+        - date: string 'yymmdd' indicating the date
+        - time: string 'hhmmss' indicating the time
+        Return:
+        - resp: server response if successful
+        - list: list of newsgroup names"""
 
-		return self.longcmd('NEWGROUPS ' + date + ' ' + time)
+        return self.longcmd('NEWGROUPS ' + date + ' ' + time)
 
-	def newnews(self, group, date, time):
-		"""Process a NEWNEWS command.  Arguments:
-		- group: group name or '*'
-		- date: string 'yymmdd' indicating the date
-		- time: string 'hhmmss' indicating the time
-		Return:
-		- resp: server response if successful
-		- list: list of article ids"""
+    def newnews(self, group, date, time):
+        """Process a NEWNEWS command.  Arguments:
+        - group: group name or '*'
+        - date: string 'yymmdd' indicating the date
+        - time: string 'hhmmss' indicating the time
+        Return:
+        - resp: server response if successful
+        - list: list of article ids"""
 
-		cmd = 'NEWNEWS ' + group + ' ' + date + ' ' + time
-		return self.longcmd(cmd)
+        cmd = 'NEWNEWS ' + group + ' ' + date + ' ' + time
+        return self.longcmd(cmd)
 
-	def list(self):
-		"""Process a LIST command.  Return:
-		- resp: server response if successful
-		- list: list of (group, last, first, flag) (strings)"""
+    def list(self):
+        """Process a LIST command.  Return:
+        - resp: server response if successful
+        - list: list of (group, last, first, flag) (strings)"""
 
-		resp, list = self.longcmd('LIST')
-		for i in range(len(list)):
-			# Parse lines into "group last first flag"
-			list[i] = tuple(string.split(list[i]))
-		return resp, list
+        resp, list = self.longcmd('LIST')
+        for i in range(len(list)):
+            # Parse lines into "group last first flag"
+            list[i] = tuple(string.split(list[i]))
+        return resp, list
 
-	def group(self, name):
-		"""Process a GROUP command.  Argument:
-		- group: the group name
-		Returns:
-		- resp: server response if successful
-		- count: number of articles (string)
-		- first: first article number (string)
-		- last: last article number (string)
-		- name: the group name"""
+    def group(self, name):
+        """Process a GROUP command.  Argument:
+        - group: the group name
+        Returns:
+        - resp: server response if successful
+        - count: number of articles (string)
+        - first: first article number (string)
+        - last: last article number (string)
+        - name: the group name"""
 
-		resp = self.shortcmd('GROUP ' + name)
-		if resp[:3] != '211':
-			raise NNTPReplyError(resp)
-		words = string.split(resp)
-		count = first = last = 0
-		n = len(words)
-		if n > 1:
-			count = words[1]
-			if n > 2:
-				first = words[2]
-				if n > 3:
-					last = words[3]
-					if n > 4:
-						name = string.lower(words[4])
-		return resp, count, first, last, name
+        resp = self.shortcmd('GROUP ' + name)
+        if resp[:3] != '211':
+            raise NNTPReplyError(resp)
+        words = string.split(resp)
+        count = first = last = 0
+        n = len(words)
+        if n > 1:
+            count = words[1]
+            if n > 2:
+                first = words[2]
+                if n > 3:
+                    last = words[3]
+                    if n > 4:
+                        name = string.lower(words[4])
+        return resp, count, first, last, name
 
-	def help(self):
-		"""Process a HELP command.  Returns:
-		- resp: server response if successful
-		- list: list of strings"""
+    def help(self):
+        """Process a HELP command.  Returns:
+        - resp: server response if successful
+        - list: list of strings"""
 
-		return self.longcmd('HELP')
+        return self.longcmd('HELP')
 
-	def statparse(self, resp):
-		"""Internal: parse the response of a STAT, NEXT or LAST command."""
-		if resp[:2] != '22':
-			raise NNTPReplyError(resp)
-		words = string.split(resp)
-		nr = 0
-		id = ''
-		n = len(words)
-		if n > 1:
-			nr = words[1]
-			if n > 2:
-				id = words[2]
-		return resp, nr, id
+    def statparse(self, resp):
+        """Internal: parse the response of a STAT, NEXT or LAST command."""
+        if resp[:2] != '22':
+            raise NNTPReplyError(resp)
+        words = string.split(resp)
+        nr = 0
+        id = ''
+        n = len(words)
+        if n > 1:
+            nr = words[1]
+            if n > 2:
+                id = words[2]
+        return resp, nr, id
 
-	def statcmd(self, line):
-		"""Internal: process a STAT, NEXT or LAST command."""
-		resp = self.shortcmd(line)
-		return self.statparse(resp)
+    def statcmd(self, line):
+        """Internal: process a STAT, NEXT or LAST command."""
+        resp = self.shortcmd(line)
+        return self.statparse(resp)
 
-	def stat(self, id):
-		"""Process a STAT command.  Argument:
-		- id: article number or message id
-		Returns:
-		- resp: server response if successful
-		- nr:   the article number
-		- id:   the article id"""
+    def stat(self, id):
+        """Process a STAT command.  Argument:
+        - id: article number or message id
+        Returns:
+        - resp: server response if successful
+        - nr:   the article number
+        - id:   the article id"""
 
-		return self.statcmd('STAT ' + id)
+        return self.statcmd('STAT ' + id)
 
-	def next(self):
-		"""Process a NEXT command.  No arguments.  Return as for STAT."""
-		return self.statcmd('NEXT')
+    def next(self):
+        """Process a NEXT command.  No arguments.  Return as for STAT."""
+        return self.statcmd('NEXT')
 
-	def last(self):
-		"""Process a LAST command.  No arguments.  Return as for STAT."""
-		return self.statcmd('LAST')
+    def last(self):
+        """Process a LAST command.  No arguments.  Return as for STAT."""
+        return self.statcmd('LAST')
 
-	def artcmd(self, line):
-		"""Internal: process a HEAD, BODY or ARTICLE command."""
-		resp, list = self.longcmd(line)
-		resp, nr, id = self.statparse(resp)
-		return resp, nr, id, list
+    def artcmd(self, line):
+        """Internal: process a HEAD, BODY or ARTICLE command."""
+        resp, list = self.longcmd(line)
+        resp, nr, id = self.statparse(resp)
+        return resp, nr, id, list
 
-	def head(self, id):
-		"""Process a HEAD command.  Argument:
-		- id: article number or message id
-		Returns:
-		- resp: server response if successful
-		- nr: article number
-		- id: message id
-		- list: the lines of the article's header"""
+    def head(self, id):
+        """Process a HEAD command.  Argument:
+        - id: article number or message id
+        Returns:
+        - resp: server response if successful
+        - nr: article number
+        - id: message id
+        - list: the lines of the article's header"""
 
-		return self.artcmd('HEAD ' + id)
+        return self.artcmd('HEAD ' + id)
 
-	def body(self, id):
-		"""Process a BODY command.  Argument:
-		- id: article number or message id
-		Returns:
-		- resp: server response if successful
-		- nr: article number
-		- id: message id
-		- list: the lines of the article's body"""
+    def body(self, id):
+        """Process a BODY command.  Argument:
+        - id: article number or message id
+        Returns:
+        - resp: server response if successful
+        - nr: article number
+        - id: message id
+        - list: the lines of the article's body"""
 
-		return self.artcmd('BODY ' + id)
+        return self.artcmd('BODY ' + id)
 
-	def article(self, id):
-		"""Process an ARTICLE command.  Argument:
-		- id: article number or message id
-		Returns:
-		- resp: server response if successful
-		- nr: article number
-		- id: message id
-		- list: the lines of the article"""
+    def article(self, id):
+        """Process an ARTICLE command.  Argument:
+        - id: article number or message id
+        Returns:
+        - resp: server response if successful
+        - nr: article number
+        - id: message id
+        - list: the lines of the article"""
 
-		return self.artcmd('ARTICLE ' + id)
+        return self.artcmd('ARTICLE ' + id)
 
-	def slave(self):
-		"""Process a SLAVE command.  Returns:
-		- resp: server response if successful"""
+    def slave(self):
+        """Process a SLAVE command.  Returns:
+        - resp: server response if successful"""
 
-		return self.shortcmd('SLAVE')
+        return self.shortcmd('SLAVE')
 
-	def xhdr(self, hdr, str):
-		"""Process an XHDR command (optional server extension).  Arguments:
-		- hdr: the header type (e.g. 'subject')
-		- str: an article nr, a message id, or a range nr1-nr2
-		Returns:
-		- resp: server response if successful
-		- list: list of (nr, value) strings"""
+    def xhdr(self, hdr, str):
+        """Process an XHDR command (optional server extension).  Arguments:
+        - hdr: the header type (e.g. 'subject')
+        - str: an article nr, a message id, or a range nr1-nr2
+        Returns:
+        - resp: server response if successful
+        - list: list of (nr, value) strings"""
 
-		pat = re.compile('^([0-9]+) ?(.*)\n?')
-		resp, lines = self.longcmd('XHDR ' + hdr + ' ' + str)
-		for i in range(len(lines)):
-			line = lines[i]
-			m = pat.match(line)
-			if m:
-				lines[i] = m.group(1, 2)
-		return resp, lines
+        pat = re.compile('^([0-9]+) ?(.*)\n?')
+        resp, lines = self.longcmd('XHDR ' + hdr + ' ' + str)
+        for i in range(len(lines)):
+            line = lines[i]
+            m = pat.match(line)
+            if m:
+                lines[i] = m.group(1, 2)
+        return resp, lines
 
-	def xover(self,start,end):
-		"""Process an XOVER command (optional server extension) Arguments:
-		- start: start of range
-		- end: end of range
-		Returns:
-		- resp: server response if successful
-		- list: list of (art-nr, subject, poster, date,
-		                 id, references, size, lines)"""
+    def xover(self,start,end):
+        """Process an XOVER command (optional server extension) Arguments:
+        - start: start of range
+        - end: end of range
+        Returns:
+        - resp: server response if successful
+        - list: list of (art-nr, subject, poster, date,
+                         id, references, size, lines)"""
 
-		resp, lines = self.longcmd('XOVER ' + start + '-' + end)
-		xover_lines = []
-		for line in lines:
-			elem = string.splitfields(line,"\t")
-			try:
-				xover_lines.append((elem[0],
-						    elem[1],
-						    elem[2],
-						    elem[3],
-						    elem[4],
-						    string.split(elem[5]),
-						    elem[6],
-						    elem[7]))
-			except IndexError:
-				raise NNTPDataError(line)
-		return resp,xover_lines
+        resp, lines = self.longcmd('XOVER ' + start + '-' + end)
+        xover_lines = []
+        for line in lines:
+            elem = string.splitfields(line,"\t")
+            try:
+                xover_lines.append((elem[0],
+                                    elem[1],
+                                    elem[2],
+                                    elem[3],
+                                    elem[4],
+                                    string.split(elem[5]),
+                                    elem[6],
+                                    elem[7]))
+            except IndexError:
+                raise NNTPDataError(line)
+        return resp,xover_lines
 
-	def xgtitle(self, group):
-		"""Process an XGTITLE command (optional server extension) Arguments:
-		- group: group name wildcard (i.e. news.*)
-		Returns:
-		- resp: server response if successful
-		- list: list of (name,title) strings"""
+    def xgtitle(self, group):
+        """Process an XGTITLE command (optional server extension) Arguments:
+        - group: group name wildcard (i.e. news.*)
+        Returns:
+        - resp: server response if successful
+        - list: list of (name,title) strings"""
 
-		line_pat = re.compile("^([^ \t]+)[ \t]+(.*)$")
-		resp, raw_lines = self.longcmd('XGTITLE ' + group)
-		lines = []
-		for raw_line in raw_lines:
-			match = line_pat.search(string.strip(raw_line))
-			if match:
-				lines.append(match.group(1, 2))
-		return resp, lines
+        line_pat = re.compile("^([^ \t]+)[ \t]+(.*)$")
+        resp, raw_lines = self.longcmd('XGTITLE ' + group)
+        lines = []
+        for raw_line in raw_lines:
+            match = line_pat.search(string.strip(raw_line))
+            if match:
+                lines.append(match.group(1, 2))
+        return resp, lines
 
-	def xpath(self,id):
-		"""Process an XPATH command (optional server extension) Arguments:
-		- id: Message id of article
-		Returns:
-		resp: server response if successful
-		path: directory path to article"""
+    def xpath(self,id):
+        """Process an XPATH command (optional server extension) Arguments:
+        - id: Message id of article
+        Returns:
+        resp: server response if successful
+        path: directory path to article"""
 
-		resp = self.shortcmd("XPATH " + id)
-		if resp[:3] != '223':
-			raise NNTPReplyError(resp)
-		try:
-			[resp_num, path] = string.split(resp)
-		except ValueError:
-			raise NNTPReplyError(resp)
-		else:
-			return resp, path
+        resp = self.shortcmd("XPATH " + id)
+        if resp[:3] != '223':
+            raise NNTPReplyError(resp)
+        try:
+            [resp_num, path] = string.split(resp)
+        except ValueError:
+            raise NNTPReplyError(resp)
+        else:
+            return resp, path
 
-	def date (self):
-		"""Process the DATE command. Arguments:
-		None
-		Returns:
-		resp: server response if successful
-		date: Date suitable for newnews/newgroups commands etc.
-		time: Time suitable for newnews/newgroups commands etc."""
+    def date (self):
+        """Process the DATE command. Arguments:
+        None
+        Returns:
+        resp: server response if successful
+        date: Date suitable for newnews/newgroups commands etc.
+        time: Time suitable for newnews/newgroups commands etc."""
 
-		resp = self.shortcmd("DATE")
-		if resp[:3] != '111':
-			raise NNTPReplyError(resp)
-		elem = string.split(resp)
-		if len(elem) != 2:
-			raise NNTPDataError(resp)
-		date = elem[1][2:8]
-		time = elem[1][-6:]
-		if len(date) != 6 or len(time) != 6:
-			raise NNTPDataError(resp)
-		return resp, date, time
+        resp = self.shortcmd("DATE")
+        if resp[:3] != '111':
+            raise NNTPReplyError(resp)
+        elem = string.split(resp)
+        if len(elem) != 2:
+            raise NNTPDataError(resp)
+        date = elem[1][2:8]
+        time = elem[1][-6:]
+        if len(date) != 6 or len(time) != 6:
+            raise NNTPDataError(resp)
+        return resp, date, time
 
 
-	def post(self, f):
-		"""Process a POST command.  Arguments:
-		- f: file containing the article
-		Returns:
-		- resp: server response if successful"""
+    def post(self, f):
+        """Process a POST command.  Arguments:
+        - f: file containing the article
+        Returns:
+        - resp: server response if successful"""
 
-		resp = self.shortcmd('POST')
-		# Raises error_??? if posting is not allowed
-		if resp[0] != '3':
-			raise NNTPReplyError(resp)
-		while 1:
-			line = f.readline()
-			if not line:
-				break
-			if line[-1] == '\n':
-				line = line[:-1]
-			if line[:1] == '.':
-				line = '.' + line
-			self.putline(line)
-		self.putline('.')
-		return self.getresp()
+        resp = self.shortcmd('POST')
+        # Raises error_??? if posting is not allowed
+        if resp[0] != '3':
+            raise NNTPReplyError(resp)
+        while 1:
+            line = f.readline()
+            if not line:
+                break
+            if line[-1] == '\n':
+                line = line[:-1]
+            if line[:1] == '.':
+                line = '.' + line
+            self.putline(line)
+        self.putline('.')
+        return self.getresp()
 
-	def ihave(self, id, f):
-		"""Process an IHAVE command.  Arguments:
-		- id: message-id of the article
-		- f:  file containing the article
-		Returns:
-		- resp: server response if successful
-		Note that if the server refuses the article an exception is raised."""
+    def ihave(self, id, f):
+        """Process an IHAVE command.  Arguments:
+        - id: message-id of the article
+        - f:  file containing the article
+        Returns:
+        - resp: server response if successful
+        Note that if the server refuses the article an exception is raised."""
 
-		resp = self.shortcmd('IHAVE ' + id)
-		# Raises error_??? if the server already has it
-		if resp[0] != '3':
-			raise NNTPReplyError(resp)
-		while 1:
-			line = f.readline()
-			if not line:
-				break
-			if line[-1] == '\n':
-				line = line[:-1]
-			if line[:1] == '.':
-				line = '.' + line
-			self.putline(line)
-		self.putline('.')
-		return self.getresp()
+        resp = self.shortcmd('IHAVE ' + id)
+        # Raises error_??? if the server already has it
+        if resp[0] != '3':
+            raise NNTPReplyError(resp)
+        while 1:
+            line = f.readline()
+            if not line:
+                break
+            if line[-1] == '\n':
+                line = line[:-1]
+            if line[:1] == '.':
+                line = '.' + line
+            self.putline(line)
+        self.putline('.')
+        return self.getresp()
 
-	def quit(self):
-		"""Process a QUIT command and close the socket.  Returns:
-		- resp: server response if successful"""
+    def quit(self):
+        """Process a QUIT command and close the socket.  Returns:
+        - resp: server response if successful"""
 
-		resp = self.shortcmd('QUIT')
-		self.file.close()
-		self.sock.close()
-		del self.file, self.sock
-		return resp
+        resp = self.shortcmd('QUIT')
+        self.file.close()
+        self.sock.close()
+        del self.file, self.sock
+        return resp
 
 
 def _test():
-	"""Minimal test function."""
-	s = NNTP('news', readermode='reader')
-	resp, count, first, last, name = s.group('comp.lang.python')
-	print resp
-	print 'Group', name, 'has', count, 'articles, range', first, 'to', last
-	resp, subs = s.xhdr('subject', first + '-' + last)
-	print resp
-	for item in subs:
-		print "%7s %s" % item
-	resp = s.quit()
-	print resp
+    """Minimal test function."""
+    s = NNTP('news', readermode='reader')
+    resp, count, first, last, name = s.group('comp.lang.python')
+    print resp
+    print 'Group', name, 'has', count, 'articles, range', first, 'to', last
+    resp, subs = s.xhdr('subject', first + '-' + last)
+    print resp
+    for item in subs:
+        print "%7s %s" % item
+    resp = s.quit()
+    print resp
 
 
 # Run the test when run as a script
 if __name__ == '__main__':
-	_test()
+    _test()
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index c1f4df7..571a7d0 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -1,5 +1,5 @@
 # Module 'ntpath' -- common operations on WinNT/Win95 pathnames
-"""Common pathname manipulations, WindowsNT/95 version. 
+"""Common pathname manipulations, WindowsNT/95 version.
 
 Instead of importing this module directly, import os and refer to this
 module as os.path.
@@ -254,7 +254,7 @@
 def walk(top, func, arg):
     """Directory tree walk whth callback function.
 
-    walk(top, func, arg) calls func(arg, d, files) for each directory d 
+    walk(top, func, arg) calls func(arg, d, files) for each directory d
     in the tree rooted at top (including top itself); files is a list
     of all the files and subdirs in directory d."""
     try:
@@ -313,7 +313,7 @@
 # XXX With COMMAND.COM you can use any characters in a variable name,
 # XXX except '^|<>='.
 
-def expandvars(path):  
+def expandvars(path):
     """Expand shell variables of form $var and ${var}.
 
     Unknown variables are left unchanged."""
diff --git a/Lib/nturl2path.py b/Lib/nturl2path.py
index 0445b8a..2d08eee 100644
--- a/Lib/nturl2path.py
+++ b/Lib/nturl2path.py
@@ -1,66 +1,66 @@
 """Convert a NT pathname to a file URL and vice versa."""
 
 def url2pathname(url):
-	r"""Convert a URL to a DOS path.
+    r"""Convert a URL to a DOS path.
 
-		///C|/foo/bar/spam.foo
+            ///C|/foo/bar/spam.foo
 
-			becomes
+                    becomes
 
-		C:\foo\bar\spam.foo
-	"""
-	import string, urllib
-	if not '|' in url:
-	    # No drive specifier, just convert slashes
-	    if url[:4] == '////':
-	        # path is something like ////host/path/on/remote/host
-	        # convert this to \\host\path\on\remote\host
-	        # (notice halving of slashes at the start of the path)
-	        url = url[2:]
-	    components = string.split(url, '/')
-	    # make sure not to convert quoted slashes :-)
-	    return urllib.unquote(string.join(components, '\\'))
-	comp = string.split(url, '|')
-	if len(comp) != 2 or comp[0][-1] not in string.letters:
-		error = 'Bad URL: ' + url
-		raise IOError, error
-	drive = string.upper(comp[0][-1])
-	components = string.split(comp[1], '/')
-	path = drive + ':'
-	for  comp in components:
-		if comp:
-			path = path + '\\' + urllib.unquote(comp)
-	return path
+            C:\foo\bar\spam.foo
+    """
+    import string, urllib
+    if not '|' in url:
+        # No drive specifier, just convert slashes
+        if url[:4] == '////':
+            # path is something like ////host/path/on/remote/host
+            # convert this to \\host\path\on\remote\host
+            # (notice halving of slashes at the start of the path)
+            url = url[2:]
+        components = string.split(url, '/')
+        # make sure not to convert quoted slashes :-)
+        return urllib.unquote(string.join(components, '\\'))
+    comp = string.split(url, '|')
+    if len(comp) != 2 or comp[0][-1] not in string.letters:
+        error = 'Bad URL: ' + url
+        raise IOError, error
+    drive = string.upper(comp[0][-1])
+    components = string.split(comp[1], '/')
+    path = drive + ':'
+    for  comp in components:
+        if comp:
+            path = path + '\\' + urllib.unquote(comp)
+    return path
 
 def pathname2url(p):
-	r"""Convert a DOS path name to a file url.
+    r"""Convert a DOS path name to a file url.
 
-		C:\foo\bar\spam.foo
+            C:\foo\bar\spam.foo
 
-			becomes
+                    becomes
 
-		///C|/foo/bar/spam.foo
-	"""
+            ///C|/foo/bar/spam.foo
+    """
 
-	import string, urllib
-	if not ':' in p:
-	    # No drive specifier, just convert slashes and quote the name
-	    if p[:2] == '\\\\':
-	        # path is something like \\host\path\on\remote\host
-	        # convert this to ////host/path/on/remote/host
-	        # (notice doubling of slashes at the start of the path)
-	        p = '\\\\' + p
-	    components = string.split(p, '\\')
-	    return urllib.quote(string.join(components, '/'))
-	comp = string.split(p, ':')
-	if len(comp) != 2 or len(comp[0]) > 1:
-		error = 'Bad path: ' + p
-		raise IOError, error
+    import string, urllib
+    if not ':' in p:
+        # No drive specifier, just convert slashes and quote the name
+        if p[:2] == '\\\\':
+        # path is something like \\host\path\on\remote\host
+        # convert this to ////host/path/on/remote/host
+        # (notice doubling of slashes at the start of the path)
+            p = '\\\\' + p
+        components = string.split(p, '\\')
+        return urllib.quote(string.join(components, '/'))
+    comp = string.split(p, ':')
+    if len(comp) != 2 or len(comp[0]) > 1:
+        error = 'Bad path: ' + p
+        raise IOError, error
 
-	drive = urllib.quote(string.upper(comp[0]))
-	components = string.split(comp[1], '\\')
-	path = '///' + drive + '|'
-	for comp in components:
-		if comp:
-			path = path + '/' + urllib.quote(comp)
-	return path
+    drive = urllib.quote(string.upper(comp[0]))
+    components = string.split(comp[1], '\\')
+    path = '///' + drive + '|'
+    for comp in components:
+        if comp:
+            path = path + '/' + urllib.quote(comp)
+    return path
diff --git a/Lib/os.py b/Lib/os.py
index ea38021..0ccdad2 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -213,7 +213,7 @@
 
     Execute the executable file (which is searched for along $PATH)
     with argument list args and environment env, replacing the current
-    process. """    
+    process. """
     env = args[-1]
     execvpe(file, args[:-1], env)
 
@@ -231,7 +231,7 @@
     Execute the executable file (which is searched for along $PATH)
     with argument list args and environment env , replacing the
     current process.
-    args may be a list or tuple of strings. """    
+    args may be a list or tuple of strings. """
     _execvpe(file, args, env)
 
 _notfound = None
@@ -370,7 +370,7 @@
 Execute file with arguments from args in a subprocess.
 If mode == P_NOWAIT return the pid of the process.
 If mode == P_WAIT return the process's exit code if it exits normally;
-otherwise return -SIG, where SIG is the signal that killed it. """   
+otherwise return -SIG, where SIG is the signal that killed it. """
         return _spawnvef(mode, file, args, None, execv)
 
     def spawnve(mode, file, args, env):
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 697fb88..cb1a4d2 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -14,893 +14,893 @@
 import re
 
 def find_function(funcname, filename):
-	cre = re.compile(r'def\s+%s\s*[(]' % funcname)
-	try:
-		fp = open(filename)
-	except IOError:
-		return None
-	# consumer of this info expects the first line to be 1
-	lineno = 1
-	answer = None
-	while 1:
-		line = fp.readline()
-		if line == '':
-			break
-		if cre.match(line):
-			answer = funcname, filename, lineno
-			break
-		lineno = lineno + 1
-	fp.close()
-	return answer
+    cre = re.compile(r'def\s+%s\s*[(]' % funcname)
+    try:
+        fp = open(filename)
+    except IOError:
+        return None
+    # consumer of this info expects the first line to be 1
+    lineno = 1
+    answer = None
+    while 1:
+        line = fp.readline()
+        if line == '':
+            break
+        if cre.match(line):
+            answer = funcname, filename, lineno
+            break
+        lineno = lineno + 1
+    fp.close()
+    return answer
 
 
 # Interaction prompt line will separate file and call info from code
 # text using value of line_prefix string.  A newline and arrow may
 # be to your liking.  You can set it once pdb is imported using the
 # command "pdb.line_prefix = '\n% '".
-# line_prefix = ': '	# Use this to get the old situation back
-line_prefix = '\n-> '	# Probably a better default
+# line_prefix = ': '    # Use this to get the old situation back
+line_prefix = '\n-> '   # Probably a better default
 
 class Pdb(bdb.Bdb, cmd.Cmd):
-	
-	def __init__(self):
-		bdb.Bdb.__init__(self)
-		cmd.Cmd.__init__(self)
-		self.prompt = '(Pdb) '
-		self.aliases = {}
-		# Try to load readline if it exists
-		try:
-			import readline
-		except ImportError:
-			pass
 
-		# Read $HOME/.pdbrc and ./.pdbrc
-		self.rcLines = []
-		if os.environ.has_key('HOME'):
-			envHome = os.environ['HOME']
-			try:
-				rcFile = open(os.path.join(envHome, ".pdbrc"))
-			except IOError:
-				pass
-			else:
-				for line in rcFile.readlines():
-					self.rcLines.append(line)
-				rcFile.close()
-		try:
-			rcFile = open(".pdbrc")
-		except IOError:
-			pass
-		else:
-			for line in rcFile.readlines():
-				self.rcLines.append(line)
-			rcFile.close()
-	
-	def reset(self):
-		bdb.Bdb.reset(self)
-		self.forget()
-	
-	def forget(self):
-		self.lineno = None
-		self.stack = []
-		self.curindex = 0
-		self.curframe = None
-	
-	def setup(self, f, t):
-		self.forget()
-		self.stack, self.curindex = self.get_stack(f, t)
-		self.curframe = self.stack[self.curindex][0]
-		self.execRcLines()
+    def __init__(self):
+        bdb.Bdb.__init__(self)
+        cmd.Cmd.__init__(self)
+        self.prompt = '(Pdb) '
+        self.aliases = {}
+        # Try to load readline if it exists
+        try:
+            import readline
+        except ImportError:
+            pass
 
-	# Can be executed earlier than 'setup' if desired
-	def execRcLines(self):
-		if self.rcLines:
-			# Make local copy because of recursion
-			rcLines = self.rcLines
-			# executed only once
-			self.rcLines = []
-			for line in rcLines:
-				line = line[:-1]
-				if len (line) > 0 and line[0] != '#':
-					self.onecmd (line)
-	
-	# Override Bdb methods (except user_call, for now)
-	
-	def user_line(self, frame):
-		"""This function is called when we stop or break at this line."""
-		self.interaction(frame, None)
-	
-	def user_return(self, frame, return_value):
-		"""This function is called when a return trap is set here."""
-		frame.f_locals['__return__'] = return_value
-		print '--Return--'
-		self.interaction(frame, None)
-	
-	def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
-		"""This function is called if an exception occurs,
-		but only if we are to stop at or just below this level."""
-		frame.f_locals['__exception__'] = exc_type, exc_value
-		if type(exc_type) == type(''):
-			exc_type_name = exc_type
-		else: exc_type_name = exc_type.__name__
-		print exc_type_name + ':', repr.repr(exc_value)
-		self.interaction(frame, exc_traceback)
-	
-	# General interaction function
-	
-	def interaction(self, frame, traceback):
-		self.setup(frame, traceback)
-		self.print_stack_entry(self.stack[self.curindex])
-		self.cmdloop()
-		self.forget()
+        # Read $HOME/.pdbrc and ./.pdbrc
+        self.rcLines = []
+        if os.environ.has_key('HOME'):
+            envHome = os.environ['HOME']
+            try:
+                rcFile = open(os.path.join(envHome, ".pdbrc"))
+            except IOError:
+                pass
+            else:
+                for line in rcFile.readlines():
+                    self.rcLines.append(line)
+                rcFile.close()
+        try:
+            rcFile = open(".pdbrc")
+        except IOError:
+            pass
+        else:
+            for line in rcFile.readlines():
+                self.rcLines.append(line)
+            rcFile.close()
 
-	def default(self, line):
-		if line[:1] == '!': line = line[1:]
-		locals = self.curframe.f_locals
-		globals = self.curframe.f_globals
-		try:
-			code = compile(line + '\n', '<stdin>', 'single')
-			exec code in globals, locals
-		except:
-			t, v = sys.exc_info()[:2]
-			if type(t) == type(''):
-				exc_type_name = t
-			else: exc_type_name = t.__name__
-			print '***', exc_type_name + ':', v
+    def reset(self):
+        bdb.Bdb.reset(self)
+        self.forget()
 
-	def precmd(self, line):
-		"""Handle alias expansion and ';;' separator."""
-		if not line:
-			return line
-		args = string.split(line)
-		while self.aliases.has_key(args[0]):
-			line = self.aliases[args[0]]
-			ii = 1
-			for tmpArg in args[1:]:
-				line = string.replace(line, "%" + str(ii),
-						      tmpArg)
-				ii = ii + 1
-			line = string.replace(line, "%*",
-					      string.join(args[1:], ' '))
-			args = string.split(line)
-		# split into ';;' separated commands
-		# unless it's an alias command
-		if args[0] != 'alias':
-			marker = string.find(line, ';;')
-			if marker >= 0:
-				# queue up everything after marker
-				next = string.lstrip(line[marker+2:])
-				self.cmdqueue.append(next)
-				line = string.rstrip(line[:marker])
-		return line
+    def forget(self):
+        self.lineno = None
+        self.stack = []
+        self.curindex = 0
+        self.curframe = None
 
-	# Command definitions, called by cmdloop()
-	# The argument is the remaining string on the command line
-	# Return true to exit from the command loop 
-	
-	do_h = cmd.Cmd.do_help
+    def setup(self, f, t):
+        self.forget()
+        self.stack, self.curindex = self.get_stack(f, t)
+        self.curframe = self.stack[self.curindex][0]
+        self.execRcLines()
 
-	def do_EOF(self, arg):
-		return 0	# Don't die on EOF
+    # Can be executed earlier than 'setup' if desired
+    def execRcLines(self):
+        if self.rcLines:
+            # Make local copy because of recursion
+            rcLines = self.rcLines
+            # executed only once
+            self.rcLines = []
+            for line in rcLines:
+                line = line[:-1]
+                if len (line) > 0 and line[0] != '#':
+                    self.onecmd (line)
 
-	def do_break(self, arg, temporary = 0):
-		# break [ ([filename:]lineno | function) [, "condition"] ]
-		if not arg:
-			if self.breaks:  # There's at least one
-				print "Num Type         Disp Enb   Where"
-				for bp in bdb.Breakpoint.bpbynumber:
-					if bp:
-						bp.bpprint()
-			return
-		# parse arguments; comma has lowest precedence
-		# and cannot occur in filename
-		filename = None
-		lineno = None
-		cond = None
-		comma = string.find(arg, ',')
-		if comma > 0:
-			# parse stuff after comma: "condition"
-			cond = string.lstrip(arg[comma+1:])
-			arg = string.rstrip(arg[:comma])
-		# parse stuff before comma: [filename:]lineno | function
-		colon = string.rfind(arg, ':')
-		if colon >= 0:
-			filename = string.rstrip(arg[:colon])
-			f = self.lookupmodule(filename)
-			if not f:
-				print '*** ', `filename`,
-				print 'not found from sys.path'
-				return
-			else:
-				filename = f
-			arg = string.lstrip(arg[colon+1:])
-			try:
-				lineno = int(arg)
-			except ValueError, msg:
-				print '*** Bad lineno:', arg
-				return
-		else:
-			# no colon; can be lineno or function
-			try:
-				lineno = int(arg)
-			except ValueError:
-				try:
-					func = eval(arg,
-						    self.curframe.f_globals,
-						    self.curframe.f_locals)
-				except:
-					func = arg
-				try:
-					if hasattr(func, 'im_func'):
-						func = func.im_func
-					code = func.func_code
-					lineno = code.co_firstlineno
-					filename = code.co_filename
-				except:
-					# last thing to try
-					(ok, filename, ln) = self.lineinfo(arg)
-					if not ok:
-					    print '*** The specified object',
-					    print `arg`,
-					    print 'is not a function'
-					    print ('or was not found '
-						   'along sys.path.')
-					    return
-					lineno = int(ln)
-		if not filename:
-			filename = self.defaultFile()
-		# Check for reasonable breakpoint
-		line = self.checkline(filename, lineno)
-		if line:
-			# now set the break point
-			err = self.set_break(filename, line, temporary, cond)
-			if err: print '***', err
-			else:
-				bp = self.get_breaks(filename, line)[-1]
-				print "Breakpoint %d at %s:%d" % (bp.number,
-								  bp.file,
-								  bp.line)
+    # Override Bdb methods (except user_call, for now)
 
-	# To be overridden in derived debuggers
-	def defaultFile(self):
-		"""Produce a reasonable default."""
-		filename = self.curframe.f_code.co_filename
-		if filename == '<string>' and mainpyfile:
-			filename = mainpyfile
-		return filename
+    def user_line(self, frame):
+        """This function is called when we stop or break at this line."""
+        self.interaction(frame, None)
 
-	do_b = do_break
-	
-	def do_tbreak(self, arg):
-		self.do_break(arg, 1)
+    def user_return(self, frame, return_value):
+        """This function is called when a return trap is set here."""
+        frame.f_locals['__return__'] = return_value
+        print '--Return--'
+        self.interaction(frame, None)
 
-	def lineinfo(self, identifier):
-		failed = (None, None, None)
-		# Input is identifier, may be in single quotes
-		idstring = string.split(identifier, "'")
-		if len(idstring) == 1:
-			# not in single quotes
-			id = string.strip(idstring[0])
-		elif len(idstring) == 3:
-			# quoted
-			id = string.strip(idstring[1])
-		else:
-			return failed
-		if id == '': return failed
-		parts = string.split(id, '.')
-		# Protection for derived debuggers
-		if parts[0] == 'self':
-			del parts[0]
-			if len(parts) == 0:
-				return failed
-		# Best first guess at file to look at
-		fname = self.defaultFile()
-		if len(parts) == 1:
-			item = parts[0]
-		else:
-			# More than one part.
-			# First is module, second is method/class
-			f = self.lookupmodule(parts[0])
-			if f:
-				fname = f
-			item = parts[1]
-		answer = find_function(item, fname)
-		return answer or failed
-		
-	def checkline(self, filename, lineno):
-		"""Return line number of first line at or after input
-		argument such that if the input points to a 'def', the
-		returned line number is the first
-		non-blank/non-comment line to follow.  If the input
-		points to a blank or comment line, return 0.  At end
-		of file, also return 0."""
+    def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
+        """This function is called if an exception occurs,
+        but only if we are to stop at or just below this level."""
+        frame.f_locals['__exception__'] = exc_type, exc_value
+        if type(exc_type) == type(''):
+            exc_type_name = exc_type
+        else: exc_type_name = exc_type.__name__
+        print exc_type_name + ':', repr.repr(exc_value)
+        self.interaction(frame, exc_traceback)
 
-		line = linecache.getline(filename, lineno)
-		if not line:
-			print 'End of file'
-			return 0
-		line = string.strip(line)
-		# Don't allow setting breakpoint at a blank line
-		if ( not line or (line[0] == '#') or
-		     (line[:3] == '"""') or line[:3] == "'''" ):
-			print '*** Blank or comment'
-			return 0
-		# When a file is read in and a breakpoint is at
-		# the 'def' statement, the system stops there at
-		# code parse time.  We don't want that, so all breakpoints
-		# set at 'def' statements are moved one line onward
-		if line[:3] == 'def':
-			instr = ''
-			brackets = 0
-			while 1:
-				skipone = 0
-				for c in line:
-					if instr:
-						if skipone:
-							skipone = 0
-						elif c == '\\':
-							skipone = 1
-						elif c == instr:
-							instr = ''
-					elif c == '#':
-						break
-					elif c in ('"',"'"):
-						instr = c
-					elif c in ('(','{','['):
-						brackets = brackets + 1
-					elif c in (')','}',']'):
-						brackets = brackets - 1
-				lineno = lineno+1
-				line = linecache.getline(filename, lineno)
-				if not line:
-					print 'end of file'
-					return 0
-				line = string.strip(line)
-				if not line: continue	# Blank line
-				if brackets <= 0 and line[0] not in ('#','"',"'"):
-					break
-		return lineno
+    # General interaction function
+
+    def interaction(self, frame, traceback):
+        self.setup(frame, traceback)
+        self.print_stack_entry(self.stack[self.curindex])
+        self.cmdloop()
+        self.forget()
+
+    def default(self, line):
+        if line[:1] == '!': line = line[1:]
+        locals = self.curframe.f_locals
+        globals = self.curframe.f_globals
+        try:
+            code = compile(line + '\n', '<stdin>', 'single')
+            exec code in globals, locals
+        except:
+            t, v = sys.exc_info()[:2]
+            if type(t) == type(''):
+                exc_type_name = t
+            else: exc_type_name = t.__name__
+            print '***', exc_type_name + ':', v
+
+    def precmd(self, line):
+        """Handle alias expansion and ';;' separator."""
+        if not line:
+            return line
+        args = string.split(line)
+        while self.aliases.has_key(args[0]):
+            line = self.aliases[args[0]]
+            ii = 1
+            for tmpArg in args[1:]:
+                line = string.replace(line, "%" + str(ii),
+                                      tmpArg)
+                ii = ii + 1
+            line = string.replace(line, "%*",
+                                  string.join(args[1:], ' '))
+            args = string.split(line)
+        # split into ';;' separated commands
+        # unless it's an alias command
+        if args[0] != 'alias':
+            marker = string.find(line, ';;')
+            if marker >= 0:
+                # queue up everything after marker
+                next = string.lstrip(line[marker+2:])
+                self.cmdqueue.append(next)
+                line = string.rstrip(line[:marker])
+        return line
+
+    # Command definitions, called by cmdloop()
+    # The argument is the remaining string on the command line
+    # Return true to exit from the command loop
+
+    do_h = cmd.Cmd.do_help
+
+    def do_EOF(self, arg):
+        return 0        # Don't die on EOF
+
+    def do_break(self, arg, temporary = 0):
+        # break [ ([filename:]lineno | function) [, "condition"] ]
+        if not arg:
+            if self.breaks:  # There's at least one
+                print "Num Type         Disp Enb   Where"
+                for bp in bdb.Breakpoint.bpbynumber:
+                    if bp:
+                        bp.bpprint()
+            return
+        # parse arguments; comma has lowest precedence
+        # and cannot occur in filename
+        filename = None
+        lineno = None
+        cond = None
+        comma = string.find(arg, ',')
+        if comma > 0:
+            # parse stuff after comma: "condition"
+            cond = string.lstrip(arg[comma+1:])
+            arg = string.rstrip(arg[:comma])
+        # parse stuff before comma: [filename:]lineno | function
+        colon = string.rfind(arg, ':')
+        if colon >= 0:
+            filename = string.rstrip(arg[:colon])
+            f = self.lookupmodule(filename)
+            if not f:
+                print '*** ', `filename`,
+                print 'not found from sys.path'
+                return
+            else:
+                filename = f
+            arg = string.lstrip(arg[colon+1:])
+            try:
+                lineno = int(arg)
+            except ValueError, msg:
+                print '*** Bad lineno:', arg
+                return
+        else:
+            # no colon; can be lineno or function
+            try:
+                lineno = int(arg)
+            except ValueError:
+                try:
+                    func = eval(arg,
+                                self.curframe.f_globals,
+                                self.curframe.f_locals)
+                except:
+                    func = arg
+                try:
+                    if hasattr(func, 'im_func'):
+                        func = func.im_func
+                    code = func.func_code
+                    lineno = code.co_firstlineno
+                    filename = code.co_filename
+                except:
+                    # last thing to try
+                    (ok, filename, ln) = self.lineinfo(arg)
+                    if not ok:
+                        print '*** The specified object',
+                        print `arg`,
+                        print 'is not a function'
+                        print ('or was not found '
+                               'along sys.path.')
+                        return
+                    lineno = int(ln)
+        if not filename:
+            filename = self.defaultFile()
+        # Check for reasonable breakpoint
+        line = self.checkline(filename, lineno)
+        if line:
+            # now set the break point
+            err = self.set_break(filename, line, temporary, cond)
+            if err: print '***', err
+            else:
+                bp = self.get_breaks(filename, line)[-1]
+                print "Breakpoint %d at %s:%d" % (bp.number,
+                                                  bp.file,
+                                                  bp.line)
+
+    # To be overridden in derived debuggers
+    def defaultFile(self):
+        """Produce a reasonable default."""
+        filename = self.curframe.f_code.co_filename
+        if filename == '<string>' and mainpyfile:
+            filename = mainpyfile
+        return filename
+
+    do_b = do_break
+
+    def do_tbreak(self, arg):
+        self.do_break(arg, 1)
+
+    def lineinfo(self, identifier):
+        failed = (None, None, None)
+        # Input is identifier, may be in single quotes
+        idstring = string.split(identifier, "'")
+        if len(idstring) == 1:
+            # not in single quotes
+            id = string.strip(idstring[0])
+        elif len(idstring) == 3:
+            # quoted
+            id = string.strip(idstring[1])
+        else:
+            return failed
+        if id == '': return failed
+        parts = string.split(id, '.')
+        # Protection for derived debuggers
+        if parts[0] == 'self':
+            del parts[0]
+            if len(parts) == 0:
+                return failed
+        # Best first guess at file to look at
+        fname = self.defaultFile()
+        if len(parts) == 1:
+            item = parts[0]
+        else:
+            # More than one part.
+            # First is module, second is method/class
+            f = self.lookupmodule(parts[0])
+            if f:
+                fname = f
+            item = parts[1]
+        answer = find_function(item, fname)
+        return answer or failed
+
+    def checkline(self, filename, lineno):
+        """Return line number of first line at or after input
+        argument such that if the input points to a 'def', the
+        returned line number is the first
+        non-blank/non-comment line to follow.  If the input
+        points to a blank or comment line, return 0.  At end
+        of file, also return 0."""
+
+        line = linecache.getline(filename, lineno)
+        if not line:
+            print 'End of file'
+            return 0
+        line = string.strip(line)
+        # Don't allow setting breakpoint at a blank line
+        if ( not line or (line[0] == '#') or
+             (line[:3] == '"""') or line[:3] == "'''" ):
+            print '*** Blank or comment'
+            return 0
+        # When a file is read in and a breakpoint is at
+        # the 'def' statement, the system stops there at
+        # code parse time.  We don't want that, so all breakpoints
+        # set at 'def' statements are moved one line onward
+        if line[:3] == 'def':
+            instr = ''
+            brackets = 0
+            while 1:
+                skipone = 0
+                for c in line:
+                    if instr:
+                        if skipone:
+                            skipone = 0
+                        elif c == '\\':
+                            skipone = 1
+                        elif c == instr:
+                            instr = ''
+                    elif c == '#':
+                        break
+                    elif c in ('"',"'"):
+                        instr = c
+                    elif c in ('(','{','['):
+                        brackets = brackets + 1
+                    elif c in (')','}',']'):
+                        brackets = brackets - 1
+                lineno = lineno+1
+                line = linecache.getline(filename, lineno)
+                if not line:
+                    print 'end of file'
+                    return 0
+                line = string.strip(line)
+                if not line: continue   # Blank line
+                if brackets <= 0 and line[0] not in ('#','"',"'"):
+                    break
+        return lineno
+
+    def do_enable(self, arg):
+        args = string.split(arg)
+        for i in args:
+            bp = bdb.Breakpoint.bpbynumber[int(i)]
+            if bp:
+                bp.enable()
+
+    def do_disable(self, arg):
+        args = string.split(arg)
+        for i in args:
+            bp = bdb.Breakpoint.bpbynumber[int(i)]
+            if bp:
+                bp.disable()
+
+    def do_condition(self, arg):
+        # arg is breakpoint number and condition
+        args = string.split(arg, ' ', 1)
+        bpnum = int(string.strip(args[0]))
+        try:
+            cond = args[1]
+        except:
+            cond = None
+        bp = bdb.Breakpoint.bpbynumber[bpnum]
+        if bp:
+            bp.cond = cond
+            if not cond:
+                print 'Breakpoint', bpnum,
+                print 'is now unconditional.'
+
+    def do_ignore(self,arg):
+        """arg is bp number followed by ignore count."""
+        args = string.split(arg)
+        bpnum = int(string.strip(args[0]))
+        try:
+            count = int(string.strip(args[1]))
+        except:
+            count = 0
+        bp = bdb.Breakpoint.bpbynumber[bpnum]
+        if bp:
+            bp.ignore = count
+            if (count > 0):
+                reply = 'Will ignore next '
+                if (count > 1):
+                    reply = reply + '%d crossings' % count
+                else:
+                    reply = reply + '1 crossing'
+                print reply + ' of breakpoint %d.' % bpnum
+            else:
+                print 'Will stop next time breakpoint',
+                print bpnum, 'is reached.'
+
+    def do_clear(self, arg):
+        """Three possibilities, tried in this order:
+        clear -> clear all breaks, ask for confirmation
+        clear file:lineno -> clear all breaks at file:lineno
+        clear bpno bpno ... -> clear breakpoints by number"""
+        if not arg:
+            try:
+                reply = raw_input('Clear all breaks? ')
+            except EOFError:
+                reply = 'no'
+            reply = string.lower(string.strip(reply))
+            if reply in ('y', 'yes'):
+                self.clear_all_breaks()
+            return
+        if ':' in arg:
+            # Make sure it works for "clear C:\foo\bar.py:12"
+            i = string.rfind(arg, ':')
+            filename = arg[:i]
+            arg = arg[i+1:]
+            try:
+                lineno = int(arg)
+            except:
+                err = "Invalid line number (%s)" % arg
+            else:
+                err = self.clear_break(filename, lineno)
+            if err: print '***', err
+            return
+        numberlist = string.split(arg)
+        for i in numberlist:
+            err = self.clear_bpbynumber(i)
+            if err:
+                print '***', err
+            else:
+                print 'Deleted breakpoint %s ' % (i,)
+    do_cl = do_clear # 'c' is already an abbreviation for 'continue'
+
+    def do_where(self, arg):
+        self.print_stack_trace()
+    do_w = do_where
+
+    def do_up(self, arg):
+        if self.curindex == 0:
+            print '*** Oldest frame'
+        else:
+            self.curindex = self.curindex - 1
+            self.curframe = self.stack[self.curindex][0]
+            self.print_stack_entry(self.stack[self.curindex])
+            self.lineno = None
+    do_u = do_up
+
+    def do_down(self, arg):
+        if self.curindex + 1 == len(self.stack):
+            print '*** Newest frame'
+        else:
+            self.curindex = self.curindex + 1
+            self.curframe = self.stack[self.curindex][0]
+            self.print_stack_entry(self.stack[self.curindex])
+            self.lineno = None
+    do_d = do_down
+
+    def do_step(self, arg):
+        self.set_step()
+        return 1
+    do_s = do_step
+
+    def do_next(self, arg):
+        self.set_next(self.curframe)
+        return 1
+    do_n = do_next
+
+    def do_return(self, arg):
+        self.set_return(self.curframe)
+        return 1
+    do_r = do_return
+
+    def do_continue(self, arg):
+        self.set_continue()
+        return 1
+    do_c = do_cont = do_continue
+
+    def do_quit(self, arg):
+        self.set_quit()
+        return 1
+    do_q = do_quit
+
+    def do_args(self, arg):
+        f = self.curframe
+        co = f.f_code
+        dict = f.f_locals
+        n = co.co_argcount
+        if co.co_flags & 4: n = n+1
+        if co.co_flags & 8: n = n+1
+        for i in range(n):
+            name = co.co_varnames[i]
+            print name, '=',
+            if dict.has_key(name): print dict[name]
+            else: print "*** undefined ***"
+    do_a = do_args
 
-	def do_enable(self, arg):
-		args = string.split(arg)
-		for i in args:
-			bp = bdb.Breakpoint.bpbynumber[int(i)]
-			if bp:
-				bp.enable()
+    def do_retval(self, arg):
+        if self.curframe.f_locals.has_key('__return__'):
+            print self.curframe.f_locals['__return__']
+        else:
+            print '*** Not yet returned!'
+    do_rv = do_retval
 
-	def do_disable(self, arg):
-		args = string.split(arg)
-		for i in args:
-			bp = bdb.Breakpoint.bpbynumber[int(i)]
-			if bp:
-				bp.disable()
+    def do_p(self, arg):
+        try:
+            value = eval(arg, self.curframe.f_globals,
+                            self.curframe.f_locals)
+        except:
+            t, v = sys.exc_info()[:2]
+            if type(t) == type(''):
+                exc_type_name = t
+            else: exc_type_name = t.__name__
+            print '***', exc_type_name + ':', `v`
+            return
 
-	def do_condition(self, arg):
-		# arg is breakpoint number and condition
-		args = string.split(arg, ' ', 1)
-		bpnum = int(string.strip(args[0]))
-		try:
-			cond = args[1]
-		except:
-			cond = None
-		bp = bdb.Breakpoint.bpbynumber[bpnum]
-		if bp:
-			bp.cond = cond
-			if not cond:
-				print 'Breakpoint', bpnum,
-				print 'is now unconditional.'
+        print `value`
 
-	def do_ignore(self,arg):
-		"""arg is bp number followed by ignore count."""
-		args = string.split(arg)
-		bpnum = int(string.strip(args[0]))
-		try:
-			count = int(string.strip(args[1]))
-		except:
-			count = 0
-		bp = bdb.Breakpoint.bpbynumber[bpnum]
-		if bp:
-			bp.ignore = count
-			if (count > 0):
-				reply = 'Will ignore next '
-				if (count > 1):
-					reply = reply + '%d crossings' % count
-				else:
-					reply = reply + '1 crossing'
-				print reply + ' of breakpoint %d.' % bpnum
-			else:
-				print 'Will stop next time breakpoint',
-				print bpnum, 'is reached.'
+    def do_list(self, arg):
+        self.lastcmd = 'list'
+        last = None
+        if arg:
+            try:
+                x = eval(arg, {}, {})
+                if type(x) == type(()):
+                    first, last = x
+                    first = int(first)
+                    last = int(last)
+                    if last < first:
+                        # Assume it's a count
+                        last = first + last
+                else:
+                    first = max(1, int(x) - 5)
+            except:
+                print '*** Error in argument:', `arg`
+                return
+        elif self.lineno is None:
+            first = max(1, self.curframe.f_lineno - 5)
+        else:
+            first = self.lineno + 1
+        if last is None:
+            last = first + 10
+        filename = self.curframe.f_code.co_filename
+        breaklist = self.get_file_breaks(filename)
+        try:
+            for lineno in range(first, last+1):
+                line = linecache.getline(filename, lineno)
+                if not line:
+                    print '[EOF]'
+                    break
+                else:
+                    s = string.rjust(`lineno`, 3)
+                    if len(s) < 4: s = s + ' '
+                    if lineno in breaklist: s = s + 'B'
+                    else: s = s + ' '
+                    if lineno == self.curframe.f_lineno:
+                        s = s + '->'
+                    print s + '\t' + line,
+                    self.lineno = lineno
+        except KeyboardInterrupt:
+            pass
+    do_l = do_list
 
-	def do_clear(self, arg):
-		"""Three possibilities, tried in this order:
-		clear -> clear all breaks, ask for confirmation
-		clear file:lineno -> clear all breaks at file:lineno
-		clear bpno bpno ... -> clear breakpoints by number"""
-		if not arg:
-			try:
-				reply = raw_input('Clear all breaks? ')
-			except EOFError:
-				reply = 'no'
-			reply = string.lower(string.strip(reply))
-			if reply in ('y', 'yes'):
-				self.clear_all_breaks()
-			return
-		if ':' in arg:
-			# Make sure it works for "clear C:\foo\bar.py:12"
-			i = string.rfind(arg, ':')
-			filename = arg[:i]
-			arg = arg[i+1:]
-			try:
-				lineno = int(arg)
-			except:
-				err = "Invalid line number (%s)" % arg
-			else:
-				err = self.clear_break(filename, lineno)
-			if err: print '***', err
-			return
-		numberlist = string.split(arg)
-		for i in numberlist:
-			err = self.clear_bpbynumber(i)
-			if err:
-				print '***', err
-			else:
-				print 'Deleted breakpoint %s ' % (i,)
-	do_cl = do_clear # 'c' is already an abbreviation for 'continue'
-	
-	def do_where(self, arg):
-		self.print_stack_trace()
-	do_w = do_where
-	
-	def do_up(self, arg):
-		if self.curindex == 0:
-			print '*** Oldest frame'
-		else:
-			self.curindex = self.curindex - 1
-			self.curframe = self.stack[self.curindex][0]
-			self.print_stack_entry(self.stack[self.curindex])
-			self.lineno = None
-	do_u = do_up
-	
-	def do_down(self, arg):
-		if self.curindex + 1 == len(self.stack):
-			print '*** Newest frame'
-		else:
-			self.curindex = self.curindex + 1
-			self.curframe = self.stack[self.curindex][0]
-			self.print_stack_entry(self.stack[self.curindex])
-			self.lineno = None
-	do_d = do_down
-	
-	def do_step(self, arg):
-		self.set_step()
-		return 1
-	do_s = do_step
-	
-	def do_next(self, arg):
-		self.set_next(self.curframe)
-		return 1
-	do_n = do_next
-	
-	def do_return(self, arg):
-		self.set_return(self.curframe)
-		return 1
-	do_r = do_return
-	
-	def do_continue(self, arg):
-		self.set_continue()
-		return 1
-	do_c = do_cont = do_continue
-	
-	def do_quit(self, arg):
-		self.set_quit()
-		return 1
-	do_q = do_quit
-	
-	def do_args(self, arg):
-		f = self.curframe
-		co = f.f_code
-		dict = f.f_locals
-		n = co.co_argcount
-		if co.co_flags & 4: n = n+1
-		if co.co_flags & 8: n = n+1
-		for i in range(n):
-			name = co.co_varnames[i]
-			print name, '=',
-			if dict.has_key(name): print dict[name]
-			else: print "*** undefined ***"
-	do_a = do_args
-	
-	def do_retval(self, arg):
-		if self.curframe.f_locals.has_key('__return__'):
-			print self.curframe.f_locals['__return__']
-		else:
-			print '*** Not yet returned!'
-	do_rv = do_retval
-	
-	def do_p(self, arg):
-		try:
-			value = eval(arg, self.curframe.f_globals,
-					self.curframe.f_locals)
-		except:
-			t, v = sys.exc_info()[:2]
-			if type(t) == type(''):
-				exc_type_name = t
-			else: exc_type_name = t.__name__
-			print '***', exc_type_name + ':', `v`
-			return
+    def do_whatis(self, arg):
+        try:
+            value = eval(arg, self.curframe.f_globals,
+                            self.curframe.f_locals)
+        except:
+            t, v = sys.exc_info()[:2]
+            if type(t) == type(''):
+                exc_type_name = t
+            else: exc_type_name = t.__name__
+            print '***', exc_type_name + ':', `v`
+            return
+        code = None
+        # Is it a function?
+        try: code = value.func_code
+        except: pass
+        if code:
+            print 'Function', code.co_name
+            return
+        # Is it an instance method?
+        try: code = value.im_func.func_code
+        except: pass
+        if code:
+            print 'Method', code.co_name
+            return
+        # None of the above...
+        print type(value)
 
-		print `value`
+    def do_alias(self, arg):
+        args = string.split (arg)
+        if len(args) == 0:
+            keys = self.aliases.keys()
+            keys.sort()
+            for alias in keys:
+                print "%s = %s" % (alias, self.aliases[alias])
+            return
+        if self.aliases.has_key(args[0]) and len (args) == 1:
+            print "%s = %s" % (args[0], self.aliases[args[0]])
+        else:
+            self.aliases[args[0]] = string.join(args[1:], ' ')
 
-	def do_list(self, arg):
-		self.lastcmd = 'list'
-		last = None
-		if arg:
-			try:
-				x = eval(arg, {}, {})
-				if type(x) == type(()):
-					first, last = x
-					first = int(first)
-					last = int(last)
-					if last < first:
-						# Assume it's a count
-						last = first + last
-				else:
-					first = max(1, int(x) - 5)
-			except:
-				print '*** Error in argument:', `arg`
-				return
-		elif self.lineno is None:
-			first = max(1, self.curframe.f_lineno - 5)
-		else:
-			first = self.lineno + 1
-		if last is None:
-			last = first + 10
-		filename = self.curframe.f_code.co_filename
-		breaklist = self.get_file_breaks(filename)
-		try:
-			for lineno in range(first, last+1):
-				line = linecache.getline(filename, lineno)
-				if not line:
-					print '[EOF]'
-					break
-				else:
-					s = string.rjust(`lineno`, 3)
-					if len(s) < 4: s = s + ' '
-					if lineno in breaklist: s = s + 'B'
-					else: s = s + ' '
-					if lineno == self.curframe.f_lineno:
-						s = s + '->'
-					print s + '\t' + line,
-					self.lineno = lineno
-		except KeyboardInterrupt:
-			pass
-	do_l = do_list
+    def do_unalias(self, arg):
+        args = string.split (arg)
+        if len(args) == 0: return
+        if self.aliases.has_key(args[0]):
+            del self.aliases[args[0]]
 
-	def do_whatis(self, arg):
-		try:
-			value = eval(arg, self.curframe.f_globals,
-					self.curframe.f_locals)
-		except:
-			t, v = sys.exc_info()[:2]
-			if type(t) == type(''):
-				exc_type_name = t
-			else: exc_type_name = t.__name__
-			print '***', exc_type_name + ':', `v`
-			return
-		code = None
-		# Is it a function?
-		try: code = value.func_code
-		except: pass
-		if code:
-			print 'Function', code.co_name
-			return
-		# Is it an instance method?
-		try: code = value.im_func.func_code
-		except: pass
-		if code:
-			print 'Method', code.co_name
-			return
-		# None of the above...
-		print type(value)
+    # Print a traceback starting at the top stack frame.
+    # The most recently entered frame is printed last;
+    # this is different from dbx and gdb, but consistent with
+    # the Python interpreter's stack trace.
+    # It is also consistent with the up/down commands (which are
+    # compatible with dbx and gdb: up moves towards 'main()'
+    # and down moves towards the most recent stack frame).
 
-	def do_alias(self, arg):
-		args = string.split (arg)
-		if len(args) == 0:
-			keys = self.aliases.keys()
-			keys.sort()
-			for alias in keys:
-				print "%s = %s" % (alias, self.aliases[alias])
-			return
-		if self.aliases.has_key(args[0]) and len (args) == 1:
-			print "%s = %s" % (args[0], self.aliases[args[0]])
-		else:
-			self.aliases[args[0]] = string.join(args[1:], ' ')
+    def print_stack_trace(self):
+        try:
+            for frame_lineno in self.stack:
+                self.print_stack_entry(frame_lineno)
+        except KeyboardInterrupt:
+            pass
 
-	def do_unalias(self, arg):
-		args = string.split (arg)
-		if len(args) == 0: return
-		if self.aliases.has_key(args[0]):
-			del self.aliases[args[0]]
+    def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
+        frame, lineno = frame_lineno
+        if frame is self.curframe:
+            print '>',
+        else:
+            print ' ',
+        print self.format_stack_entry(frame_lineno, prompt_prefix)
 
-	# Print a traceback starting at the top stack frame.
-	# The most recently entered frame is printed last;
-	# this is different from dbx and gdb, but consistent with
-	# the Python interpreter's stack trace.
-	# It is also consistent with the up/down commands (which are
-	# compatible with dbx and gdb: up moves towards 'main()'
-	# and down moves towards the most recent stack frame).
-	
-	def print_stack_trace(self):
-		try:
-			for frame_lineno in self.stack:
-				self.print_stack_entry(frame_lineno)
-		except KeyboardInterrupt:
-			pass
-	
-	def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
-		frame, lineno = frame_lineno
-		if frame is self.curframe:
-			print '>',
-		else:
-			print ' ',
-		print self.format_stack_entry(frame_lineno, prompt_prefix)
 
+    # Help methods (derived from pdb.doc)
 
-	# Help methods (derived from pdb.doc)
+    def help_help(self):
+        self.help_h()
 
-	def help_help(self):
-		self.help_h()
+    def help_h(self):
+        print """h(elp)
+Without argument, print the list of available commands.
+With a command name as argument, print help about that command
+"help pdb" pipes the full documentation file to the $PAGER
+"help exec" gives help on the ! command"""
 
-	def help_h(self):
-		print """h(elp)
-	Without argument, print the list of available commands.
-	With a command name as argument, print help about that command
-	"help pdb" pipes the full documentation file to the $PAGER
-	"help exec" gives help on the ! command"""
+    def help_where(self):
+        self.help_w()
 
-	def help_where(self):
-		self.help_w()
+    def help_w(self):
+        print """w(here)
+Print a stack trace, with the most recent frame at the bottom.
+An arrow indicates the "current frame", which determines the
+context of most commands."""
 
-	def help_w(self):
-		print """w(here)
-	Print a stack trace, with the most recent frame at the bottom.
-	An arrow indicates the "current frame", which determines the
-	context of most commands."""
+    def help_down(self):
+        self.help_d()
 
-	def help_down(self):
-		self.help_d()
+    def help_d(self):
+        print """d(own)
+Move the current frame one level down in the stack trace
+(to an older frame)."""
 
-	def help_d(self):
-		print """d(own)
-	Move the current frame one level down in the stack trace
-	(to an older frame)."""
+    def help_up(self):
+        self.help_u()
 
-	def help_up(self):
-		self.help_u()
+    def help_u(self):
+        print """u(p)
+Move the current frame one level up in the stack trace
+(to a newer frame)."""
 
-	def help_u(self):
-		print """u(p)
-	Move the current frame one level up in the stack trace
-	(to a newer frame)."""
+    def help_break(self):
+        self.help_b()
 
-	def help_break(self):
-		self.help_b()
+    def help_b(self):
+        print """b(reak) ([file:]lineno | function) [, condition]
+With a line number argument, set a break there in the current
+file.  With a function name, set a break at first executable line
+of that function.  Without argument, list all breaks.  If a second
+argument is present, it is a string specifying an expression
+which must evaluate to true before the breakpoint is honored.
 
-	def help_b(self):
-		print """b(reak) ([file:]lineno | function) [, condition]
-	With a line number argument, set a break there in the current
-	file.  With a function name, set a break at first executable line
-	of that function.  Without argument, list all breaks.  If a second
-	argument is present, it is a string specifying an expression
-	which must evaluate to true before the breakpoint is honored.
+The line number may be prefixed with a filename and a colon,
+to specify a breakpoint in another file (probably one that
+hasn't been loaded yet).  The file is searched for on sys.path;
+the .py suffix may be omitted."""
 
-	The line number may be prefixed with a filename and a colon,
-	to specify a breakpoint in another file (probably one that
-	hasn't been loaded yet).  The file is searched for on sys.path;
-	the .py suffix may be omitted."""
+    def help_clear(self):
+        self.help_cl()
 
-	def help_clear(self):
-		self.help_cl()
+    def help_cl(self):
+        print "cl(ear) filename:lineno"
+        print """cl(ear) [bpnumber [bpnumber...]]
+With a space separated list of breakpoint numbers, clear
+those breakpoints.  Without argument, clear all breaks (but
+first ask confirmation).  With a filename:lineno argument,
+clear all breaks at that line in that file.
 
-	def help_cl(self):
-		print "cl(ear) filename:lineno"
-		print """cl(ear) [bpnumber [bpnumber...]]
-	With a space separated list of breakpoint numbers, clear
-	those breakpoints.  Without argument, clear all breaks (but
-	first ask confirmation).  With a filename:lineno argument,
-	clear all breaks at that line in that file.
+Note that the argument is different from previous versions of
+the debugger (in python distributions 1.5.1 and before) where
+a linenumber was used instead of either filename:lineno or
+breakpoint numbers."""
 
-	Note that the argument is different from previous versions of
-	the debugger (in python distributions 1.5.1 and before) where
-	a linenumber was used instead of either filename:lineno or
-	breakpoint numbers."""
+    def help_tbreak(self):
+        print """tbreak  same arguments as break, but breakpoint is
+removed when first hit."""
 
-	def help_tbreak(self):
-		print """tbreak  same arguments as break, but breakpoint is
-	removed when first hit."""
+    def help_enable(self):
+        print """enable bpnumber [bpnumber ...]
+Enables the breakpoints given as a space separated list of
+bp numbers."""
 
-	def help_enable(self):
-		print """enable bpnumber [bpnumber ...]
-	Enables the breakpoints given as a space separated list of
-	bp numbers."""
+    def help_disable(self):
+        print """disable bpnumber [bpnumber ...]
+Disables the breakpoints given as a space separated list of
+bp numbers."""
 
-	def help_disable(self):
-		print """disable bpnumber [bpnumber ...]
-	Disables the breakpoints given as a space separated list of
-	bp numbers."""
+    def help_ignore(self):
+        print """ignore bpnumber count
+Sets the ignore count for the given breakpoint number.  A breakpoint
+becomes active when the ignore count is zero.  When non-zero, the
+count is decremented each time the breakpoint is reached and the
+breakpoint is not disabled and any associated condition evaluates
+to true."""
 
-	def help_ignore(self):
-		print """ignore bpnumber count
-	Sets the ignore count for the given breakpoint number.  A breakpoint
-	becomes active when the ignore count is zero.  When non-zero, the
-	count is decremented each time the breakpoint is reached and the
-	breakpoint is not disabled and any associated condition evaluates
-	to true."""
+    def help_condition(self):
+        print """condition bpnumber str_condition
+str_condition is a string specifying an expression which
+must evaluate to true before the breakpoint is honored.
+If str_condition is absent, any existing condition is removed;
+i.e., the breakpoint is made unconditional."""
 
-	def help_condition(self):
-		print """condition bpnumber str_condition
-	str_condition is a string specifying an expression which
-	must evaluate to true before the breakpoint is honored.
-	If str_condition is absent, any existing condition is removed;
-	i.e., the breakpoint is made unconditional."""
+    def help_step(self):
+        self.help_s()
 
-	def help_step(self):
-		self.help_s()
+    def help_s(self):
+        print """s(tep)
+Execute the current line, stop at the first possible occasion
+(either in a function that is called or in the current function)."""
 
-	def help_s(self):
-		print """s(tep)
-	Execute the current line, stop at the first possible occasion
-	(either in a function that is called or in the current function)."""
+    def help_next(self):
+        self.help_n()
 
-	def help_next(self):
-		self.help_n()
+    def help_n(self):
+        print """n(ext)
+Continue execution until the next line in the current function
+is reached or it returns."""
 
-	def help_n(self):
-		print """n(ext)
-	Continue execution until the next line in the current function
-	is reached or it returns."""
+    def help_return(self):
+        self.help_r()
 
-	def help_return(self):
-		self.help_r()
+    def help_r(self):
+        print """r(eturn)
+Continue execution until the current function returns."""
 
-	def help_r(self):
-		print """r(eturn)
-	Continue execution until the current function returns."""
+    def help_continue(self):
+        self.help_c()
 
-	def help_continue(self):
-		self.help_c()
+    def help_cont(self):
+        self.help_c()
 
-	def help_cont(self):
-		self.help_c()
+    def help_c(self):
+        print """c(ont(inue))
+Continue execution, only stop when a breakpoint is encountered."""
 
-	def help_c(self):
-		print """c(ont(inue))
-	Continue execution, only stop when a breakpoint is encountered."""
+    def help_list(self):
+        self.help_l()
 
-	def help_list(self):
-		self.help_l()
+    def help_l(self):
+        print """l(ist) [first [,last]]
+List source code for the current file.
+Without arguments, list 11 lines around the current line
+or continue the previous listing.
+With one argument, list 11 lines starting at that line.
+With two arguments, list the given range;
+if the second argument is less than the first, it is a count."""
 
-	def help_l(self):
-		print """l(ist) [first [,last]]
-	List source code for the current file.
-	Without arguments, list 11 lines around the current line
-	or continue the previous listing.
-	With one argument, list 11 lines starting at that line.
-	With two arguments, list the given range;
-	if the second argument is less than the first, it is a count."""
+    def help_args(self):
+        self.help_a()
 
-	def help_args(self):
-		self.help_a()
+    def help_a(self):
+        print """a(rgs)
+Print the arguments of the current function."""
 
-	def help_a(self):
-		print """a(rgs)
-	Print the arguments of the current function."""
+    def help_p(self):
+        print """p expression
+Print the value of the expression."""
 
-	def help_p(self):
-		print """p expression
-	Print the value of the expression."""
+    def help_exec(self):
+        print """(!) statement
+Execute the (one-line) statement in the context of
+the current stack frame.
+The exclamation point can be omitted unless the first word
+of the statement resembles a debugger command.
+To assign to a global variable you must always prefix the
+command with a 'global' command, e.g.:
+(Pdb) global list_options; list_options = ['-l']
+(Pdb)"""
 
-	def help_exec(self):
-		print """(!) statement
-	Execute the (one-line) statement in the context of
-	the current stack frame.
-	The exclamation point can be omitted unless the first word
-	of the statement resembles a debugger command.
-	To assign to a global variable you must always prefix the
-	command with a 'global' command, e.g.:
-	(Pdb) global list_options; list_options = ['-l']
-	(Pdb)"""
+    def help_quit(self):
+        self.help_q()
 
-	def help_quit(self):
-		self.help_q()
+    def help_q(self):
+        print """q(uit) Quit from the debugger.
+The program being executed is aborted."""
 
-	def help_q(self):
-		print """q(uit)	Quit from the debugger.
-	The program being executed is aborted."""
+    def help_whatis(self):
+        print """whatis arg
+Prints the type of the argument."""
 
-	def help_whatis(self):
-		print """whatis arg
-	Prints the type of the argument."""
+    def help_EOF(self):
+        print """EOF
+Handles the receipt of EOF as a command."""
 
-	def help_EOF(self):
-		print """EOF
-	Handles the receipt of EOF as a command."""
+    def help_alias(self):
+        print """alias [name [command [parameter parameter ...] ]]
+Creates an alias called 'name' the executes 'command'.  The command
+must *not* be enclosed in quotes.  Replaceable parameters are
+indicated by %1, %2, and so on, while %* is replaced by all the
+parameters.  If no command is given, the current alias for name
+is shown. If no name is given, all aliases are listed.
 
-	def help_alias(self):
-		print """alias [name [command [parameter parameter ...] ]]
-	Creates an alias called 'name' the executes 'command'.  The command
-	must *not* be enclosed in quotes.  Replaceable parameters are
-	indicated by %1, %2, and so on, while %* is replaced by all the 
-	parameters.  If no command is given, the current alias for name
-	is shown. If no name is given, all aliases are listed.
-	
-	Aliases may be nested and can contain anything that can be
-	legally typed at the pdb prompt.  Note!  You *can* override
-	internal pdb commands with aliases!  Those internal commands
-	are then hidden until the alias is removed.  Aliasing is recursively
-	applied to the first word of the command line; all other words
-	in the line are left alone.
+Aliases may be nested and can contain anything that can be
+legally typed at the pdb prompt.  Note!  You *can* override
+internal pdb commands with aliases!  Those internal commands
+are then hidden until the alias is removed.  Aliasing is recursively
+applied to the first word of the command line; all other words
+in the line are left alone.
 
-	Some useful aliases (especially when placed in the .pdbrc file) are:
+Some useful aliases (especially when placed in the .pdbrc file) are:
 
-	#Print instance variables (usage "pi classInst")
-	alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
+#Print instance variables (usage "pi classInst")
+alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
 
-	#Print instance variables in self
-	alias ps pi self
-	"""
+#Print instance variables in self
+alias ps pi self
+"""
 
-	def help_unalias(self):
-		print """unalias name
-	Deletes the specified alias."""
+    def help_unalias(self):
+        print """unalias name
+Deletes the specified alias."""
 
-	def help_pdb(self):
-		help()
+    def help_pdb(self):
+        help()
 
-	def lookupmodule(self, filename):
-		"""Helper function for break/clear parsing -- may be overridden."""
-		root, ext = os.path.splitext(filename)
-		if ext == '':
-			filename = filename + '.py'
-		if os.path.isabs(filename):
-			return filename
-		for dirname in sys.path:
-			while os.path.islink(dirname):
-				dirname = os.readlink(dirname)
-			fullname = os.path.join(dirname, filename)
-			if os.path.exists(fullname):
-				return fullname
-		return None
+    def lookupmodule(self, filename):
+        """Helper function for break/clear parsing -- may be overridden."""
+        root, ext = os.path.splitext(filename)
+        if ext == '':
+            filename = filename + '.py'
+        if os.path.isabs(filename):
+            return filename
+        for dirname in sys.path:
+            while os.path.islink(dirname):
+                dirname = os.readlink(dirname)
+            fullname = os.path.join(dirname, filename)
+            if os.path.exists(fullname):
+                return fullname
+        return None
 
 # Simplified interface
 
 def run(statement, globals=None, locals=None):
-	Pdb().run(statement, globals, locals)
+    Pdb().run(statement, globals, locals)
 
 def runeval(expression, globals=None, locals=None):
-	return Pdb().runeval(expression, globals, locals)
+    return Pdb().runeval(expression, globals, locals)
 
 def runctx(statement, globals, locals):
-	# B/W compatibility
-	run(statement, globals, locals)
+    # B/W compatibility
+    run(statement, globals, locals)
 
 def runcall(*args):
-	return apply(Pdb().runcall, args)
+    return apply(Pdb().runcall, args)
 
 def set_trace():
-	Pdb().set_trace()
+    Pdb().set_trace()
 
 # Post-Mortem interface
 
 def post_mortem(t):
-	p = Pdb()
-	p.reset()
-	while t.tb_next is not None:
-		t = t.tb_next
-	p.interaction(t.tb_frame, t)
+    p = Pdb()
+    p.reset()
+    while t.tb_next is not None:
+        t = t.tb_next
+    p.interaction(t.tb_frame, t)
 
 def pm():
-	post_mortem(sys.last_traceback)
+    post_mortem(sys.last_traceback)
 
 
 # Main program for testing
@@ -908,37 +908,37 @@
 TESTCMD = 'import x; x.main()'
 
 def test():
-	run(TESTCMD)
+    run(TESTCMD)
 
 # print help
 def help():
-	for dirname in sys.path:
-		fullname = os.path.join(dirname, 'pdb.doc')
-		if os.path.exists(fullname):
-			sts = os.system('${PAGER-more} '+fullname)
-			if sts: print '*** Pager exit status:', sts
-			break
-	else:
-		print 'Sorry, can\'t find the help file "pdb.doc"',
-		print 'along the Python search path'
+    for dirname in sys.path:
+        fullname = os.path.join(dirname, 'pdb.doc')
+        if os.path.exists(fullname):
+            sts = os.system('${PAGER-more} '+fullname)
+            if sts: print '*** Pager exit status:', sts
+            break
+    else:
+        print 'Sorry, can\'t find the help file "pdb.doc"',
+        print 'along the Python search path'
 
 mainmodule = ''
 mainpyfile = ''
 
 # When invoked as main program, invoke the debugger on a script
 if __name__=='__main__':
-	if not sys.argv[1:]:
-		print "usage: pdb.py scriptfile [arg] ..."
-		sys.exit(2)
+    if not sys.argv[1:]:
+        print "usage: pdb.py scriptfile [arg] ..."
+        sys.exit(2)
 
-	mainpyfile = filename = sys.argv[1]	# Get script filename
-	if not os.path.exists(filename):
-		print 'Error:', `filename`, 'does not exist'
-		sys.exit(1)
-	mainmodule = os.path.basename(filename)
-	del sys.argv[0]		# Hide "pdb.py" from argument list
+    mainpyfile = filename = sys.argv[1]     # Get script filename
+    if not os.path.exists(filename):
+        print 'Error:', `filename`, 'does not exist'
+        sys.exit(1)
+    mainmodule = os.path.basename(filename)
+    del sys.argv[0]         # Hide "pdb.py" from argument list
 
-	# Insert script directory in front of module search path
-	sys.path.insert(0, os.path.dirname(filename))
+    # Insert script directory in front of module search path
+    sys.path.insert(0, os.path.dirname(filename))
 
-	run('execfile(' + `filename` + ')')
+    run('execfile(' + `filename` + ')')
diff --git a/Lib/pickle.py b/Lib/pickle.py
index fb9448e..45fd0f1 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -123,7 +123,7 @@
             return LONG_BINGET + s
 
         return GET + `i` + '\n'
-        
+
     def save(self, object, pers_save = 0):
         memo = self.memo
 
@@ -134,7 +134,7 @@
                 return
 
         d = id(object)
- 
+
         t = type(object)
 
         if ((t is TupleType) and (len(object) == 0)):
@@ -179,14 +179,14 @@
                                      "tuple" % reduce
 
             l = len(tup)
-   
+
             if ((l != 2) and (l != 3)):
                 raise PicklingError, "tuple returned by %s must contain " \
                                      "only two or three elements" % reduce
 
             callable = tup[0]
             arg_tup  = tup[1]
-          
+
             if (l > 2):
                 state = tup[2]
             else:
@@ -196,7 +196,7 @@
                 raise PicklingError, "Second element of tuple returned " \
                                      "by %s must be a tuple" % reduce
 
-            self.save_reduce(callable, arg_tup, state) 
+            self.save_reduce(callable, arg_tup, state)
             memo_len = len(memo)
             self.write(self.put(memo_len))
             memo[d] = (memo_len, object)
@@ -224,7 +224,7 @@
         save(callable)
         save(arg_tup)
         write(REDUCE)
-        
+
         if (state is not None):
             save(state)
             write(BUILD)
@@ -317,7 +317,7 @@
             if (self.bin):
                 write(POP_MARK + self.get(memo[d][0]))
                 return
-           
+
             write(POP * (len(object) + 1) + self.get(memo[d][0]))
             return
 
@@ -352,7 +352,7 @@
 
         for element in object:
             save(element)
-  
+
             if (not using_appends):
                 write(APPEND)
 
@@ -542,7 +542,7 @@
 
     def load_binpersid(self):
         stack = self.stack
-         
+
         pid = stack[-1]
         del stack[-1]
 
@@ -568,7 +568,7 @@
     def load_binint2(self):
         self.append(mloads('i' + self.read(2) + '\000\000'))
     dispatch[BININT2] = load_binint2
- 
+
     def load_long(self):
         self.append(long(self.readline()[:-1], 0))
     dispatch[LONG] = load_long
@@ -710,7 +710,7 @@
         k = self.marker()
         klass = stack[k + 1]
         del stack[k + 1]
-        args = tuple(stack[k + 1:]) 
+        args = tuple(stack[k + 1:])
         del stack[k:]
         instantiated = 0
         if (not args and type(klass) is ClassType and
@@ -726,7 +726,7 @@
         if not instantiated:
             value = apply(klass, args)
         self.append(value)
-    dispatch[OBJ] = load_obj                
+    dispatch[OBJ] = load_obj
 
     def load_global(self):
         module = self.readline()[:-1]
@@ -761,8 +761,8 @@
                     safe = None
 
                 if (not safe):
-                   raise UnpicklingError, "%s is not safe for " \
-                                          "unpickling" % callable
+                    raise UnpicklingError, "%s is not safe for " \
+                                           "unpickling" % callable
 
         if arg_tup is None:
             value = callable.__basicnew__()
@@ -829,7 +829,7 @@
 
         del stack[mark:]
     dispatch[APPENDS] = load_appends
-           
+
     def load_setitem(self):
         stack = self.stack
         value = stack[-1]
diff --git a/Lib/pipes.py b/Lib/pipes.py
index 3aa1bf1..77a57e8 100644
--- a/Lib/pipes.py
+++ b/Lib/pipes.py
@@ -69,229 +69,229 @@
 
 # Conversion step kinds
 
-FILEIN_FILEOUT = 'ff'			# Must read & write real files
-STDIN_FILEOUT  = '-f'			# Must write a real file
-FILEIN_STDOUT  = 'f-'			# Must read a real file
-STDIN_STDOUT   = '--'			# Normal pipeline element
-SOURCE         = '.-'			# Must be first, writes stdout
-SINK           = '-.'			# Must be last, reads stdin
+FILEIN_FILEOUT = 'ff'                   # Must read & write real files
+STDIN_FILEOUT  = '-f'                   # Must write a real file
+FILEIN_STDOUT  = 'f-'                   # Must read a real file
+STDIN_STDOUT   = '--'                   # Normal pipeline element
+SOURCE         = '.-'                   # Must be first, writes stdout
+SINK           = '-.'                   # Must be last, reads stdin
 
 stepkinds = [FILEIN_FILEOUT, STDIN_FILEOUT, FILEIN_STDOUT, STDIN_STDOUT, \
-	     SOURCE, SINK]
+             SOURCE, SINK]
 
 
 class Template:
-	"""Class representing a pipeline template."""
+    """Class representing a pipeline template."""
 
-	def __init__(self):
-		"""Template() returns a fresh pipeline template."""
-		self.debugging = 0
-		self.reset()
+    def __init__(self):
+        """Template() returns a fresh pipeline template."""
+        self.debugging = 0
+        self.reset()
 
-	def __repr__(self):
-		"""t.__repr__() implements `t`."""
-		return '<Template instance, steps=' + `self.steps` + '>'
+    def __repr__(self):
+        """t.__repr__() implements `t`."""
+        return '<Template instance, steps=' + `self.steps` + '>'
 
-	def reset(self):
-		"""t.reset() restores a pipeline template to its initial state."""
-		self.steps = []
+    def reset(self):
+        """t.reset() restores a pipeline template to its initial state."""
+        self.steps = []
 
-	def clone(self):
-		"""t.clone() returns a new pipeline template with identical
-		initial state as the current one."""
-		t = Template()
-		t.steps = self.steps[:]
-		t.debugging = self.debugging
-		return t
+    def clone(self):
+        """t.clone() returns a new pipeline template with identical
+        initial state as the current one."""
+        t = Template()
+        t.steps = self.steps[:]
+        t.debugging = self.debugging
+        return t
 
-	def debug(self, flag):
-		"""t.debug(flag) turns debugging on or off."""
-		self.debugging = flag
+    def debug(self, flag):
+        """t.debug(flag) turns debugging on or off."""
+        self.debugging = flag
 
-	def append(self, cmd, kind):
-		"""t.append(cmd, kind) adds a new step at the end."""
-		if type(cmd) is not type(''):
-			raise TypeError, \
-			      'Template.append: cmd must be a string'
-		if kind not in stepkinds:
-			raise ValueError, \
-			      'Template.append: bad kind ' + `kind`
-		if kind == SOURCE:
-			raise ValueError, \
-			      'Template.append: SOURCE can only be prepended'
-		if self.steps and self.steps[-1][1] == SINK:
-			raise ValueError, \
-			      'Template.append: already ends with SINK'
-		if kind[0] == 'f' and not re.search('\$IN\b', cmd):
-			raise ValueError, \
-			      'Template.append: missing $IN in cmd'
-		if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
-			raise ValueError, \
-			      'Template.append: missing $OUT in cmd'
-		self.steps.append((cmd, kind))
+    def append(self, cmd, kind):
+        """t.append(cmd, kind) adds a new step at the end."""
+        if type(cmd) is not type(''):
+            raise TypeError, \
+                  'Template.append: cmd must be a string'
+        if kind not in stepkinds:
+            raise ValueError, \
+                  'Template.append: bad kind ' + `kind`
+        if kind == SOURCE:
+            raise ValueError, \
+                  'Template.append: SOURCE can only be prepended'
+        if self.steps and self.steps[-1][1] == SINK:
+            raise ValueError, \
+                  'Template.append: already ends with SINK'
+        if kind[0] == 'f' and not re.search('\$IN\b', cmd):
+            raise ValueError, \
+                  'Template.append: missing $IN in cmd'
+        if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
+            raise ValueError, \
+                  'Template.append: missing $OUT in cmd'
+        self.steps.append((cmd, kind))
 
-	def prepend(self, cmd, kind):
-		"""t.prepend(cmd, kind) adds a new step at the front."""
-		if type(cmd) is not type(''):
-			raise TypeError, \
-			      'Template.prepend: cmd must be a string'
-		if kind not in stepkinds:
-			raise ValueError, \
-			      'Template.prepend: bad kind ' + `kind`
-		if kind == SINK:
-			raise ValueError, \
-			      'Template.prepend: SINK can only be appended'
-		if self.steps and self.steps[0][1] == SOURCE:
-			raise ValueError, \
-			      'Template.prepend: already begins with SOURCE'
-		if kind[0] == 'f' and not re.search('\$IN\b', cmd):
-			raise ValueError, \
-			      'Template.prepend: missing $IN in cmd'
-		if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
-			raise ValueError, \
-			      'Template.prepend: missing $OUT in cmd'
-		self.steps.insert(0, (cmd, kind))
+    def prepend(self, cmd, kind):
+        """t.prepend(cmd, kind) adds a new step at the front."""
+        if type(cmd) is not type(''):
+            raise TypeError, \
+                  'Template.prepend: cmd must be a string'
+        if kind not in stepkinds:
+            raise ValueError, \
+                  'Template.prepend: bad kind ' + `kind`
+        if kind == SINK:
+            raise ValueError, \
+                  'Template.prepend: SINK can only be appended'
+        if self.steps and self.steps[0][1] == SOURCE:
+            raise ValueError, \
+                  'Template.prepend: already begins with SOURCE'
+        if kind[0] == 'f' and not re.search('\$IN\b', cmd):
+            raise ValueError, \
+                  'Template.prepend: missing $IN in cmd'
+        if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
+            raise ValueError, \
+                  'Template.prepend: missing $OUT in cmd'
+        self.steps.insert(0, (cmd, kind))
 
-	def open(self, file, rw):
-		"""t.open(file, rw) returns a pipe or file object open for
-		reading or writing; the file is the other end of the pipeline."""
-		if rw == 'r':
-			return self.open_r(file)
-		if rw == 'w':
-			return self.open_w(file)
-		raise ValueError, \
-		      'Template.open: rw must be \'r\' or \'w\', not ' + `rw`
+    def open(self, file, rw):
+        """t.open(file, rw) returns a pipe or file object open for
+        reading or writing; the file is the other end of the pipeline."""
+        if rw == 'r':
+            return self.open_r(file)
+        if rw == 'w':
+            return self.open_w(file)
+        raise ValueError, \
+              'Template.open: rw must be \'r\' or \'w\', not ' + `rw`
 
-	def open_r(self, file):
-		"""t.open_r(file) and t.open_w(file) implement
-		t.open(file, 'r') and t.open(file, 'w') respectively."""
-		if not self.steps:
-			return open(file, 'r')
-		if self.steps[-1][1] == SINK:
-			raise ValueError, \
-			      'Template.open_r: pipeline ends width SINK'
-		cmd = self.makepipeline(file, '')
-		return os.popen(cmd, 'r')
+    def open_r(self, file):
+        """t.open_r(file) and t.open_w(file) implement
+        t.open(file, 'r') and t.open(file, 'w') respectively."""
+        if not self.steps:
+            return open(file, 'r')
+        if self.steps[-1][1] == SINK:
+            raise ValueError, \
+                  'Template.open_r: pipeline ends width SINK'
+        cmd = self.makepipeline(file, '')
+        return os.popen(cmd, 'r')
 
-	def open_w(self, file):
-		if not self.steps:
-			return open(file, 'w')
-		if self.steps[0][1] == SOURCE:
-			raise ValueError, \
-			      'Template.open_w: pipeline begins with SOURCE'
-		cmd = self.makepipeline('', file)
-		return os.popen(cmd, 'w')
+    def open_w(self, file):
+        if not self.steps:
+            return open(file, 'w')
+        if self.steps[0][1] == SOURCE:
+            raise ValueError, \
+                  'Template.open_w: pipeline begins with SOURCE'
+        cmd = self.makepipeline('', file)
+        return os.popen(cmd, 'w')
 
-	def copy(self, infile, outfile):
-		return os.system(self.makepipeline(infile, outfile))
+    def copy(self, infile, outfile):
+        return os.system(self.makepipeline(infile, outfile))
 
-	def makepipeline(self, infile, outfile):
-		cmd = makepipeline(infile, self.steps, outfile)
-		if self.debugging:
-			print cmd
-			cmd = 'set -x; ' + cmd
-		return cmd
+    def makepipeline(self, infile, outfile):
+        cmd = makepipeline(infile, self.steps, outfile)
+        if self.debugging:
+            print cmd
+            cmd = 'set -x; ' + cmd
+        return cmd
 
 
 def makepipeline(infile, steps, outfile):
-	# Build a list with for each command:
-	# [input filename or '', command string, kind, output filename or '']
-	
-	list = []
-	for cmd, kind in steps:
-		list.append(['', cmd, kind, ''])
-	#
-	# Make sure there is at least one step
-	#
-	if not list:
-		list.append(['', 'cat', '--', ''])
-	#
-	# Take care of the input and output ends
-	#
-	[cmd, kind] = list[0][1:3]
-	if kind[0] == 'f' and not infile:
-		list.insert(0, ['', 'cat', '--', ''])
-	list[0][0] = infile
-	#
-	[cmd, kind] = list[-1][1:3]
-	if kind[1] == 'f' and not outfile:
-		list.append(['', 'cat', '--', ''])
-	list[-1][-1] = outfile
-	#
-	# Invent temporary files to connect stages that need files
-	#
-	garbage = []
-	for i in range(1, len(list)):
-		lkind = list[i-1][2]
-		rkind = list[i][2]
-		if lkind[1] == 'f' or rkind[0] == 'f':
-			temp = tempfile.mktemp()
-			garbage.append(temp)
-			list[i-1][-1] = list[i][0] = temp
-	#
-	for item in list:
-		[inf, cmd, kind, outf] = item
-		if kind[1] == 'f':
-			cmd = 'OUT=' + quote(outf) + '; ' + cmd
-		if kind[0] == 'f':
-			cmd = 'IN=' + quote(inf) + '; ' + cmd
-		if kind[0] == '-' and inf:
-			cmd = cmd + ' <' + quote(inf)
-		if kind[1] == '-' and outf:
-			cmd = cmd + ' >' + quote(outf)
-		item[1] = cmd
-	#
-	cmdlist = list[0][1]
-	for item in list[1:]:
-		[cmd, kind] = item[1:3]
-		if item[0] == '':
-			if 'f' in kind:
-				cmd = '{ ' + cmd + '; }'
-			cmdlist = cmdlist + ' |\n' + cmd
-		else:
-			cmdlist = cmdlist + '\n' + cmd
-	#
-	if garbage:
-		rmcmd = 'rm -f'
-		for file in garbage:
-			rmcmd = rmcmd + ' ' + quote(file)
-		trapcmd = 'trap ' + quote(rmcmd + '; exit') + ' 1 2 3 13 14 15'
-		cmdlist = trapcmd + '\n' + cmdlist + '\n' + rmcmd
-	#
-	return cmdlist
+    # Build a list with for each command:
+    # [input filename or '', command string, kind, output filename or '']
+
+    list = []
+    for cmd, kind in steps:
+        list.append(['', cmd, kind, ''])
+    #
+    # Make sure there is at least one step
+    #
+    if not list:
+        list.append(['', 'cat', '--', ''])
+    #
+    # Take care of the input and output ends
+    #
+    [cmd, kind] = list[0][1:3]
+    if kind[0] == 'f' and not infile:
+        list.insert(0, ['', 'cat', '--', ''])
+    list[0][0] = infile
+    #
+    [cmd, kind] = list[-1][1:3]
+    if kind[1] == 'f' and not outfile:
+        list.append(['', 'cat', '--', ''])
+    list[-1][-1] = outfile
+    #
+    # Invent temporary files to connect stages that need files
+    #
+    garbage = []
+    for i in range(1, len(list)):
+        lkind = list[i-1][2]
+        rkind = list[i][2]
+        if lkind[1] == 'f' or rkind[0] == 'f':
+            temp = tempfile.mktemp()
+            garbage.append(temp)
+            list[i-1][-1] = list[i][0] = temp
+    #
+    for item in list:
+        [inf, cmd, kind, outf] = item
+        if kind[1] == 'f':
+            cmd = 'OUT=' + quote(outf) + '; ' + cmd
+        if kind[0] == 'f':
+            cmd = 'IN=' + quote(inf) + '; ' + cmd
+        if kind[0] == '-' and inf:
+            cmd = cmd + ' <' + quote(inf)
+        if kind[1] == '-' and outf:
+            cmd = cmd + ' >' + quote(outf)
+        item[1] = cmd
+    #
+    cmdlist = list[0][1]
+    for item in list[1:]:
+        [cmd, kind] = item[1:3]
+        if item[0] == '':
+            if 'f' in kind:
+                cmd = '{ ' + cmd + '; }'
+            cmdlist = cmdlist + ' |\n' + cmd
+        else:
+            cmdlist = cmdlist + '\n' + cmd
+    #
+    if garbage:
+        rmcmd = 'rm -f'
+        for file in garbage:
+            rmcmd = rmcmd + ' ' + quote(file)
+        trapcmd = 'trap ' + quote(rmcmd + '; exit') + ' 1 2 3 13 14 15'
+        cmdlist = trapcmd + '\n' + cmdlist + '\n' + rmcmd
+    #
+    return cmdlist
 
 
 # Reliably quote a string as a single argument for /bin/sh
 
-_safechars = string.letters + string.digits + '!@%_-+=:,./'	# Safe unquoted
-_funnychars = '"`$\\'				# Unsafe inside "double quotes"
+_safechars = string.letters + string.digits + '!@%_-+=:,./'     # Safe unquoted
+_funnychars = '"`$\\'                           # Unsafe inside "double quotes"
 
 def quote(file):
-	for c in file:
-		if c not in _safechars:
-			break
-	else:
-		return file
-	if '\'' not in file:
-		return '\'' + file + '\''
-	res = ''
-	for c in file:
-		if c in _funnychars:
-			c = '\\' + c
-		res = res + c
-	return '"' + res + '"'
+    for c in file:
+        if c not in _safechars:
+            break
+    else:
+        return file
+    if '\'' not in file:
+        return '\'' + file + '\''
+    res = ''
+    for c in file:
+        if c in _funnychars:
+            c = '\\' + c
+        res = res + c
+    return '"' + res + '"'
 
 
 # Small test program and example
 
 def test():
-	print 'Testing...'
-	t = Template()
-	t.append('togif $IN $OUT', 'ff')
-	t.append('giftoppm', '--')
-	t.append('ppmtogif >$OUT', '-f')
-	t.append('fromgif $IN $OUT', 'ff')
-	t.debug(1)
-	FILE = '/usr/local/images/rgb/rogues/guido.rgb'
-	t.copy(FILE, '@temp')
-	print 'Done.'
+    print 'Testing...'
+    t = Template()
+    t.append('togif $IN $OUT', 'ff')
+    t.append('giftoppm', '--')
+    t.append('ppmtogif >$OUT', '-f')
+    t.append('fromgif $IN $OUT', 'ff')
+    t.debug(1)
+    FILE = '/usr/local/images/rgb/rogues/guido.rgb'
+    t.copy(FILE, '@temp')
+    print 'Done.'
diff --git a/Lib/poplib.py b/Lib/poplib.py
index 5a3813c..2f55f74 100644
--- a/Lib/poplib.py
+++ b/Lib/poplib.py
@@ -32,290 +32,290 @@
 
 class POP3:
 
-	"""This class supports both the minimal and optional command sets.
-	Arguments can be strings or integers (where appropriate)
-	(e.g.: retr(1) and retr('1') both work equally well.
+    """This class supports both the minimal and optional command sets.
+    Arguments can be strings or integers (where appropriate)
+    (e.g.: retr(1) and retr('1') both work equally well.
 
-	Minimal Command Set:
-		USER name		user(name)
-		PASS string		pass_(string)
-		STAT			stat()
-		LIST [msg]		list(msg = None)
-		RETR msg		retr(msg)
-		DELE msg		dele(msg)
-		NOOP			noop()
-		RSET			rset()
-		QUIT			quit()
+    Minimal Command Set:
+            USER name               user(name)
+            PASS string             pass_(string)
+            STAT                    stat()
+            LIST [msg]              list(msg = None)
+            RETR msg                retr(msg)
+            DELE msg                dele(msg)
+            NOOP                    noop()
+            RSET                    rset()
+            QUIT                    quit()
 
-	Optional Commands (some servers support these):
-		RPOP name		rpop(name)
-		APOP name digest	apop(name, digest)
-		TOP msg n		top(msg, n)
-		UIDL [msg]		uidl(msg = None)
+    Optional Commands (some servers support these):
+            RPOP name               rpop(name)
+            APOP name digest        apop(name, digest)
+            TOP msg n               top(msg, n)
+            UIDL [msg]              uidl(msg = None)
 
-	Raises one exception: 'error_proto'.
+    Raises one exception: 'error_proto'.
 
-	Instantiate with:
-		POP3(hostname, port=110)
+    Instantiate with:
+            POP3(hostname, port=110)
 
-	NB:	the POP protocol locks the mailbox from user
-		authorization until QUIT, so be sure to get in, suck
-		the messages, and quit, each time you access the
-		mailbox.
+    NB:     the POP protocol locks the mailbox from user
+            authorization until QUIT, so be sure to get in, suck
+            the messages, and quit, each time you access the
+            mailbox.
 
-		POP is a line-based protocol, which means large mail
-		messages consume lots of python cycles reading them
-		line-by-line.
+            POP is a line-based protocol, which means large mail
+            messages consume lots of python cycles reading them
+            line-by-line.
 
-		If it's available on your mail server, use IMAP4
-		instead, it doesn't suffer from the two problems
-		above.
-	"""
+            If it's available on your mail server, use IMAP4
+            instead, it doesn't suffer from the two problems
+            above.
+    """
 
 
-	def __init__(self, host, port = POP3_PORT):
-		self.host = host
-		self.port = port
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self.sock.connect((self.host, self.port))
-		self.file = self.sock.makefile('rb')
-		self._debugging = 0
-		self.welcome = self._getresp()
+    def __init__(self, host, port = POP3_PORT):
+        self.host = host
+        self.port = port
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.sock.connect((self.host, self.port))
+        self.file = self.sock.makefile('rb')
+        self._debugging = 0
+        self.welcome = self._getresp()
 
 
-	def _putline(self, line):
-		#if self._debugging > 1: print '*put*', `line`
-		self.sock.send('%s%s' % (line, CRLF))
+    def _putline(self, line):
+        #if self._debugging > 1: print '*put*', `line`
+        self.sock.send('%s%s' % (line, CRLF))
 
 
-	# Internal: send one command to the server (through _putline())
+    # Internal: send one command to the server (through _putline())
 
-	def _putcmd(self, line):
-		#if self._debugging: print '*cmd*', `line`
-		self._putline(line)
+    def _putcmd(self, line):
+        #if self._debugging: print '*cmd*', `line`
+        self._putline(line)
 
 
-	# Internal: return one line from the server, stripping CRLF.
-	# This is where all the CPU time of this module is consumed.
-	# Raise error_proto('-ERR EOF') if the connection is closed.
+    # Internal: return one line from the server, stripping CRLF.
+    # This is where all the CPU time of this module is consumed.
+    # Raise error_proto('-ERR EOF') if the connection is closed.
 
-	def _getline(self):
-		line = self.file.readline()
-		#if self._debugging > 1: print '*get*', `line`
-		if not line: raise error_proto('-ERR EOF')
-		octets = len(line)
-		# server can send any combination of CR & LF
-		# however, 'readline()' returns lines ending in LF
-		# so only possibilities are ...LF, ...CRLF, CR...LF
-		if line[-2:] == CRLF:
-			return line[:-2], octets
-		if line[0] == CR:
-			return line[1:-1], octets
-		return line[:-1], octets
+    def _getline(self):
+        line = self.file.readline()
+        #if self._debugging > 1: print '*get*', `line`
+        if not line: raise error_proto('-ERR EOF')
+        octets = len(line)
+        # server can send any combination of CR & LF
+        # however, 'readline()' returns lines ending in LF
+        # so only possibilities are ...LF, ...CRLF, CR...LF
+        if line[-2:] == CRLF:
+            return line[:-2], octets
+        if line[0] == CR:
+            return line[1:-1], octets
+        return line[:-1], octets
 
 
-	# Internal: get a response from the server.
-	# Raise 'error_proto' if the response doesn't start with '+'.
+    # Internal: get a response from the server.
+    # Raise 'error_proto' if the response doesn't start with '+'.
 
-	def _getresp(self):
-		resp, o = self._getline()
-		#if self._debugging > 1: print '*resp*', `resp`
-		c = resp[:1]
-		if c != '+':
-			raise error_proto(resp)
-		return resp
+    def _getresp(self):
+        resp, o = self._getline()
+        #if self._debugging > 1: print '*resp*', `resp`
+        c = resp[:1]
+        if c != '+':
+            raise error_proto(resp)
+        return resp
 
 
-	# Internal: get a response plus following text from the server.
+    # Internal: get a response plus following text from the server.
 
-	def _getlongresp(self):
-		resp = self._getresp()
-		list = []; octets = 0
-		line, o = self._getline()
-		while line != '.':
-			if line[:2] == '..':
-				o = o-1
-				line = line[1:]
-			octets = octets + o
-			list.append(line)
-			line, o = self._getline()
-		return resp, list, octets
+    def _getlongresp(self):
+        resp = self._getresp()
+        list = []; octets = 0
+        line, o = self._getline()
+        while line != '.':
+            if line[:2] == '..':
+                o = o-1
+                line = line[1:]
+            octets = octets + o
+            list.append(line)
+            line, o = self._getline()
+        return resp, list, octets
 
 
-	# Internal: send a command and get the response
+    # Internal: send a command and get the response
 
-	def _shortcmd(self, line):
-		self._putcmd(line)
-		return self._getresp()
+    def _shortcmd(self, line):
+        self._putcmd(line)
+        return self._getresp()
 
 
-	# Internal: send a command and get the response plus following text
+    # Internal: send a command and get the response plus following text
 
-	def _longcmd(self, line):
-		self._putcmd(line)
-		return self._getlongresp()
+    def _longcmd(self, line):
+        self._putcmd(line)
+        return self._getlongresp()
 
 
-	# These can be useful:
+    # These can be useful:
+
+    def getwelcome(self):
+        return self.welcome
+
+
+    def set_debuglevel(self, level):
+        self._debugging = level
+
+
+    # Here are all the POP commands:
+
+    def user(self, user):
+        """Send user name, return response
 
-	def getwelcome(self): 
-		return self.welcome
+        (should indicate password required).
+        """
+        return self._shortcmd('USER %s' % user)
 
 
-	def set_debuglevel(self, level):
-		self._debugging = level
+    def pass_(self, pswd):
+        """Send password, return response
 
+        (response includes message count, mailbox size).
 
-	# Here are all the POP commands:
+        NB: mailbox is locked by server from here to 'quit()'
+        """
+        return self._shortcmd('PASS %s' % pswd)
 
-	def user(self, user):
-		"""Send user name, return response
-		
-		(should indicate password required).
-		"""
-		return self._shortcmd('USER %s' % user)
 
+    def stat(self):
+        """Get mailbox status.
 
-	def pass_(self, pswd):
-		"""Send password, return response
-		
-		(response includes message count, mailbox size).
+        Result is tuple of 2 ints (message count, mailbox size)
+        """
+        retval = self._shortcmd('STAT')
+        rets = string.split(retval)
+        #if self._debugging: print '*stat*', `rets`
+        numMessages = string.atoi(rets[1])
+        sizeMessages = string.atoi(rets[2])
+        return (numMessages, sizeMessages)
 
-		NB: mailbox is locked by server from here to 'quit()'
-		"""
-		return self._shortcmd('PASS %s' % pswd)
 
+    def list(self, which=None):
+        """Request listing, return result.
 
-	def stat(self):
-		"""Get mailbox status.
-		
-		Result is tuple of 2 ints (message count, mailbox size)
-		"""
-		retval = self._shortcmd('STAT')
-		rets = string.split(retval)
-		#if self._debugging: print '*stat*', `rets`
-		numMessages = string.atoi(rets[1])
-		sizeMessages = string.atoi(rets[2])
-		return (numMessages, sizeMessages)
+        Result without a message number argument is in form
+        ['response', ['mesg_num octets', ...]].
 
+        Result when a message number argument is given is a
+        single response: the "scan listing" for that message.
+        """
+        if which:
+            return self._shortcmd('LIST %s' % which)
+        return self._longcmd('LIST')
 
-	def list(self, which=None):
-		"""Request listing, return result.
 
-		Result without a message number argument is in form
-		['response', ['mesg_num octets', ...]].
+    def retr(self, which):
+        """Retrieve whole message number 'which'.
 
-		Result when a message number argument is given is a
-		single response: the "scan listing" for that message.
-		"""
-		if which:
-			return self._shortcmd('LIST %s' % which)
-		return self._longcmd('LIST')
+        Result is in form ['response', ['line', ...], octets].
+        """
+        return self._longcmd('RETR %s' % which)
 
 
-	def retr(self, which):
-		"""Retrieve whole message number 'which'.
+    def dele(self, which):
+        """Delete message number 'which'.
 
-		Result is in form ['response', ['line', ...], octets].
-		"""
-		return self._longcmd('RETR %s' % which)
+        Result is 'response'.
+        """
+        return self._shortcmd('DELE %s' % which)
 
 
-	def dele(self, which):
-		"""Delete message number 'which'.
+    def noop(self):
+        """Does nothing.
 
-		Result is 'response'.
-		"""
-		return self._shortcmd('DELE %s' % which)
+        One supposes the response indicates the server is alive.
+        """
+        return self._shortcmd('NOOP')
 
 
-	def noop(self):
-		"""Does nothing.
-		
-		One supposes the response indicates the server is alive.
-		"""
-		return self._shortcmd('NOOP')
+    def rset(self):
+        """Not sure what this does."""
+        return self._shortcmd('RSET')
 
 
-	def rset(self):
-		"""Not sure what this does."""
-		return self._shortcmd('RSET')
+    def quit(self):
+        """Signoff: commit changes on server, unlock mailbox, close connection."""
+        try:
+            resp = self._shortcmd('QUIT')
+        except error_proto, val:
+            resp = val
+        self.file.close()
+        self.sock.close()
+        del self.file, self.sock
+        return resp
 
+    #__del__ = quit
 
-	def quit(self):
-		"""Signoff: commit changes on server, unlock mailbox, close connection."""
-		try:
-			resp = self._shortcmd('QUIT')
-		except error_proto, val:
-			resp = val
-		self.file.close()
-		self.sock.close()
-		del self.file, self.sock
-		return resp
 
-	#__del__ = quit
+    # optional commands:
 
+    def rpop(self, user):
+        """Not sure what this does."""
+        return self._shortcmd('RPOP %s' % user)
 
-	# optional commands:
 
-	def rpop(self, user):
-		"""Not sure what this does."""
-		return self._shortcmd('RPOP %s' % user)
+    timestamp = regex.compile('\+OK.*\(<[^>]+>\)')
 
+    def apop(self, user, secret):
+        """Authorisation
 
-	timestamp = regex.compile('\+OK.*\(<[^>]+>\)')
+        - only possible if server has supplied a timestamp in initial greeting.
 
-	def apop(self, user, secret):
-		"""Authorisation
-		
-		- only possible if server has supplied a timestamp in initial greeting.
+        Args:
+                user    - mailbox user;
+                secret  - secret shared between client and server.
 
-		Args:
-			user	- mailbox user;
-			secret	- secret shared between client and server.
+        NB: mailbox is locked by server from here to 'quit()'
+        """
+        if self.timestamp.match(self.welcome) <= 0:
+            raise error_proto('-ERR APOP not supported by server')
+        import md5
+        digest = md5.new(self.timestamp.group(1)+secret).digest()
+        digest = string.join(map(lambda x:'%02x'%ord(x), digest), '')
+        return self._shortcmd('APOP %s %s' % (user, digest))
 
-		NB: mailbox is locked by server from here to 'quit()'
-		"""
-		if self.timestamp.match(self.welcome) <= 0:
-			raise error_proto('-ERR APOP not supported by server')
-		import md5
-		digest = md5.new(self.timestamp.group(1)+secret).digest()
-		digest = string.join(map(lambda x:'%02x'%ord(x), digest), '')
-		return self._shortcmd('APOP %s %s' % (user, digest))
 
+    def top(self, which, howmuch):
+        """Retrieve message header of message number 'which'
+        and first 'howmuch' lines of message body.
 
-	def top(self, which, howmuch):
-		"""Retrieve message header of message number 'which'
-		and first 'howmuch' lines of message body.
+        Result is in form ['response', ['line', ...], octets].
+        """
+        return self._longcmd('TOP %s %s' % (which, howmuch))
 
-		Result is in form ['response', ['line', ...], octets].
-		"""
-		return self._longcmd('TOP %s %s' % (which, howmuch))
 
+    def uidl(self, which=None):
+        """Return message digest (unique id) list.
 
-	def uidl(self, which=None):
-		"""Return message digest (unique id) list.
+        If 'which', result contains unique id for that message
+        in the form 'response mesgnum uid', otherwise result is
+        the list ['response', ['mesgnum uid', ...], octets]
+        """
+        if which:
+            return self._shortcmd('UIDL %s' % which)
+        return self._longcmd('UIDL')
 
-		If 'which', result contains unique id for that message
-		in the form 'response mesgnum uid', otherwise result is
-		the list ['response', ['mesgnum uid', ...], octets]
-		"""
-		if which:
-			return self._shortcmd('UIDL %s' % which)
-		return self._longcmd('UIDL')
 
-				
 if __name__ == "__main__":
-	a = POP3(TESTSERVER)
-	print a.getwelcome()
-	a.user(TESTACCOUNT)
-	a.pass_(TESTPASSWORD)
-	a.list()
-	(numMsgs, totalSize) = a.stat()
-	for i in range(1, numMsgs + 1):
-		(header, msg, octets) = a.retr(i)
-		print "Message ", `i`, ':'
-		for line in msg:
-			print '   ' + line
-		print '-----------------------'
-	a.quit()
+    a = POP3(TESTSERVER)
+    print a.getwelcome()
+    a.user(TESTACCOUNT)
+    a.pass_(TESTPASSWORD)
+    a.list()
+    (numMsgs, totalSize) = a.stat()
+    for i in range(1, numMsgs + 1):
+        (header, msg, octets) = a.retr(i)
+        print "Message ", `i`, ':'
+        for line in msg:
+            print '   ' + line
+        print '-----------------------'
+    a.quit()
diff --git a/Lib/posixfile.py b/Lib/posixfile.py
index 23f2c85..58c4b4f 100644
--- a/Lib/posixfile.py
+++ b/Lib/posixfile.py
@@ -129,7 +129,7 @@
 
         l_flags = fcntl.fcntl(file.fileno(), FCNTL.F_SETFL, l_flags)
 
-        if 'c' in which:        
+        if 'c' in which:
             arg = ('!' not in which)    # 0 is don't, 1 is do close on exec
             l_flags = fcntl.fcntl(file.fileno(), FCNTL.F_SETFD, arg)
 
@@ -142,7 +142,7 @@
             if FCNTL.O_NDELAY & l_flags: which = which + 'n'
             if FCNTL.O_SYNC & l_flags: which = which + 's'
             return which
-        
+
     def lock(self, how, *args):
         import struct, fcntl, FCNTL
 
@@ -176,7 +176,7 @@
                             'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
                             'bsdos2', 'bsdos3', 'bsdos4'):
             flock = struct.pack('lxxxxlxxxxlhh', \
-                  l_start, l_len, os.getpid(), l_type, l_whence) 
+                  l_start, l_len, os.getpid(), l_type, l_whence)
         elif sys.platform in ['aix3', 'aix4']:
             flock = struct.pack('hhlllii', \
                   l_type, l_whence, l_start, l_len, 0, 0, 0)
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 32850b4..fd870b7 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -55,7 +55,7 @@
 # Trailing '/'es are stripped from head unless it is the root.
 
 def split(p):
-    """Split a pathname.  Returns tuple "(head, tail)" where "tail" is 
+    """Split a pathname.  Returns tuple "(head, tail)" where "tail" is
     everything after the final slash.  Either part may be empty."""
     i = p.rfind('/') + 1
     head, tail = p[:i], p[i:]
@@ -93,7 +93,7 @@
 # path.  Useful on DOS/Windows/NT; on Unix, the drive is always empty.
 
 def splitdrive(p):
-    """Split a pathname into drive and path. On Posix, drive is always 
+    """Split a pathname into drive and path. On Posix, drive is always
     empty."""
     return '', p
 
@@ -220,7 +220,7 @@
 def samestat(s1, s2):
     """Test whether two stat buffers reference the same file"""
     return s1[stat.ST_INO] == s2[stat.ST_INO] and \
-	   s1[stat.ST_DEV] == s2[stat.ST_DEV]
+           s1[stat.ST_DEV] == s2[stat.ST_DEV]
 
 
 # Is a path a mount point?
@@ -253,7 +253,7 @@
 # or to impose a different order of visiting.
 
 def walk(top, func, arg):
-    """walk(top,func,arg) calls func(arg, d, files) for each directory "d" 
+    """walk(top,func,arg) calls func(arg, d, files) for each directory "d"
     in the tree  rooted at "top" (including "top" itself).  "files" is a list
     of all the files and subdirs in directory "d".
     """
@@ -263,10 +263,10 @@
         return
     func(arg, top, names)
     for name in names:
-            name = join(top, name)
-            st = os.lstat(name)
-            if stat.S_ISDIR(st[stat.ST_MODE]):
-                walk(name, func, arg)
+        name = join(top, name)
+        st = os.lstat(name)
+        if stat.S_ISDIR(st[stat.ST_MODE]):
+            walk(name, func, arg)
 
 
 # Expand paths beginning with '~' or '~user'.
@@ -279,7 +279,7 @@
 # variable expansion.)
 
 def expanduser(path):
-    """Expand ~ and ~user constructions.  If user or $HOME is unknown, 
+    """Expand ~ and ~user constructions.  If user or $HOME is unknown,
     do nothing."""
     if path[:1] != '~':
         return path
@@ -349,7 +349,7 @@
     for comp in comps:
         if comp in ('', '.'):
             continue
-        if (comp != '..' or (not initial_slash and not new_comps) or 
+        if (comp != '..' or (not initial_slash and not new_comps) or
              (new_comps and new_comps[-1] == '..')):
             new_comps.append(comp)
         elif new_comps:
diff --git a/Lib/pre.py b/Lib/pre.py
index 9dedb9c..adc1ddf 100644
--- a/Lib/pre.py
+++ b/Lib/pre.py
@@ -44,7 +44,7 @@
 resulting RE will match the second character.
     \\number  Matches the contents of the group of the same number.
     \\A       Matches only at the start of the string.
-    \\Z       Matches only at the end of the string. 
+    \\Z       Matches only at the end of the string.
     \\b       Matches the empty string, but only at the start or end of a word.
     \\B       Matches the empty string, but not at the start or end of a word.
     \\d       Matches any decimal digit; equivalent to the set [0-9].
@@ -55,7 +55,7 @@
              With LOCALE, it will match the set [0-9_] plus characters defined
              as letters for the current locale.
     \\W       Matches the complement of \\w.
-    \\\\       Matches a literal backslash. 
+    \\\\       Matches a literal backslash.
 
 This module exports the following functions:
     match    Match a regular expression pattern to the beginning of a string.
@@ -100,8 +100,8 @@
 I = IGNORECASE
 L = LOCALE
 M = MULTILINE
-S = DOTALL 
-X = VERBOSE 
+S = DOTALL
+X = VERBOSE
 
 
 #
@@ -125,7 +125,7 @@
 
 def match(pattern, string, flags=0):
     """match (pattern, string[, flags]) -> MatchObject or None
-    
+
     If zero or more characters at the beginning of string match the
     regular expression pattern, return a corresponding MatchObject
     instance. Return None if the string does not match the pattern;
@@ -135,12 +135,12 @@
     search() instead.
 
     """
-    
+
     return _cachecompile(pattern, flags).match(string)
-  
+
 def search(pattern, string, flags=0):
     """search (pattern, string[, flags]) -> MatchObject or None
-    
+
     Scan through string looking for a location where the regular
     expression pattern produces a match, and return a corresponding
     MatchObject instance. Return None if no position in the string
@@ -149,10 +149,10 @@
 
     """
     return _cachecompile(pattern, flags).search(string)
-  
+
 def sub(pattern, repl, string, count=0):
     """sub(pattern, repl, string[, count=0]) -> string
-    
+
     Return the string obtained by replacing the leftmost
     non-overlapping occurrences of pattern in string by the
     replacement repl. If the pattern isn't found, string is returned
@@ -177,7 +177,7 @@
 
 def subn(pattern, repl, string, count=0):
     """subn(pattern, repl, string[, count=0]) -> (string, num substitutions)
-    
+
     Perform the same operation as sub(), but return a tuple
     (new_string, number_of_subs_made).
 
@@ -185,10 +185,10 @@
     if type(pattern) == type(''):
         pattern = _cachecompile(pattern)
     return pattern.subn(repl, string, count)
-  
+
 def split(pattern, string, maxsplit=0):
     """split(pattern, string[, maxsplit=0]) -> list of strings
-    
+
     Split string by the occurrences of pattern. If capturing
     parentheses are used in pattern, then the text of all groups in
     the pattern are also returned as part of the resulting list. If
@@ -203,7 +203,7 @@
 
 def findall(pattern, string):
     """findall(pattern, string) -> list
-    
+
     Return a list of all non-overlapping matches of pattern in
     string. If one or more groups are present in the pattern, return a
     list of groups; this will be a list of tuples if the pattern has
@@ -216,7 +216,7 @@
 
 def escape(pattern):
     """escape(string) -> string
-    
+
     Return string with all non-alphanumerics backslashed; this is
     useful if you want to match an arbitrary literal string that may
     have regular expression metacharacters in it.
@@ -242,7 +242,7 @@
     groupindex={}
     code=pcre_compile(pattern, flags, groupindex)
     return RegexObject(pattern, flags, code, groupindex)
-    
+
 
 #
 #   Class definitions
@@ -258,18 +258,18 @@
     subn     Same as sub, but also return the number of substitutions made.
     split    Split a string by the occurrences of the pattern.
     findall  Find all occurrences of the pattern in a string.
-    
+
     """
 
     def __init__(self, pattern, flags, code, groupindex):
-        self.code = code 
+        self.code = code
         self.flags = flags
         self.pattern = pattern
         self.groupindex = groupindex
 
     def search(self, string, pos=0, endpos=None):
         """search(string[, pos][, endpos]) -> MatchObject or None
-        
+
         Scan through string looking for a location where this regular
         expression produces a match, and return a corresponding
         MatchObject instance. Return None if no position in the string
@@ -277,24 +277,24 @@
         a zero-length match at some point in the string. The optional
         pos and endpos parameters have the same meaning as for the
         match() method.
-    
+
         """
-        if endpos is None or endpos>len(string): 
+        if endpos is None or endpos>len(string):
             endpos=len(string)
         if endpos<pos: endpos=pos
         regs = self.code.match(string, pos, endpos, 0)
         if regs is None:
             return None
         self._num_regs=len(regs)
-        
+
         return MatchObject(self,
                            string,
                            pos, endpos,
                            regs)
-    
+
     def match(self, string, pos=0, endpos=None):
         """match(string[, pos][, endpos]) -> MatchObject or None
-        
+
         If zero or more characters at the beginning of string match
         this regular expression, return a corresponding MatchObject
         instance. Return None if the string does not match the
@@ -316,7 +316,7 @@
         searched for a match.
 
         """
-        if endpos is None or endpos>len(string): 
+        if endpos is None or endpos>len(string):
             endpos=len(string)
         if endpos<pos: endpos=pos
         regs = self.code.match(string, pos, endpos, ANCHORED)
@@ -327,23 +327,23 @@
                            string,
                            pos, endpos,
                            regs)
-    
+
     def sub(self, repl, string, count=0):
         """sub(repl, string[, count=0]) -> string
-        
+
         Return the string obtained by replacing the leftmost
         non-overlapping occurrences of the compiled pattern in string
         by the replacement repl. If the pattern isn't found, string is
         returned unchanged.
 
         Identical to the sub() function, using the compiled pattern.
-        
+
         """
         return self.subn(repl, string, count)[0]
-    
-    def subn(self, repl, source, count=0): 
+
+    def subn(self, repl, source, count=0):
         """subn(repl, string[, count=0]) -> tuple
-        
+
         Perform the same operation as sub(), but return a tuple
         (new_string, number_of_subs_made).
 
@@ -399,17 +399,17 @@
             n = n + 1
         append(source[pos:])
         return (string.join(results, ''), n)
-                                                                            
+
     def split(self, source, maxsplit=0):
         """split(source[, maxsplit=0]) -> list of strings
-    
+
         Split string by the occurrences of the compiled pattern. If
         capturing parentheses are used in the pattern, then the text
         of all groups in the pattern are also returned as part of the
         resulting list. If maxsplit is nonzero, at most maxsplit
         splits occur, and the remainder of the string is returned as
         the final element of the list.
-        
+
         """
         if maxsplit < 0:
             raise error, "negative split count"
@@ -449,7 +449,7 @@
 
     def findall(self, source):
         """findall(source) -> list
-    
+
         Return a list of all non-overlapping matches of the compiled
         pattern in string. If one or more groups are present in the
         pattern, return a list of groups; this will be a list of
@@ -487,7 +487,7 @@
     def __getinitargs__(self):
         return (None,None,None,None) # any 4 elements, to work around
                                      # problems with the
-                                     # pickle/cPickle modules not yet 
+                                     # pickle/cPickle modules not yet
                                      # ignoring the __init__ function
     def __getstate__(self):
         return self.pattern, self.flags, self.groupindex
@@ -517,13 +517,13 @@
     def __init__(self, re, string, pos, endpos, regs):
         self.re = re
         self.string = string
-        self.pos = pos 
+        self.pos = pos
         self.endpos = endpos
         self.regs = regs
-        
+
     def start(self, g = 0):
         """start([group=0]) -> int or None
-        
+
         Return the index of the start of the substring matched by
         group; group defaults to zero (meaning the whole matched
         substring). Return -1 if group exists but did not contribute
@@ -536,10 +536,10 @@
             except (KeyError, TypeError):
                 raise IndexError, 'group %s is undefined' % `g`
         return self.regs[g][0]
-    
+
     def end(self, g = 0):
         """end([group=0]) -> int or None
-        
+
         Return the indices of the end of the substring matched by
         group; group defaults to zero (meaning the whole matched
         substring). Return -1 if group exists but did not contribute
@@ -552,10 +552,10 @@
             except (KeyError, TypeError):
                 raise IndexError, 'group %s is undefined' % `g`
         return self.regs[g][1]
-    
+
     def span(self, g = 0):
         """span([group=0]) -> tuple
-        
+
         Return the 2-tuple (m.start(group), m.end(group)). Note that
         if group did not contribute to the match, this is (-1,
         -1). Group defaults to zero (meaning the whole matched
@@ -568,10 +568,10 @@
             except (KeyError, TypeError):
                 raise IndexError, 'group %s is undefined' % `g`
         return self.regs[g]
-    
+
     def groups(self, default=None):
         """groups([default=None]) -> tuple
-        
+
         Return a tuple containing all the subgroups of the match, from
         1 up to however many groups are in the pattern. The default
         argument is used for groups that did not participate in the
@@ -589,7 +589,7 @@
 
     def group(self, *groups):
         """group([group1, group2, ...]) -> string or tuple
-        
+
         Return one or more subgroups of the match. If there is a
         single argument, the result is a single string; if there are
         multiple arguments, the result is a tuple with one item per
@@ -636,7 +636,7 @@
 
     def groupdict(self, default=None):
         """groupdict([default=None]) -> dictionary
-        
+
         Return a dictionary containing all the named subgroups of the
         match, keyed by the subgroup name. The default argument is
         used for groups that did not participate in the match.
diff --git a/Lib/profile.py b/Lib/profile.py
index feaf287..c32b3f8 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -11,7 +11,7 @@
 
 # Copyright 1994, by InfoSeek Corporation, all rights reserved.
 # Written by James Roskind
-# 
+#
 # Permission to use, copy, modify, and distribute this Python software
 # and its associated documentation for any purpose (subject to the
 # restriction in the following sentence) without fee is hereby granted,
@@ -24,7 +24,7 @@
 # to remain in Python, compiled Python, or other languages (such as C)
 # wherein the modified or derived code is exclusively imported into a
 # Python module.
-# 
+#
 # INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 # SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 # FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
@@ -41,12 +41,12 @@
 import marshal
 
 
-# Sample timer for use with 
+# Sample timer for use with
 #i_count = 0
 #def integer_timer():
-#	global i_count
-#	i_count = i_count + 1
-#	return i_count
+#       global i_count
+#       i_count = i_count + 1
+#       return i_count
 #itimes = integer_timer # replace with C coded timer returning integers
 
 #**************************************************************************
@@ -57,515 +57,515 @@
 
 # simplified user interface
 def run(statement, *args):
-	prof = Profile()
-	try:
-		prof = prof.run(statement)
-	except SystemExit:
-		pass
-	if args:
-		prof.dump_stats(args[0])
-	else:
-		return prof.print_stats()
+    prof = Profile()
+    try:
+        prof = prof.run(statement)
+    except SystemExit:
+        pass
+    if args:
+        prof.dump_stats(args[0])
+    else:
+        return prof.print_stats()
 
 # print help
 def help():
-	for dirname in sys.path:
-		fullname = os.path.join(dirname, 'profile.doc')
-		if os.path.exists(fullname):
-			sts = os.system('${PAGER-more} '+fullname)
-			if sts: print '*** Pager exit status:', sts
-			break
-	else:
-		print 'Sorry, can\'t find the help file "profile.doc"',
-		print 'along the Python search path'
+    for dirname in sys.path:
+        fullname = os.path.join(dirname, 'profile.doc')
+        if os.path.exists(fullname):
+            sts = os.system('${PAGER-more} '+fullname)
+            if sts: print '*** Pager exit status:', sts
+            break
+    else:
+        print 'Sorry, can\'t find the help file "profile.doc"',
+        print 'along the Python search path'
 
 
 class Profile:
-	"""Profiler class.
-	
-	self.cur is always a tuple.  Each such tuple corresponds to a stack
-	frame that is currently active (self.cur[-2]).  The following are the
-	definitions of its members.  We use this external "parallel stack" to
-	avoid contaminating the program that we are profiling. (old profiler
-	used to write into the frames local dictionary!!) Derived classes
-	can change the definition of some entries, as long as they leave
-	[-2:] intact.
+    """Profiler class.
 
-	[ 0] = Time that needs to be charged to the parent frame's function.
-	       It is used so that a function call will not have to access the
-	       timing data for the parent frame.
-	[ 1] = Total time spent in this frame's function, excluding time in
-	       subfunctions
-	[ 2] = Cumulative time spent in this frame's function, including time in
-	       all subfunctions to this frame.
-	[-3] = Name of the function that corresponds to this frame.  
-	[-2] = Actual frame that we correspond to (used to sync exception handling)
-	[-1] = Our parent 6-tuple (corresponds to frame.f_back)
+    self.cur is always a tuple.  Each such tuple corresponds to a stack
+    frame that is currently active (self.cur[-2]).  The following are the
+    definitions of its members.  We use this external "parallel stack" to
+    avoid contaminating the program that we are profiling. (old profiler
+    used to write into the frames local dictionary!!) Derived classes
+    can change the definition of some entries, as long as they leave
+    [-2:] intact.
 
-	Timing data for each function is stored as a 5-tuple in the dictionary
-	self.timings[].  The index is always the name stored in self.cur[4].
-	The following are the definitions of the members:
+    [ 0] = Time that needs to be charged to the parent frame's function.
+           It is used so that a function call will not have to access the
+           timing data for the parent frame.
+    [ 1] = Total time spent in this frame's function, excluding time in
+           subfunctions
+    [ 2] = Cumulative time spent in this frame's function, including time in
+           all subfunctions to this frame.
+    [-3] = Name of the function that corresponds to this frame.
+    [-2] = Actual frame that we correspond to (used to sync exception handling)
+    [-1] = Our parent 6-tuple (corresponds to frame.f_back)
 
-	[0] = The number of times this function was called, not counting direct
-	      or indirect recursion,
-	[1] = Number of times this function appears on the stack, minus one
-	[2] = Total time spent internal to this function
-	[3] = Cumulative time that this function was present on the stack.  In
-	      non-recursive functions, this is the total execution time from start
-	      to finish of each invocation of a function, including time spent in
-	      all subfunctions.
-	[5] = A dictionary indicating for each function name, the number of times
-	      it was called by us.
-	"""
+    Timing data for each function is stored as a 5-tuple in the dictionary
+    self.timings[].  The index is always the name stored in self.cur[4].
+    The following are the definitions of the members:
 
-	def __init__(self, timer=None):
-		self.timings = {}
-		self.cur = None
-		self.cmd = ""
+    [0] = The number of times this function was called, not counting direct
+          or indirect recursion,
+    [1] = Number of times this function appears on the stack, minus one
+    [2] = Total time spent internal to this function
+    [3] = Cumulative time that this function was present on the stack.  In
+          non-recursive functions, this is the total execution time from start
+          to finish of each invocation of a function, including time spent in
+          all subfunctions.
+    [5] = A dictionary indicating for each function name, the number of times
+          it was called by us.
+    """
 
-		self.dispatch = {  \
-			  'call'     : self.trace_dispatch_call, \
-			  'return'   : self.trace_dispatch_return, \
-			  'exception': self.trace_dispatch_exception, \
-			  }
+    def __init__(self, timer=None):
+        self.timings = {}
+        self.cur = None
+        self.cmd = ""
 
-		if not timer:
-			if os.name == 'mac':
-				import MacOS
-				self.timer = MacOS.GetTicks
-				self.dispatcher = self.trace_dispatch_mac
-				self.get_time = self.get_time_mac
-			elif hasattr(time, 'clock'):
-				self.timer = time.clock
-				self.dispatcher = self.trace_dispatch_i
-			elif hasattr(os, 'times'):
-				self.timer = os.times
-				self.dispatcher = self.trace_dispatch
-			else:
-				self.timer = time.time
-				self.dispatcher = self.trace_dispatch_i
-		else:
-			self.timer = timer
-			t = self.timer() # test out timer function
-			try:
-				if len(t) == 2:
-					self.dispatcher = self.trace_dispatch
-				else:
-					self.dispatcher = self.trace_dispatch_l
-			except TypeError:
-				self.dispatcher = self.trace_dispatch_i
-		self.t = self.get_time()
-		self.simulate_call('profiler')
+        self.dispatch = {  \
+                  'call'     : self.trace_dispatch_call, \
+                  'return'   : self.trace_dispatch_return, \
+                  'exception': self.trace_dispatch_exception, \
+                  }
+
+        if not timer:
+            if os.name == 'mac':
+                import MacOS
+                self.timer = MacOS.GetTicks
+                self.dispatcher = self.trace_dispatch_mac
+                self.get_time = self.get_time_mac
+            elif hasattr(time, 'clock'):
+                self.timer = time.clock
+                self.dispatcher = self.trace_dispatch_i
+            elif hasattr(os, 'times'):
+                self.timer = os.times
+                self.dispatcher = self.trace_dispatch
+            else:
+                self.timer = time.time
+                self.dispatcher = self.trace_dispatch_i
+        else:
+            self.timer = timer
+            t = self.timer() # test out timer function
+            try:
+                if len(t) == 2:
+                    self.dispatcher = self.trace_dispatch
+                else:
+                    self.dispatcher = self.trace_dispatch_l
+            except TypeError:
+                self.dispatcher = self.trace_dispatch_i
+        self.t = self.get_time()
+        self.simulate_call('profiler')
 
 
-	def get_time(self): # slow simulation of method to acquire time
-		t = self.timer()
-		if type(t) == type(()) or type(t) == type([]):
-			t = reduce(lambda x,y: x+y, t, 0)
-		return t
-		
-	def get_time_mac(self):
-		return self.timer()/60.0
+    def get_time(self): # slow simulation of method to acquire time
+        t = self.timer()
+        if type(t) == type(()) or type(t) == type([]):
+            t = reduce(lambda x,y: x+y, t, 0)
+        return t
 
-	# Heavily optimized dispatch routine for os.times() timer
+    def get_time_mac(self):
+        return self.timer()/60.0
 
-	def trace_dispatch(self, frame, event, arg):
-		t = self.timer()
-		t = t[0] + t[1] - self.t        # No Calibration constant
-		# t = t[0] + t[1] - self.t - .00053 # Calibration constant
+    # Heavily optimized dispatch routine for os.times() timer
 
-		if self.dispatch[event](frame,t):
-			t = self.timer()
-			self.t = t[0] + t[1]
-		else:
-			r = self.timer()
-			self.t = r[0] + r[1] - t # put back unrecorded delta
-		return
+    def trace_dispatch(self, frame, event, arg):
+        t = self.timer()
+        t = t[0] + t[1] - self.t        # No Calibration constant
+        # t = t[0] + t[1] - self.t - .00053 # Calibration constant
+
+        if self.dispatch[event](frame,t):
+            t = self.timer()
+            self.t = t[0] + t[1]
+        else:
+            r = self.timer()
+            self.t = r[0] + r[1] - t # put back unrecorded delta
+        return
 
 
 
-	# Dispatch routine for best timer program (return = scalar integer)
+    # Dispatch routine for best timer program (return = scalar integer)
 
-	def trace_dispatch_i(self, frame, event, arg):
-		t = self.timer() - self.t # - 1 # Integer calibration constant
-		if self.dispatch[event](frame,t):
-			self.t = self.timer()
-		else:
-			self.t = self.timer() - t  # put back unrecorded delta
-		return
-	
-	# Dispatch routine for macintosh (timer returns time in ticks of 1/60th second)
+    def trace_dispatch_i(self, frame, event, arg):
+        t = self.timer() - self.t # - 1 # Integer calibration constant
+        if self.dispatch[event](frame,t):
+            self.t = self.timer()
+        else:
+            self.t = self.timer() - t  # put back unrecorded delta
+        return
 
-	def trace_dispatch_mac(self, frame, event, arg):
-		t = self.timer()/60.0 - self.t # - 1 # Integer calibration constant
-		if self.dispatch[event](frame,t):
-			self.t = self.timer()/60.0
-		else:
-			self.t = self.timer()/60.0 - t  # put back unrecorded delta
-		return
+    # Dispatch routine for macintosh (timer returns time in ticks of 1/60th second)
+
+    def trace_dispatch_mac(self, frame, event, arg):
+        t = self.timer()/60.0 - self.t # - 1 # Integer calibration constant
+        if self.dispatch[event](frame,t):
+            self.t = self.timer()/60.0
+        else:
+            self.t = self.timer()/60.0 - t  # put back unrecorded delta
+        return
 
 
-	# SLOW generic dispatch routine for timer returning lists of numbers
+    # SLOW generic dispatch routine for timer returning lists of numbers
 
-	def trace_dispatch_l(self, frame, event, arg):
-		t = self.get_time() - self.t
+    def trace_dispatch_l(self, frame, event, arg):
+        t = self.get_time() - self.t
 
-		if self.dispatch[event](frame,t):
-			self.t = self.get_time()
-		else:
-			self.t = self.get_time()-t # put back unrecorded delta
-		return
+        if self.dispatch[event](frame,t):
+            self.t = self.get_time()
+        else:
+            self.t = self.get_time()-t # put back unrecorded delta
+        return
 
 
-	def trace_dispatch_exception(self, frame, t):
-		rt, rtt, rct, rfn, rframe, rcur = self.cur
-		if (not rframe is frame) and rcur:
-			return self.trace_dispatch_return(rframe, t)
-		return 0
+    def trace_dispatch_exception(self, frame, t):
+        rt, rtt, rct, rfn, rframe, rcur = self.cur
+        if (not rframe is frame) and rcur:
+            return self.trace_dispatch_return(rframe, t)
+        return 0
 
 
-	def trace_dispatch_call(self, frame, t):
-		fcode = frame.f_code
-		fn = (fcode.co_filename, fcode.co_firstlineno, fcode.co_name)
-		self.cur = (t, 0, 0, fn, frame, self.cur)
-		if self.timings.has_key(fn):
-			cc, ns, tt, ct, callers = self.timings[fn]
-			self.timings[fn] = cc, ns + 1, tt, ct, callers
-		else:
-			self.timings[fn] = 0, 0, 0, 0, {}
-		return 1
+    def trace_dispatch_call(self, frame, t):
+        fcode = frame.f_code
+        fn = (fcode.co_filename, fcode.co_firstlineno, fcode.co_name)
+        self.cur = (t, 0, 0, fn, frame, self.cur)
+        if self.timings.has_key(fn):
+            cc, ns, tt, ct, callers = self.timings[fn]
+            self.timings[fn] = cc, ns + 1, tt, ct, callers
+        else:
+            self.timings[fn] = 0, 0, 0, 0, {}
+        return 1
 
-	def trace_dispatch_return(self, frame, t):
-		# if not frame is self.cur[-2]: raise "Bad return", self.cur[3]
+    def trace_dispatch_return(self, frame, t):
+        # if not frame is self.cur[-2]: raise "Bad return", self.cur[3]
 
-		# Prefix "r" means part of the Returning or exiting frame
-		# Prefix "p" means part of the Previous or older frame
+        # Prefix "r" means part of the Returning or exiting frame
+        # Prefix "p" means part of the Previous or older frame
 
-		rt, rtt, rct, rfn, frame, rcur = self.cur
-		rtt = rtt + t
-		sft = rtt + rct
+        rt, rtt, rct, rfn, frame, rcur = self.cur
+        rtt = rtt + t
+        sft = rtt + rct
 
-		pt, ptt, pct, pfn, pframe, pcur = rcur
-		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+        pt, ptt, pct, pfn, pframe, pcur = rcur
+        self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
 
-		cc, ns, tt, ct, callers = self.timings[rfn]
-		if not ns:
-			ct = ct + sft
-			cc = cc + 1
-		if callers.has_key(pfn):
-			callers[pfn] = callers[pfn] + 1  # hack: gather more
-			# stats such as the amount of time added to ct courtesy
-			# of this specific call, and the contribution to cc
-			# courtesy of this call.
-		else:
-			callers[pfn] = 1
-		self.timings[rfn] = cc, ns - 1, tt+rtt, ct, callers
+        cc, ns, tt, ct, callers = self.timings[rfn]
+        if not ns:
+            ct = ct + sft
+            cc = cc + 1
+        if callers.has_key(pfn):
+            callers[pfn] = callers[pfn] + 1  # hack: gather more
+            # stats such as the amount of time added to ct courtesy
+            # of this specific call, and the contribution to cc
+            # courtesy of this call.
+        else:
+            callers[pfn] = 1
+        self.timings[rfn] = cc, ns - 1, tt+rtt, ct, callers
 
-		return 1
+        return 1
 
-	# The next few function play with self.cmd. By carefully preloading
-	# our parallel stack, we can force the profiled result to include
-	# an arbitrary string as the name of the calling function.
-	# We use self.cmd as that string, and the resulting stats look
-	# very nice :-).
+    # The next few function play with self.cmd. By carefully preloading
+    # our parallel stack, we can force the profiled result to include
+    # an arbitrary string as the name of the calling function.
+    # We use self.cmd as that string, and the resulting stats look
+    # very nice :-).
 
-	def set_cmd(self, cmd):
-		if self.cur[-1]: return   # already set
-		self.cmd = cmd
-		self.simulate_call(cmd)
+    def set_cmd(self, cmd):
+        if self.cur[-1]: return   # already set
+        self.cmd = cmd
+        self.simulate_call(cmd)
 
-	class fake_code:
-		def __init__(self, filename, line, name):
-			self.co_filename = filename
-			self.co_line = line
-			self.co_name = name
-			self.co_firstlineno = 0
+    class fake_code:
+        def __init__(self, filename, line, name):
+            self.co_filename = filename
+            self.co_line = line
+            self.co_name = name
+            self.co_firstlineno = 0
 
-		def __repr__(self):
-			return repr((self.co_filename, self.co_line, self.co_name))
+        def __repr__(self):
+            return repr((self.co_filename, self.co_line, self.co_name))
 
-	class fake_frame:
-		def __init__(self, code, prior):
-			self.f_code = code
-			self.f_back = prior
-			
-	def simulate_call(self, name):
-		code = self.fake_code('profile', 0, name)
-		if self.cur:
-			pframe = self.cur[-2]
-		else:
-			pframe = None
-		frame = self.fake_frame(code, pframe)
-		a = self.dispatch['call'](frame, 0)
-		return
+    class fake_frame:
+        def __init__(self, code, prior):
+            self.f_code = code
+            self.f_back = prior
 
-	# collect stats from pending stack, including getting final
-	# timings for self.cmd frame.
-	
-	def simulate_cmd_complete(self):   
-		t = self.get_time() - self.t
-		while self.cur[-1]:
-			# We *can* cause assertion errors here if
-			# dispatch_trace_return checks for a frame match!
-			a = self.dispatch['return'](self.cur[-2], t)
-			t = 0
-		self.t = self.get_time() - t
+    def simulate_call(self, name):
+        code = self.fake_code('profile', 0, name)
+        if self.cur:
+            pframe = self.cur[-2]
+        else:
+            pframe = None
+        frame = self.fake_frame(code, pframe)
+        a = self.dispatch['call'](frame, 0)
+        return
 
-	
-	def print_stats(self):
-		import pstats
-		pstats.Stats(self).strip_dirs().sort_stats(-1). \
-			  print_stats()
+    # collect stats from pending stack, including getting final
+    # timings for self.cmd frame.
 
-	def dump_stats(self, file):
-		f = open(file, 'wb')
-		self.create_stats()
-		marshal.dump(self.stats, f)
-		f.close()
-
-	def create_stats(self):
-		self.simulate_cmd_complete()
-		self.snapshot_stats()
-
-	def snapshot_stats(self):
-		self.stats = {}
-		for func in self.timings.keys():
-			cc, ns, tt, ct, callers = self.timings[func]
-			callers = callers.copy()
-			nc = 0
-			for func_caller in callers.keys():
-				nc = nc + callers[func_caller]
-			self.stats[func] = cc, nc, tt, ct, callers
+    def simulate_cmd_complete(self):
+        t = self.get_time() - self.t
+        while self.cur[-1]:
+            # We *can* cause assertion errors here if
+            # dispatch_trace_return checks for a frame match!
+            a = self.dispatch['return'](self.cur[-2], t)
+            t = 0
+        self.t = self.get_time() - t
 
 
-	# The following two methods can be called by clients to use
-	# a profiler to profile a statement, given as a string.
-	
-	def run(self, cmd):
-		import __main__
-		dict = __main__.__dict__
-		return self.runctx(cmd, dict, dict)
-	
-	def runctx(self, cmd, globals, locals):
-		self.set_cmd(cmd)
-		sys.setprofile(self.dispatcher)
-		try:
-			exec cmd in globals, locals
-		finally:
-			sys.setprofile(None)
-		return self
+    def print_stats(self):
+        import pstats
+        pstats.Stats(self).strip_dirs().sort_stats(-1). \
+                  print_stats()
 
-	# This method is more useful to profile a single function call.
-	def runcall(self, func, *args):
-		self.set_cmd(`func`)
-		sys.setprofile(self.dispatcher)
-		try:
-			return apply(func, args)
-		finally:
-			sys.setprofile(None)
+    def dump_stats(self, file):
+        f = open(file, 'wb')
+        self.create_stats()
+        marshal.dump(self.stats, f)
+        f.close()
+
+    def create_stats(self):
+        self.simulate_cmd_complete()
+        self.snapshot_stats()
+
+    def snapshot_stats(self):
+        self.stats = {}
+        for func in self.timings.keys():
+            cc, ns, tt, ct, callers = self.timings[func]
+            callers = callers.copy()
+            nc = 0
+            for func_caller in callers.keys():
+                nc = nc + callers[func_caller]
+            self.stats[func] = cc, nc, tt, ct, callers
 
 
-	#******************************************************************
-	# The following calculates the overhead for using a profiler.  The
-	# problem is that it takes a fair amount of time for the profiler
-	# to stop the stopwatch (from the time it receives an event).
-	# Similarly, there is a delay from the time that the profiler
-	# re-starts the stopwatch before the user's code really gets to
-	# continue.  The following code tries to measure the difference on
-	# a per-event basis. The result can the be placed in the
-	# Profile.dispatch_event() routine for the given platform.  Note
-	# that this difference is only significant if there are a lot of
-	# events, and relatively little user code per event.  For example,
-	# code with small functions will typically benefit from having the
-	# profiler calibrated for the current platform.  This *could* be
-	# done on the fly during init() time, but it is not worth the
-	# effort.  Also note that if too large a value specified, then
-	# execution time on some functions will actually appear as a
-	# negative number.  It is *normal* for some functions (with very
-	# low call counts) to have such negative stats, even if the
-	# calibration figure is "correct." 
-	#
-	# One alternative to profile-time calibration adjustments (i.e.,
-	# adding in the magic little delta during each event) is to track
-	# more carefully the number of events (and cumulatively, the number
-	# of events during sub functions) that are seen.  If this were
-	# done, then the arithmetic could be done after the fact (i.e., at
-	# display time).  Currently, we track only call/return events.
-	# These values can be deduced by examining the callees and callers
-	# vectors for each functions.  Hence we *can* almost correct the
-	# internal time figure at print time (note that we currently don't
-	# track exception event processing counts).  Unfortunately, there
-	# is currently no similar information for cumulative sub-function
-	# time.  It would not be hard to "get all this info" at profiler
-	# time.  Specifically, we would have to extend the tuples to keep
-	# counts of this in each frame, and then extend the defs of timing
-	# tuples to include the significant two figures. I'm a bit fearful
-	# that this additional feature will slow the heavily optimized
-	# event/time ratio (i.e., the profiler would run slower, fur a very
-	# low "value added" feature.) 
-	#
-	# Plugging in the calibration constant doesn't slow down the
-	# profiler very much, and the accuracy goes way up.
-	#**************************************************************
-	
-	def calibrate(self, m):
-		# Modified by Tim Peters
-		n = m
-		s = self.get_time()
-		while n:
-			self.simple()
-			n = n - 1
-		f = self.get_time()
-		my_simple = f - s
-		#print "Simple =", my_simple,
+    # The following two methods can be called by clients to use
+    # a profiler to profile a statement, given as a string.
 
-		n = m
-		s = self.get_time()
-		while n:
-			self.instrumented()
-			n = n - 1
-		f = self.get_time()
-		my_inst = f - s
-		# print "Instrumented =", my_inst
-		avg_cost = (my_inst - my_simple)/m
-		#print "Delta/call =", avg_cost, "(profiler fixup constant)"
-		return avg_cost
+    def run(self, cmd):
+        import __main__
+        dict = __main__.__dict__
+        return self.runctx(cmd, dict, dict)
 
-	# simulate a program with no profiler activity
-	def simple(self):
-		a = 1
-		pass
+    def runctx(self, cmd, globals, locals):
+        self.set_cmd(cmd)
+        sys.setprofile(self.dispatcher)
+        try:
+            exec cmd in globals, locals
+        finally:
+            sys.setprofile(None)
+        return self
 
-	# simulate a program with call/return event processing
-	def instrumented(self):
-		a = 1
-		self.profiler_simulation(a, a, a)
+    # This method is more useful to profile a single function call.
+    def runcall(self, func, *args):
+        self.set_cmd(`func`)
+        sys.setprofile(self.dispatcher)
+        try:
+            return apply(func, args)
+        finally:
+            sys.setprofile(None)
 
-	# simulate an event processing activity (from user's perspective)
-	def profiler_simulation(self, x, y, z):  
-		t = self.timer()
-		## t = t[0] + t[1]
-		self.ut = t
+
+    #******************************************************************
+    # The following calculates the overhead for using a profiler.  The
+    # problem is that it takes a fair amount of time for the profiler
+    # to stop the stopwatch (from the time it receives an event).
+    # Similarly, there is a delay from the time that the profiler
+    # re-starts the stopwatch before the user's code really gets to
+    # continue.  The following code tries to measure the difference on
+    # a per-event basis. The result can the be placed in the
+    # Profile.dispatch_event() routine for the given platform.  Note
+    # that this difference is only significant if there are a lot of
+    # events, and relatively little user code per event.  For example,
+    # code with small functions will typically benefit from having the
+    # profiler calibrated for the current platform.  This *could* be
+    # done on the fly during init() time, but it is not worth the
+    # effort.  Also note that if too large a value specified, then
+    # execution time on some functions will actually appear as a
+    # negative number.  It is *normal* for some functions (with very
+    # low call counts) to have such negative stats, even if the
+    # calibration figure is "correct."
+    #
+    # One alternative to profile-time calibration adjustments (i.e.,
+    # adding in the magic little delta during each event) is to track
+    # more carefully the number of events (and cumulatively, the number
+    # of events during sub functions) that are seen.  If this were
+    # done, then the arithmetic could be done after the fact (i.e., at
+    # display time).  Currently, we track only call/return events.
+    # These values can be deduced by examining the callees and callers
+    # vectors for each functions.  Hence we *can* almost correct the
+    # internal time figure at print time (note that we currently don't
+    # track exception event processing counts).  Unfortunately, there
+    # is currently no similar information for cumulative sub-function
+    # time.  It would not be hard to "get all this info" at profiler
+    # time.  Specifically, we would have to extend the tuples to keep
+    # counts of this in each frame, and then extend the defs of timing
+    # tuples to include the significant two figures. I'm a bit fearful
+    # that this additional feature will slow the heavily optimized
+    # event/time ratio (i.e., the profiler would run slower, fur a very
+    # low "value added" feature.)
+    #
+    # Plugging in the calibration constant doesn't slow down the
+    # profiler very much, and the accuracy goes way up.
+    #**************************************************************
+
+    def calibrate(self, m):
+        # Modified by Tim Peters
+        n = m
+        s = self.get_time()
+        while n:
+            self.simple()
+            n = n - 1
+        f = self.get_time()
+        my_simple = f - s
+        #print "Simple =", my_simple,
+
+        n = m
+        s = self.get_time()
+        while n:
+            self.instrumented()
+            n = n - 1
+        f = self.get_time()
+        my_inst = f - s
+        # print "Instrumented =", my_inst
+        avg_cost = (my_inst - my_simple)/m
+        #print "Delta/call =", avg_cost, "(profiler fixup constant)"
+        return avg_cost
+
+    # simulate a program with no profiler activity
+    def simple(self):
+        a = 1
+        pass
+
+    # simulate a program with call/return event processing
+    def instrumented(self):
+        a = 1
+        self.profiler_simulation(a, a, a)
+
+    # simulate an event processing activity (from user's perspective)
+    def profiler_simulation(self, x, y, z):
+        t = self.timer()
+        ## t = t[0] + t[1]
+        self.ut = t
 
 
 
 class OldProfile(Profile):
-	"""A derived profiler that simulates the old style profile, providing
-	errant results on recursive functions. The reason for the usefulness of
-	this profiler is that it runs faster (i.e., less overhead).  It still
-	creates all the caller stats, and is quite useful when there is *no*
-	recursion in the user's code.
-	
-	This code also shows how easy it is to create a modified profiler.
-	"""
+    """A derived profiler that simulates the old style profile, providing
+    errant results on recursive functions. The reason for the usefulness of
+    this profiler is that it runs faster (i.e., less overhead).  It still
+    creates all the caller stats, and is quite useful when there is *no*
+    recursion in the user's code.
 
-	def trace_dispatch_exception(self, frame, t):
-		rt, rtt, rct, rfn, rframe, rcur = self.cur
-		if rcur and not rframe is frame:
-			return self.trace_dispatch_return(rframe, t)
-		return 0
+    This code also shows how easy it is to create a modified profiler.
+    """
 
-	def trace_dispatch_call(self, frame, t):
-		fn = `frame.f_code`
-		
-		self.cur = (t, 0, 0, fn, frame, self.cur)
-		if self.timings.has_key(fn):
-			tt, ct, callers = self.timings[fn]
-			self.timings[fn] = tt, ct, callers
-		else:
-			self.timings[fn] = 0, 0, {}
-		return 1
+    def trace_dispatch_exception(self, frame, t):
+        rt, rtt, rct, rfn, rframe, rcur = self.cur
+        if rcur and not rframe is frame:
+            return self.trace_dispatch_return(rframe, t)
+        return 0
 
-	def trace_dispatch_return(self, frame, t):
-		rt, rtt, rct, rfn, frame, rcur = self.cur
-		rtt = rtt + t
-		sft = rtt + rct
+    def trace_dispatch_call(self, frame, t):
+        fn = `frame.f_code`
 
-		pt, ptt, pct, pfn, pframe, pcur = rcur
-		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+        self.cur = (t, 0, 0, fn, frame, self.cur)
+        if self.timings.has_key(fn):
+            tt, ct, callers = self.timings[fn]
+            self.timings[fn] = tt, ct, callers
+        else:
+            self.timings[fn] = 0, 0, {}
+        return 1
 
-		tt, ct, callers = self.timings[rfn]
-		if callers.has_key(pfn):
-			callers[pfn] = callers[pfn] + 1
-		else:
-			callers[pfn] = 1
-		self.timings[rfn] = tt+rtt, ct + sft, callers
+    def trace_dispatch_return(self, frame, t):
+        rt, rtt, rct, rfn, frame, rcur = self.cur
+        rtt = rtt + t
+        sft = rtt + rct
 
-		return 1
+        pt, ptt, pct, pfn, pframe, pcur = rcur
+        self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+
+        tt, ct, callers = self.timings[rfn]
+        if callers.has_key(pfn):
+            callers[pfn] = callers[pfn] + 1
+        else:
+            callers[pfn] = 1
+        self.timings[rfn] = tt+rtt, ct + sft, callers
+
+        return 1
 
 
-	def snapshot_stats(self):
-		self.stats = {}
-		for func in self.timings.keys():
-			tt, ct, callers = self.timings[func]
-			callers = callers.copy()
-			nc = 0
-			for func_caller in callers.keys():
-				nc = nc + callers[func_caller]
-			self.stats[func] = nc, nc, tt, ct, callers
+    def snapshot_stats(self):
+        self.stats = {}
+        for func in self.timings.keys():
+            tt, ct, callers = self.timings[func]
+            callers = callers.copy()
+            nc = 0
+            for func_caller in callers.keys():
+                nc = nc + callers[func_caller]
+            self.stats[func] = nc, nc, tt, ct, callers
 
-		
+
 
 class HotProfile(Profile):
-	"""The fastest derived profile example.  It does not calculate
-	caller-callee relationships, and does not calculate cumulative
-	time under a function.  It only calculates time spent in a
-	function, so it runs very quickly due to its very low overhead.
-	"""
+    """The fastest derived profile example.  It does not calculate
+    caller-callee relationships, and does not calculate cumulative
+    time under a function.  It only calculates time spent in a
+    function, so it runs very quickly due to its very low overhead.
+    """
 
-	def trace_dispatch_exception(self, frame, t):
-		rt, rtt, rfn, rframe, rcur = self.cur
-		if rcur and not rframe is frame:
-			return self.trace_dispatch_return(rframe, t)
-		return 0
+    def trace_dispatch_exception(self, frame, t):
+        rt, rtt, rfn, rframe, rcur = self.cur
+        if rcur and not rframe is frame:
+            return self.trace_dispatch_return(rframe, t)
+        return 0
 
-	def trace_dispatch_call(self, frame, t):
-		self.cur = (t, 0, frame, self.cur)
-		return 1
+    def trace_dispatch_call(self, frame, t):
+        self.cur = (t, 0, frame, self.cur)
+        return 1
 
-	def trace_dispatch_return(self, frame, t):
-		rt, rtt, frame, rcur = self.cur
+    def trace_dispatch_return(self, frame, t):
+        rt, rtt, frame, rcur = self.cur
 
-		rfn = `frame.f_code`
+        rfn = `frame.f_code`
 
-		pt, ptt, pframe, pcur = rcur
-		self.cur = pt, ptt+rt, pframe, pcur
+        pt, ptt, pframe, pcur = rcur
+        self.cur = pt, ptt+rt, pframe, pcur
 
-		if self.timings.has_key(rfn):
-			nc, tt = self.timings[rfn]
-			self.timings[rfn] = nc + 1, rt + rtt + tt
-		else:
-			self.timings[rfn] =      1, rt + rtt
+        if self.timings.has_key(rfn):
+            nc, tt = self.timings[rfn]
+            self.timings[rfn] = nc + 1, rt + rtt + tt
+        else:
+            self.timings[rfn] =      1, rt + rtt
 
-		return 1
+        return 1
 
 
-	def snapshot_stats(self):
-		self.stats = {}
-		for func in self.timings.keys():
-			nc, tt = self.timings[func]
-			self.stats[func] = nc, nc, tt, 0, {}
+    def snapshot_stats(self):
+        self.stats = {}
+        for func in self.timings.keys():
+            nc, tt = self.timings[func]
+            self.stats[func] = nc, nc, tt, 0, {}
 
-		
+
 
 #****************************************************************************
 def Stats(*args):
-	print 'Report generating functions are in the "pstats" module\a'
+    print 'Report generating functions are in the "pstats" module\a'
 
 
 # When invoked as main program, invoke the profiler on a script
 if __name__ == '__main__':
-	import sys
-	import os
-	if not sys.argv[1:]:
-		print "usage: profile.py scriptfile [arg] ..."
-		sys.exit(2)
+    import sys
+    import os
+    if not sys.argv[1:]:
+        print "usage: profile.py scriptfile [arg] ..."
+        sys.exit(2)
 
-	filename = sys.argv[1]	# Get script filename
+    filename = sys.argv[1]  # Get script filename
 
-	del sys.argv[0]		# Hide "profile.py" from argument list
+    del sys.argv[0]         # Hide "profile.py" from argument list
 
-	# Insert script directory in front of module search path
-	sys.path.insert(0, os.path.dirname(filename))
+    # Insert script directory in front of module search path
+    sys.path.insert(0, os.path.dirname(filename))
 
-	run('execfile(' + `filename` + ')')
+    run('execfile(' + `filename` + ')')
diff --git a/Lib/pstats.py b/Lib/pstats.py
index 558962e..9923b95 100644
--- a/Lib/pstats.py
+++ b/Lib/pstats.py
@@ -9,7 +9,7 @@
 
 # Copyright 1994, by InfoSeek Corporation, all rights reserved.
 # Written by James Roskind
-# 
+#
 # Permission to use, copy, modify, and distribute this Python software
 # and its associated documentation for any purpose (subject to the
 # restriction in the following sentence) without fee is hereby granted,
@@ -22,7 +22,7 @@
 # to remain in Python, compiled Python, or other languages (such as C)
 # wherein the modified or derived code is exclusively imported into a
 # Python module.
-# 
+#
 # INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 # SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 # FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
@@ -41,486 +41,485 @@
 import fpformat
 
 class Stats:
-	"""This class is used for creating reports from data generated by the
-	Profile class.  It is a "friend" of that class, and imports data either
-	by direct access to members of Profile class, or by reading in a dictionary
-	that was emitted (via marshal) from the Profile class.
+    """This class is used for creating reports from data generated by the
+    Profile class.  It is a "friend" of that class, and imports data either
+    by direct access to members of Profile class, or by reading in a dictionary
+    that was emitted (via marshal) from the Profile class.
 
-	The big change from the previous Profiler (in terms of raw functionality)
-	is that an "add()" method has been provided to combine Stats from
-	several distinct profile runs.  Both the constructor and the add()
-	method now take arbitrarily many file names as arguments.
+    The big change from the previous Profiler (in terms of raw functionality)
+    is that an "add()" method has been provided to combine Stats from
+    several distinct profile runs.  Both the constructor and the add()
+    method now take arbitrarily many file names as arguments.
 
-	All the print methods now take an argument that indicates how many lines
-	to print.  If the arg is a floating point number between 0 and 1.0, then
-	it is taken as a decimal percentage of the available lines to be printed
-	(e.g., .1 means print 10% of all available lines).  If it is an integer,
-	it is taken to mean the number of lines of data that you wish to have
-	printed.
+    All the print methods now take an argument that indicates how many lines
+    to print.  If the arg is a floating point number between 0 and 1.0, then
+    it is taken as a decimal percentage of the available lines to be printed
+    (e.g., .1 means print 10% of all available lines).  If it is an integer,
+    it is taken to mean the number of lines of data that you wish to have
+    printed.
 
-	The sort_stats() method now processes some additional options (i.e., in
-	addition to the old -1, 0, 1, or 2).  It takes an arbitrary number of quoted
-	strings to select the sort order.  For example sort_stats('time', 'name')
-	sorts on the major key of "internal function time", and on the minor
-	key of 'the name of the function'.  Look at the two tables in sort_stats()
-	and get_sort_arg_defs(self) for more examples.
+    The sort_stats() method now processes some additional options (i.e., in
+    addition to the old -1, 0, 1, or 2).  It takes an arbitrary number of quoted
+    strings to select the sort order.  For example sort_stats('time', 'name')
+    sorts on the major key of "internal function time", and on the minor
+    key of 'the name of the function'.  Look at the two tables in sort_stats()
+    and get_sort_arg_defs(self) for more examples.
 
-	All methods now return "self",  so you can string together commands like:
-	    Stats('foo', 'goo').strip_dirs().sort_stats('calls').\
-	                        print_stats(5).print_callers(5)
-	"""
-	
-	def __init__(self, *args):
-		if not len(args):
-			arg = None
-		else:
-			arg = args[0]
-			args = args[1:]
-		self.init(arg)
-		apply(self.add, args).ignore()
-			
-	def init(self, arg):
-		self.all_callees = None  # calc only if needed
-		self.files = []
-		self.fcn_list = None
-		self.total_tt = 0
-		self.total_calls = 0
-		self.prim_calls = 0
-		self.max_name_len = 0
-		self.top_level = {}
-		self.stats = {}
-		self.sort_arg_dict = {}
-		self.load_stats(arg)
-		trouble = 1
-		try:
-			self.get_top_level_stats()
-			trouble = 0
-		finally:
-			if trouble:
-				print "Invalid timing data",
-				if self.files: print self.files[-1],
-				print
+    All methods now return "self",  so you can string together commands like:
+        Stats('foo', 'goo').strip_dirs().sort_stats('calls').\
+                            print_stats(5).print_callers(5)
+    """
+
+    def __init__(self, *args):
+        if not len(args):
+            arg = None
+        else:
+            arg = args[0]
+            args = args[1:]
+        self.init(arg)
+        apply(self.add, args).ignore()
+
+    def init(self, arg):
+        self.all_callees = None  # calc only if needed
+        self.files = []
+        self.fcn_list = None
+        self.total_tt = 0
+        self.total_calls = 0
+        self.prim_calls = 0
+        self.max_name_len = 0
+        self.top_level = {}
+        self.stats = {}
+        self.sort_arg_dict = {}
+        self.load_stats(arg)
+        trouble = 1
+        try:
+            self.get_top_level_stats()
+            trouble = 0
+        finally:
+            if trouble:
+                print "Invalid timing data",
+                if self.files: print self.files[-1],
+                print
 
 
-	def load_stats(self, arg):
-		if not arg:  self.stats = {}
-		elif type(arg) == type(""):
-			f = open(arg, 'rb')
-			self.stats = marshal.load(f)
-			f.close()
-			try:
-				file_stats = os.stat(arg)
-				arg = time.ctime(file_stats[8]) + "    " + arg
-			except:  # in case this is not unix
-				pass
-			self.files = [ arg ]
-		elif hasattr(arg, 'create_stats'):
-			arg.create_stats()
-			self.stats = arg.stats
-			arg.stats = {}
-		if not self.stats:
-			raise TypeError,  "Cannot create or construct a " \
-				  + `self.__class__` \
-				  + " object from '" + `arg` + "'"
-		return
+    def load_stats(self, arg):
+        if not arg:  self.stats = {}
+        elif type(arg) == type(""):
+            f = open(arg, 'rb')
+            self.stats = marshal.load(f)
+            f.close()
+            try:
+                file_stats = os.stat(arg)
+                arg = time.ctime(file_stats[8]) + "    " + arg
+            except:  # in case this is not unix
+                pass
+            self.files = [ arg ]
+        elif hasattr(arg, 'create_stats'):
+            arg.create_stats()
+            self.stats = arg.stats
+            arg.stats = {}
+        if not self.stats:
+            raise TypeError,  "Cannot create or construct a " \
+                      + `self.__class__` \
+                      + " object from '" + `arg` + "'"
+        return
 
-	def get_top_level_stats(self):
-		for func in self.stats.keys():
-			cc, nc, tt, ct, callers = self.stats[func]
-			self.total_calls = self.total_calls + nc
-			self.prim_calls  = self.prim_calls  + cc
-			self.total_tt    = self.total_tt    + tt
-			if callers.has_key(("jprofile", 0, "profiler")):
-				self.top_level[func] = None
-			if len(func_std_string(func)) > self.max_name_len:
-				self.max_name_len = len(func_std_string(func))
-					
-	def add(self, *arg_list):
-		if not arg_list: return self
-		if len(arg_list) > 1: apply(self.add, arg_list[1:])
-		other = arg_list[0]
-		if type(self) != type(other) or \
-			  self.__class__ != other.__class__:
-			other = Stats(other)
-		self.files = self.files + other.files
-		self.total_calls = self.total_calls + other.total_calls
-		self.prim_calls = self.prim_calls + other.prim_calls
-		self.total_tt = self.total_tt + other.total_tt
-		for func in other.top_level.keys():
-			self.top_level[func] = None
+    def get_top_level_stats(self):
+        for func in self.stats.keys():
+            cc, nc, tt, ct, callers = self.stats[func]
+            self.total_calls = self.total_calls + nc
+            self.prim_calls  = self.prim_calls  + cc
+            self.total_tt    = self.total_tt    + tt
+            if callers.has_key(("jprofile", 0, "profiler")):
+                self.top_level[func] = None
+            if len(func_std_string(func)) > self.max_name_len:
+                self.max_name_len = len(func_std_string(func))
 
-		if self.max_name_len < other.max_name_len:
-			self.max_name_len = other.max_name_len
+    def add(self, *arg_list):
+        if not arg_list: return self
+        if len(arg_list) > 1: apply(self.add, arg_list[1:])
+        other = arg_list[0]
+        if type(self) != type(other) or \
+                  self.__class__ != other.__class__:
+            other = Stats(other)
+        self.files = self.files + other.files
+        self.total_calls = self.total_calls + other.total_calls
+        self.prim_calls = self.prim_calls + other.prim_calls
+        self.total_tt = self.total_tt + other.total_tt
+        for func in other.top_level.keys():
+            self.top_level[func] = None
 
-		self.fcn_list = None
+        if self.max_name_len < other.max_name_len:
+            self.max_name_len = other.max_name_len
 
-		for func in other.stats.keys():
-			if self.stats.has_key(func):
-				old_func_stat = self.stats[func]
-			else:
-				old_func_stat = (0, 0, 0, 0, {},)
-			self.stats[func] = add_func_stats(old_func_stat, \
-				  other.stats[func])
-		return self
-			
+        self.fcn_list = None
 
-
-	# list the tuple indices and directions for sorting,
-	# along with some printable description
-	sort_arg_dict_default = {\
-		  "calls"     : (((1,-1),              ), "call count"),\
-		  "cumulative": (((3,-1),              ), "cumulative time"),\
-		  "file"      : (((4, 1),              ), "file name"),\
-		  "line"      : (((5, 1),              ), "line number"),\
-		  "module"    : (((4, 1),              ), "file name"),\
-		  "name"      : (((6, 1),              ), "function name"),\
-		  "nfl"       : (((6, 1),(4, 1),(5, 1),), "name/file/line"), \
-		  "pcalls"    : (((0,-1),              ), "call count"),\
-		  "stdname"   : (((7, 1),              ), "standard name"),\
-		  "time"      : (((2,-1),              ), "internal time"),\
-		  }
-
-	def get_sort_arg_defs(self):
-		"""Expand all abbreviations that are unique."""
-		if not self.sort_arg_dict:
-			self.sort_arg_dict = dict = {}
-			std_list = dict.keys()
-			bad_list = {}
-			for word in self.sort_arg_dict_default.keys():
-				fragment = word
-				while fragment:
-					if not fragment:
-						break
-					if dict.has_key(fragment):
-						bad_list[fragment] = 0
-						break
-					dict[fragment] = self. \
-						  sort_arg_dict_default[word]
-					fragment = fragment[:-1]
-			for word in bad_list.keys():
-				del dict[word]
-		return self.sort_arg_dict
-			
-
-	def sort_stats(self, *field):
-		if not field:
-			self.fcn_list = 0
-			return self
-		if len(field) == 1 and type(field[0]) == type(1):
-			# Be compatible with old profiler
-			field = [ {-1: "stdname", \
-				  0:"calls", \
-				  1:"time", \
-				  2: "cumulative" }  [ field[0] ] ]
-
-		sort_arg_defs = self.get_sort_arg_defs()
-		sort_tuple = ()
-		self.sort_type = ""
-		connector = ""
-		for word in field:
-			sort_tuple = sort_tuple + sort_arg_defs[word][0]
-			self.sort_type = self.sort_type + connector + \
-				  sort_arg_defs[word][1]
-			connector = ", "
-					
-		stats_list = []
-		for func in self.stats.keys():
-			cc, nc, tt, ct, callers = self.stats[func]
-			stats_list.append((cc, nc, tt, ct) + func_split(func) \
-				           + (func_std_string(func), func,)  )
-
-		stats_list.sort(TupleComp(sort_tuple).compare)
-
-		self.fcn_list = fcn_list = []
-		for tuple in stats_list:
-			fcn_list.append(tuple[-1])
-		return self
-
-
-	def reverse_order(self):
-		if self.fcn_list: self.fcn_list.reverse()
-		return self
-
-	def strip_dirs(self):
-		oldstats = self.stats
-		self.stats = newstats = {}
-		max_name_len = 0
-		for func in oldstats.keys():
-			cc, nc, tt, ct, callers = oldstats[func]
-			newfunc = func_strip_path(func)
-			if len(func_std_string(newfunc)) > max_name_len:
-				max_name_len = len(func_std_string(newfunc))
-			newcallers = {}
-			for func2 in callers.keys():
-				newcallers[func_strip_path(func2)] = \
-					  callers[func2]
-
-			if newstats.has_key(newfunc):
-				newstats[newfunc] = add_func_stats( \
-					  newstats[newfunc],\
-					  (cc, nc, tt, ct, newcallers))
-			else:
-				newstats[newfunc] = (cc, nc, tt, ct, newcallers)
-		old_top = self.top_level
-		self.top_level = new_top = {}
-		for func in old_top.keys():
-			new_top[func_strip_path(func)] = None
-
-		self.max_name_len = max_name_len
-
-		self.fcn_list = None
-		self.all_callees = None
-		return self
+        for func in other.stats.keys():
+            if self.stats.has_key(func):
+                old_func_stat = self.stats[func]
+            else:
+                old_func_stat = (0, 0, 0, 0, {},)
+            self.stats[func] = add_func_stats(old_func_stat, \
+                      other.stats[func])
+        return self
 
 
 
-	def calc_callees(self):
-		if self.all_callees: return
-		self.all_callees = all_callees = {}
-		for func in self.stats.keys():
-			if not all_callees.has_key(func):
-				all_callees[func] = {}
-			cc, nc, tt, ct, callers = self.stats[func]
-			for func2 in callers.keys():
-				if not all_callees.has_key(func2):
-					all_callees[func2] = {}
-				all_callees[func2][func]  = callers[func2]
-		return
+    # list the tuple indices and directions for sorting,
+    # along with some printable description
+    sort_arg_dict_default = {\
+              "calls"     : (((1,-1),              ), "call count"),\
+              "cumulative": (((3,-1),              ), "cumulative time"),\
+              "file"      : (((4, 1),              ), "file name"),\
+              "line"      : (((5, 1),              ), "line number"),\
+              "module"    : (((4, 1),              ), "file name"),\
+              "name"      : (((6, 1),              ), "function name"),\
+              "nfl"       : (((6, 1),(4, 1),(5, 1),), "name/file/line"), \
+              "pcalls"    : (((0,-1),              ), "call count"),\
+              "stdname"   : (((7, 1),              ), "standard name"),\
+              "time"      : (((2,-1),              ), "internal time"),\
+              }
 
-	#******************************************************************
-	# The following functions support actual printing of reports
-	#******************************************************************
+    def get_sort_arg_defs(self):
+        """Expand all abbreviations that are unique."""
+        if not self.sort_arg_dict:
+            self.sort_arg_dict = dict = {}
+            std_list = dict.keys()
+            bad_list = {}
+            for word in self.sort_arg_dict_default.keys():
+                fragment = word
+                while fragment:
+                    if not fragment:
+                        break
+                    if dict.has_key(fragment):
+                        bad_list[fragment] = 0
+                        break
+                    dict[fragment] = self. \
+                              sort_arg_dict_default[word]
+                    fragment = fragment[:-1]
+            for word in bad_list.keys():
+                del dict[word]
+        return self.sort_arg_dict
 
-	# Optional "amount" is either a line count, or a percentage of lines.
 
-	def eval_print_amount(self, sel, list, msg):
-		new_list = list
-		if type(sel) == type(""):
-			new_list = []
-			for func in list:
-				if re.search(sel, func_std_string(func)):
-					new_list.append(func)
-		else:
-			count = len(list)
-			if type(sel) == type(1.0) and 0.0 <= sel < 1.0:
-				count = int (count * sel + .5)
-				new_list = list[:count]
-			elif type(sel) == type(1) and 0 <= sel < count:
-				count = sel
-				new_list = list[:count]
-		if len(list) != len(new_list):
-			msg = msg + "   List reduced from " + `len(list)` \
-				  + " to " + `len(new_list)` + \
-				  " due to restriction <" + `sel` + ">\n"
-			
-		return new_list, msg
+    def sort_stats(self, *field):
+        if not field:
+            self.fcn_list = 0
+            return self
+        if len(field) == 1 and type(field[0]) == type(1):
+            # Be compatible with old profiler
+            field = [ {-1: "stdname", \
+                      0:"calls", \
+                      1:"time", \
+                      2: "cumulative" }  [ field[0] ] ]
+
+        sort_arg_defs = self.get_sort_arg_defs()
+        sort_tuple = ()
+        self.sort_type = ""
+        connector = ""
+        for word in field:
+            sort_tuple = sort_tuple + sort_arg_defs[word][0]
+            self.sort_type = self.sort_type + connector + \
+                      sort_arg_defs[word][1]
+            connector = ", "
+
+        stats_list = []
+        for func in self.stats.keys():
+            cc, nc, tt, ct, callers = self.stats[func]
+            stats_list.append((cc, nc, tt, ct) + func_split(func) \
+                               + (func_std_string(func), func,)  )
+
+        stats_list.sort(TupleComp(sort_tuple).compare)
+
+        self.fcn_list = fcn_list = []
+        for tuple in stats_list:
+            fcn_list.append(tuple[-1])
+        return self
+
+
+    def reverse_order(self):
+        if self.fcn_list: self.fcn_list.reverse()
+        return self
+
+    def strip_dirs(self):
+        oldstats = self.stats
+        self.stats = newstats = {}
+        max_name_len = 0
+        for func in oldstats.keys():
+            cc, nc, tt, ct, callers = oldstats[func]
+            newfunc = func_strip_path(func)
+            if len(func_std_string(newfunc)) > max_name_len:
+                max_name_len = len(func_std_string(newfunc))
+            newcallers = {}
+            for func2 in callers.keys():
+                newcallers[func_strip_path(func2)] = \
+                          callers[func2]
+
+            if newstats.has_key(newfunc):
+                newstats[newfunc] = add_func_stats( \
+                          newstats[newfunc],\
+                          (cc, nc, tt, ct, newcallers))
+            else:
+                newstats[newfunc] = (cc, nc, tt, ct, newcallers)
+        old_top = self.top_level
+        self.top_level = new_top = {}
+        for func in old_top.keys():
+            new_top[func_strip_path(func)] = None
+
+        self.max_name_len = max_name_len
+
+        self.fcn_list = None
+        self.all_callees = None
+        return self
 
 
 
-	def get_print_list(self, sel_list):
-		width = self.max_name_len
-		if self.fcn_list:
-			list = self.fcn_list[:]
-			msg = "   Ordered by: " + self.sort_type + '\n'
-		else:
-			list = self.stats.keys()
-			msg = "   Random listing order was used\n"
+    def calc_callees(self):
+        if self.all_callees: return
+        self.all_callees = all_callees = {}
+        for func in self.stats.keys():
+            if not all_callees.has_key(func):
+                all_callees[func] = {}
+            cc, nc, tt, ct, callers = self.stats[func]
+            for func2 in callers.keys():
+                if not all_callees.has_key(func2):
+                    all_callees[func2] = {}
+                all_callees[func2][func]  = callers[func2]
+        return
 
-		for selection in sel_list:
-			list,msg = self.eval_print_amount(selection, list, msg)
+    #******************************************************************
+    # The following functions support actual printing of reports
+    #******************************************************************
 
-		count = len(list)
+    # Optional "amount" is either a line count, or a percentage of lines.
 
-		if not list:
-			return 0, list
-		print msg
-		if count < len(self.stats):
-			width = 0
-			for func in list:
-				if  len(func_std_string(func)) > width:
-					width = len(func_std_string(func))
-		return width+2, list
-		
-	def print_stats(self, *amount):
-		for filename in self.files:
-			print filename
-		if self.files: print
-		indent = "        "
-		for func in self.top_level.keys():
-			print indent, func_get_function_name(func)
-		
-		print  indent, self.total_calls, "function calls",
-		if self.total_calls != self.prim_calls:
-			print "(" + `self.prim_calls`, "primitive calls)", 
-		print "in", fpformat.fix(self.total_tt, 3), "CPU seconds"
-		print
-		width, list = self.get_print_list(amount)
-		if list:
-			self.print_title()
-			for func in list:
-				self.print_line(func)
-			print 
-			print
-		return self
+    def eval_print_amount(self, sel, list, msg):
+        new_list = list
+        if type(sel) == type(""):
+            new_list = []
+            for func in list:
+                if re.search(sel, func_std_string(func)):
+                    new_list.append(func)
+        else:
+            count = len(list)
+            if type(sel) == type(1.0) and 0.0 <= sel < 1.0:
+                count = int (count * sel + .5)
+                new_list = list[:count]
+            elif type(sel) == type(1) and 0 <= sel < count:
+                count = sel
+                new_list = list[:count]
+        if len(list) != len(new_list):
+            msg = msg + "   List reduced from " + `len(list)` \
+                      + " to " + `len(new_list)` + \
+                      " due to restriction <" + `sel` + ">\n"
 
-			
-	def print_callees(self, *amount):
-		width, list = self.get_print_list(amount)
-		if list:
-			self.calc_callees()
-
-			self.print_call_heading(width, "called...")
-			for func in list:
-				if self.all_callees.has_key(func):
-					self.print_call_line(width, \
-						  func, self.all_callees[func])
-				else:
-					self.print_call_line(width, func, {})
-			print
-			print
-		return self
-
-	def print_callers(self, *amount):
-		width, list = self.get_print_list(amount)
-		if list:
-			self.print_call_heading(width, "was called by...")
-			for func in list:
-				cc, nc, tt, ct, callers = self.stats[func]
-				self.print_call_line(width, func, callers)
-			print
-			print
-		return self
-
-	def print_call_heading(self, name_size, column_title):
-		print string.ljust("Function ", name_size) + column_title
-
-
-	def print_call_line(self, name_size, source, call_dict):
-		print string.ljust(func_std_string(source), name_size),
-		if not call_dict:
-			print "--"
-			return
-		clist = call_dict.keys()
-		clist.sort()
-		name_size = name_size + 1
-		indent = ""
-		for func in clist:
-			name = func_std_string(func)
-			print indent*name_size + name + '(' \
-				  + `call_dict[func]`+')', \
-				  f8(self.stats[func][3])
-			indent = " "
+        return new_list, msg
 
 
 
-	def print_title(self):
-		print string.rjust('ncalls', 9),
-		print string.rjust('tottime', 8),
-		print string.rjust('percall', 8),
-		print string.rjust('cumtime', 8),
-		print string.rjust('percall', 8),
-		print 'filename:lineno(function)'
+    def get_print_list(self, sel_list):
+        width = self.max_name_len
+        if self.fcn_list:
+            list = self.fcn_list[:]
+            msg = "   Ordered by: " + self.sort_type + '\n'
+        else:
+            list = self.stats.keys()
+            msg = "   Random listing order was used\n"
+
+        for selection in sel_list:
+            list,msg = self.eval_print_amount(selection, list, msg)
+
+        count = len(list)
+
+        if not list:
+            return 0, list
+        print msg
+        if count < len(self.stats):
+            width = 0
+            for func in list:
+                if  len(func_std_string(func)) > width:
+                    width = len(func_std_string(func))
+        return width+2, list
+
+    def print_stats(self, *amount):
+        for filename in self.files:
+            print filename
+        if self.files: print
+        indent = "        "
+        for func in self.top_level.keys():
+            print indent, func_get_function_name(func)
+
+        print  indent, self.total_calls, "function calls",
+        if self.total_calls != self.prim_calls:
+            print "(" + `self.prim_calls`, "primitive calls)",
+        print "in", fpformat.fix(self.total_tt, 3), "CPU seconds"
+        print
+        width, list = self.get_print_list(amount)
+        if list:
+            self.print_title()
+            for func in list:
+                self.print_line(func)
+            print
+            print
+        return self
 
 
-	def print_line(self, func):  # hack : should print percentages
-		cc, nc, tt, ct, callers = self.stats[func]
-		c = `nc`
-		if nc != cc:
-			c = c + '/' + `cc`
-		print string.rjust(c, 9),
-		print f8(tt),
-		if nc == 0:
-			print ' '*8,
-		else:
-			print f8(tt/nc),
-		print f8(ct),
-		if cc == 0:
-			print ' '*8,
-		else:
-			print f8(ct/cc),
-		print func_std_string(func)
+    def print_callees(self, *amount):
+        width, list = self.get_print_list(amount)
+        if list:
+            self.calc_callees()
+
+            self.print_call_heading(width, "called...")
+            for func in list:
+                if self.all_callees.has_key(func):
+                    self.print_call_line(width, \
+                              func, self.all_callees[func])
+                else:
+                    self.print_call_line(width, func, {})
+            print
+            print
+        return self
+
+    def print_callers(self, *amount):
+        width, list = self.get_print_list(amount)
+        if list:
+            self.print_call_heading(width, "was called by...")
+            for func in list:
+                cc, nc, tt, ct, callers = self.stats[func]
+                self.print_call_line(width, func, callers)
+            print
+            print
+        return self
+
+    def print_call_heading(self, name_size, column_title):
+        print string.ljust("Function ", name_size) + column_title
 
 
-	def ignore(self):
-		pass # has no return value, so use at end of line :-)
+    def print_call_line(self, name_size, source, call_dict):
+        print string.ljust(func_std_string(source), name_size),
+        if not call_dict:
+            print "--"
+            return
+        clist = call_dict.keys()
+        clist.sort()
+        name_size = name_size + 1
+        indent = ""
+        for func in clist:
+            name = func_std_string(func)
+            print indent*name_size + name + '(' \
+                      + `call_dict[func]`+')', \
+                      f8(self.stats[func][3])
+            indent = " "
+
+
+
+    def print_title(self):
+        print string.rjust('ncalls', 9),
+        print string.rjust('tottime', 8),
+        print string.rjust('percall', 8),
+        print string.rjust('cumtime', 8),
+        print string.rjust('percall', 8),
+        print 'filename:lineno(function)'
+
+
+    def print_line(self, func):  # hack : should print percentages
+        cc, nc, tt, ct, callers = self.stats[func]
+        c = `nc`
+        if nc != cc:
+            c = c + '/' + `cc`
+        print string.rjust(c, 9),
+        print f8(tt),
+        if nc == 0:
+            print ' '*8,
+        else:
+            print f8(tt/nc),
+        print f8(ct),
+        if cc == 0:
+            print ' '*8,
+        else:
+            print f8(ct/cc),
+        print func_std_string(func)
+
+
+    def ignore(self):
+        pass # has no return value, so use at end of line :-)
 
 
 class TupleComp:
-	"""This class provides a generic function for comparing any two tuples.
-	Each instance records a list of tuple-indices (from most significant
-	to least significant), and sort direction (ascending or decending) for
-	each tuple-index.  The compare functions can then be used as the function
-	argument to the system sort() function when a list of tuples need to be
-	sorted in the instances order."""
+    """This class provides a generic function for comparing any two tuples.
+    Each instance records a list of tuple-indices (from most significant
+    to least significant), and sort direction (ascending or decending) for
+    each tuple-index.  The compare functions can then be used as the function
+    argument to the system sort() function when a list of tuples need to be
+    sorted in the instances order."""
 
-	def __init__(self, comp_select_list):
-		self.comp_select_list = comp_select_list
+    def __init__(self, comp_select_list):
+        self.comp_select_list = comp_select_list
 
-	def compare (self, left, right):
-		for index, direction in self.comp_select_list:
-			l = left[index]
-			r = right[index]
-			if l < r:
-				return -direction
-			if l > r:
-				return direction
-		return 0
+    def compare (self, left, right):
+        for index, direction in self.comp_select_list:
+            l = left[index]
+            r = right[index]
+            if l < r:
+                return -direction
+            if l > r:
+                return direction
+        return 0
 
-		
+
 
 #**************************************************************************
 
 def func_strip_path(func_name):
-	file, line, name = func_name
-	return os.path.basename(file), line, name
+    file, line, name = func_name
+    return os.path.basename(file), line, name
 
 def func_get_function_name(func):
-	return func[2]
+    return func[2]
 
 def func_std_string(func_name): # match what old profile produced
-	file, line, name = func_name
-	return file + ":" + `line` + "(" + name + ")"
+    file, line, name = func_name
+    return file + ":" + `line` + "(" + name + ")"
 
 def func_split(func_name):
-	return func_name
+    return func_name
 
 #**************************************************************************
 # The following functions combine statists for pairs functions.
 # The bulk of the processing involves correctly handling "call" lists,
-# such as callers and callees. 
+# such as callers and callees.
 #**************************************************************************
 
 def add_func_stats(target, source):
-	"""Add together all the stats for two profile entries."""
-	cc, nc, tt, ct, callers = source
-	t_cc, t_nc, t_tt, t_ct, t_callers = target
-	return (cc+t_cc, nc+t_nc, tt+t_tt, ct+t_ct, \
-		  add_callers(t_callers, callers))
+    """Add together all the stats for two profile entries."""
+    cc, nc, tt, ct, callers = source
+    t_cc, t_nc, t_tt, t_ct, t_callers = target
+    return (cc+t_cc, nc+t_nc, tt+t_tt, ct+t_ct, \
+              add_callers(t_callers, callers))
 
 
 def add_callers(target, source):
-	"""Combine two caller lists in a single list."""
-	new_callers = {}
-	for func in target.keys():
-		new_callers[func] = target[func]
-	for func in source.keys():
-		if new_callers.has_key(func):
-			new_callers[func] = source[func] + new_callers[func]
-		else:
-			new_callers[func] = source[func]
-	return new_callers
+    """Combine two caller lists in a single list."""
+    new_callers = {}
+    for func in target.keys():
+        new_callers[func] = target[func]
+    for func in source.keys():
+        if new_callers.has_key(func):
+            new_callers[func] = source[func] + new_callers[func]
+        else:
+            new_callers[func] = source[func]
+    return new_callers
 
 def count_calls(callers):
-	"""Sum the caller statistics to get total number of calls received."""
-	nc = 0
-	for func in callers.keys():
-		nc = nc + callers[func]
-	return nc
+    """Sum the caller statistics to get total number of calls received."""
+    nc = 0
+    for func in callers.keys():
+        nc = nc + callers[func]
+    return nc
 
 #**************************************************************************
 # The following functions support printing of reports
 #**************************************************************************
 
 def f8(x):
-	return string.rjust(fpformat.fix(x, 3), 8)
-
+    return string.rjust(fpformat.fix(x, 3), 8)
diff --git a/Lib/pty.py b/Lib/pty.py
index 12c9093..ef2113b 100644
--- a/Lib/pty.py
+++ b/Lib/pty.py
@@ -1,9 +1,9 @@
 """Pseudo terminal utilities."""
 
 # Bugs: No signal handling.  Doesn't set slave termios and window size.
-#	Only tested on Linux.
-# See:  W. Richard Stevens. 1992.  Advanced Programming in the 
-#	UNIX Environment.  Chapter 19.
+#       Only tested on Linux.
+# See:  W. Richard Stevens. 1992.  Advanced Programming in the
+#       UNIX Environment.  Chapter 19.
 # Author: Steen Lumholt -- with additions by Guido.
 
 from select import select
@@ -17,133 +17,133 @@
 CHILD = 0
 
 def openpty():
-	"""openpty() -> (master_fd, slave_fd)
-	Open a pty master/slave pair, using os.openpty() if possible."""
+    """openpty() -> (master_fd, slave_fd)
+    Open a pty master/slave pair, using os.openpty() if possible."""
 
-	try:
-		return os.openpty()
-	except (AttributeError, OSError):
-		pass
-	master_fd, slave_name = _open_terminal()
-	slave_fd = slave_open(slave_name)
-	return master_fd, slave_fd
+    try:
+        return os.openpty()
+    except (AttributeError, OSError):
+        pass
+    master_fd, slave_name = _open_terminal()
+    slave_fd = slave_open(slave_name)
+    return master_fd, slave_fd
 
 def master_open():
-	"""master_open() -> (master_fd, slave_name)
-	Open a pty master and return the fd, and the filename of the slave end.
-	Deprecated, use openpty() instead."""
+    """master_open() -> (master_fd, slave_name)
+    Open a pty master and return the fd, and the filename of the slave end.
+    Deprecated, use openpty() instead."""
 
-	try:
-		master_fd, slave_fd = os.openpty()
-	except (AttributeError, OSError):
-		pass
-	else:
-		slave_name = os.ttyname(slave_fd)
-		os.close(slave_fd)
-		return master_fd, slave_name
+    try:
+        master_fd, slave_fd = os.openpty()
+    except (AttributeError, OSError):
+        pass
+    else:
+        slave_name = os.ttyname(slave_fd)
+        os.close(slave_fd)
+        return master_fd, slave_name
 
-	return _open_terminal()
+    return _open_terminal()
 
 def _open_terminal():
-	"""Open pty master and return (master_fd, tty_name).
-	SGI and generic BSD version, for when openpty() fails."""
-	try:
-		import sgi
-	except ImportError:
-		pass
-	else:
-		try:
-		    tty_name, master_fd = sgi._getpty(FCNTL.O_RDWR, 0666, 0)
-		except IOError, msg:
-			raise os.error, msg
-		return master_fd, tty_name
-	for x in 'pqrstuvwxyzPQRST':
-		for y in '0123456789abcdef':
-			pty_name = '/dev/pty' + x + y
-			try:
-				fd = os.open(pty_name, FCNTL.O_RDWR)
-			except os.error:
-				continue
-			return (fd, '/dev/tty' + x + y)
-	raise os.error, 'out of pty devices'
+    """Open pty master and return (master_fd, tty_name).
+    SGI and generic BSD version, for when openpty() fails."""
+    try:
+        import sgi
+    except ImportError:
+        pass
+    else:
+        try:
+            tty_name, master_fd = sgi._getpty(FCNTL.O_RDWR, 0666, 0)
+        except IOError, msg:
+            raise os.error, msg
+        return master_fd, tty_name
+    for x in 'pqrstuvwxyzPQRST':
+        for y in '0123456789abcdef':
+            pty_name = '/dev/pty' + x + y
+            try:
+                fd = os.open(pty_name, FCNTL.O_RDWR)
+            except os.error:
+                continue
+            return (fd, '/dev/tty' + x + y)
+    raise os.error, 'out of pty devices'
 
 def slave_open(tty_name):
-	"""slave_open(tty_name) -> slave_fd
-	Open the pty slave and acquire the controlling terminal, returning
-	opened filedescriptor.
-	Deprecated, use openpty() instead."""
+    """slave_open(tty_name) -> slave_fd
+    Open the pty slave and acquire the controlling terminal, returning
+    opened filedescriptor.
+    Deprecated, use openpty() instead."""
 
-	return os.open(tty_name, FCNTL.O_RDWR)
+    return os.open(tty_name, FCNTL.O_RDWR)
 
 def fork():
-	"""fork() -> (pid, master_fd)
-	Fork and make the child a session leader with a controlling terminal."""
+    """fork() -> (pid, master_fd)
+    Fork and make the child a session leader with a controlling terminal."""
 
-	try:
-		pid, fd = os.forkpty()
-	except (AttributeError, OSError):
-		pass
-	else:
-		if pid == CHILD:
-			try:
-				os.setsid()
-			except OSError:
-				# os.forkpty() already set us session leader
-				pass
-		return pid, fd
+    try:
+        pid, fd = os.forkpty()
+    except (AttributeError, OSError):
+        pass
+    else:
+        if pid == CHILD:
+            try:
+                os.setsid()
+            except OSError:
+                # os.forkpty() already set us session leader
+                pass
+        return pid, fd
 
-	master_fd, slave_fd = openpty() 
-	pid = os.fork()
-	if pid == CHILD:
-		# Establish a new session.
-		os.setsid()
-		os.close(master_fd)
+    master_fd, slave_fd = openpty()
+    pid = os.fork()
+    if pid == CHILD:
+        # Establish a new session.
+        os.setsid()
+        os.close(master_fd)
 
-		# Slave becomes stdin/stdout/stderr of child.
-		os.dup2(slave_fd, STDIN_FILENO)
-		os.dup2(slave_fd, STDOUT_FILENO)
-		os.dup2(slave_fd, STDERR_FILENO)
-		if (slave_fd > STDERR_FILENO):
-			os.close (slave_fd)
+        # Slave becomes stdin/stdout/stderr of child.
+        os.dup2(slave_fd, STDIN_FILENO)
+        os.dup2(slave_fd, STDOUT_FILENO)
+        os.dup2(slave_fd, STDERR_FILENO)
+        if (slave_fd > STDERR_FILENO):
+            os.close (slave_fd)
 
-	# Parent and child process.
-	return pid, master_fd
+    # Parent and child process.
+    return pid, master_fd
 
 def _writen(fd, data):
-	"""Write all the data to a descriptor."""
-	while data != '':
-		n = os.write(fd, data)
-		data = data[n:]
+    """Write all the data to a descriptor."""
+    while data != '':
+        n = os.write(fd, data)
+        data = data[n:]
 
 def _read(fd):
-	"""Default read function."""
-	return os.read(fd, 1024)
+    """Default read function."""
+    return os.read(fd, 1024)
 
 def _copy(master_fd, master_read=_read, stdin_read=_read):
-	"""Parent copy loop.
-	Copies  
-	  	pty master -> standard output	(master_read)
-	  	standard input -> pty master	(stdin_read)"""
-	while 1:
-		rfds, wfds, xfds = select(
-			[master_fd, STDIN_FILENO], [], [])
-		if master_fd in rfds:
-			data = master_read(master_fd)
-			os.write(STDOUT_FILENO, data)
-		if STDIN_FILENO in rfds:
-			data = stdin_read(STDIN_FILENO)
-			_writen(master_fd, data)
+    """Parent copy loop.
+    Copies
+            pty master -> standard output   (master_read)
+            standard input -> pty master    (stdin_read)"""
+    while 1:
+        rfds, wfds, xfds = select(
+                [master_fd, STDIN_FILENO], [], [])
+        if master_fd in rfds:
+            data = master_read(master_fd)
+            os.write(STDOUT_FILENO, data)
+        if STDIN_FILENO in rfds:
+            data = stdin_read(STDIN_FILENO)
+            _writen(master_fd, data)
 
 def spawn(argv, master_read=_read, stdin_read=_read):
-	"""Create a spawned process."""
-	if type(argv) == type(''):
-		argv = (argv,)
-	pid, master_fd = fork()
-	if pid == CHILD:
-		apply(os.execlp, (argv[0],) + argv)
-	mode = tty.tcgetattr(STDIN_FILENO)
-	tty.setraw(STDIN_FILENO)
-	try:
-		_copy(master_fd, master_read, stdin_read)
-	except:
-		tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
+    """Create a spawned process."""
+    if type(argv) == type(''):
+        argv = (argv,)
+    pid, master_fd = fork()
+    if pid == CHILD:
+        apply(os.execlp, (argv[0],) + argv)
+    mode = tty.tcgetattr(STDIN_FILENO)
+    tty.setraw(STDIN_FILENO)
+    try:
+        _copy(master_fd, master_read, stdin_read)
+    except:
+        tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py
index 74b7ff7..43bd32c 100644
--- a/Lib/pyclbr.py
+++ b/Lib/pyclbr.py
@@ -4,7 +4,7 @@
 definitions and to find out the superclasses of a class.
 
 The interface consists of a single function:
-	readmodule(module, path)
+        readmodule(module, path)
 module is the name of a Python module, path is an optional list of
 directories where the module is to be searched.  If present, path is
 prepended to the system search path sys.path.
@@ -15,11 +15,11 @@
 
 A class is described by the class Class in this module.  Instances
 of this class have the following instance variables:
-	name -- the name of the class
-	super -- a list of super classes (Class instances)
-	methods -- a dictionary of methods
-	file -- the file in which the class was defined
-	lineno -- the line in the file on which the class statement occurred
+        name -- the name of the class
+        super -- a list of super classes (Class instances)
+        methods -- a dictionary of methods
+        file -- the file in which the class was defined
+        lineno -- the line in the file on which the class statement occurred
 The dictionary of methods uses the method names as keys and the line
 numbers on which the method was defined as values.
 If the name of a super class is not recognized, the corresponding
@@ -64,52 +64,52 @@
 _getnext = re.compile(r"""
     (?P<String>
        \""" [^"\\]* (?:
-			(?: \\. | "(?!"") )
-			[^"\\]*
-		    )*
+                        (?: \\. | "(?!"") )
+                        [^"\\]*
+                    )*
        \"""
 
     |   ''' [^'\\]* (?:
-			(?: \\. | '(?!'') )
-			[^'\\]*
-		    )*
-	'''
+                        (?: \\. | '(?!'') )
+                        [^'\\]*
+                    )*
+        '''
     )
 
 |   (?P<Method>
-	^
-	(?P<MethodIndent> [ \t]* )
-	def [ \t]+
-	(?P<MethodName> [a-zA-Z_] \w* )
-	[ \t]* \(
+        ^
+        (?P<MethodIndent> [ \t]* )
+        def [ \t]+
+        (?P<MethodName> [a-zA-Z_] \w* )
+        [ \t]* \(
     )
 
 |   (?P<Class>
-	^
-	(?P<ClassIndent> [ \t]* )
-	class [ \t]+
-	(?P<ClassName> [a-zA-Z_] \w* )
-	[ \t]*
-	(?P<ClassSupers> \( [^)\n]* \) )?
-	[ \t]* :
+        ^
+        (?P<ClassIndent> [ \t]* )
+        class [ \t]+
+        (?P<ClassName> [a-zA-Z_] \w* )
+        [ \t]*
+        (?P<ClassSupers> \( [^)\n]* \) )?
+        [ \t]* :
     )
 
 |   (?P<Import>
-	^ import [ \t]+
-	(?P<ImportList> [^#;\n]+ )
+        ^ import [ \t]+
+        (?P<ImportList> [^#;\n]+ )
     )
 
 |   (?P<ImportFrom>
-	^ from [ \t]+
-	(?P<ImportFromPath>
-	    [a-zA-Z_] \w*
-	    (?:
-		[ \t]* \. [ \t]* [a-zA-Z_] \w*
-	    )*
-	)
-	[ \t]+
-	import [ \t]+
-	(?P<ImportFromList> [^#;\n]+ )
+        ^ from [ \t]+
+        (?P<ImportFromPath>
+            [a-zA-Z_] \w*
+            (?:
+                [ \t]* \. [ \t]* [a-zA-Z_] \w*
+            )*
+        )
+        [ \t]+
+        import [ \t]+
+        (?P<ImportFromList> [^#;\n]+ )
     )
 """, re.VERBOSE | re.DOTALL | re.MULTILINE).search
 
@@ -117,220 +117,220 @@
 
 # each Python class is represented by an instance of this class
 class Class:
-	'''Class to represent a Python class.'''
-	def __init__(self, module, name, super, file, lineno):
-		self.module = module
-		self.name = name
-		if super is None:
-			super = []
-		self.super = super
-		self.methods = {}
-		self.file = file
-		self.lineno = lineno
+    '''Class to represent a Python class.'''
+    def __init__(self, module, name, super, file, lineno):
+        self.module = module
+        self.name = name
+        if super is None:
+            super = []
+        self.super = super
+        self.methods = {}
+        self.file = file
+        self.lineno = lineno
 
-	def _addmethod(self, name, lineno):
-		self.methods[name] = lineno
+    def _addmethod(self, name, lineno):
+        self.methods[name] = lineno
 
 class Function(Class):
-	'''Class to represent a top-level Python function'''
-	def __init__(self, module, name, file, lineno):
-		Class.__init__(self, module, name, None, file, lineno)
-	def _addmethod(self, name, lineno):
-		assert 0, "Function._addmethod() shouldn't be called"
+    '''Class to represent a top-level Python function'''
+    def __init__(self, module, name, file, lineno):
+        Class.__init__(self, module, name, None, file, lineno)
+    def _addmethod(self, name, lineno):
+        assert 0, "Function._addmethod() shouldn't be called"
 
 def readmodule(module, path=[], inpackage=0):
-	'''Backwards compatible interface.
+    '''Backwards compatible interface.
 
-	Like readmodule_ex() but strips Function objects from the
-	resulting dictionary.'''
+    Like readmodule_ex() but strips Function objects from the
+    resulting dictionary.'''
 
-	dict = readmodule_ex(module, path, inpackage)
-	res = {}
-	for key, value in dict.items():
-		if not isinstance(value, Function):
-			res[key] = value
-	return res
+    dict = readmodule_ex(module, path, inpackage)
+    res = {}
+    for key, value in dict.items():
+        if not isinstance(value, Function):
+            res[key] = value
+    return res
 
 def readmodule_ex(module, path=[], inpackage=0):
-	'''Read a module file and return a dictionary of classes.
+    '''Read a module file and return a dictionary of classes.
 
-	Search for MODULE in PATH and sys.path, read and parse the
-	module and return a dictionary with one entry for each class
-	found in the module.'''
+    Search for MODULE in PATH and sys.path, read and parse the
+    module and return a dictionary with one entry for each class
+    found in the module.'''
 
-	dict = {}
+    dict = {}
 
-	i = string.rfind(module, '.')
-	if i >= 0:
-		# Dotted module name
-		package = string.strip(module[:i])
-		submodule = string.strip(module[i+1:])
-		parent = readmodule(package, path, inpackage)
-		child = readmodule(submodule, parent['__path__'], 1)
-		return child
+    i = string.rfind(module, '.')
+    if i >= 0:
+        # Dotted module name
+        package = string.strip(module[:i])
+        submodule = string.strip(module[i+1:])
+        parent = readmodule(package, path, inpackage)
+        child = readmodule(submodule, parent['__path__'], 1)
+        return child
 
-	if _modules.has_key(module):
-		# we've seen this module before...
-		return _modules[module]
-	if module in sys.builtin_module_names:
-		# this is a built-in module
-		_modules[module] = dict
-		return dict
+    if _modules.has_key(module):
+        # we've seen this module before...
+        return _modules[module]
+    if module in sys.builtin_module_names:
+        # this is a built-in module
+        _modules[module] = dict
+        return dict
 
-	# search the path for the module
-	f = None
-	if inpackage:
-		try:
-			f, file, (suff, mode, type) = \
-				imp.find_module(module, path)
-		except ImportError:
-			f = None
-	if f is None:
-		fullpath = list(path) + sys.path
-		f, file, (suff, mode, type) = imp.find_module(module, fullpath)
-	if type == imp.PKG_DIRECTORY:
-		dict['__path__'] = [file]
-		_modules[module] = dict
-		path = [file] + path
-		f, file, (suff, mode, type) = \
-				imp.find_module('__init__', [file])
-	if type != imp.PY_SOURCE:
-		# not Python source, can't do anything with this module
-		f.close()
-		_modules[module] = dict
-		return dict
+    # search the path for the module
+    f = None
+    if inpackage:
+        try:
+            f, file, (suff, mode, type) = \
+                    imp.find_module(module, path)
+        except ImportError:
+            f = None
+    if f is None:
+        fullpath = list(path) + sys.path
+        f, file, (suff, mode, type) = imp.find_module(module, fullpath)
+    if type == imp.PKG_DIRECTORY:
+        dict['__path__'] = [file]
+        _modules[module] = dict
+        path = [file] + path
+        f, file, (suff, mode, type) = \
+                        imp.find_module('__init__', [file])
+    if type != imp.PY_SOURCE:
+        # not Python source, can't do anything with this module
+        f.close()
+        _modules[module] = dict
+        return dict
 
-	_modules[module] = dict
-	imports = []
-	classstack = []	# stack of (class, indent) pairs
-	src = f.read()
-	f.close()
+    _modules[module] = dict
+    imports = []
+    classstack = [] # stack of (class, indent) pairs
+    src = f.read()
+    f.close()
 
-	# To avoid having to stop the regexp at each newline, instead
-	# when we need a line number we simply string.count the number of
-	# newlines in the string since the last time we did this; i.e.,
-	#    lineno = lineno + \
-	#             string.count(src, '\n', last_lineno_pos, here)
-	#    last_lineno_pos = here
-	countnl = string.count
-	lineno, last_lineno_pos = 1, 0
-	i = 0
-	while 1:
-		m = _getnext(src, i)
-		if not m:
-			break
-		start, i = m.span()
+    # To avoid having to stop the regexp at each newline, instead
+    # when we need a line number we simply string.count the number of
+    # newlines in the string since the last time we did this; i.e.,
+    #    lineno = lineno + \
+    #             string.count(src, '\n', last_lineno_pos, here)
+    #    last_lineno_pos = here
+    countnl = string.count
+    lineno, last_lineno_pos = 1, 0
+    i = 0
+    while 1:
+        m = _getnext(src, i)
+        if not m:
+            break
+        start, i = m.span()
 
-		if m.start("Method") >= 0:
-			# found a method definition or function
-			thisindent = _indent(m.group("MethodIndent"))
-			meth_name = m.group("MethodName")
-			lineno = lineno + \
-				 countnl(src, '\n',
-					 last_lineno_pos, start)
-			last_lineno_pos = start
-			# close all classes indented at least as much
-			while classstack and \
-			      classstack[-1][1] >= thisindent:
-				del classstack[-1]
-			if classstack:
-				# it's a class method
-				cur_class = classstack[-1][0]
-				cur_class._addmethod(meth_name, lineno)
-			else:
-				# it's a function
-				f = Function(module, meth_name,
-					     file, lineno)
-				dict[meth_name] = f
+        if m.start("Method") >= 0:
+            # found a method definition or function
+            thisindent = _indent(m.group("MethodIndent"))
+            meth_name = m.group("MethodName")
+            lineno = lineno + \
+                     countnl(src, '\n',
+                             last_lineno_pos, start)
+            last_lineno_pos = start
+            # close all classes indented at least as much
+            while classstack and \
+                  classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            if classstack:
+                # it's a class method
+                cur_class = classstack[-1][0]
+                cur_class._addmethod(meth_name, lineno)
+            else:
+                # it's a function
+                f = Function(module, meth_name,
+                             file, lineno)
+                dict[meth_name] = f
 
-		elif m.start("String") >= 0:
-			pass
+        elif m.start("String") >= 0:
+            pass
 
-		elif m.start("Class") >= 0:
-			# we found a class definition
-			thisindent = _indent(m.group("ClassIndent"))
-			# close all classes indented at least as much
-			while classstack and \
-			      classstack[-1][1] >= thisindent:
-				del classstack[-1]
-			lineno = lineno + \
-				 countnl(src, '\n', last_lineno_pos, start)
-			last_lineno_pos = start
-			class_name = m.group("ClassName")
-			inherit = m.group("ClassSupers")
-			if inherit:
-				# the class inherits from other classes
-				inherit = string.strip(inherit[1:-1])
-				names = []
-				for n in string.splitfields(inherit, ','):
-					n = string.strip(n)
-					if dict.has_key(n):
-						# we know this super class
-						n = dict[n]
-					else:
-						c = string.splitfields(n, '.')
-						if len(c) > 1:
-							# super class
-							# is of the
-							# form module.class:
-							# look in
-							# module for class
-							m = c[-2]
-							c = c[-1]
-							if _modules.has_key(m):
-								d = _modules[m]
-								if d.has_key(c):
-									n = d[c]
-					names.append(n)
-				inherit = names
-			# remember this class
-			cur_class = Class(module, class_name, inherit,
-					  file, lineno)
-			dict[class_name] = cur_class
-			classstack.append((cur_class, thisindent))
+        elif m.start("Class") >= 0:
+            # we found a class definition
+            thisindent = _indent(m.group("ClassIndent"))
+            # close all classes indented at least as much
+            while classstack and \
+                  classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            lineno = lineno + \
+                     countnl(src, '\n', last_lineno_pos, start)
+            last_lineno_pos = start
+            class_name = m.group("ClassName")
+            inherit = m.group("ClassSupers")
+            if inherit:
+                # the class inherits from other classes
+                inherit = string.strip(inherit[1:-1])
+                names = []
+                for n in string.splitfields(inherit, ','):
+                    n = string.strip(n)
+                    if dict.has_key(n):
+                        # we know this super class
+                        n = dict[n]
+                    else:
+                        c = string.splitfields(n, '.')
+                        if len(c) > 1:
+                            # super class
+                            # is of the
+                            # form module.class:
+                            # look in
+                            # module for class
+                            m = c[-2]
+                            c = c[-1]
+                            if _modules.has_key(m):
+                                d = _modules[m]
+                                if d.has_key(c):
+                                    n = d[c]
+                    names.append(n)
+                inherit = names
+            # remember this class
+            cur_class = Class(module, class_name, inherit,
+                              file, lineno)
+            dict[class_name] = cur_class
+            classstack.append((cur_class, thisindent))
 
-		elif m.start("Import") >= 0:
-			# import module
-			for n in string.split(m.group("ImportList"), ','):
-				n = string.strip(n)
-				try:
-					# recursively read the imported module
-					d = readmodule(n, path, inpackage)
-				except:
-					##print 'module', n, 'not found'
-					pass
+        elif m.start("Import") >= 0:
+            # import module
+            for n in string.split(m.group("ImportList"), ','):
+                n = string.strip(n)
+                try:
+                    # recursively read the imported module
+                    d = readmodule(n, path, inpackage)
+                except:
+                    ##print 'module', n, 'not found'
+                    pass
 
-		elif m.start("ImportFrom") >= 0:
-			# from module import stuff
-			mod = m.group("ImportFromPath")
-			names = string.split(m.group("ImportFromList"), ',')
-			try:
-				# recursively read the imported module
-				d = readmodule(mod, path, inpackage)
-			except:
-				##print 'module', mod, 'not found'
-				continue
-			# add any classes that were defined in the
-			# imported module to our name space if they
-			# were mentioned in the list
-			for n in names:
-				n = string.strip(n)
-				if d.has_key(n):
-					dict[n] = d[n]
-				elif n == '*':
-					# only add a name if not
-					# already there (to mimic what
-					# Python does internally)
-					# also don't add names that
-					# start with _
-					for n in d.keys():
-						if n[0] != '_' and \
-						   not dict.has_key(n):
-							dict[n] = d[n]
-		else:
-			assert 0, "regexp _getnext found something unexpected"
+        elif m.start("ImportFrom") >= 0:
+            # from module import stuff
+            mod = m.group("ImportFromPath")
+            names = string.split(m.group("ImportFromList"), ',')
+            try:
+                # recursively read the imported module
+                d = readmodule(mod, path, inpackage)
+            except:
+                ##print 'module', mod, 'not found'
+                continue
+            # add any classes that were defined in the
+            # imported module to our name space if they
+            # were mentioned in the list
+            for n in names:
+                n = string.strip(n)
+                if d.has_key(n):
+                    dict[n] = d[n]
+                elif n == '*':
+                    # only add a name if not
+                    # already there (to mimic what
+                    # Python does internally)
+                    # also don't add names that
+                    # start with _
+                    for n in d.keys():
+                        if n[0] != '_' and \
+                           not dict.has_key(n):
+                            dict[n] = d[n]
+        else:
+            assert 0, "regexp _getnext found something unexpected"
 
-	return dict
+    return dict
 
 def _indent(ws, _expandtabs=string.expandtabs):
-	return len(_expandtabs(ws, TABWIDTH))
+    return len(_expandtabs(ws, TABWIDTH))
diff --git a/Lib/quopri.py b/Lib/quopri.py
index 80fc6f9..5bb11f6 100755
--- a/Lib/quopri.py
+++ b/Lib/quopri.py
@@ -26,7 +26,7 @@
 
     'input' and 'output' are files with readline() and write() methods.
     The 'quotetabs' flag indicates whether tabs should be quoted.
-	"""
+        """
     while 1:
         line = input.readline()
         if not line: