class CheveretoRipper extends AbstractHTMLRipper {
    private static final Map<String, String> CONSENT_COOKIE;
    static {
        CONSENT_COOKIE = new TreeMap<String, String>();
        CONSENT_COOKIE.put("AGREE_CONSENT", "1");
    }

    public CheveretoRipper(URL url) throws IOException {
        super(url);
    }

    private static List<String> explicit_domains = Arrays.asList("tag-fox.com", "kenzato.uk");

    @Override
    public String getHost() {
        return url.toExternalForm().split("/")[2];
    }

    @Override
    public String getDomain() {
        return url.toExternalForm().split("/")[2];
    }

    @Override
    public boolean canRip(URL url) {
        String url_name = url.toExternalForm();
        if (explicit_domains.contains(url_name.split("/")[2])) {
                return true;
        }
        return false;
    }

    @Override
    public String getAlbumTitle(URL url) throws MalformedURLException {<FILL_FUNCTION_BODY>}

    @Override
    public String getGID(URL url) throws MalformedURLException {
        Pattern p = Pattern.compile("(?:https?://)?(?:www\\.)?[a-z1-9-]*\\.[a-z1-9]*(?:[a-zA-Z1-9]*)/album/([a-zA-Z1-9]*)/?$");
        Matcher m = p.matcher(url.toExternalForm());
        if (m.matches()) {
            return m.group(1);
        }
        throw new MalformedURLException("Expected chevereto URL format: " +
                        "site.domain/album/albumName or site.domain/username/albums- got " + url + " instead");
    }

    @Override
    public Document getFirstPage() throws IOException {
        // "url" is an instance field of the superclass
        return Http.url(url).cookies(CONSENT_COOKIE).get();
    }

    @Override
    public Document getNextPage(Document doc) throws IOException {
        // Find next page
        String nextUrl = "";
        // We use comic-nav-next to the find the next page
        Element elem = doc.select("li.pagination-next > a").first();
            if (elem == null) {
                throw new IOException("No more pages");
            }
            String nextPage = elem.attr("href");
            // Some times this returns a empty string
            // This for stops that
            if (nextPage == "") {
                return null;
            } else {
                return Http.url(nextPage).cookies(CONSENT_COOKIE).get();
            }
        }

    @Override
    public List<String> getURLsFromPage(Document doc) {
        List<String> result = new ArrayList<>();
            for (Element el : doc.select("a.image-container > img")) {
                String imageSource = el.attr("src");
                // We remove the .md from images so we download the full size image
                // not the medium ones
                imageSource = imageSource.replace(".md", "");
                result.add(imageSource);
            }
        return result;
    }

    @Override
    public void downloadURL(URL url, int index) {
        addURLToDownload(url, getPrefix(index));
    }
}

        try {
            // Attempt to use album title as GID
            Element titleElement = getFirstPage().select("meta[property=og:title]").first();
            String title = titleElement.attr("content");
            title = title.substring(title.lastIndexOf('/') + 1);
            return getHost() + "_" + title.trim();
        } catch (IOException e) {
            // Fall back to default album naming convention
            LOGGER.info("Unable to find title at " + url);
        }
        return super.getAlbumTitle(url);
    
<methods>public boolean addURLToDownload(java.net.URL, java.io.File, java.lang.String, Map<java.lang.String,java.lang.String>, java.lang.Boolean) ,public boolean addURLToDownload(java.net.URL, java.io.File) ,public boolean canRip(java.net.URL) ,public void downloadCompleted(java.net.URL, java.io.File) ,public void downloadErrored(java.net.URL, java.lang.String) ,public void downloadExists(java.net.URL, java.io.File) ,public int getCompletionPercentage() ,public int getCount() ,public abstract java.lang.String getHost() ,public Document getNextPage(Document) throws java.io.IOException,public java.lang.String getStatusText() ,public void rip() throws java.io.IOException,public java.net.URL sanitizeURL(java.net.URL) throws java.net.MalformedURLException,public boolean saveText(java.net.URL, java.lang.String, java.lang.String, int) ,public void setWorkingDir(java.net.URL) throws java.io.IOException<variables>private Map<java.net.URL,java.io.File> itemsCompleted,private Map<java.net.URL,java.lang.String> itemsErrored,private Map<java.net.URL,java.io.File> itemsPending