function resolve( opts, clbk ) {
	var options;
	var retries;
	var data;

	options = getOptions( opts ); // request options
	options.path = urlpath( opts.pathname, opts.type );

	data = Object.create( null ); // no prototype
	retries = 0;

	debug( 'Resolving dependents.' );
	return next();

	/**
	* Retrieves the next page.
	*
	* @private
	*/
	function next() {
		debug( 'Request path: %s', options.path );
		request( options, onResource );
	}

	/**
	* Callback invoked upon receiving an HTTP response.
	*
	* @private
	* @param {(Error|null)} error - error or null
	* @param {Object} response - HTTP response object
	* @param {string} body - response body
	* @returns {void}
	*/
	function onResource( error, response, body ) {
		var selection;
		var el;
		var $;
		var i;
		if ( error ) {
			if (
				error.status === 429 || // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
				error.status === 503 || // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503
				error.message.indexOf( 'Too Many Requests' ) >= 0 ||
				error.message.indexOf( 'Service Unavailable' ) >= 0
			) {
				retries += 1;
				if ( retries > MAX_RETRIES ) {
					debug( 'Maximum number of retries exceeded. Status: %d. Error: %s', error.status, error.message );
					return done( error );
				}
				debug( 'Encountered an error. Status: %d. Error: %s', error.status, error.message );
				return setTimeout( retry, exp2( retries ) * DELAY );
			}
			return done( error );
		}
		// Reset the retry counter:
		retries = 0;

		$ = cheerio.load( body );
		selection = $( '#dependents div.Box-row' );

		debug( 'Found %d dependents.', selection.length );
		if ( selection.length === 0 ) {
			return done();
		}
		selection.each( onElement );

		selection = $( 'div.paginate-container' ).find( 'a' );
		for ( i = 0; i < selection.length; i++ ) {
			el = $( selection.get( i ) );
			if ( el.text() === 'Next' ) {
				debug( 'Processing the next page of dependents.' );
				options.path = substringAfter( el.attr( 'href' ), options.hostname );
				return next();
			}
		}
		return done();

		/**
		* Callback invoked on finding a dependent.
		*
		* @private
		* @param {NonNegativeInteger} i - index
		* @param {Element} el - element
		*/
		function onElement( i, el ) {
			var links;
			var owner;
			var forks;
			var stars;
			var repo;
			var type;
			var o;

			// Repository names are comprised of two links:
			links = $( el ).find( '[data-repository-hovercards-enabled] a' );

			// The first link is the repository owner (either a user or organization):
			owner = links.first();
			type = owner.attr( 'data-hovercard-type' );
			owner = replace( owner.text(), RE_WHITESPACE, '' );

			// The second link is the repository name:
			repo = links.last().text();
			repo = replace( repo, RE_WHITESPACE, '' );

			// Get the number of stars:
			stars = $( el ).find( '.octicon.octicon-star' );
			if ( stars.length > 0 ) {
				stars = replace( stars.first().parent().text(), RE_WHITESPACE, '' );
			} else {
				stars = '0';
			}
			// Get the number of forks:
			forks = $( el ).find( '.octicon.octicon-repo-forked' );
			if ( forks.length > 0 ) {
				forks = replace( forks.first().parent().text(), RE_WHITESPACE, '' );
			} else {
				forks = '0';
			}
			// Check whether the repository owner is a new dependent...
			o = data[ owner ];
			if ( o === void 0 ) {
				o = {
					'owner': owner,
					'type': type,
					'repos': []
				};
			}
			// Add the repository to the list of dependents:
			o.repos.push( [ repo, stars, forks ] );

			// Update our data object:
			data[ owner ] = o;
		}
	}

	/**
	* Retries a request.
	*
	* @private
	*/
	function retry() {
		debug( 'Retrying request (%d of %d).', retries, MAX_RETRIES );
		next();
	}

	/**
	* Callback invoked upon resolving resources.
	*
	* @private
	* @param {Error} [error] - error object
	* @returns {void}
	*/
	function done( error ) {
		if ( error ) {
			return clbk( error );
		}
		debug( 'Request completed.' );
		return clbk( null, objectValues( data ) );
	}
}
Resolves dependents.

@private
@param {Object} opts - options
@param {Callback} clbk - callback to invoke after resolving dependents
@returns {void}