docs: def _put_data(self, sd, ase, offsets, data):
          # type: (SyncCopy, blobxfer.models.synccopy.Descriptor,
          #        blobxfer.models.azure.StorageEntity,
          #        blobxfer.models.upload.Offsets, bytes) -> None
          """Put data in Azure
          :param SyncCopy self: this
          :param blobxfer.models.synccopy.Descriptor sd: synccopy descriptor
          :param blobxfer.models.azure.StorageEntity ase: Storage entity
          :param blobxfer.models.upload.Offsets offsets: offsets
          :param bytes data: data to upload
          """
          if ase.mode == blobxfer.models.azure.StorageModes.Append:
              # append block
              if data is not None:
                  blobxfer.operations.azure.blob.append.append_block(ase, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.Block:
              # handle one-shot uploads
              if sd.is_one_shot_block_blob:
                  if blobxfer.util.is_not_empty(sd.src_entity.md5):
                      digest = sd.src_entity.md5
                  else:
                      digest = None
                  blobxfer.operations.azure.blob.block.create_blob(
                      ase, data, digest, sd.src_entity.raw_metadata)
                  return
              # upload block
              if data is not None:
                  blobxfer.operations.azure.blob.block.put_block(
                      ase, offsets, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.File:
              # upload range
              if data is not None:
                  blobxfer.operations.azure.file.put_file_range(
                      ase, offsets, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.Page:
              if data is not None:
                  # compute aligned size
                  aligned = blobxfer.util.page_align_content_length(
                      offsets.num_bytes)
                  # align page
                  if aligned != offsets.num_bytes:
                      data = data.ljust(aligned, b'\0')
                  if blobxfer.operations.md5.check_data_is_empty(data):
                      return
                  # upload page
                  blobxfer.operations.azure.blob.page.put_page(
                      ase, offsets.range_start,
                      offsets.range_start + aligned - 1, data)