docs: def target_signature(self):
          '''Return file signature'''
          if self.exists():
              if not self._md5:
                  self._md5 = fileMD5(self)
              return (os.path.getmtime(self), os.path.getsize(self), self._md5)
          elif (self + '.zapped').is_file():
              with open(self + '.zapped') as sig:
                  line = sig.readline()
                  _, mtime, size, md5 = line.strip().rsplit('\t', 3)
                  self._md5 = md5
                  return (float(mtime), int(size), md5)
          else:
              raise ValueError(f'{self} does not exist.')