diff --git a/Lib/shelve.py b/Lib/shelve.py
index a068536..952df16 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -31,127 +31,127 @@
 # Try using cPickle and cStringIO if available.
 
 try:
-        from cPickle import Pickler, Unpickler
+    from cPickle import Pickler, Unpickler
 except ImportError:
-        from pickle import Pickler, Unpickler
+    from pickle import Pickler, Unpickler
 
 try:
-        from cStringIO import StringIO
+    from cStringIO import StringIO
 except ImportError:
-        from StringIO import StringIO
+    from StringIO import StringIO
 
 
 class Shelf:
-        """Base class for shelf implementations.
+    """Base class for shelf implementations.
 
-        This is initialized with a dictionary-like object.
-        See the module's __doc__ string for an overview of the interface.
-        """
+    This is initialized with a dictionary-like object.
+    See the module's __doc__ string for an overview of the interface.
+    """
 
-        def __init__(self, dict):
-                self.dict = dict
-        
-        def keys(self):
-                return self.dict.keys()
-        
-        def __len__(self):
-                return len(self.dict)
-        
-        def has_key(self, key):
-                return self.dict.has_key(key)
+    def __init__(self, dict):
+        self.dict = dict
 
-        def get(self, key, default=None):
-                if self.dict.has_key(key):
-                        return self[key]
-                return default
-        
-        def __getitem__(self, key):
-                f = StringIO(self.dict[key])
-                return Unpickler(f).load()
-        
-        def __setitem__(self, key, value):
-                f = StringIO()
-                p = Pickler(f)
-                p.dump(value)
-                self.dict[key] = f.getvalue()
-        
-        def __delitem__(self, key):
-                del self.dict[key]
-        
-        def close(self):
-                try:
-                        self.dict.close()
-                except:
-                        pass
-                self.dict = 0
+    def keys(self):
+        return self.dict.keys()
 
-        def __del__(self):
-                self.close()
+    def __len__(self):
+        return len(self.dict)
 
-        def sync(self):
-                if hasattr(self.dict, 'sync'):
-                        self.dict.sync()
-            
+    def has_key(self, key):
+        return self.dict.has_key(key)
+
+    def get(self, key, default=None):
+        if self.dict.has_key(key):
+            return self[key]
+        return default
+
+    def __getitem__(self, key):
+        f = StringIO(self.dict[key])
+        return Unpickler(f).load()
+
+    def __setitem__(self, key, value):
+        f = StringIO()
+        p = Pickler(f)
+        p.dump(value)
+        self.dict[key] = f.getvalue()
+
+    def __delitem__(self, key):
+        del self.dict[key]
+
+    def close(self):
+        try:
+            self.dict.close()
+        except:
+            pass
+        self.dict = 0
+
+    def __del__(self):
+        self.close()
+
+    def sync(self):
+        if hasattr(self.dict, 'sync'):
+            self.dict.sync()
+
 
 class BsdDbShelf(Shelf):
-        """Shelf implementation using the "BSD" db interface.
+    """Shelf implementation using the "BSD" db interface.
 
-        This adds methods first(), next(), previous(), last() and
-        set_location() that have no counterpart in [g]dbm databases.
+    This adds methods first(), next(), previous(), last() and
+    set_location() that have no counterpart in [g]dbm databases.
 
-        The actual database must be opened using one of the "bsddb"
-        modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
-        bsddb.rnopen) and passed to the constructor.
+    The actual database must be opened using one of the "bsddb"
+    modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
+    bsddb.rnopen) and passed to the constructor.
 
-        See the module's __doc__ string for an overview of the interface.
-        """
+    See the module's __doc__ string for an overview of the interface.
+    """
 
-        def __init__(self, dict):
-            Shelf.__init__(self, dict)
+    def __init__(self, dict):
+        Shelf.__init__(self, dict)
 
-        def set_location(self, key):
-             (key, value) = self.dict.set_location(key)
-             f = StringIO(value)
-             return (key, Unpickler(f).load())
+    def set_location(self, key):
+        (key, value) = self.dict.set_location(key)
+        f = StringIO(value)
+        return (key, Unpickler(f).load())
 
-        def next(self):
-             (key, value) = self.dict.next()
-             f = StringIO(value)
-             return (key, Unpickler(f).load())
+    def next(self):
+        (key, value) = self.dict.next()
+        f = StringIO(value)
+        return (key, Unpickler(f).load())
 
-        def previous(self):
-             (key, value) = self.dict.previous()
-             f = StringIO(value)
-             return (key, Unpickler(f).load())
+    def previous(self):
+        (key, value) = self.dict.previous()
+        f = StringIO(value)
+        return (key, Unpickler(f).load())
 
-        def first(self):
-             (key, value) = self.dict.first()
-             f = StringIO(value)
-             return (key, Unpickler(f).load())
+    def first(self):
+        (key, value) = self.dict.first()
+        f = StringIO(value)
+        return (key, Unpickler(f).load())
 
-        def last(self):
-             (key, value) = self.dict.last()
-             f = StringIO(value)
-             return (key, Unpickler(f).load())
+    def last(self):
+        (key, value) = self.dict.last()
+        f = StringIO(value)
+        return (key, Unpickler(f).load())
 
 
 class DbfilenameShelf(Shelf):
-        """Shelf implementation using the "anydbm" generic dbm interface.
+    """Shelf implementation using the "anydbm" generic dbm interface.
 
-        This is initialized with the filename for the dbm database.
-        See the module's __doc__ string for an overview of the interface.
-        """
-        
-        def __init__(self, filename, flag='c'):
-                import anydbm
-                Shelf.__init__(self, anydbm.open(filename, flag))
+    This is initialized with the filename for the dbm database.
+    See the module's __doc__ string for an overview of the interface.
+    """
+
+    def __init__(self, filename, flag='c'):
+        import anydbm
+        Shelf.__init__(self, anydbm.open(filename, flag))
 
 
 def open(filename, flag='c'):
-        """Open a persistent dictionary for reading and writing.
+    """Open a persistent dictionary for reading and writing.
 
-        Argument is the filename for the dbm database.
-        See the module's __doc__ string for an overview of the interface.
-        """
-        
-        return DbfilenameShelf(filename, flag)
+    Argument is the filename for the dbm database.
+    See the module's __doc__ string for an overview of the interface.
+    """
+
+    return DbfilenameShelf(filename, flag)
