// Path: src/main/java/pokeraidbot/domain/pokemon/Pokemon.java
// public class Pokemon {
// 
//     private String name;
//     private PokemonTypes types;
//     private Set<String> weaknesses;
//     private Set<String> resistant;
//     private Integer number;
//     private String about;
//     private String buddyDistance;
// 
//     public Pokemon(Integer number, String name, String about, PokemonTypes types, String buddyDistance,
//                    Set<String> weaknesses, Set<String> resistantTo) {
//         Validate.notNull(number, "Number is null!");
//         Validate.notNull(types, "Types is null!");
//         Validate.notEmpty(name, "Name is empty!");
//         if (types != PokemonTypes.NONE) {
//             Validate.notEmpty(weaknesses, "Weaknesses is empty!");
//             Validate.notEmpty(resistantTo, "ResistantTo is empty!");
//         }
// 
//         this.number = number;
//         this.name = name;
//         this.about = about;
//         this.types = types;
//         this.buddyDistance = buddyDistance;
//         this.weaknesses = weaknesses;
//         resistant = resistantTo;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Pokemon)) return false;
// 
//         Pokemon pokemon = (Pokemon) o;
// 
//         if (name != null ? !name.equals(pokemon.name) : pokemon.name != null) return false;
//         if (types != null ? !types.equals(pokemon.types) : pokemon.types != null) return false;
//         if (weaknesses != null ? !weaknesses.equals(pokemon.weaknesses) : pokemon.weaknesses != null) return false;
//         if (resistant != null ? !resistant.equals(pokemon.resistant) : pokemon.resistant != null) return false;
//         if (number != null ? !number.equals(pokemon.number) : pokemon.number != null) return false;
//         if (about != null ? !about.equals(pokemon.about) : pokemon.about != null) return false;
//         return buddyDistance != null ? buddyDistance.equals(pokemon.buddyDistance) : pokemon.buddyDistance == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = name != null ? name.hashCode() : 0;
//         result = 31 * result + (types != null ? types.hashCode() : 0);
//         result = 31 * result + (weaknesses != null ? weaknesses.hashCode() : 0);
//         result = 31 * result + (resistant != null ? resistant.hashCode() : 0);
//         result = 31 * result + (number != null ? number.hashCode() : 0);
//         result = 31 * result + (about != null ? about.hashCode() : 0);
//         result = 31 * result + (buddyDistance != null ? buddyDistance.hashCode() : 0);
//         return result;
//     }
// 
//     public PokemonTypes getTypes() {
//         return types;
//     }
// 
//     public Set<String> getWeaknesses() {
//         return weaknesses;
//     }
// 
//     public Set<String> getResistant() {
//         return resistant;
//     }
// 
//     public Integer getNumber() {
//         return number;
//     }
// 
//     public String getAbout() {
//         return about;
//     }
// 
//     public String getBuddyDistance() {
//         return buddyDistance;
//     }
// 
//     @Override
//     public String toString() {
//         return name + (types.getTypeSet().size() > 0 ? " (" + types + ")" : "");
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public boolean isEgg() {
//         return StringUtils.containsIgnoreCase(name, "egg") && name.matches("[Ee][Gg][Gg][1-6]");
//     }
// }
// 
// Path: src/main/java/pokeraidbot/infrastructure/CounterPokemon.java
// public class CounterPokemon {
//     private final String counterPokemonName;
//     private final Set<String> moves;
// 
//     public CounterPokemon(String counterPokemonName, Set<String> moves) {
//         this.counterPokemonName = counterPokemonName;
//         this.moves = moves;
//     }
// 
//     public String getCounterPokemonName() {
//         return counterPokemonName;
//     }
// 
//     public Set<String> getMoves() {
//         return moves;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof CounterPokemon)) return false;
// 
//         CounterPokemon that = (CounterPokemon) o;
// 
//         if (counterPokemonName != null ? !counterPokemonName.equals(that.counterPokemonName) : that.counterPokemonName != null)
//             return false;
//         return moves != null ? moves.equals(that.moves) : that.moves == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = counterPokemonName != null ? counterPokemonName.hashCode() : 0;
//         result = 31 * result + (moves != null ? moves.hashCode() : 0);
//         return result;
//     }
// 
//     @Override
//     public String toString() {
//         return counterPokemonName;
//     }
// }


import pokeraidbot.domain.pokemon.Pokemon;
import pokeraidbot.infrastructure.CounterPokemon;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
        } else {
            return Collections.EMPTY_SET;
        }

    }

    public Set<CounterPokemon> getGoodCounters() {
        if (goodCounters != null) {
            return Collections.unmodifiableSet(goodCounters);
        } else {
            return Collections.EMPTY_SET;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof RaidBossCounters)) return false;

        RaidBossCounters that = (RaidBossCounters) o;

        if (pokemon != null ? !pokemon.equals(that.pokemon) : that.pokemon != null) return false;
        if (supremeCounters != null ? !supremeCounters.equals(that.supremeCounters) : that.supremeCounters != null)
            return false;
        return goodCounters != null ? goodCounters.equals(that.goodCounters) : that.goodCounters == null;
    }

    @Override
    public int hashCode() {
        int result = pokemon != null ? pokemon.hashCode() : 0;
// Path: src/main/java/pokeraidbot/domain/pokemon/Pokemon.java
// public class Pokemon {
// 
//     private String name;
//     private PokemonTypes types;
//     private Set<String> weaknesses;
//     private Set<String> resistant;
//     private Integer number;
//     private String about;
//     private String buddyDistance;
// 
//     public Pokemon(Integer number, String name, String about, PokemonTypes types, String buddyDistance,
//                    Set<String> weaknesses, Set<String> resistantTo) {
//         Validate.notNull(number, "Number is null!");
//         Validate.notNull(types, "Types is null!");
//         Validate.notEmpty(name, "Name is empty!");
//         if (types != PokemonTypes.NONE) {
//             Validate.notEmpty(weaknesses, "Weaknesses is empty!");
//             Validate.notEmpty(resistantTo, "ResistantTo is empty!");
//         }
// 
//         this.number = number;
//         this.name = name;
//         this.about = about;
//         this.types = types;
//         this.buddyDistance = buddyDistance;
//         this.weaknesses = weaknesses;
//         resistant = resistantTo;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Pokemon)) return false;
// 
//         Pokemon pokemon = (Pokemon) o;
// 
//         if (name != null ? !name.equals(pokemon.name) : pokemon.name != null) return false;
//         if (types != null ? !types.equals(pokemon.types) : pokemon.types != null) return false;
//         if (weaknesses != null ? !weaknesses.equals(pokemon.weaknesses) : pokemon.weaknesses != null) return false;
//         if (resistant != null ? !resistant.equals(pokemon.resistant) : pokemon.resistant != null) return false;
//         if (number != null ? !number.equals(pokemon.number) : pokemon.number != null) return false;
//         if (about != null ? !about.equals(pokemon.about) : pokemon.about != null) return false;
//         return buddyDistance != null ? buddyDistance.equals(pokemon.buddyDistance) : pokemon.buddyDistance == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = name != null ? name.hashCode() : 0;
//         result = 31 * result + (types != null ? types.hashCode() : 0);
//         result = 31 * result + (weaknesses != null ? weaknesses.hashCode() : 0);
//         result = 31 * result + (resistant != null ? resistant.hashCode() : 0);
//         result = 31 * result + (number != null ? number.hashCode() : 0);
//         result = 31 * result + (about != null ? about.hashCode() : 0);
//         result = 31 * result + (buddyDistance != null ? buddyDistance.hashCode() : 0);
//         return result;
//     }
// 
//     public PokemonTypes getTypes() {
//         return types;
//     }
// 
//     public Set<String> getWeaknesses() {
//         return weaknesses;
//     }
// 
//     public Set<String> getResistant() {
//         return resistant;
//     }
// 
//     public Integer getNumber() {
//         return number;
//     }
// 
//     public String getAbout() {
//         return about;
//     }
// 
//     public String getBuddyDistance() {
//         return buddyDistance;
//     }
// 
//     @Override
//     public String toString() {
//         return name + (types.getTypeSet().size() > 0 ? " (" + types + ")" : "");
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public boolean isEgg() {
//         return StringUtils.containsIgnoreCase(name, "egg") && name.matches("[Ee][Gg][Gg][1-6]");
//     }
// }
// 
// Path: src/main/java/pokeraidbot/infrastructure/CounterPokemon.java
// public class CounterPokemon {
//     private final String counterPokemonName;
//     private final Set<String> moves;
// 
//     public CounterPokemon(String counterPokemonName, Set<String> moves) {
//         this.counterPokemonName = counterPokemonName;
//         this.moves = moves;
//     }
// 
//     public String getCounterPokemonName() {
//         return counterPokemonName;
//     }
// 
//     public Set<String> getMoves() {
//         return moves;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof CounterPokemon)) return false;
// 
//         CounterPokemon that = (CounterPokemon) o;
// 
//         if (counterPokemonName != null ? !counterPokemonName.equals(that.counterPokemonName) : that.counterPokemonName != null)
//             return false;
//         return moves != null ? moves.equals(that.moves) : that.moves == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = counterPokemonName != null ? counterPokemonName.hashCode() : 0;
//         result = 31 * result + (moves != null ? moves.hashCode() : 0);
//         return result;
//     }
// 
//     @Override
//     public String toString() {
//         return counterPokemonName;
//     }
// }


// Path: src/main/java/pokeraidbot/domain/raid/RaidBossCounters.java
import pokeraidbot.domain.pokemon.Pokemon;
import pokeraidbot.infrastructure.CounterPokemon;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

        } else {
            return Collections.EMPTY_SET;
        }

    }

    public Set<CounterPokemon> getGoodCounters() {
        if (goodCounters != null) {
            return Collections.unmodifiableSet(goodCounters);
        } else {
            return Collections.EMPTY_SET;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof RaidBossCounters)) return false;

        RaidBossCounters that = (RaidBossCounters) o;

        if (pokemon != null ? !pokemon.equals(that.pokemon) : that.pokemon != null) return false;
        if (supremeCounters != null ? !supremeCounters.equals(that.supremeCounters) : that.supremeCounters != null)
            return false;
        return goodCounters != null ? goodCounters.equals(that.goodCounters) : that.goodCounters == null;
    }

    @Override
    public int hashCode() {
        int result = pokemon != null ? pokemon.hashCode() : 0;
        result = 31 * result + (supremeCounters != null ? supremeCounters.hashCode() : 0);