code: def perform(self):
          
  
          if self._file_size < self._SINGLE_UPLOAD_MAX:
              resource = "{0}{1}".format(self._DEFAULT_RESOURCE, self.bucket)
              response = self.__upload(resource, open(self._file_path, 'rb').read())
              return response.headers['location']
          else:
              response = self.__init_chunked_upload()
              min_chunk_size = int(response.headers['x-ton-min-chunk-size'])
              chunk_size = min_chunk_size * self._DEFAULT_CHUNK_SIZE
              location = response.headers['location']
  
              f = open(self._file_path, 'rb')
              bytes_read = 0
              while True:
                  bytes = f.read(chunk_size)
                  if not bytes:
                      break
                  bytes_start = bytes_read
                  bytes_read += len(bytes)
                  response = self.__upload_chunk(location, chunk_size, bytes, bytes_start, bytes_read)
                  response_time = int(response.headers['x-response-time'])
                  chunk_size = min_chunk_size * size(self._DEFAULT_CHUNK_SIZE,
                                                     self._RESPONSE_TIME_MAX,
                                                     response_time)
              f.close()
  
              return location.split("?")[0]
docs: Executes the current TONUpload object.