code: def read_map(fo, writer_schema, reader_schema=None):
      
      if reader_schema:
          def item_reader(fo, w_schema, r_schema):
              return read_data(fo, w_schema['values'], r_schema['values'])
      else:
          def item_reader(fo, w_schema, _):
              return read_data(fo, w_schema['values'])
  
      read_items = {}
      block_count = read_long(fo)
      while block_count != 0:
          if block_count < 0:
              block_count = -block_count
              # Read block size, unused
              read_long(fo)
  
          for i in xrange(block_count):
              key = read_utf8(fo)
              read_items[key] = item_reader(fo, writer_schema, reader_schema)
          block_count = read_long(fo)
  
      return read_items
docs: Maps are encoded as a series of blocks.
  
      Each block consists of a long count value, followed by that many key/value
      pairs.  A block with count zero indicates the end of the map.  Each item is
      encoded per the map's value schema.
  
      If a block's count is negative, then the count is followed immediately by a
      long block size, indicating the number of bytes in the block.  The actual
      count in this case is the absolute value of the count written.