class HTMLLinkContext extends LinkContext {
    
    private static final long serialVersionUID = 1L;

    
    final public static HTMLLinkContext META = new HTMLLinkContext("meta");
    final public static HTMLLinkContext A_HREF = new HTMLLinkContext("a", "href");
    final public static HTMLLinkContext IMG_SRC = new HTMLLinkContext("img", "src");
    final public static HTMLLinkContext IMG_SRCSET = new HTMLLinkContext("img", "srcset");
    final public static HTMLLinkContext SOURCE_SRCSET = new HTMLLinkContext("source", "srcset");
    final public static HTMLLinkContext IMG_DATA_SRC = new HTMLLinkContext("img", "data-src");
    final public static HTMLLinkContext IMG_DATA_SRCSET = new HTMLLinkContext("img", "data-srcset");
    final public static HTMLLinkContext IMG_DATA_ORIGINAL = new HTMLLinkContext("img", "data-original");
    final public static HTMLLinkContext IMG_DATA_ORIGINAL_SET = new HTMLLinkContext("source", "data-original-set");
    final public static HTMLLinkContext SOURCE_DATA_ORIGINAL_SET = new HTMLLinkContext("source", "data-original-set");    
    final public static HTMLLinkContext SCRIPT_SRC = new HTMLLinkContext("script", "src");
    final public static HTMLLinkContext META_HREF = new HTMLLinkContext("meta", "href");
    
    
    /**
     * The HTML path to the URL.
     */
    private final String path;
    
    /**
     * return an instance of HTMLLinkContext for attribute {@code attr} in
     * element {@code el}. returns pre-allocated shared instance for common case,
     * or new instance for others.
     * @param el element name
     * @param attr attribute name
     * @return instance of HTMLLinkContext
     */
    public static HTMLLinkContext get(CharSequence el, CharSequence attr) {
        if (attr.equals("href") || attr.equals("HREF")) {
            if (el.equals("a") || el.equals("A")) return A_HREF;
            if (el.equals("meta") || el.equals("META")) return META_HREF;
        } else if (attr.equals("src") || attr.equals("SRC")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_SRC;
            if (el.equals("script") || attr.equals("SCRIPT")) return SCRIPT_SRC;
        } else if (attr.equals("srcset") || attr.equals("SRCSET")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_SRCSET;
            if (el.equals("source") || attr.equals("SOURCE")) return SOURCE_SRCSET;
        } else if (attr.equals("data-src") || attr.equals("DATA-SRC")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_DATA_SRC;
        } else if (attr.equals("data-srcset") || attr.equals("DATA-SRCSET")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_DATA_SRCSET;
        } else if (attr.equals("data-original") || attr.equals("DATA-ORIGINAL")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_DATA_ORIGINAL;
        } else if (attr.equals("data-original-set") || attr.equals("DATA-ORIGINAL-SET")) {
            if (el.equals("img") || attr.equals("IMG")) return IMG_DATA_ORIGINAL_SET;
            if (el.equals("source") || attr.equals("SOURCE")) return SOURCE_DATA_ORIGINAL_SET;
        }
        return new HTMLLinkContext(el, attr);
    }
    /**
     * return an instance of HTMLLinkContext for path {@code path}.
     * returns pre-allocated shared instance for common case, or new instance for others.
     * <p>TODO: most code calling this method builds path by concatenating element name
     * and attribute name. consider changing such code to call {@link #get(CharSequence, CharSequence)}
     * instead.</p> 
     * @param path element and attribute in XLink-like path notation
     * @return instance of HTMLLinkContext
     */
    public static HTMLLinkContext get(String path) {<FILL_FUNCTION_BODY>}
    /**
     * Constructor.
     * 
     * @param path   an XPath-like context, eg "A\@HREF"
     */
    protected HTMLLinkContext(String path) {
        // FIXME: Verify that path really is XPath-like
        this.path = path;
    }

    
    protected HTMLLinkContext(CharSequence element, CharSequence attribute) {
        if (attribute == null) {
            this.path = "";
        } else {
            this.path = element + "/@" + attribute;
        }
    }
    
    @Override
    public String toString() {
        return path;
    }
}

        if (path.equalsIgnoreCase("a/@href")) return A_HREF;
        if (path.equalsIgnoreCase("meta/@href")) return META_HREF;
        if (path.equalsIgnoreCase("img/@src")) return IMG_SRC;
        if (path.equalsIgnoreCase("img/@srcset")) return IMG_SRCSET;
        if (path.equalsIgnoreCase("source/@srcset")) return SOURCE_SRCSET;
        if (path.equalsIgnoreCase("script/@src")) return SCRIPT_SRC;
        if (path.equalsIgnoreCase("img/@data-src")) return IMG_DATA_SRC;
        if (path.equalsIgnoreCase("img/@data-srcset")) return IMG_DATA_SRCSET;
        if (path.equalsIgnoreCase("img/@data-original")) return IMG_DATA_ORIGINAL;
        if (path.equalsIgnoreCase("img/@data-original-set")) return IMG_DATA_ORIGINAL_SET;
        if (path.equalsIgnoreCase("source/@data-original-set")) return SOURCE_DATA_ORIGINAL_SET;
        return new HTMLLinkContext(path);
    
<methods>public non-sealed void <init>() ,public boolean equals(java.lang.Object) ,public int hashCode() <variables>public static final org.archive.modules.extractor.LinkContext EMBED_MISC,public static final org.archive.modules.extractor.LinkContext INFERRED_MISC,public static final org.archive.modules.extractor.LinkContext JS_MISC,public static final org.archive.modules.extractor.LinkContext MANIFEST_MISC,public static final org.archive.modules.extractor.LinkContext NAVLINK_MISC,public static final org.archive.modules.extractor.LinkContext PREREQ_MISC,public static final org.archive.modules.extractor.LinkContext SPECULATIVE_MISC,private static final long serialVersionUID