
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xml:lang="en" lang="en">
    <!-- this is a JXR report set (jdk8) -->
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Apache NetBeans Maven Utilities - NBM Maven Plugin 4.2-SNAPSHOT Reference</title>
        <script type="text/javascript">
            tmpTargetPage = "" + window.location.search;
            if (tmpTargetPage != "" && tmpTargetPage != "undefined")
                tmpTargetPage = tmpTargetPage.substring(1);
            if (tmpTargetPage.indexOf(":") != -1 || (tmpTargetPage != "" && !validURL(tmpTargetPage)))
                tmpTargetPage = "undefined";
            targetPage = tmpTargetPage;
            function validURL(url) {
                try {
                    url = decodeURIComponent(url);
                }
                catch (error) {
                    return false;
                }
                var pos = url.indexOf(".html");
                if (pos == -1 || pos != url.length - 5)
                    return false;
                var allowNumber = false;
                var allowSep = false;
                var seenDot = false;
                for (var i = 0; i < url.length - 5; i++) {
                    var ch = url.charAt(i);
                    if ('a' <= ch && ch <= 'z' ||
                            'A' <= ch && ch <= 'Z' ||
                            ch == '$' ||
                            ch == '_' ||
                            ch.charCodeAt(0) > 127) {
                        allowNumber = true;
                        allowSep = true;
                    } else if ('0' <= ch && ch <= '9'
                            || ch == '-') {
                        if (!allowNumber)
                            return false;
                    } else if (ch == '/' || ch == '.') {
                        if (!allowSep)
                            return false;
                        allowNumber = false;
                        allowSep = false;
                        if (ch == '.')
                            seenDot = true;
                        if (ch == '/' && seenDot)
                            return false;
                    } else {
                        return false;
                    }
                }
                return true;
            }
            function loadFrames() {
                if (targetPage != "" && targetPage != "undefined")
                    top.classFrame.location = top.targetPage;
            }
        </script>
    </head>
    <frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
        <frameset rows="30%,70%" title="Left frames" onload="top.loadFrames()">
            <frame src="overview-frame.html" name="packageListFrame" title="All Packages"/>
            <frame src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"/>
        </frameset>
        <frame src="overview-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"/>
        <noframes>
            <h1>Frame Alert</h1>
            <p>
                You don't have frames. Go <a href="overview-summary.html">here</a>
            </p>
        </noframes>
    </frameset>
</html>
