// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/PluginException.java
// public class PluginException extends Exception {
// 
//     private Optional<DependencyProblem> dependencyProblem = Optional.empty();
// 
//     private Optional<PluginMetadata> pluginMetadata = Optional.empty();
// 
//     public PluginException(Exception e) {
//         super(e);
//     }
// 
//     public PluginException(String message) {
//         super(message);
//     }
// 
//     public PluginException(String message, Exception e) {
//         super(message, e);
//     }
// 
//     public PluginException withDependencyProblem(DependencyProblem dependencyProblem) {
//         this.dependencyProblem = Optional.ofNullable(dependencyProblem);
//         return this;
//     }
// 
//     public PluginException withPlugin(PluginMetadata pluginMetadata) {
//         this.pluginMetadata = Optional.ofNullable(pluginMetadata);
//         return this;
//     }
// 
//     /**
//      * Returns dependency problem if any
//      *
//      * @return dependency problem
//      */
//     public Optional<DependencyProblem> getDependencyProblem() {
//         return dependencyProblem;
//     }
// 
//     /**
//      * Returns plugin affected
//      *
//      * @return plugin metadata
//      */
//     public Optional<PluginMetadata> getPluginMetadata() {
//         return pluginMetadata;
//     }
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/PluginMetadata.java
// public interface PluginMetadata {
// 
//     /**
//      * Returns unique plugin name
//      *
//      * @return free-form string with name
//      */
//     String getName();
// 
//     /**
//      * Returns plugin version
//      *
//      * @return free-form string with version
//      */
//     String getVersion();
// 
//     /**
//      * Returns {@link Path} object corresponding to plugin file
//      *
//      * @return plugin {@link Path} object
//      */
//     Path getPath();
// 
//     /**
//      * Returns {@link org.meridor.stecker.interfaces.Dependency} object corresponding to this plugin
//      *
//      * @return dependency object
//      */
//     Dependency getDependency();
// 
//     /**
//      * Returns date when plugin was released
//      *
//      * @return local date or empty if not set
//      */
//     Optional<ZonedDateTime> getDate();
// 
//     /**
//      * Returns detailed plugin description
//      *
//      * @return description or empty if not set
//      */
//     Optional<String> getDescription();
// 
//     /**
//      * Returns maintainer email and name
//      *
//      * @return email and name in the format: <b>John Smith &lt;john.smith@example.com&gt;</b> or empty if not set
//      */
//     Optional<String> getMaintainer();
// 
//     /**
//      * Returns a list of plugins required to make this plugin work
//      *
//      * @return possibly empty list with dependencies
//      */
//     List<Dependency> getRequiredDependencies();
// 
//     /**
//      * Returns a list of plugins that should be never installed simultaneously with this plugin
//      *
//      * @return possibly empty list with conflicting dependencies
//      */
//     List<Dependency> getConflictingDependencies();
// 
//     /**
//      * Returns a meta dependency which is provided by this plugin
//      *
//      * @return meta dependency or empty if not set
//      */
//     Optional<Dependency> getProvidedDependency();
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/interfaces/Dependency.java
// public interface Dependency {
// 
//     /**
//      * Returns dependency name
//      *
//      * @return dependency name
//      */
//     String getName();
// 
//     /**
//      * Returns dependency version if present
//      *
//      * @return dependency version if present and empty otherwise
//      */
//     Optional<String> getVersion();
// 
//     /**
//      * Forces to override {@link Object#equals(Object)}
//      *
//      * @param anotherDependency dependency to compare to
//      * @return true if equal and false otherwise
//      */
//     boolean equals(Object anotherDependency);
// 
//     /**
//      * Forces to override {@link Object#hashCode()}
//      *
//      * @return instance hash code
//      */
//     int hashCode();
// 
//     /**
//      * Returns dependency string representation
//      *
//      * @return dependency string representation
//      */
//     String toString();
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/interfaces/ManifestReader.java
// public interface ManifestReader {
// 
//     /**
//      * Reads jar file manifest and returns plugin information stored there
//      *
//      * @param pluginFile plugin file to process
//      * @return plugin information in {@link org.meridor.stecker.PluginMetadata} format
//      * @throws org.meridor.stecker.PluginException when something goes wrong during manifest reading
//      */
//     PluginMetadata read(Path pluginFile) throws PluginException;
// 
// }


import org.meridor.stecker.PluginException;
import org.meridor.stecker.PluginMetadata;
import org.meridor.stecker.interfaces.Dependency;
import org.meridor.stecker.interfaces.ManifestReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
package org.meridor.stecker.impl;



public class DefaultManifestReader implements ManifestReader {

    public static final String DEPENDENCY_DELIMITER = ";";
    public static final String VERSION_DELIMITER = "=";
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    @Override
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/PluginException.java
// public class PluginException extends Exception {
// 
//     private Optional<DependencyProblem> dependencyProblem = Optional.empty();
// 
//     private Optional<PluginMetadata> pluginMetadata = Optional.empty();
// 
//     public PluginException(Exception e) {
//         super(e);
//     }
// 
//     public PluginException(String message) {
//         super(message);
//     }
// 
//     public PluginException(String message, Exception e) {
//         super(message, e);
//     }
// 
//     public PluginException withDependencyProblem(DependencyProblem dependencyProblem) {
//         this.dependencyProblem = Optional.ofNullable(dependencyProblem);
//         return this;
//     }
// 
//     public PluginException withPlugin(PluginMetadata pluginMetadata) {
//         this.pluginMetadata = Optional.ofNullable(pluginMetadata);
//         return this;
//     }
// 
//     /**
//      * Returns dependency problem if any
//      *
//      * @return dependency problem
//      */
//     public Optional<DependencyProblem> getDependencyProblem() {
//         return dependencyProblem;
//     }
// 
//     /**
//      * Returns plugin affected
//      *
//      * @return plugin metadata
//      */
//     public Optional<PluginMetadata> getPluginMetadata() {
//         return pluginMetadata;
//     }
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/PluginMetadata.java
// public interface PluginMetadata {
// 
//     /**
//      * Returns unique plugin name
//      *
//      * @return free-form string with name
//      */
//     String getName();
// 
//     /**
//      * Returns plugin version
//      *
//      * @return free-form string with version
//      */
//     String getVersion();
// 
//     /**
//      * Returns {@link Path} object corresponding to plugin file
//      *
//      * @return plugin {@link Path} object
//      */
//     Path getPath();
// 
//     /**
//      * Returns {@link org.meridor.stecker.interfaces.Dependency} object corresponding to this plugin
//      *
//      * @return dependency object
//      */
//     Dependency getDependency();
// 
//     /**
//      * Returns date when plugin was released
//      *
//      * @return local date or empty if not set
//      */
//     Optional<ZonedDateTime> getDate();
// 
//     /**
//      * Returns detailed plugin description
//      *
//      * @return description or empty if not set
//      */
//     Optional<String> getDescription();
// 
//     /**
//      * Returns maintainer email and name
//      *
//      * @return email and name in the format: <b>John Smith &lt;john.smith@example.com&gt;</b> or empty if not set
//      */
//     Optional<String> getMaintainer();
// 
//     /**
//      * Returns a list of plugins required to make this plugin work
//      *
//      * @return possibly empty list with dependencies
//      */
//     List<Dependency> getRequiredDependencies();
// 
//     /**
//      * Returns a list of plugins that should be never installed simultaneously with this plugin
//      *
//      * @return possibly empty list with conflicting dependencies
//      */
//     List<Dependency> getConflictingDependencies();
// 
//     /**
//      * Returns a meta dependency which is provided by this plugin
//      *
//      * @return meta dependency or empty if not set
//      */
//     Optional<Dependency> getProvidedDependency();
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/interfaces/Dependency.java
// public interface Dependency {
// 
//     /**
//      * Returns dependency name
//      *
//      * @return dependency name
//      */
//     String getName();
// 
//     /**
//      * Returns dependency version if present
//      *
//      * @return dependency version if present and empty otherwise
//      */
//     Optional<String> getVersion();
// 
//     /**
//      * Forces to override {@link Object#equals(Object)}
//      *
//      * @param anotherDependency dependency to compare to
//      * @return true if equal and false otherwise
//      */
//     boolean equals(Object anotherDependency);
// 
//     /**
//      * Forces to override {@link Object#hashCode()}
//      *
//      * @return instance hash code
//      */
//     int hashCode();
// 
//     /**
//      * Returns dependency string representation
//      *
//      * @return dependency string representation
//      */
//     String toString();
// 
// }
// 
// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/interfaces/ManifestReader.java
// public interface ManifestReader {
// 
//     /**
//      * Reads jar file manifest and returns plugin information stored there
//      *
//      * @param pluginFile plugin file to process
//      * @return plugin information in {@link org.meridor.stecker.PluginMetadata} format
//      * @throws org.meridor.stecker.PluginException when something goes wrong during manifest reading
//      */
//     PluginMetadata read(Path pluginFile) throws PluginException;
// 
// }


// Path: stecker-plugin-loader/src/main/java/org/meridor/stecker/impl/DefaultManifestReader.java
import org.meridor.stecker.PluginException;
import org.meridor.stecker.PluginMetadata;
import org.meridor.stecker.interfaces.Dependency;
import org.meridor.stecker.interfaces.ManifestReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;

package org.meridor.stecker.impl;



public class DefaultManifestReader implements ManifestReader {

    public static final String DEPENDENCY_DELIMITER = ";";
    public static final String VERSION_DELIMITER = "=";
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    @Override
    public PluginMetadata read(Path pluginFile) throws PluginException {