          """ The entry point for the Alignments tool from :mod:`lib.tools.alignments.cli`.
  
          Launches the selected alignments job.
          """
          if self.args.job in ("missing-alignments", "missing-frames",
                               "multi-faces", "leftover-faces", "no-faces"):
              job = Check
          else:
              job = globals()[self.args.job.title().replace("-", "")]
          job = job(self.alignments, self.args)
          logger.debug(job)
 
</s> remove     def _load_alignments(self):
        """ Loads the given alignments file(s) prior to running the selected job.

        Returns
        -------
        :class:`~tools.alignments.media.AlignmentData` or list
            The alignments data formatted for use by the alignments tool. If multiple alignments
            files have been selected, then this will be a list of
            :class:`~tools.alignments.media.AlignmentData` objects
        """
        logger.debug("Loading alignments")
        if len(self.args.alignments_file) > 1 and self.args.job != "merge":
            logger.error("Multiple alignments files are only permitted for merging")
            sys.exit(0)
        if len(self.args.alignments_file) == 1 and self.args.job == "merge":
            logger.error("More than one alignments file required for merging")
            sys.exit(0)

        if len(self.args.alignments_file) == 1:
            retval = AlignmentData(self.args.alignments_file[0])
        else:
            retval = [AlignmentData(a_file) for a_file in self.args.alignments_file]
        logger.debug("Alignments: %s", retval)
        return retval

 </s> add  </s> remove         logger.info("[CHECK %s]", self.type.upper())
        items_output = self.compile_output()
        self.output_results(items_output)
 </s> add         logger.info("[CHECK %s]", self._type.upper())
        items_output = self._compile_output()
        self._output_results(items_output) </s> remove     def validate(self):
 </s> add     def _validate(self): </s> remove         if self.job == "missing-frames" and self.output == "move":
 </s> add         if self._job == "missing-frames" and self._output == "move": </s> remove     """ Sort alignments' index by the order they appear in an image """
 </s> add     """ Sort alignments' index by the order they appear in an image in left to right order.

    Parameters
    ----------
    alignments: :class:`tools.lib_alignments.media.AlignmentData`
        The alignments data loaded from an alignments file for this rename job
    arguments: :class:`argparse.Namespace`
        The :mod:`argparse` arguments as passed in from :mod:`tools.py`
    """
        if self.args.job in ("missing-alignments", "missing-frames", "multi-faces", "no-faces"):
          """ The entry point for the Alignments tool from :mod:`lib.tools.alignments.cli`.
  
          Launches the selected alignments job.
          """
        if self.args.job in ("missing-alignments", "missing-frames", "multi-faces", "no-faces"):
        if self.args.job in ("missing-alignments", "missing-frames", "multi-faces", "no-faces"):
              job = Check
          else:
              job = globals()[self.args.job.title().replace("-", "")]
          job = job(self.alignments, self.args)
          logger.debug(job)
keep keep keep keep replace replace keep keep keep keep keep
 Update extracted faces to use PNG EXIF data (#1123)

Documentation
  - Update Usage.md, align.rst and image.rst
lib.image.py
  - read_image - Remove hash return, add metadata return
  - Remove read_image_hash functions
  - Add read_image_meta functios
  - Replace encode_image_with_hash with encode_image (to store metadata)
  - Add png meta reading and writing functions
  - Update Image Loaders/Savers to handle metadata rather than hashes
lib.training_data
  - Naming updates to remove references to hashes
lib.align.Alignments
  - Add versioning notes
  - Increment alignments version to 2.1
  - Deprecate hashing lookup functions
  - Replace filter_hashes with filter_faces
lib.align.detected_face
  - DetectedFace
    - Remove hash property
    - Add png header data serializing/deserializing functions
  - Mask
    - Add png header data serializing/deserializing functions
  - add update_legacy_png_header function to update png meta data
lib.cli.args - Deprecate alignments files for training
- plugins.train.trainer
  - Update alignments/mask code to read png header data
- scripts.convert
  - Aligned images folder - read data from png headers
- scripts.extract
  - Write png header information and no longer store hash of face
- tools.alignments
  - remove leftover-faces, merge and update-hashes jobs
  - Update jobs to use png meta data rather than hashes
- tools.manual
  - Update extract code to output png meta data and don't store hashes
  - Perform check on launch that tool is not pointing at a faces folder
tools.mask
  - Update to use png meta data
tools.sort
  - Update to use png meta data 
tools/alignments/alignments.py