code: def slim_frame_data(frames, frame_allowance=25):
      
      frames_len = 0
      app_frames = []
      system_frames = []
      for frame in frames:
          frames_len += 1
          if frame.get('in_app'):
              app_frames.append(frame)
          else:
              system_frames.append(frame)
  
      if frames_len <= frame_allowance:
          return frames
  
      remaining = frames_len - frame_allowance
      app_count = len(app_frames)
      system_allowance = max(frame_allowance - app_count, 0)
      if system_allowance:
          half_max = int(system_allowance / 2)
          # prioritize trimming system frames
          for frame in system_frames[half_max:-half_max]:
              frame.pop('vars', None)
              frame.pop('pre_context', None)
              frame.pop('post_context', None)
              remaining -= 1
  
      else:
          for frame in system_frames:
              frame.pop('vars', None)
              frame.pop('pre_context', None)
              frame.pop('post_context', None)
              remaining -= 1
  
      if remaining:
          app_allowance = app_count - remaining
          half_max = int(app_allowance / 2)
  
          for frame in app_frames[half_max:-half_max]:
              frame.pop('vars', None)
              frame.pop('pre_context', None)
              frame.pop('post_context', None)
  
      return frames
docs: Removes various excess metadata from middle frames which go beyond
      ``frame_allowance``.
  
      Returns ``frames``.