@Override
	public void run() {
		final ArrayList<Integer> keys = new ArrayList<Integer>(count.keySet());
		Collections.shuffle(keys);

		for (Integer key : keys) {
			final Integer clicksRemaining = this.count.get(key);
			if (clicksRemaining == 0) {
				continue;
			}

			int clicksToDo = Random.nextInt(0, clicksRemaining + 1);
			if (clicksToDo > 0) {
				final Component component = ctx.widgets.widget(WIDGET_CHARACTER).component(key);
				for (int i = 0; i < clicksToDo; i++) {
					if (component.click()) {
						count.put(key, clicksRemaining - 1);
						Condition.sleep(300); // TODO: varp change?
					}
				}
			}
		}

		for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
			if (entry.getValue() > 0) {
				return;
			}
		}

		final Component accept = ctx.widgets.widget(WIDGET_CHARACTER).component(ACCEPT);
		if (accept.valid()) {
			if (accept.click("Accept")) {
				Condition.wait(new Callable<Boolean>() {
					@Override
					public Boolean call() throws Exception {
						return !accept.valid();
					}
				}, 200, 15);
			}
		}
	}