// Path: src/main/java/myessentials/config/api/ConfigProperty.java
// public class ConfigProperty<T> {
// 
//     private T value;
// 
//     public final String name;
//     public final String category;
//     public final String comment;
// 
// 
//     public ConfigProperty(String name, String category, String comment, T defaultValue) {
//         this.name = name;
//         this.category = category;
//         this.comment = comment;
//         this.value = defaultValue;
//     }
// 
//     /**
//      * Sets the value inside the property
//      */
//     public void set(T value) {
//         this.value = value;
//     }
// 
//     /**
//      * Returns the value retained inside the property
//      */
//     public T get() {
//         return value;
//     }
// 
//     public boolean isClassType(Class clazz) {
//         return value.getClass().isAssignableFrom(clazz);
//     }
// 
//     public Property.Type getType() {
//         return CONFIG_TYPES.get(value.getClass());
//     }
// 
// 
//     private static final Map<Class<?>, Property.Type> CONFIG_TYPES = ImmutableMap.<Class<?>, Property.Type> builder().put(Integer.class, Property.Type.INTEGER)
//             .put(int.class, Property.Type.INTEGER).put(Integer[].class, Property.Type.INTEGER)
//             .put(int[].class, Property.Type.INTEGER).put(Double.class, Property.Type.DOUBLE)
//             .put(double.class, Property.Type.DOUBLE).put(Double[].class, Property.Type.DOUBLE)
//             .put(double[].class, Property.Type.DOUBLE).put(Float.class, Property.Type.DOUBLE)
//             .put(float.class, Property.Type.DOUBLE).put(Float[].class, Property.Type.DOUBLE)
//             .put(float[].class, Property.Type.DOUBLE).put(Boolean.class, Property.Type.BOOLEAN)
//             .put(boolean.class, Property.Type.BOOLEAN).put(Boolean[].class, Property.Type.BOOLEAN)
//             .put(boolean[].class, Property.Type.BOOLEAN).put(String.class, Property.Type.STRING)
//             .put(String[].class, Property.Type.STRING).build();
// 
// }
// 
// Path: src/main/java/myessentials/config/api/ConfigTemplate.java
// public abstract class ConfigTemplate {
// 
//     protected String modID;
//     protected Configuration config;
//     protected List<ConfigProperty> properties = new ArrayList<ConfigProperty>();
// 
//     public void init(String forgeConfigPath, String modID) {
//         init(new File(forgeConfigPath), modID);
//     }
// 
//     public void init(File forgeConfigFile, String modID) {
//         init(new Configuration(forgeConfigFile), modID);
//     }
// 
//     public void init(Configuration forgeConfig, String modID) {
//         this.config = forgeConfig;
//         this.modID = modID;
//         bind();
//         reload();
//     }
// 
//     public Configuration getForgeConfig() {
//         return this.config;
//     }
// 
//     public String getModID() {
//         return this.modID;
//     }
// 
//     /**
//      * Adds a ConfigProperty instance which can then be loaded/saved in the config.
//      */
//     public void addBinding(ConfigProperty property) {
//         addBinding(property, false);
//     }
// 
//     /**
//      * Adds a ConfigProperty instance which can then be loaded/saved in the config.
//      * It will automatically reload if specified.
//      */
//     public void addBinding(ConfigProperty property, boolean reload) {
//         this.properties.add(property);
//         if (reload) {
//             reload();
//         }
//     }
// 
//     /**
//      * Loads the config file from the hard drive
//      */
//     public void reload() {
//         config.load();
//         for (ConfigProperty property : properties) {
//             ConfigCategory category = config.getCategory(property.category);
//             Property forgeProp;
//             if (!category.containsKey(property.name)) {
//                 forgeProp = new Property(property.name, property.get().toString(), property.getType());
//                 forgeProp.comment = property.comment;
//                 category.put(property.name, forgeProp);
//             } else {
//                 forgeProp = category.get(property.name);
//                 forgeProp.comment = property.comment;
//             }
//             setProperty(property, forgeProp);
//         }
//         config.save();
//     }
// 
//     private void bind() {
//         for (Field field : getClass().getDeclaredFields()) {
//             if (field.getType().isAssignableFrom(ConfigProperty.class)) {
//                 try {
//                     properties.add((ConfigProperty)field.get(this));
//                 } catch (IllegalAccessException ex) {
//                     MyEssentialsCore.instance.LOG.error("Failed to access " + field.getName() + " while binding to config " + config.getConfigFile().getName());
//                     MyEssentialsCore.instance.LOG.error(ExceptionUtils.getStackTrace(ex));
//                 }
//             }
//         }
//     }
// 
//     @SuppressWarnings("unchecked")
//     private void setProperty(ConfigProperty property, Property forgeProp) {
//         try {
//             if (property.isClassType(Integer.class)) {
//                 property.set(forgeProp.getInt());
//             } else if (property.isClassType(Double.class)) {
//                 property.set(forgeProp.getDouble());
//             } else if (property.isClassType(Boolean.class)) {
//                 property.set(forgeProp.getBoolean());
//             } else if (property.isClassType(String.class)) {
//                 property.set(forgeProp.getString());
//             } else if (property.isClassType(Integer[].class)) {
//                 property.set(forgeProp.getIntList());
//             } else if (property.isClassType(Double[].class)) {
//                 property.set(forgeProp.getDoubleList());
//             } else if (property.isClassType(Boolean[].class)) {
//                 property.set(forgeProp.getBooleanList());
//             } else if (property.isClassType(String[].class)) {
//                 property.set(forgeProp.getStringList());
//             }
//         } catch (RuntimeException ex) {
//             MyEssentialsCore.instance.LOG.error("Config value of " + property.name + " in category " + property.category + " was not of the proper type!");
//             MyEssentialsCore.instance.LOG.error(ExceptionUtils.getStackTrace(ex));
//             throw ex;
//         }
//     }
// }


import myessentials.config.api.ConfigProperty;
import myessentials.config.api.ConfigTemplate;

package myessentials;


public class Config extends ConfigTemplate {

    public static final Config instance = new Config();


// Path: src/main/java/myessentials/config/api/ConfigProperty.java
// public class ConfigProperty<T> {
// 
//     private T value;
// 
//     public final String name;
//     public final String category;
//     public final String comment;
// 
// 
//     public ConfigProperty(String name, String category, String comment, T defaultValue) {
//         this.name = name;
//         this.category = category;
//         this.comment = comment;
//         this.value = defaultValue;
//     }
// 
//     /**
//      * Sets the value inside the property
//      */
//     public void set(T value) {
//         this.value = value;
//     }
// 
//     /**
//      * Returns the value retained inside the property
//      */
//     public T get() {
//         return value;
//     }
// 
//     public boolean isClassType(Class clazz) {
//         return value.getClass().isAssignableFrom(clazz);
//     }
// 
//     public Property.Type getType() {
//         return CONFIG_TYPES.get(value.getClass());
//     }
// 
// 
//     private static final Map<Class<?>, Property.Type> CONFIG_TYPES = ImmutableMap.<Class<?>, Property.Type> builder().put(Integer.class, Property.Type.INTEGER)
//             .put(int.class, Property.Type.INTEGER).put(Integer[].class, Property.Type.INTEGER)
//             .put(int[].class, Property.Type.INTEGER).put(Double.class, Property.Type.DOUBLE)
//             .put(double.class, Property.Type.DOUBLE).put(Double[].class, Property.Type.DOUBLE)
//             .put(double[].class, Property.Type.DOUBLE).put(Float.class, Property.Type.DOUBLE)
//             .put(float.class, Property.Type.DOUBLE).put(Float[].class, Property.Type.DOUBLE)
//             .put(float[].class, Property.Type.DOUBLE).put(Boolean.class, Property.Type.BOOLEAN)
//             .put(boolean.class, Property.Type.BOOLEAN).put(Boolean[].class, Property.Type.BOOLEAN)
//             .put(boolean[].class, Property.Type.BOOLEAN).put(String.class, Property.Type.STRING)
//             .put(String[].class, Property.Type.STRING).build();
// 
// }
// 
// Path: src/main/java/myessentials/config/api/ConfigTemplate.java
// public abstract class ConfigTemplate {
// 
//     protected String modID;
//     protected Configuration config;
//     protected List<ConfigProperty> properties = new ArrayList<ConfigProperty>();
// 
//     public void init(String forgeConfigPath, String modID) {
//         init(new File(forgeConfigPath), modID);
//     }
// 
//     public void init(File forgeConfigFile, String modID) {
//         init(new Configuration(forgeConfigFile), modID);
//     }
// 
//     public void init(Configuration forgeConfig, String modID) {
//         this.config = forgeConfig;
//         this.modID = modID;
//         bind();
//         reload();
//     }
// 
//     public Configuration getForgeConfig() {
//         return this.config;
//     }
// 
//     public String getModID() {
//         return this.modID;
//     }
// 
//     /**
//      * Adds a ConfigProperty instance which can then be loaded/saved in the config.
//      */
//     public void addBinding(ConfigProperty property) {
//         addBinding(property, false);
//     }
// 
//     /**
//      * Adds a ConfigProperty instance which can then be loaded/saved in the config.
//      * It will automatically reload if specified.
//      */
//     public void addBinding(ConfigProperty property, boolean reload) {
//         this.properties.add(property);
//         if (reload) {
//             reload();
//         }
//     }
// 
//     /**
//      * Loads the config file from the hard drive
//      */
//     public void reload() {
//         config.load();
//         for (ConfigProperty property : properties) {
//             ConfigCategory category = config.getCategory(property.category);
//             Property forgeProp;
//             if (!category.containsKey(property.name)) {
//                 forgeProp = new Property(property.name, property.get().toString(), property.getType());
//                 forgeProp.comment = property.comment;
//                 category.put(property.name, forgeProp);
//             } else {
//                 forgeProp = category.get(property.name);
//                 forgeProp.comment = property.comment;
//             }
//             setProperty(property, forgeProp);
//         }
//         config.save();
//     }
// 
//     private void bind() {
//         for (Field field : getClass().getDeclaredFields()) {
//             if (field.getType().isAssignableFrom(ConfigProperty.class)) {
//                 try {
//                     properties.add((ConfigProperty)field.get(this));
//                 } catch (IllegalAccessException ex) {
//                     MyEssentialsCore.instance.LOG.error("Failed to access " + field.getName() + " while binding to config " + config.getConfigFile().getName());
//                     MyEssentialsCore.instance.LOG.error(ExceptionUtils.getStackTrace(ex));
//                 }
//             }
//         }
//     }
// 
//     @SuppressWarnings("unchecked")
//     private void setProperty(ConfigProperty property, Property forgeProp) {
//         try {
//             if (property.isClassType(Integer.class)) {
//                 property.set(forgeProp.getInt());
//             } else if (property.isClassType(Double.class)) {
//                 property.set(forgeProp.getDouble());
//             } else if (property.isClassType(Boolean.class)) {
//                 property.set(forgeProp.getBoolean());
//             } else if (property.isClassType(String.class)) {
//                 property.set(forgeProp.getString());
//             } else if (property.isClassType(Integer[].class)) {
//                 property.set(forgeProp.getIntList());
//             } else if (property.isClassType(Double[].class)) {
//                 property.set(forgeProp.getDoubleList());
//             } else if (property.isClassType(Boolean[].class)) {
//                 property.set(forgeProp.getBooleanList());
//             } else if (property.isClassType(String[].class)) {
//                 property.set(forgeProp.getStringList());
//             }
//         } catch (RuntimeException ex) {
//             MyEssentialsCore.instance.LOG.error("Config value of " + property.name + " in category " + property.category + " was not of the proper type!");
//             MyEssentialsCore.instance.LOG.error(ExceptionUtils.getStackTrace(ex));
//             throw ex;
//         }
//     }
// }


// Path: src/main/java/myessentials/Config.java
import myessentials.config.api.ConfigProperty;
import myessentials.config.api.ConfigTemplate;

package myessentials;


public class Config extends ConfigTemplate {

    public static final Config instance = new Config();


    public ConfigProperty<Boolean> maintenanceMode = new ConfigProperty<Boolean>(
