// Path: asciidoctorj-api/src/main/java/org/asciidoctor/ast/DocumentHeader.java
// @Deprecated
// public interface DocumentHeader {
// 
//     /**
//      * @deprecated Use {@link Document#getAuthors()} instead.
//      */
//     @Deprecated
//     List<Author> getAuthors();
// 
//     /**
//      * @deprecated Use {@link Document#getStructuredDoctitle()} instead.
//      */
//     @Deprecated
//     Title getDocumentTitle();
// 
//     /**
//      * @deprecated Use {@link Document#getDoctitle()} instead.
//      */
//     @Deprecated
//     String getPageTitle();
// 
//     /**
//      * @deprecated Use {@link Document#getAuthors()} instead.
//      */
//     @Deprecated
//     Author getAuthor();
// 
//     /**
//      * @deprecated Use {@link Document#getRevisionInfo()} instead.
//      */
//     @Deprecated
//     RevisionInfo getRevisionInfo();
// 
//     /**
//      * @deprecated Use {@link Document#getAttributes()} instead.
//      */
//     @Deprecated
//     Map<String, Object> getAttributes();
// }
// 
// Path: asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/CaseInsensitiveMap.java
// public class CaseInsensitiveMap<K extends String, V> implements Map<K, V> {
// 
//     private Map<K, V> map;
// 
//     public CaseInsensitiveMap() {
//         this(new HashMap<K, V>());
//     }
// 
//     public CaseInsensitiveMap(Map<K, V> map) {
//         this.map = map;
//     }
// 
//     @Override
//     public void clear() {
//         map.clear();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (key instanceof String) {
//             return map.containsKey(((String) key).toLowerCase());
//         } else {
//             return map.containsKey(key);
//         }
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         return map.containsValue(value);
//     }
// 
//     @Override
//     public Set<java.util.Map.Entry<K, V>> entrySet() {
//         return map.entrySet();
//     }
// 
//     @Override
//     public V get(Object key) {
//         if (key instanceof String) {
//             return map.get(((String) key).toLowerCase());
//         } else {
//             return map.get(key);
//         }
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return map.isEmpty();
//     }
// 
//     @Override
//     public Set<K> keySet() {
//         return map.keySet();
//     }
// 
//     @Override
//     public V put(K key, V value) {
//         return map.put((K) key.toLowerCase(), value);
//     }
// 
//     @Override
//     public void putAll(Map<? extends K, ? extends V> m) {
//         for (Entry<? extends String, ? extends V> entry : m.entrySet()) {
//             map.put((K) entry.getKey().toLowerCase(), entry.getValue());
//         }
//     }
// 
//     @Override
//     public V remove(Object key) {
//         if (key instanceof String) {
//             return map.remove(((String) key).toLowerCase());
//         } else {
//             return map.remove(key);
//         }
//     }
// 
//     @Override
//     public int size() {
//         return map.size();
//     }
// 
//     @Override
//     public Collection<V> values() {
//         return map.values();
//     }
// 
// }


import org.asciidoctor.ast.Author;
import org.asciidoctor.ast.DocumentHeader;
import org.asciidoctor.ast.RevisionInfo;
import org.asciidoctor.ast.Title;
import org.asciidoctor.jruby.internal.CaseInsensitiveMap;
import java.util.List;
import java.util.Map;
        return this.authors;
    }

    public Title getDocumentTitle() {
        return documentTitle;
    }

    public String getPageTitle() {
        return pageTitle;
    }

    public Author getAuthor() {
        return authors == null || authors.size() == 0 ? null : authors.get(0);
    }

    public RevisionInfo getRevisionInfo() {
        return revisionInfo;
    }

    public Map<String, Object> getAttributes() {
        return attributes;
    }

    public static DocumentHeaderImpl createDocumentHeader(Title documentTitle, String pageTitle,
                                                          List<Author> authors, Map<String, Object> attributes) {

        DocumentHeaderImpl documentHeader = new DocumentHeaderImpl();

        documentHeader.documentTitle = documentTitle;
        documentHeader.pageTitle = pageTitle;
// Path: asciidoctorj-api/src/main/java/org/asciidoctor/ast/DocumentHeader.java
// @Deprecated
// public interface DocumentHeader {
// 
//     /**
//      * @deprecated Use {@link Document#getAuthors()} instead.
//      */
//     @Deprecated
//     List<Author> getAuthors();
// 
//     /**
//      * @deprecated Use {@link Document#getStructuredDoctitle()} instead.
//      */
//     @Deprecated
//     Title getDocumentTitle();
// 
//     /**
//      * @deprecated Use {@link Document#getDoctitle()} instead.
//      */
//     @Deprecated
//     String getPageTitle();
// 
//     /**
//      * @deprecated Use {@link Document#getAuthors()} instead.
//      */
//     @Deprecated
//     Author getAuthor();
// 
//     /**
//      * @deprecated Use {@link Document#getRevisionInfo()} instead.
//      */
//     @Deprecated
//     RevisionInfo getRevisionInfo();
// 
//     /**
//      * @deprecated Use {@link Document#getAttributes()} instead.
//      */
//     @Deprecated
//     Map<String, Object> getAttributes();
// }
// 
// Path: asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/CaseInsensitiveMap.java
// public class CaseInsensitiveMap<K extends String, V> implements Map<K, V> {
// 
//     private Map<K, V> map;
// 
//     public CaseInsensitiveMap() {
//         this(new HashMap<K, V>());
//     }
// 
//     public CaseInsensitiveMap(Map<K, V> map) {
//         this.map = map;
//     }
// 
//     @Override
//     public void clear() {
//         map.clear();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (key instanceof String) {
//             return map.containsKey(((String) key).toLowerCase());
//         } else {
//             return map.containsKey(key);
//         }
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         return map.containsValue(value);
//     }
// 
//     @Override
//     public Set<java.util.Map.Entry<K, V>> entrySet() {
//         return map.entrySet();
//     }
// 
//     @Override
//     public V get(Object key) {
//         if (key instanceof String) {
//             return map.get(((String) key).toLowerCase());
//         } else {
//             return map.get(key);
//         }
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return map.isEmpty();
//     }
// 
//     @Override
//     public Set<K> keySet() {
//         return map.keySet();
//     }
// 
//     @Override
//     public V put(K key, V value) {
//         return map.put((K) key.toLowerCase(), value);
//     }
// 
//     @Override
//     public void putAll(Map<? extends K, ? extends V> m) {
//         for (Entry<? extends String, ? extends V> entry : m.entrySet()) {
//             map.put((K) entry.getKey().toLowerCase(), entry.getValue());
//         }
//     }
// 
//     @Override
//     public V remove(Object key) {
//         if (key instanceof String) {
//             return map.remove(((String) key).toLowerCase());
//         } else {
//             return map.remove(key);
//         }
//     }
// 
//     @Override
//     public int size() {
//         return map.size();
//     }
// 
//     @Override
//     public Collection<V> values() {
//         return map.values();
//     }
// 
// }


// Path: asciidoctorj-core/src/main/java/org/asciidoctor/jruby/ast/impl/DocumentHeaderImpl.java
import org.asciidoctor.ast.Author;
import org.asciidoctor.ast.DocumentHeader;
import org.asciidoctor.ast.RevisionInfo;
import org.asciidoctor.ast.Title;
import org.asciidoctor.jruby.internal.CaseInsensitiveMap;
import java.util.List;
import java.util.Map;

        return this.authors;
    }

    public Title getDocumentTitle() {
        return documentTitle;
    }

    public String getPageTitle() {
        return pageTitle;
    }

    public Author getAuthor() {
        return authors == null || authors.size() == 0 ? null : authors.get(0);
    }

    public RevisionInfo getRevisionInfo() {
        return revisionInfo;
    }

    public Map<String, Object> getAttributes() {
        return attributes;
    }

    public static DocumentHeaderImpl createDocumentHeader(Title documentTitle, String pageTitle,
                                                          List<Author> authors, Map<String, Object> attributes) {

        DocumentHeaderImpl documentHeader = new DocumentHeaderImpl();

        documentHeader.documentTitle = documentTitle;
        documentHeader.pageTitle = pageTitle;
        documentHeader.attributes = new CaseInsensitiveMap<>(attributes);