diff --git a/Lib/repr.py b/Lib/repr.py
index 0827428..b47ac2a 100644
--- a/Lib/repr.py
+++ b/Lib/repr.py
@@ -3,93 +3,93 @@
 import string
 
 class Repr:
-	def __init__(self):
-		self.maxlevel = 6
-		self.maxtuple = 6
-		self.maxlist = 6
-		self.maxdict = 4
-		self.maxstring = 30
-		self.maxlong = 40
-		self.maxother = 20
-	def repr(self, x):
-		return self.repr1(x, self.maxlevel)
-	def repr1(self, x, level):
-		typename = `type(x)`[7:-2] # "<type '......'>"
-		if ' ' in typename:
-			parts = string.split(typename)
-			typename = string.joinfields(parts, '_')
-		if hasattr(self, 'repr_' + typename):
-			return getattr(self, 'repr_' + typename)(x, level)
-		else:
-			s = `x`
-			if len(s) > self.maxother:
-				i = max(0, (self.maxother-3)/2)
-				j = max(0, self.maxother-3-i)
-				s = s[:i] + '...' + s[len(s)-j:]
-			return s
-	def repr_tuple(self, x, level):
-		n = len(x)
-		if n == 0: return '()'
-		if level <= 0: return '(...)'
-		s = ''
-		for i in range(min(n, self.maxtuple)):
-			if s: s = s + ', '
-			s = s + self.repr1(x[i], level-1)
-		if n > self.maxtuple: s = s + ', ...'
-		elif n == 1: s = s + ','
-		return '(' + s + ')'
-	def repr_list(self, x, level):
-		n = len(x)
-		if n == 0: return '[]'
-		if level <= 0: return '[...]'
-		s = ''
-		for i in range(min(n, self.maxlist)):
-			if s: s = s + ', '
-			s = s + self.repr1(x[i], level-1)
-		if n > self.maxlist: s = s + ', ...'
-		return '[' + s + ']'
-	def repr_dictionary(self, x, level):
-		n = len(x)
-		if n == 0: return '{}'
-		if level <= 0: return '{...}'
-		s = ''
-		keys = x.keys()
-		keys.sort()
-		for i in range(min(n, self.maxdict)):
-			if s: s = s + ', '
-			key = keys[i]
-			s = s + self.repr1(key, level-1)
-			s = s + ': ' + self.repr1(x[key], level-1)
-		if n > self.maxdict: s = s + ', ...'
-		return '{' + s + '}'
-	def repr_string(self, x, level):
-		s = `x[:self.maxstring]`
-		if len(s) > self.maxstring:
-			i = max(0, (self.maxstring-3)/2)
-			j = max(0, self.maxstring-3-i)
-			s = `x[:i] + x[len(x)-j:]`
-			s = s[:i] + '...' + s[len(s)-j:]
-		return s
-	def repr_long_int(self, x, level):
-		s = `x` # XXX Hope this isn't too slow...
-		if len(s) > self.maxlong:
-			i = max(0, (self.maxlong-3)/2)
-			j = max(0, self.maxlong-3-i)
-			s = s[:i] + '...' + s[len(s)-j:]
-		return s
-	def repr_instance(self, x, level):
-		try:
-			s = `x`
-			# Bugs in x.__repr__() can cause arbitrary
-			# exceptions -- then make up something
-		except:
-			return '<' + x.__class__.__name__ + ' instance at ' + \
-				  hex(id(x))[2:] + '>'
-		if len(s) > self.maxstring:
-			i = max(0, (self.maxstring-3)/2)
-			j = max(0, self.maxstring-3-i)
-			s = s[:i] + '...' + s[len(s)-j:]
-		return s
+    def __init__(self):
+        self.maxlevel = 6
+        self.maxtuple = 6
+        self.maxlist = 6
+        self.maxdict = 4
+        self.maxstring = 30
+        self.maxlong = 40
+        self.maxother = 20
+    def repr(self, x):
+        return self.repr1(x, self.maxlevel)
+    def repr1(self, x, level):
+        typename = `type(x)`[7:-2] # "<type '......'>"
+        if ' ' in typename:
+            parts = string.split(typename)
+            typename = string.joinfields(parts, '_')
+        if hasattr(self, 'repr_' + typename):
+            return getattr(self, 'repr_' + typename)(x, level)
+        else:
+            s = `x`
+            if len(s) > self.maxother:
+                i = max(0, (self.maxother-3)/2)
+                j = max(0, self.maxother-3-i)
+                s = s[:i] + '...' + s[len(s)-j:]
+            return s
+    def repr_tuple(self, x, level):
+        n = len(x)
+        if n == 0: return '()'
+        if level <= 0: return '(...)'
+        s = ''
+        for i in range(min(n, self.maxtuple)):
+            if s: s = s + ', '
+            s = s + self.repr1(x[i], level-1)
+        if n > self.maxtuple: s = s + ', ...'
+        elif n == 1: s = s + ','
+        return '(' + s + ')'
+    def repr_list(self, x, level):
+        n = len(x)
+        if n == 0: return '[]'
+        if level <= 0: return '[...]'
+        s = ''
+        for i in range(min(n, self.maxlist)):
+            if s: s = s + ', '
+            s = s + self.repr1(x[i], level-1)
+        if n > self.maxlist: s = s + ', ...'
+        return '[' + s + ']'
+    def repr_dictionary(self, x, level):
+        n = len(x)
+        if n == 0: return '{}'
+        if level <= 0: return '{...}'
+        s = ''
+        keys = x.keys()
+        keys.sort()
+        for i in range(min(n, self.maxdict)):
+            if s: s = s + ', '
+            key = keys[i]
+            s = s + self.repr1(key, level-1)
+            s = s + ': ' + self.repr1(x[key], level-1)
+        if n > self.maxdict: s = s + ', ...'
+        return '{' + s + '}'
+    def repr_string(self, x, level):
+        s = `x[:self.maxstring]`
+        if len(s) > self.maxstring:
+            i = max(0, (self.maxstring-3)/2)
+            j = max(0, self.maxstring-3-i)
+            s = `x[:i] + x[len(x)-j:]`
+            s = s[:i] + '...' + s[len(s)-j:]
+        return s
+    def repr_long_int(self, x, level):
+        s = `x` # XXX Hope this isn't too slow...
+        if len(s) > self.maxlong:
+            i = max(0, (self.maxlong-3)/2)
+            j = max(0, self.maxlong-3-i)
+            s = s[:i] + '...' + s[len(s)-j:]
+        return s
+    def repr_instance(self, x, level):
+        try:
+            s = `x`
+            # Bugs in x.__repr__() can cause arbitrary
+            # exceptions -- then make up something
+        except:
+            return '<' + x.__class__.__name__ + ' instance at ' + \
+                      hex(id(x))[2:] + '>'
+        if len(s) > self.maxstring:
+            i = max(0, (self.maxstring-3)/2)
+            j = max(0, self.maxstring-3-i)
+            s = s[:i] + '...' + s[len(s)-j:]
+        return s
 
 aRepr = Repr()
 repr = aRepr.repr
