              if self._counts["update"] != 0:
                  self._alignments.backup()
                  self._alignments.save()
              if self._input_is_faces:
                  self._faces_saver.close()
  
          self._extractor_input_thread.join()
          if self._saver is not None:
              self._saver.close()
  
 
</s> remove     def _save(self, frame, idx, detected_face):
 </s> add     def _save(self, frame: str, idx: int, detected_face: DetectedFace) -> None: </s> remove     def _input_frames(self, *args):
 </s> add     def _input_frames(self, *args: Union[tuple, Tuple["EventQueue"]]) -> None: </s> remove                             source=extractor_output.mask_tool_face_info)
 </s> add                             source=extractor_output.frame_metadata) </s> remove     def _update_frames(self, extractor_output):
 </s> add     def _update_frames(self, extractor_output: ExtractMedia) -> None:
                assert self._faces_saver is not None
              if self._counts["update"] != 0:
                  self._alignments.backup()
                  self._alignments.save()
              if self._input_is_faces:
                assert self._faces_saver is not None
                  self._faces_saver.close()
  
          self._extractor_input_thread.join()
          if self._saver is not None:
              self._saver.close()
  
keep keep keep add keep keep keep keep keep keep
 Minor updates and fixups
  - Mask Tool - Typing + BiSeNet mask update fix
  - Alignments Tool - Auto search for alignments file 
tools/mask/mask.py