<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def download(url, path, kind='file', progressbar=True, replace=False, timeout=10., verbose=True):
 """Download a URL. This will download a file and store it in a '~/data/` folder, creating directories if need be. It will also work for zip files, in which case it will unzip all of the files to the desired location. Parameters url : string The url of the file to download. This may be a dropbox or google drive "share link", or a regular URL. If it is a share link, then it should point to a single file and not a folder. To download folders, zip them first. path : string The path where the downloaded file will be stored. If ``zipfile`` is True, then this must be a folder into which files will be zipped. kind : one of ['file', 'zip', 'tar', 'tar.gz'] The kind of file to be downloaded. If not 'file', then the file contents will be unpackaged according to the kind specified. Package contents will be placed in ``root_destination/<name>``. progressbar : bool Whether to display a progress bar during file download. replace : bool If True and the URL points to a single file, overwrite the old file if possible. timeout : float The URL open timeout. verbose : bool Whether to print download status to the screen. Returns ------- out_path : string A path to the downloaded file (or folder, in the case of a zip file). """

    if kind not in ALLOWED_KINDS:
        raise ValueError('`kind` must be one of {}, got {}'.format(
            ALLOWED_KINDS, kind))

    # Make sure we have directories to dump files
    path = op.expanduser(path)

    if len(path) == 0:
        raise ValueError('You must specify a path. For current directory use .')

    download_url = _convert_url_to_downloadable(url)

    if replace is False and op.exists(path):
        msg = ('Replace is False and data exists, so doing nothing. '
               'Use replace==True to re-download the data.')
    elif kind in ZIP_KINDS:
        # Create new folder for data if we need it
        if not op.isdir(path):
            if verbose:
                tqdm.write('Creating data folder...')
            os.makedirs(path)

        # Download the file to a temporary folder to unzip
        path_temp = _TempDir()
        path_temp_file = op.join(path_temp, "tmp.{}".format(kind))
        _fetch_file(download_url, path_temp_file, timeout=timeout,
                    verbose=verbose)

        # Unzip the file to the out path
        if verbose:
            tqdm.write('Extracting {} file...'.format(kind))
        if kind == 'zip':
            zipper = ZipFile
        elif kind == 'tar':
            zipper = tarfile.open
        elif kind == 'tar.gz':
            zipper = partial(tarfile.open, mode='r:gz')
        with zipper(path_temp_file) as myobj:
            myobj.extractall(path)
        msg = 'Successfully downloaded / unzipped to {}'.format(path)
    else:
        if not op.isdir(op.dirname(path)):
            os.makedirs(op.dirname(path))
        _fetch_file(download_url, path, timeout=timeout, verbose=verbose)
        msg = 'Successfully downloaded file to {}'.format(path)
    if verbose:
        tqdm.write(msg)
    return path