private static TSeeding toSeeding(String... playerNames) {
   List<TPlayer> playersBestFirst = Lists.newArrayList();
   for (String playerName : playerNames) {
     playersBestFirst.add(TPlayer.create(playerName));
   }
   return TSeeding.create(playersBestFirst);
 }
 @SuppressWarnings("unchecked")
 public static StageSpec parseYaml(
     Object yamlStage, int stageNum, Map<String, Game> games, AtomicInteger playerLimitSoFar) {
   Map<String, Object> stageMap = (Map<String, Object>) yamlStage;
   YamlUtils.validateKeys(stageMap, "stage", ALLOWED_KEYS);
   String formatName = (String) stageMap.get("format");
   List<RoundSpec> rounds = Lists.newArrayList();
   int roundNum = 0;
   for (Object yamlRound : (List<Object>) stageMap.get("rounds")) {
     rounds.add(RoundSpec.parseYaml(yamlRound, roundNum, games));
     roundNum++;
   }
   int playerLimit = playerLimitSoFar.get();
   if (stageMap.containsKey("playerLimit")) {
     playerLimit = Math.min(playerLimit, (int) stageMap.get("playerLimit"));
     playerLimitSoFar.set(playerLimit);
   }
   if (stageMap.containsKey("playerCutoff")) {
     // This affects the player limit for the next round, not the current round.
     playerLimitSoFar.set((int) stageMap.get("playerCutoff"));
   }
   Set<TPlayer> excludedPlayers = Sets.newHashSet();
   if (stageMap.containsKey("excludedPlayers")) {
     for (Object playerName : (List<Object>) stageMap.get("excludedPlayers")) {
       // Note that playerName could actually be e.g. an Integer instead
       // of a String, so we do need toString() instead of a cast.
       excludedPlayers.add(TPlayer.create(playerName.toString()));
     }
   }
   return new StageSpec(
       stageNum,
       StageFormat.parse(formatName),
       ImmutableList.copyOf(rounds),
       playerLimit,
       ImmutableSet.copyOf(excludedPlayers));
 }