diff --git a/Jenkinsfile-site.groovy b/Jenkinsfile-site.groovy
deleted file mode 100644
index 3b8810a..0000000
--- a/Jenkinsfile-site.groovy
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-pipeline {
-    agent none
-    tools { 
-        maven 'Maven 3.3.9' 
-        jdk 'JDK 1.8 (latest)' 
-    }
-    stages {
-        stage('SCM operation'){
-            agent {label 'ubuntu'}
-            steps {
-                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', noTags: true, reference: '', shallow: true], [$class: 'MessageExclusion', excludedMessage: 'Automated site publishing.*'], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'master-branch']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/apache/incubator-netbeans-mavenutils/']]])
-
-                sh 'rm -rf stagedsite'
-		sh 'mkdir stagedsite'
-		sh 'rm -f mavenusite.zip'
-            }
-        }
-        stage('Build Site'){ 
-            agent {label 'ubuntu'}
-            steps {
-                // build site skin
-                script {
-                    def mvnfoldersforsite  = ['parent','webskin']
-                    def BASEDIR = pwd()
-                    for (String mvnproject in mvnfoldersforsite) {
-                        dir('master-branch/'+mvnproject) {
-                            sh "mvn clean install -Dmaven.repo.local=${BASEDIR}/.repository"
-                        }
-                    }
-                }
-                // build site
-                script {
-                    def mvnfoldersforsite  = ['parent','nbm-shared','nb-repository-plugin',/*'nbm-maven-harness',*/ 'nbm-maven-plugin']
-                    def BASEDIR = pwd()
-                    for (String mvnproject in mvnfoldersforsite) {
-                        dir('master-branch/'+mvnproject) {
-                            sh "mvn clean install site -Dmaven.repo.local=${BASEDIR}/.repository"
-                            sh "mv target/site ${BASEDIR}/stagedsite/${mvnproject}/"
-                        }
-                    }
-                }
-                zip zipFile:'mavenusite.zip',archive:false,dir:'stagedsite'
-                archiveArtifacts artifacts:'mavenusite.zip'
-  
-                
-            }
-        }               
-    }
-}
diff --git a/README.md b/README.md
index a08926e..956c239 100755
--- a/README.md
+++ b/README.md
@@ -19,13 +19,13 @@
 
 -->
 
-# Apache NetBeans Maven Utilities
+# Apache NetBeans Maven Archetypes - NetBeans Platorm Application
 
 ### Get In Touch
 
-[Subscribe](mailto:users-subscribe@netbeans.incubator.apache.org) or [mail](mailto:users@netbeans.incubator.apache.org) the [users@netbeans.incubator.apache.org](mailto:users@netbeans.incubator.apache.org) list - Ask questions, find answers, and also help other users.
+[Subscribe](mailto:users-subscribe@netbeans.apache.org) or [mail](mailto:users@netbeans.apache.org) the [users@netbeans.apache.org](mailto:users@netbeans.apache.org) list - Ask questions, find answers, and also help other users.
 
-[Subscribe](mailto:dev-subscribe@netbeans.incubator.apache.org) or [mail](mailto:dev@netbeans.incubator.apache.org) the [dev@netbeans.incubator.apache.org](mailto:dev@netbeans.incubator.apache.org) list - Join developement discussions, propose new ideas and connect with contributors.
+[Subscribe](mailto:dev-subscribe@netbeans.apache.org) or [mail](mailto:dev@netbeans.apache.org) the [dev@netbeans.apache.org](mailto:dev@netbeans.apache.org) list - Join developement discussions, propose new ideas and connect with contributors.
 
 ### Reporting Bugs
 
diff --git a/archetype/nbm-archetype/pom.xml b/archetype/nbm-archetype/pom.xml
deleted file mode 100644
index c9cb029..0000000
--- a/archetype/nbm-archetype/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.netbeans.maven.archetypes</groupId>
-    <artifactId>nbm-archetype</artifactId>
-    <version>1.16-SNAPSHOT</version>
-    <packaging>maven-archetype</packaging>
-    <name>Apache Netbeans Maven Utilties - NetBeans Module Archetype</name>
-    <description>Archetype for development of NetBeans modules in Maven.</description>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/projects/NETBEANS</url>
-    </issueManagement>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-        <tag>master</tag>
-    </scm> 
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <artifactId>maven-archetype-plugin</artifactId>
-                    <version>2.0</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <extensions>
-            <extension>
-                <groupId>org.apache.maven.archetype</groupId>
-                <artifactId>archetype-packaging</artifactId>
-                <version>2.0</version>
-            </extension>
-        </extensions>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-                <configuration>
-                    <excludes>
-                        <exclude>src/main/resources/archetype-resources/**</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-</project>
diff --git a/archetype/nbm-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetype/nbm-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 28ee94f..0000000
--- a/archetype/nbm-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<archetype-descriptor xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                      xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
-                      partial="false" name="NetBeans module project archetype">
-    <fileSets>
-        <fileSet filtered="true" packaged="true">
-            <directory>src/main/resources</directory>
-            <includes>
-                <include>**/*.*</include>
-            </includes>
-        </fileSet>
-        <fileSet filtered="true">
-            <directory>src/main/nbm</directory>
-            <includes>
-                <include>**/*.*</include>
-            </includes>
-        </fileSet>
-        <fileSet filtered="true" packaged="true">
-            <directory>src/main/java</directory>
-        </fileSet>
-    </fileSets>
-    <requiredProperties>
-        <requiredProperty key="netbeansVersion">
-            <defaultValue>RELEASE81</defaultValue>
-        </requiredProperty>
-    </requiredProperties>
-</archetype-descriptor>
diff --git a/archetype/nbm-archetype/src/main/resources/archetype-resources/pom.xml b/archetype/nbm-archetype/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index 0eee5e6..0000000
--- a/archetype/nbm-archetype/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>${groupId}</groupId>
-    <artifactId>${artifactId}</artifactId>
-    <version>${version}</version>
-    <packaging>nbm</packaging>
-
-    <name>${artifactId}</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <repositories>
-        <!--
-        Repository hosting NetBeans modules, especially APIs.
-        Versions are based on IDE releases, e.g.: RELEASE691
-        To create your own repository, use: nbm:populate-repository
-        -->
-        <repository>
-            <id>netbeans</id>
-            <name>NetBeans</name>
-            <url>http://bits.netbeans.org/nexus/content/groups/netbeans/</url>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-netbeans-api-annotations-common</artifactId>
-            <version>${netbeansVersion}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <version>4.1</version>
-                <extensions>true</extensions>
-            </plugin>
-
-            <plugin>
-                <!-- NetBeans 6.9+ requires JDK 6, starting NetBeans 7.4 source 1.7 is required   -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.5.1</version>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>2.4</version>
-                <configuration>
-                    <!-- to have the jar plugin pickup the nbm generated manifest -->
-                    <useDefaultManifestFile>true</useDefaultManifestFile>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/nbm/manifest.mf b/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/nbm/manifest.mf
deleted file mode 100644
index 02dc07c..0000000
--- a/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/nbm/manifest.mf
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-#set( $slashed = $package.replaceAll("([.])", "/") )
-OpenIDE-Module-Localizing-Bundle: $slashed/Bundle.properties
diff --git a/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/resources/Bundle.properties b/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/resources/Bundle.properties
deleted file mode 100644
index e999176..0000000
--- a/archetype/nbm-archetype/src/main/resources/archetype-resources/src/main/resources/Bundle.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-# Localized module labels. Defaults taken from POM (<name>, <description>, <groupId>) if unset.
-#OpenIDE-Module-Name=
-#OpenIDE-Module-Short-Description=
-#OpenIDE-Module-Long-Description=
-#OpenIDE-Module-Display-Category=
diff --git a/archetype/nbm-suite-root/pom.xml b/archetype/nbm-suite-root/pom.xml
deleted file mode 100644
index 66154f1..0000000
--- a/archetype/nbm-suite-root/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.netbeans.maven.archetypes</groupId>
-    <artifactId>nbm-suite-root</artifactId>
-    <version>1.11-SNAPSHOT</version>
-    <packaging>maven-archetype</packaging>
-    
-    <name>Apache Netbeans Maven Utilties - NetBeans Module Suite Archetype</name>
-    <description>Root project archetype for creating multi module projects developing NetBeans IDE modules. Approximately similar in functionality to module suites in NetBeans Ant projects.</description>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/projects/NETBEANS</url>
-    </issueManagement>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm> 
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <artifactId>maven-archetype-plugin</artifactId>
-                    <version>2.0</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <extensions>
-            <extension>
-                <groupId>org.apache.maven.archetype</groupId>
-                <artifactId>archetype-packaging</artifactId>
-                <version>2.0</version>
-            </extension>
-        </extensions>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-                <configuration>
-                    <excludes>
-                        <exclude>src/main/resources/archetype-resources/**</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-</project>
diff --git a/archetype/nbm-suite-root/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetype/nbm-suite-root/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 74d169d..0000000
--- a/archetype/nbm-suite-root/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<archetype-descriptor xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
-  partial="false" name="NetBeans module suite archetype">
-  <fileSets>
-    <fileSet filtered="true" packaged="false">
-      <directory></directory>
-      <includes>
-        <include>nbactions.xml</include>
-      </includes>
-    </fileSet>
-  </fileSets>
-  <requiredProperties>
-    <requiredProperty key="netbeansVersion">
-      <defaultValue>RELEASE74</defaultValue>
-    </requiredProperty>
-  </requiredProperties>
-</archetype-descriptor>
diff --git a/archetype/nbm-suite-root/src/main/resources/archetype-resources/nbactions.xml b/archetype/nbm-suite-root/src/main/resources/archetype-resources/nbactions.xml
deleted file mode 100644
index 498859b..0000000
--- a/archetype/nbm-suite-root/src/main/resources/archetype-resources/nbactions.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-#set( $D = '$' )
-<actions>
-    <action>
-        <actionName>run</actionName>
-        <goals>
-            <goal>package</goal>
-            <goal>nbm:cluster</goal>
-            <goal>nbm:run-ide</goal>
-        </goals>
-    </action>
-    <action>
-        <actionName>debug</actionName>
-        <goals>
-            <goal>package</goal>
-            <goal>nbm:cluster</goal>
-            <goal>nbm:run-ide</goal>
-        </goals>
-        <properties>
-            <jpda.listen>true</jpda.listen>
-            <netbeans.run.params.debug>-J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,suspend=n,server=n,address=${D}{jpda.address}</netbeans.run.params.debug>
-        </properties>
-    </action>
-</actions>
diff --git a/archetype/nbm-suite-root/src/main/resources/archetype-resources/pom.xml b/archetype/nbm-suite-root/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index 8589192..0000000
--- a/archetype/nbm-suite-root/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-#set( $D = '$' )
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>${groupId}</groupId>
-    <artifactId>${artifactId}</artifactId>
-    <version>${version}</version>
-    <packaging>pom</packaging>
-
-    <name>${artifactId}</name>
-
-    <repositories>
-        <!--
-        Repository hosting NetBeans modules, especially APIs.
-        Versions are based on IDE releases, e.g.: RELEASE691
-        To create your own repository, use: nbm:populate-repository
-        -->
-        <repository>
-            <id>netbeans</id>
-            <name>NetBeans</name>
-            <url>http://bits.netbeans.org/nexus/content/groups/netbeans/</url>
-        </repository>
-    </repositories>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.10</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>nbm-maven-plugin</artifactId>
-                    <version>3.13</version>
-                    <configuration>
-                        <cluster>${artifactId.toLowerCase().replaceAll("[^a-z0-9_]+", "_")}</cluster>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <!-- NetBeans 6.9+ requires JDK 6, starting NetBeans 7.4 source 1.7 is required-->
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>2.5.1</version>
-                    <configuration>
-                        <source>1.7</source>
-                        <target>1.7</target>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>updatesite</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>nbm-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>site</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>autoupdate</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-    <properties>
-        <netbeans.version>${netbeansVersion}</netbeans.version>
-    </properties>
-</project>
diff --git a/nb-repository-plugin/README.md b/nb-repository-plugin/README.md
deleted file mode 100644
index bd2fea0..0000000
--- a/nb-repository-plugin/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-
-#NetBeans Repository plugin
-
-The plugin is capable of populating the local or remote maven repository with module jars and NBM files from a given NetBeans installation. Useful for
-module development, modules with public APIs are separated from those without a public API.
-See the `populate` goal.
-
- To get access to a repository with NetBeans.org module artifacts and metadata, add [http://bits.netbeans.org/maven2/](http://bits.netbeans.org/maven2/) repository to your project POM
-or the repository manager you are using. The repository hosts binaries of NetBeans 6.5 and later.
-
- Also see: [Maven NBM development FAQs](http://wiki.netbeans.org/NetBeansDeveloperFAQ#Mavenized_Builds)
- 
-## HOWTO: Upload NetBeans release binaries to a Maven repository
-
-There is a `populate` goal that converts the NetBeans module information into Maven metadata
-and is capable of uploading the module jar file, javadoc, sources and nbm files to local
-and remote repositories. 
-
-For a binary-only upload (jar files and nbm files only), it's possible to download the bits from official sites. See below for URLs.
-
-For the complete upload, you will need to checkout the sources of the IDE/Platform you
-want to upload. See this FAQ entry on [HowTo checkout sources from Hg](http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial)
-
-
- The goal has multiple input parameters that link the goal to binaries prepared beforehand.
-
-* `netbeansInstallDirectory` designates the base directory where resides the NetBeans installation
-that shall be uploaded. It can be either [downloaded as zip](http://www.netbeans.org/downloads/index.html) or built from sources.
-Run `ant` in your local hg clone to build the distribution at `nbbuild/netbeans` sundirectory.
-
-* `netbeansNbmDirectory` designates the base directory where the nbm files are located.
-Run `ant build-nbms` in your local `hg clone` to build the nbms at `nbbuild/nbms` directory or download it from the
-[http://updates.netbeans.org/netbeans](http://updates.netbeans.org/netbeans) space eg.
-final *6.5* version at [http://updates.netbeans.org/netbeans/*6.5*/final/uc/](http://updates.netbeans.org/netbeans/6.5/final/uc/).
-Use a tool like `wget` to download the complete directory tree to a directory designated by the `netbeansNbmDirectory` parameter.
-
-* `netbeansSourcesDirectory` designates the base directory containing zip files with module jar sources.
-Run `ant build-source-zips` in your local hg clone to build the nbms at `nbbuild/build/source-zips` directory.
-
-* `netbeansJavadocDirectory` designates the base directory containing zip files with javadoc zips for modules with public apis.
-Run `ant build-javadoc` in your local hg clone to build the nbms at `nbbuild/build/javadoc` directory.
-
-* To have external dependencies correctly identified by their real GAV, you will need to download the index from central (or other) repository using the `download` goal.
-
-
-
diff --git a/nb-repository-plugin/pom.xml b/nb-repository-plugin/pom.xml
deleted file mode 100644
index 7d9ac8c..0000000
--- a/nb-repository-plugin/pom.xml
+++ /dev/null
@@ -1,434 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>nb-repository-plugin</artifactId>
-    <version>1.4-SNAPSHOT</version>
-    <packaging>maven-plugin</packaging>
-
-    <name>Apache NetBeans Maven Utilities - NB Repository Plugin</name>
-    <description>Maven plugin for creating Maven Repository out of a NetBeans installation (and other sources) for consumption by the projects using nbm-maven-plugin.
-    </description>
-    <inceptionYear>2005</inceptionYear>
-    <url>http://bits.netbeans.org/mavenutilities/nb-repository-plugin</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANS</url>
-    </issueManagement>
-    <prerequisites>
-        <maven>3.1.1</maven>
-    </prerequisites>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>
-    <developers>
-        <developer>
-            <id>mkleint</id>
-            <name>Milos Kleint</name>
-            <email>mkleint@gmail.com</email>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>jglick</id>
-            <name>Jesse Glick</name>
-            <email>jglick@codehaus.org</email>
-            <organization>Codehaus</organization>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>ebarboni</id>
-            <name>Eric Barboni</name>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-    </developers>
-    <contributors>
-        <contributor>
-            <name>Johan Andrén</name>
-            <email>protected</email>
-            <roles>
-                <role>Patch Contributor</role>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Mykola Nikishov</name>
-            <email>mn@mn.com.ua</email>
-            <roles>
-                <role>Patch Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Frantisek Mantlik</name>
-            <email>frantisek@mantlik.cz</email>
-            <roles>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-    </contributors>
-    
-
-    <!-- TODO need to override parent version value... I suppose this will eventually end up in mojo parent pom, check regularly -->    
-
-    <build>
-        <plugins>
-            <plugin>
-                <!-- TODO need to override parent version value... I suppose this will eventually end up in mojo parent pom, check regularly -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.5</version>
-                <configuration>
-                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>mojo-descriptor</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>descriptor</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>help-goal</id>
-                        <goals>
-                            <goal>helpmojo</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>animal-sniffer-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                        <configuration>
-                            <signature>
-                                <groupId>org.codehaus.mojo.signature</groupId>
-                                <artifactId>java17</artifactId>
-                                <version>1.0</version>
-                            </signature>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>plugins</report>
-                            <!-- <report>cim</report> -->
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-changes-plugin</artifactId>
-                <configuration>
-                    <!-- configure github milestone ? -->
-                    <!--<onlyMilestoneIssues>false</onlyMilestoneIssues>
-                    <onlyCurrentVersion>false</onlyCurrentVersion>-->
-                    <skip>true</skip>
-                </configuration>
-               
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>                           
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.5</version>
-                <configuration>
-                    <requirements>
-                        <!--
-                        NOTE: Maven 2.x does not interpolate properties of the form project.*|pom.* so the Maven Plugin Plugin
-                        gets garbage when manually examining the config of the Maven Compiler Plugin.
-                        -->
-                        <jdk>${mojo.java.target}</jdk>
-                    </requirements>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <quiet>true</quiet>
-                    <links>
-                        <!--<link>http://download-llnw.oracle.com/javaee/1.4/api/</link>-->
-                        <!-- unreachable site <link>http://commons.apache.org/collections/apidocs-COLLECTIONS_3_0/</link>-->
-                        <link>http://commons.apache.org/dbcp/apidocs/</link>
-                        <link>http://commons.apache.org/fileupload/apidocs/</link>
-                        <link>http://commons.apache.org/logging/apidocs/</link>
-                        <link>http://commons.apache.org/pool/apidocs/</link>
-                        <link>http://junit.sourceforge.net/javadoc/</link>
-                        <link>http://logging.apache.org/log4j/1.2/apidocs/</link>
-                        <!-- unreachable site <link>http://jakarta.apache.org/regexp/apidocs/</link> -->
-                        <link>http://velocity.apache.org/engine/releases/velocity-1.5/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-artifact/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-model/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-plugin-api/apidocs/</link>
-                        <!-- unreachable site <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-project/apidocs/</link>-->
-                        <!-- unreachable site <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-reporting/maven-reporting-api/apidocs/</link>-->
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-settings/apidocs/</link>
-                    </links>
-                    <tagletArtifacts>
-                        <tagletArtifact>
-                            <groupId>org.apache.maven.plugin-tools</groupId>
-                            <artifactId>maven-plugin-tools-javadoc</artifactId>
-                            <version>3.4</version>
-                        </tagletArtifact>
-                        <tagletArtifact>
-                            <groupId>org.codehaus.plexus</groupId>
-                            <artifactId>plexus-component-javadoc</artifactId>
-                            <version>1.6</version>
-                        </tagletArtifact>
-                    </tagletArtifacts>
-                </configuration>
-               
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-pmd-plugin</artifactId>
-               <configuration>
-                    <targetJdk>1.6</targetJdk>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-linkcheck-plugin</artifactId>
-                <configuration>
-                    <excludedLinks>
-                        <excludedLink>../../images/codehaus-small.png</excludedLink>
-                        <excludedLink>../../images/mojo_logo.png</excludedLink>
-                        <excludedLink>plugin-info.html</excludedLink>
-                    </excludedLinks>
-                    <!--<excludedPages>
-                        <excludedPage>dependencies.html</excludedPage> 
-                    </excludedPages>-->
-                </configuration>	       
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>2.7</version>
-                <configuration>
-                    <instrumentation>
-                        <excludes>
-                            <exclude>**/HelpMojo.class</exclude>
-                        </excludes>
-                    </instrumentation>    
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>taglist-maven-plugin</artifactId>
-                <version>2.4</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-            </plugin>
-        </plugins>
-    </reporting>
-    <profiles>
-        <profile>
-            <id>run-its</id>
-            <build>
-
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-invoker-plugin</artifactId>
-                        <version>2.0.0</version>
-                        <configuration>
-                            <debug>false</debug>
-                            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
-                            <pomIncludes>
-                                <pomInclude>*/pom.xml</pomInclude>
-                            </pomIncludes>
-                            <postBuildHookScript>verify</postBuildHookScript>
-                            <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-                            <settingsFile>src/it/settings.xml</settingsFile>
-                            <goals>
-                                <!-- default build in netbeans IDE -->
-                                <goal>clean</goal>
-                                <goal>install</goal>
-                            </goals>
-                            <filterProperties>
-                                <netbeans.version>RELEASE82</netbeans.version> 
-                            </filterProperties>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>integration-test</id>
-                                <goals>
-                                    <goal>install</goal>
-                                    <goal>integration-test</goal>
-                                    <goal>verify</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-
-            </build>
-        </profile>
-    </profiles>
-    <!--profiles>
-        <profile>
-            <id>tools.jar</id>
-            <activation>
-                <file>
-                    <exists>${java.home}/../lib/tools.jar</exists>
-                </file>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>com.sun</groupId>
-                    <artifactId>tools</artifactId>
-                    <version>1.5.0</version>
-                    <scope>system</scope>
-                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
-                </dependency>
-            </dependencies>
-        </profile>
-    </profiles-->
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-artifact</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-tools</groupId>
-            <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.5</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-            <version>3.1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.lucene</groupId>
-            <artifactId>lucene-core</artifactId>
-            <version>5.5.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-model</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-core</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-testing</groupId>
-            <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>3.3.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-compat</artifactId>
-            <version>${maven.version}</version>
-            <type>jar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.8.2</version>
-            <scope>compile</scope>
-            <type>jar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.indexer</groupId>
-            <artifactId>indexer-core</artifactId>
-            <version>6.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.wagon</groupId>
-            <artifactId>wagon-http</artifactId>
-            <version>${wagon.version}</version>
-            <type>jar</type>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>nb-shared</artifactId>
-            <version>1.3-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.wagon</groupId>
-            <artifactId>wagon-provider-api</artifactId>
-            <version>${wagon.version}</version>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
-    <properties>
-        <mojo.java.target>1.6</mojo.java.target>
-        <wagon.version>3.0.0</wagon.version>
-        <maven.version>3.1.1</maven.version>
-    </properties>
-</project>
diff --git a/nb-repository-plugin/src/it/folder/pom.xml b/nb-repository-plugin/src/it/folder/pom.xml
deleted file mode 100644
index 4c6c5e4..0000000
--- a/nb-repository-plugin/src/it/folder/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>nb-repository-plugin-it-root</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <artifactId>nb-repository-plugin-it-single-module</artifactId>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nb-repository-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>install</phase>
-                        <goals>
-                            <goal>download</goal>
-                        </goals>
-                        <configuration>
-                            <nexusIndexDirectory>${project.build.directory}/indextest</nexusIndexDirectory>
-                            <repositoryUrl>http://repo1.maven.org/maven2</repositoryUrl>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git a/nb-repository-plugin/src/it/pom.xml b/nb-repository-plugin/src/it/pom.xml
deleted file mode 100644
index 84b1664..0000000
--- a/nb-repository-plugin/src/it/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.codehaus.mojo</groupId>
-    <artifactId>nb-repository-plugin-it-root</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-  
-    <build>
-        <pluginManagement>
-            <plugins>
-               
-                <plugin>  
-                    <groupId>@project.groupId@</groupId>
-                    <artifactId>@project.artifactId@</artifactId>  
-                    <version>@project.version@</version>
-                </plugin>
-                <!--<plugin>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>@compilerPluginVersion@</version>
-                    <configuration>
-                        <source>@testJavaVersion@</source>
-                        <target>@testJavaVersion@</target>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>@surefirePluginVersion@</version>
-                </plugin>-->
-            </plugins>
-        </pluginManagement>
-    </build>
-    <properties>
-        <jar.plugin.version>3.0.2</jar.plugin.version>
-    </properties>
-</project>
\ No newline at end of file
diff --git a/nb-repository-plugin/src/it/settings.xml b/nb-repository-plugin/src/it/settings.xml
deleted file mode 100644
index 5ee363c..0000000
--- a/nb-repository-plugin/src/it/settings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<settings>
-    <profiles>
-        <profile>
-            <id>it-repo</id>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <repositories>
-                <repository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </pluginRepository>
-            </pluginRepositories>
-        </profile>
-    </profiles>
-</settings>
diff --git a/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/DownloadIndexMojo.java b/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/DownloadIndexMojo.java
deleted file mode 100644
index 1845303..0000000
--- a/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/DownloadIndexMojo.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2012 Codehaus.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package org.netbeans.nbm.repository;
-
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import org.apache.maven.artifact.manager.WagonManager;
-import org.apache.maven.index.NexusIndexer;
-import org.apache.maven.index.context.IndexCreator;
-import org.apache.maven.index.context.IndexingContext;
-import org.apache.maven.index.updater.IndexUpdateRequest;
-import org.apache.maven.index.updater.IndexUpdater;
-import org.apache.maven.index.updater.ResourceFetcher;
-import org.apache.maven.index.updater.WagonHelper;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.wagon.Wagon;
-import org.apache.maven.wagon.events.TransferEvent;
-import org.apache.maven.wagon.events.TransferListener;
-import org.apache.maven.wagon.providers.http.HttpWagon;
-import org.apache.maven.wagon.proxy.ProxyInfo;
-import org.codehaus.plexus.PlexusConstants;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.context.ContextException;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
-
-/**
- * Goal for retrieving and expanding the lucene index of the given repository. That in turn is used by the <code>populate</code>
- * goal.
- * @author mkleint
- */
-@Mojo(name="download", aggregator=true, requiresProject=false)
-public class DownloadIndexMojo extends AbstractMojo implements Contextualizable {
-    
-    /**
-     * url of the repository to download index from. Please note that if you already have
-     * an existing index at <code>nexusIndexDirectory</code>, you should always use the same url for that directory.
-     */
-    @Parameter(required=true, property="repositoryUrl")
-    private String repositoryUrl;
-    
-    /**
-     * location on disk where the index should be created. either empty or with existing index from same repository. then only update check will
-     * be performed.
-     */
-    @Parameter(required=true, property="nexusIndexDirectory")
-    private File nexusIndexDirectory;
- 
-    @Component
-    IndexUpdater remoteIndexUpdater;
-    
-    @Component
-    NexusIndexer indexer;
-    
-    PlexusContainer container;
-    
-    
-    @Component
-    WagonManager wagonManager;
-    
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException
-    {
-        try        
-        {
-            List<IndexCreator> creators = new ArrayList<IndexCreator>();
-            creators.addAll(container.lookupList(IndexCreator.class));
-            String indexurl = repositoryUrl + (!repositoryUrl.endsWith( "/") ? "/" : "") + ".index";
-            IndexingContext indexingContext = indexer.addIndexingContextForced(
-                                    "central", // context id
-                                    "central", // repository id
-                                    null, // repository folder
-                                    nexusIndexDirectory,
-                                    repositoryUrl,// repositoryUrl
-                                    indexurl,
-                                    creators);
-
-            String protocol = URI.create(repositoryUrl).getScheme();
-            ProxyInfo wagonProxy = wagonManager.getProxy( protocol );
-            TransferListener tr = new TransferListener() {
-
-                @Override
-                public void transferInitiated( TransferEvent transferEvent )
-                {
-                    getLog().info( "Initiated connection to " + repositoryUrl);
-                }
-
-                @Override
-                public void transferStarted( TransferEvent transferEvent )
-                {
-                    getLog().info( "Started transfer of " + repositoryUrl + "/.index/" + transferEvent.getResource().toString());
-                }
-
-                @Override
-                public void transferProgress( TransferEvent transferEvent, byte[] buffer, int length )
-                {
-                }
-
-                @Override
-                public void transferCompleted( TransferEvent transferEvent )
-                {
-                    getLog().info( "Finished transfer of " + repositoryUrl + "/.index/" + transferEvent.getResource().toString());
-                }
-
-                @Override
-                public void transferError( TransferEvent transferEvent )
-                {
-                    getLog().error( "Failed transfer of " + repositoryUrl + "/.index/" + transferEvent.getResource().toString(), transferEvent.getException());
-                }
-
-                @Override
-                public void debug( String message )
-                {
-                }
-            };
-            // MINDEXER-42: cannot use WagonHelper.getWagonResourceFetcher
-            Wagon wagon = container.lookup(Wagon.class, protocol);
-            if (wagon instanceof HttpWagon) { //#216401
-                HttpWagon httpwagon = (HttpWagon) wagon;
-                //#215343
-                Properties p = new Properties();
-                p.setProperty("User-Agent", "mojo/nb-repository-plugin");
-                httpwagon.setHttpHeaders(p);
-            }
-
-            ResourceFetcher fetcher = new WagonHelper.WagonFetcher(wagon, tr, null, wagonProxy);
-            IndexUpdateRequest iur = new IndexUpdateRequest(indexingContext, fetcher);
-
-            remoteIndexUpdater.fetchAndUpdateIndex(iur);
-            indexer.removeIndexingContext(indexingContext, false);
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "Cannot download index", ex);
-        }
-    }
-
-    @Override
-    public void contextualize( Context context ) throws ContextException
-    {
-        this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
-    }
-
-    
-}
diff --git a/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/PopulateRepositoryMojo.java b/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/PopulateRepositoryMojo.java
deleted file mode 100644
index 1cbdb17..0000000
--- a/nb-repository-plugin/src/main/java/org/netbeans/nbm/repository/PopulateRepositoryMojo.java
+++ /dev/null
@@ -1,1303 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2006 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm.repository;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.TopScoreDocCollector;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.FSDirectory;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.deployer.ArtifactDeployer;
-import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.handler.ArtifactHandler;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.installer.ArtifactInstallationException;
-import org.apache.maven.artifact.installer.ArtifactInstaller;
-import org.apache.maven.artifact.metadata.ArtifactMetadata;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.artifact.AttachedArtifact;
-import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.netbeans.nbm.utils.AbstractNetbeansMojo;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Input;
-import org.apache.tools.ant.taskdefs.PathConvert;
-import org.apache.tools.ant.types.FileSet;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * A goal for identifying NetBeans modules from the installation and populating the local
- * repository with them. Optionally you can also deploy to a remote repository.
- * <p>
- * If you are looking for an existing remote repository for NetBeans artifacts, check out
- * <a href="http://bits.netbeans.org/nexus/content/groups/netbeans/">http://bits.netbeans.org/nexus/content/groups/netbeans/</a>,
- * it contains API artifacts for multiple releases.
- * <a href="http://bits.netbeans.org/netbeans/trunk/maven-snapshot/">http://bits.netbeans.org/netbeans/trunk/maven-snapshot/</a>
- * may also be used for <code>SNAPSHOT</code> artifacts if you wish to test development builds.
- * </p><p>
- * See this <a href="http://mojo.codehaus.org/nbm-maven/nbm-maven-plugin/repository.html">HOWTO</a> on how to generate the NetBeans binaries required
- * by this goal.
- * </p>
- *
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- */
-@Mojo(name="populate", aggregator=true, requiresProject=false)
-public class PopulateRepositoryMojo
-    extends AbstractNetbeansMojo
-{
-    private static final String GROUP_API = ".api";
-    private static final String GROUP_IMPL = ".modules";
-    private static final String GROUP_EXTERNAL = ".external";
-    private static final String GROUP_CLUSTER = ".cluster";
-
-    
-    /**
-     * a prefix for groupId of generated content, 
-     * eg. for org.netbeans value will generate org.netbeans.cluster groupId for clusters and org.netbeans.modules for module artifacts.
-     * @since 1.2
-     */
-    @Parameter(property="groupIdPrefix", defaultValue = "org.netbeans")
-    private String groupIdPrefix;
-    
-    /**
-     * an url where to deploy the NetBeans artifacts. Optional, if not specified, the artifacts will be only installed
-     * in local repository, if you need to give credentials to access remote repo, the id of the server is hardwired to "netbeans".
-     */
-    @Parameter(property="deployUrl")
-    private String deployUrl;
-
-    /**
-     * By default the generated metadata is installed in local repository.
-     * Setting this parameter to false will avoid installing the bits. Only meaningful together with
-     * a defined "deployUrl" parameter.
-     * @since 3.0
-     */
-    @Parameter(defaultValue="false", property="skipInstall")
-    private boolean skipLocalInstall;
-
-
-    /**
-     * Location of NetBeans installation
-     */
-    @Parameter(property="netbeansInstallDirectory", required=true)
-    protected File netbeansInstallDirectory;
-
-    /**
-     * If you want to install/deploy also NetBeans api javadocs, download the javadoc zip file from netbeans.org
-     * expand it to a directory, it should contain multiple zip files. Define this parameter as absolute path to the zip files folder.
-     *
-     */
-    @Parameter(property="netbeansJavadocDirectory")
-    protected File netbeansJavadocDirectory;
-
-    /**
-     * Assumes a folder with &lt;code-name-base&gt;.zip files containing sources for modules.
-     */
-    @Parameter(property="netbeansSourcesDirectory")
-    protected File netbeansSourcesDirectory;
-
-    /**
-     * If defined, will match the nbm files found in the designated folder with the modules
-     * and upload the nbm file next to the module jar in local and remote repositories.
-     *
-     * Assumes a folder with &lt;code-name-base&gt;.nbm files containing nbm files for modules.
-     * @since 3.0
-     */
-    @Parameter(property="netbeansNbmDirectory", required=true)
-    protected File netbeansNbmDirectory;
-
-    /**
-     * When specified, will force all modules to have the designated version.
-     * Good when depending on releases. Then you would for example specify RELEASE50 in this parameter and
-     * all modules get this version in the repository. If not defined, the maven version is
-     * derived from the OpenIDE-Module-Specification-Version manifest attribute.
-     * <p>
-     * Highly Recommended!
-     * </p>
-     */
-    @Parameter(property="forcedVersion")
-    protected String forcedVersion;
-
-    /**
-     * When specified it points to a directory containing a Maven Indexer
-     * (Nexus) Lucene index. This index will be used to find external libraries that
-     * are referenced by NetBeans modules and populate the POM metadata with correct
-     * dependencies. Any dependencies not found this way, will be generated with a unique
-     * id under the org.netbeans.external groupId.
-     * <p/>
-     * Use the {@code download} goal to retrieve the index.
-     * @since 3.0
-     */
-    @Parameter(property="nexusIndexDirectory")
-    private File nexusIndexDirectory;
-
-    /**
-     * Whether to create cluster POMs in the {@code org.netbeans.cluster} group.
-     * Only meaningful when {@code forcedVersion} is defined.
-     * @since 3.7
-     */
-    @Parameter(defaultValue="true", property="defineCluster")   
-    private boolean defineCluster;
-
-    /**
-     * Optional remote repository to use for inspecting remote dependencies.
-     * This may be used to populate just part of an installation,
-     * when base modules are already available in Maven format.
-     * Currently only supported when {@code forcedVersion} is defined.
-     * @since 3.7
-     */
-    @Parameter(property="dependencyRepositoryUrl")
-    private String dependencyRepositoryUrl;
-
-    /**
-     * Repository ID to use when inspecting remote dependencies.
-     * Only meaningful when {@code dependencyRepositoryUrl} is defined.
-     * @since 3.7
-     */
-    @Parameter(defaultValue="temp", property="dependencyRepositoryId")
-    private String dependencyRepositoryId;
-
-    /**
-     * Colon separated artefact coordinate groupId:artefactId:version that
-     * represent parent to be used
-     *
-     * @since 1.4
-     */
-    @Parameter(property = "parentGAV", required = false)
-    private String parentGAV;
-    
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-    /**
-     * Local maven repository.
-     */
-    @Parameter(required=true, readonly=true, defaultValue="${localRepository}")
-    protected ArtifactRepository localRepository;
-
-    /**
-     * Maven ArtifactFactory.
-     */
-    @Component
-    private ArtifactFactory artifactFactory;
-
-    /**
-     * Maven ArtifactInstaller.
-     */
-    @Component
-    private ArtifactInstaller artifactInstaller;
-
-    /**
-     * Maven ArtifactDeployer.
-     *
-     */
-    @Component
-    private ArtifactDeployer artifactDeployer;
-
-    /**
-     * Maven ArtifactHandlerManager
-     *
-     */
-    @Component
-    private ArtifactHandlerManager artifactHandlerManager;
-
-    /**
-     * Maven ArtifactRepositoryFactory.
-     *
-     */
-    @Component
-    private ArtifactRepositoryFactory repositoryFactory;
-
-    @Component
-    private ArtifactResolver artifactResolver;
-
-    @Component
-    private ArtifactRepositoryLayout artifactRepositoryLayout;
-// </editor-fold>
-
-    // parent handler in case we have one
-    private Parent artefactParent = null;
-
-    @Override
-    public void execute()
-        throws MojoExecutionException
-    {
-        getLog().info( "Populate repository with NetBeans modules" );
-        Project antProject = antProject();
-        ArtifactRepository deploymentRepository = null;
-
-        if (parentGAV != null) 
-        {
-            // populate artefactParent
-            artefactParent = new Parent();
-            String[] split = parentGAV.split(":");
-            if (split.length != 3) {
-                throw new MojoExecutionException(
-                    "parentGAV should respect the following format groupId:artefactId:version" );
-            }
-            artefactParent.setGroupId( split[0] );
-            artefactParent.setArtifactId( split[1] );
-            artefactParent.setVersion( split[2] );
-        }
-
-        if ( deployUrl != null )
-        {
-            ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
-            deploymentRepository = repositoryFactory.createDeploymentArtifactRepository(
-                "netbeans", deployUrl, layout, true );
-        }
-        else if ( skipLocalInstall )
-        {
-            throw new MojoExecutionException(
-                    "When skipping install to local repository, one shall define the deployUrl parameter" );
-        }
-
-        IndexSearcher searcher = null;
-        if ( nexusIndexDirectory != null && nexusIndexDirectory.exists() )
-        {
-            try
-            {
-                Directory nexusDir = FSDirectory.open( nexusIndexDirectory.toPath() );
-                IndexReader nexusReader = DirectoryReader.open( nexusDir );
-                searcher = new IndexSearcher( nexusReader );
-                getLog().info( "Opened index with " + nexusReader.numDocs() + " documents" );
-            }
-            catch ( IOException ex )
-            {
-                getLog().error( "Could not open " + nexusIndexDirectory, ex );
-            }
-        }
-
-        if ( netbeansInstallDirectory == null )
-        {
-            Input input = (Input) antProject.createTask( "input" );
-            input.setMessage( "Please enter NetBeans installation directory:" );
-            input.setAddproperty( "installDir" );
-            try
-            {
-                input.execute();
-            }
-            catch ( BuildException e )
-            {
-                getLog().error( "Cannot run ant:input" );
-                throw new MojoExecutionException( e.getMessage(), e );
-            }
-            String prop = antProject.getProperty( "installDir" );
-            netbeansInstallDirectory = new File( prop );
-        }
-
-        File rootDir = netbeansInstallDirectory;
-        if ( !rootDir.exists() )
-        {
-            getLog().error( "NetBeans installation doesn't exist." );
-            throw new MojoExecutionException( "NetBeans installation doesn't exist." );
-        }
-        getLog().info( "Copying NetBeans artifacts from " + netbeansInstallDirectory );
-
-        PathConvert convert = (PathConvert) antProject.createTask( "pathconvert" );
-        convert.setPathSep( "," );
-        convert.setProperty( "netbeansincludes" );
-        FileSet set = new FileSet();
-        set.setDir( rootDir );
-        set.createInclude().setName( "**/modules/*.jar" );
-        set.createInclude().setName( "*/core/*.jar" );
-        set.createInclude().setName( "platform*/lib/*.jar" );
-
-        convert.createPath().addFileset( set );
-        try
-        {
-            convert.execute();
-        }
-        catch ( BuildException e )
-        {
-            getLog().error( "Cannot run ant:pathconvert" );
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-
-        String prop = antProject.getProperty( "netbeansincludes" );
-        StringTokenizer tok = new StringTokenizer( prop, "," );
-        HashMap<ModuleWrapper, Artifact> moduleDefinitions = new HashMap<ModuleWrapper, Artifact>();
-        HashMap<String, Collection<ModuleWrapper>> clusters = new HashMap<String, Collection<ModuleWrapper>>();
-        while ( tok.hasMoreTokens() )
-        {
-            String token = tok.nextToken();
-            File module = new File( token );
-            String clust = module.getAbsolutePath().substring( rootDir.getAbsolutePath().length() + 1 );
-            clust = clust.substring( 0, clust.indexOf( File.separator ) );
-            ExamineManifest examinator = new ExamineManifest( getLog() );
-            examinator.setPopulateDependencies( true );
-            examinator.setJarFile( module );
-            examinator.checkFile();
-            if ( examinator.isNetBeansModule() || examinator.isOsgiBundle() )
-            {
-                //TODO get artifact id from the module's manifest?
-                String artifact = module.getName().substring( 0, module.getName().indexOf( ".jar" ) );
-                if ( "boot".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-bootstrap";
-                }
-                if ( "core".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-core-startup";
-                }
-                if ( "core-base".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-core-startup-base";
-                }                
-                String version = forcedVersion == null ? examinator.getSpecVersion() : forcedVersion;
-                String group = groupIdPrefix + (examinator.isOsgiBundle() ? GROUP_EXTERNAL : examinator.hasPublicPackages() ? GROUP_API : GROUP_IMPL);
-                Artifact art = createArtifact( artifact, version, group );
-                if ( examinator.isOsgiBundle() )
-                {
-                    Dependency dep = findExternal( searcher, module );
-                    if ( dep != null )
-                    {
-                        // XXX use those coords instead of publishing this
-                        // (for now all bundles are from Orbit, which does not publish to Central, or specially built)
-                    }
-                }
-                ModuleWrapper wr = new ModuleWrapper( artifact, version, group, examinator, module );
-                wr.setCluster( clust );
-                moduleDefinitions.put( wr, art );
-                Collection<ModuleWrapper> col = clusters.get( clust );
-                if ( col == null )
-                {
-                    col = new ArrayList<ModuleWrapper>();
-                    clusters.put( clust, col );
-                }
-                col.add( wr );
-            }
-        }
-        List<ModuleWrapper> wrapperList = new ArrayList<ModuleWrapper>( moduleDefinitions.keySet() );
-        int count = wrapperList.size() + 1;
-        int index = 0;
-        File javadocRoot = null;
-        if ( netbeansJavadocDirectory != null )
-        {
-            javadocRoot = netbeansJavadocDirectory ;
-            if ( !javadocRoot.exists() )
-            {
-                javadocRoot = null;
-                throw new MojoExecutionException(
-                    "The netbeansJavadocDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-        File sourceRoot = null;
-        if ( netbeansSourcesDirectory != null )
-        {
-            sourceRoot = netbeansSourcesDirectory;
-            if ( !sourceRoot.exists() )
-            {
-                sourceRoot = null;
-                throw new MojoExecutionException(
-                    "The netbeansSourceDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-
-        File nbmRoot = null;
-        if ( netbeansNbmDirectory != null )
-        {
-            nbmRoot = netbeansNbmDirectory;
-            if ( !nbmRoot.exists() )
-            {
-                nbmRoot = null;
-                throw new MojoExecutionException(
-                    "The nbmDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-
-        List<ExternalsWrapper> externals = new ArrayList<ExternalsWrapper>();
-        try
-        {
-            for ( Map.Entry<ModuleWrapper, Artifact> elem : moduleDefinitions.entrySet() )
-            {
-                ModuleWrapper man = elem.getKey();
-                Artifact art = elem.getValue();
-                index = index + 1;
-                getLog().info( "Processing " + index + "/" + count );
-                File pom = createMavenProject( man, wrapperList, externals, searcher );
-                ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                File javadoc = null;
-                Artifact javadocArt = null;
-                if ( javadocRoot != null )
-                {
-                    File zip = new File( javadocRoot, art.getArtifactId() + ".zip" );
-                    if ( zip.exists() )
-                    {
-                        javadoc = zip;
-                        javadocArt = createAttachedArtifact( art, javadoc, "jar", "javadoc" );
-                    }
-                }
-                File source = null;
-                Artifact sourceArt = null;
-                if ( sourceRoot != null )
-                {
-                    File zip = new File( sourceRoot, art.getArtifactId() + ".zip" );
-                    if ( zip.exists() )
-                    {
-                        source = zip;
-                        sourceArt = createAttachedArtifact( art, source, "jar", "sources" );
-                    }
-                }
-                File nbm = null;
-                Artifact nbmArt = null;
-                if ( nbmRoot != null )
-                {
-                    File zip = new File( nbmRoot, art.getArtifactId() + ".nbm" );
-
-                    if ( !zip.exists() )
-                    {
-                        zip = new File( nbmRoot,
-                            man.getCluster() + File.separator + art.getArtifactId() + ".nbm" );
-                    }
-                    if ( zip.exists() )
-                    {
-                        nbm = zip;
-                        nbmArt = createAttachedArtifact( art, nbm, "nbm-file", null );
-                        if ( nbmArt.getArtifactHandler().getExtension().equals( "nbm-file" ) )
-                        {
-                            // Maven 2.x compatibility.
-                            nbmArt = createAttachedArtifact( art, nbm, "nbm", null );
-                        }
-                        assert nbmArt.getArtifactHandler().getExtension().equals( "nbm" );
-                    }
-                }
-                File moduleJar = man.getFile();
-                File moduleJarMinusCP = null;
-                if ( ! man.getModuleManifest().getClasspath().isEmpty() )
-                {
-                    try
-                    {
-                        moduleJarMinusCP = File.createTempFile( man.getArtifact(), ".jar" );
-                        moduleJarMinusCP.deleteOnExit();
-                        InputStream is = new FileInputStream( moduleJar );
-                        try
-                        {
-                            OutputStream os = new FileOutputStream( moduleJarMinusCP );
-                            try
-                            {
-                                JarInputStream jis = new JarInputStream( is );
-                                Manifest mani = new Manifest( jis.getManifest() );
-                                mani.getMainAttributes().remove( Attributes.Name.CLASS_PATH );
-                                if ( !man.deps.isEmpty() )
-                                { // MNBMODULE-132
-                                    StringBuilder b = new StringBuilder();
-                                    for ( Dependency dep : man.deps )
-                                    {
-                                        if ( b.length() > 0 )
-                                        {
-                                            b.append( ' ' );
-                                        }
-                                        b.append( dep.getGroupId() ).append( ':' ).append( dep.getArtifactId() ).append( ':' ).append( dep.getVersion() );
-                                        if (dep.getClassifier() != null) {
-                                            b.append(":").append(dep.getClassifier());
-                                        }
-                                    }
-                                    mani.getMainAttributes().putValue( "Maven-Class-Path", b.toString() );
-                                }
-                                else
-                                {
-                                    getLog().warn( "did not find any external artifacts for " + man.getModule() );
-                                }
-                                JarOutputStream jos = new JarOutputStream( os, mani );
-                                JarEntry entry;
-                                while ( ( entry = jis.getNextJarEntry() ) != null )
-                                {
-                                    if ( entry.getName().matches( "META-INF/.+[.]SF" ) )
-                                    {
-                                        throw new IOException( "cannot handle signed JARs" );
-                                    }
-                                    jos.putNextEntry( entry );
-                                    byte[] buf = new byte[(int) entry.getSize()];
-                                    int read = jis.read( buf, 0, buf.length );
-                                    if ( read != buf.length )
-                                    {
-                                        throw new IOException( "read wrong amount" );
-                                    }
-                                    jos.write( buf );
-                                }
-                                jos.close();
-                            }
-                            finally
-                            {
-                                os.close();
-                            }
-                        }
-                        finally
-                        {
-                            is.close();
-                        }
-                    }
-                    catch ( IOException x )
-                    {
-                        getLog().warn( "Could not process " + moduleJar + ": " + x, x );
-                        moduleJarMinusCP.delete();
-                        moduleJarMinusCP = null;
-                    }
-                }
-                try
-                {
-                    if ( !skipLocalInstall )
-                    {
-                        install( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art );
-                        if ( javadoc != null )
-                        {
-                            install( javadoc, javadocArt );
-                        }
-                        if ( source != null )
-                        {
-                            install( source, sourceArt );
-                        }
-                        if ( nbm != null )
-                        {
-                            install( nbm, nbmArt );
-                        }
-                    }
-                    try
-                    {
-                        if ( deploymentRepository != null )
-                        {
-                            artifactDeployer.deploy( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art,
-                                                     deploymentRepository, localRepository );
-                            if ( javadoc != null )
-                            {
-                                artifactDeployer.deploy( javadoc, javadocArt, deploymentRepository, localRepository );
-                            }
-                            if ( source != null )
-                            {
-                                artifactDeployer.deploy( source, sourceArt, deploymentRepository, localRepository );
-                            }
-                            if ( nbm != null )
-                            {
-                                artifactDeployer.deploy( nbm, nbmArt, deploymentRepository, localRepository );
-                            }
-                        }
-                    }
-                    catch ( ArtifactDeploymentException ex )
-                    {
-                        throw new MojoExecutionException( "Error Deploying artifact", ex );
-                    }
-                }
-                finally
-                {
-                    if ( moduleJarMinusCP != null )
-                    {
-                        moduleJarMinusCP.delete();
-                    }
-                }
-            }
-        }
-        finally
-        {
-            /*if ( searcher != null )
-            {
-                try
-                {
-                    searcher.close();
-                }
-                catch ( IOException ex )
-                {
-                    getLog().error( ex );
-                }
-            }*/
-        }
-
-        //process collected non-recognized external jars..
-        if ( externals.size() > 0 )
-        {
-            index = 0;
-            count = externals.size();
-            for ( ExternalsWrapper ex : externals )
-            {
-                Artifact art = createArtifact( ex.getArtifact(), ex.getVersion(), ex.getGroupid() );
-                index = index + 1;
-                getLog().info( "Processing external " + index + "/" + count );
-                File pom = createExternalProject( ex );
-                ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                if ( !skipLocalInstall )
-                {
-                    install( ex.getFile(), art );
-                }
-                try
-                {
-                    if ( deploymentRepository != null )
-                    {
-                        artifactDeployer.deploy( ex.getFile(), art,
-                            deploymentRepository, localRepository );
-                    }
-                }
-                catch ( ArtifactDeploymentException exc )
-                {
-                    throw new MojoExecutionException( "Error Deploying artifact", exc );
-                }
-            }
-        }
-
-        if ( ! defineCluster )
-        {
-            getLog().info( "Not creating cluster POMs." );
-        }
-        else if ( forcedVersion == null )
-        {
-            getLog().warn( "Version not specified, cannot create cluster POMs." );
-        }
-        else
-        {
-            for ( Map.Entry<String, Collection<ModuleWrapper>> elem : clusters.entrySet() )
-            {
-                String cluster = stripClusterName( elem.getKey() );
-                Collection<ModuleWrapper> modules = elem.getValue();
-                getLog().info( "Processing cluster " + cluster );
-                Artifact art = createClusterArtifact( cluster, forcedVersion );
-                File pom = createClusterProject( art, modules );
-                ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                if ( !skipLocalInstall )
-                {
-                    install( pom, art );
-                }
-                try
-                {
-                    if ( deploymentRepository != null )
-                    {
-                        artifactDeployer.deploy( pom, art, deploymentRepository, localRepository );
-                    }
-                }
-                catch ( ArtifactDeploymentException ex )
-                {
-                    throw new MojoExecutionException( "Error Deploying artifact", ex );
-                }
-            }
-
-        }
-    }
-
-    void install( File file, Artifact art )
-        throws MojoExecutionException
-    {
-        assert localRepository != null;
-        try
-        {
-            artifactInstaller.install( file, art, localRepository );
-        }
-        catch ( ArtifactInstallationException e )
-        {
-            // TODO: install exception that does not give a trace
-            throw new MojoExecutionException( "Error installing artifact", e );
-        }
-    }
-
-    //performs the same tasks as the MavenProjectHelper
-    Artifact createAttachedArtifact( Artifact primary, File file, String type, String classifier )
-    {
-        assert type != null;
-
-        ArtifactHandler handler;
-
-        handler = artifactHandlerManager.getArtifactHandler( type );
-
-        if ( handler == null )
-        {
-            getLog().warn( "No artifact handler for " + type );
-            handler = artifactHandlerManager.getArtifactHandler( "jar" );
-        }
-
-        Artifact artifact = new AttachedArtifact( primary, type, classifier, handler );
-
-        artifact.setFile( file );
-        artifact.setResolved( true );
-        return artifact;
-    }
-
-    private File createMavenProject( ModuleWrapper wrapper, List<ModuleWrapper> wrapperList,
-                                     List<ExternalsWrapper> externalsList, IndexSearcher searcher )
-            throws MojoExecutionException
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( wrapper.getGroup() );
-        mavenModel.setArtifactId( wrapper.getArtifact() );
-        mavenModel.setVersion( wrapper.getVersion() );
-        mavenModel.setPackaging( "jar" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null ) {
-            mavenModel.setParent( artefactParent );
-        }
-        ExamineManifest man = wrapper.getModuleManifest();
-        List<Dependency> deps = new ArrayList<Dependency>();
-        if ( !man.getDependencyTokens().isEmpty() )
-        {
-            for ( String elem : man.getDependencyTokens() )
-            {
-                // create pseudo wrapper
-                ModuleWrapper wr = new ModuleWrapper( elem );
-                int index = wrapperList.indexOf( wr );
-                if ( index > -1 )
-                {
-                    wr = wrapperList.get( index );
-                    Dependency dep = new Dependency();
-                    dep.setArtifactId( wr.getArtifact() );
-                    dep.setGroupId( wr.getGroup() );
-                    dep.setVersion( wr.getVersion() );
-                    dep.setType( "jar" );
-                    //we don't want the API modules to depend on non-api ones..
-                    // otherwise the transitive dependency mechanism pollutes your classpath..
-                    if ( wrapper.getModuleManifest().hasPublicPackages() && !wr.getModuleManifest().hasPublicPackages() )
-                    {
-                        dep.setScope( "runtime" );
-                    }
-                    deps.add( dep );
-                }
-                else if ( dependencyRepositoryUrl != null )
-                {
-                    Dependency dep = new Dependency();
-                    dep.setType( "jar" );
-                    String artifactId = elem.replace( '.', '-' );
-                    dep.setArtifactId( artifactId );
-                    if ( forcedVersion == null )
-                    {
-                        throw new MojoExecutionException( "Cannot use dependencyRepositoryUrl without forcedVersion" );
-                    }
-                    dep.setVersion( forcedVersion );
-                    ArtifactRepositoryPolicy policy = new ArtifactRepositoryPolicy();
-                    List<ArtifactRepository> repos = Collections.singletonList(
-                            repositoryFactory.createArtifactRepository( dependencyRepositoryId, dependencyRepositoryUrl, artifactRepositoryLayout, policy, policy) );
-                    try
-                    {
-                        artifactResolver.resolve( artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_API, artifactId, forcedVersion, "pom" ), repos, localRepository );
-                        dep.setGroupId( groupIdPrefix + GROUP_API );
-                    }
-                    catch ( AbstractArtifactResolutionException x )
-                    {
-                        try
-                        {
-                            artifactResolver.resolve( artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_IMPL, artifactId, forcedVersion, "pom" ), repos, localRepository );
-                            dep.setGroupId( groupIdPrefix + GROUP_IMPL );
-                            if ( wrapper.getModuleManifest().hasPublicPackages() )
-                            {
-                                dep.setScope( "runtime" );
-                            }
-                        }
-                        catch ( AbstractArtifactResolutionException x2 )
-                        {
-                            try
-                            {
-                                artifactResolver.resolve( artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_EXTERNAL, artifactId, forcedVersion, "pom" ), repos, localRepository );
-                                dep.setGroupId( groupIdPrefix + GROUP_EXTERNAL );
-                                if ( wrapper.getModuleManifest().hasPublicPackages() )
-                                {
-                                    dep.setScope( "runtime" );
-                                }
-                            }
-                            catch ( AbstractArtifactResolutionException x3 )
-                            {
-                                getLog().warn( x3.getOriginalMessage() );
-                                throw new MojoExecutionException( "No module found for dependency '" + elem + "'", x );
-                            }
-
-                           
-                        }
-
-                    }
-                    deps.add( dep );
-                }
-                else
-                {
-                    getLog().warn( "No module found for dependency '" + elem + "'" );
-                }
-            }
-        }
-        //need some generic way to handle Classpath: items.
-        //how to figure the right version?
-        String cp = wrapper.getModuleManifest().getClasspath();
-        if ( !cp.isEmpty() )
-        {
-            StringTokenizer tok = new StringTokenizer( cp );
-            while ( tok.hasMoreTokens() )
-            {
-                String path = tok.nextToken();
-                File f = new File( wrapper.getFile().getParentFile(), path );
-                if ( f.exists() )
-                {
-                    Dependency dep = findExternal( searcher, f );
-                    if ( dep != null )
-                    {
-                        deps.add( dep );
-                        // XXX MNBMODULE-170: repack NBM with *.external
-                    }
-                    else
-                    {
-                        ExternalsWrapper ex = new ExternalsWrapper();
-                        ex.setFile( f );
-                        String artId = f.getName();
-                        if ( artId.endsWith( ".jar" ) )
-                        {
-                            artId = artId.substring( 0, artId.length() - ".jar".length() );
-                        }
-                        ex.setVersion( wrapper.getVersion() );
-                        ex.setArtifact( artId );
-                        ex.setGroupid( groupIdPrefix + GROUP_EXTERNAL );
-                        externalsList.add( ex );
-                        dep = new Dependency();
-                        dep.setArtifactId( artId );
-                        dep.setGroupId( groupIdPrefix + GROUP_EXTERNAL );
-                        dep.setVersion( wrapper.getVersion() );
-                        dep.setType( "jar" );
-                        deps.add( dep );
-                    }
-                }
-            }
-        }
-
-        wrapper.deps = deps;
-        mavenModel.setDependencies( deps );
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-
-        }
-        finally
-        {
-            if ( writer != null )
-            {
-                try
-                {
-                    writer.close();
-                }
-                catch ( IOException io )
-                {
-                    io.printStackTrace();
-                }
-            }
-        }
-        return fil;
-    }
-
-    private Dependency findExternal( IndexSearcher searcher, File f )
-    {
-        if ( searcher == null )
-        {
-            return null;
-        }
-        try
-        {
-            MessageDigest shaDig = MessageDigest.getInstance( "SHA1" );
-            InputStream is = new FileInputStream( f );
-            try {
-                OutputStream os = new DigestOutputStream( new NullOutputStream(), shaDig );
-                IOUtil.copy( is, os );
-                os.close();
-            }
-            finally
-            {
-                is.close();
-            }
-            String sha = encode( shaDig.digest() );
-            TermQuery q = new TermQuery( new Term( "1", sha ) );
-            TopScoreDocCollector collector = TopScoreDocCollector.create( 5 );
-            searcher.search(q, collector);
-            ScoreDoc[] hits = collector.topDocs().scoreDocs;
-            if ( hits.length >= 1 )
-            {
-                int docId = hits[0].doc;    
-                Document doc = searcher.doc(docId);                
-                IndexableField idField = doc.getField( "u" );
-                if ( idField != null )
-                {
-                    String id = idField.stringValue();
-                    String[] splits = StringUtils.split( id, "|" );
-                    Dependency dep = new Dependency();
-                    dep.setArtifactId( splits[1] );
-                    dep.setGroupId( splits[0] );
-                    dep.setVersion( splits[2] );
-                    dep.setType( "jar" );
-                    if ( splits.length > 3 && !"NA".equals( splits[3] ) )
-                    {
-                        dep.setClassifier( splits[3] );
-                    }
-                    getLog().info( "found match " + splits[0] + ":" + splits[1] + ":" + splits[2] + " for " + f.getName() );
-                    return dep;
-                }
-                else
-                {
-                    getLog().error( "no idField for " + q );
-                }
-            }
-            else
-            {
-                getLog().info( "no repository match for " + f.getName() );
-            }
-        }
-        catch ( Exception x )
-        {
-            getLog().error( x );
-        }
-        return null;
-    }
-
-    File createExternalProject( ExternalsWrapper wrapper )
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( wrapper.getGroupid() );
-        mavenModel.setArtifactId( wrapper.getArtifact() );
-        mavenModel.setVersion( wrapper.getVersion() );
-        mavenModel.setPackaging( "jar" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null ) {
-            mavenModel.setParent( artefactParent );
-        }
-        mavenModel.setName( 
-            "Maven definition for " + wrapper.getFile().getName() + " - external part of NetBeans module." );
-        mavenModel.setDescription( 
-            "POM and identification for artifact that was not possible to uniquely identify as a maven dependency." );
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-        }
-        finally
-        {
-            if ( writer != null )
-            {
-                try
-                {
-                    writer.close();
-                }
-                catch ( IOException io )
-                {
-                    io.printStackTrace();
-                }
-            }
-        }
-        return fil;
-
-    }
-
-    private File createClusterProject( Artifact cluster, Collection<ModuleWrapper> mods )
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( cluster.getGroupId() );
-        mavenModel.setArtifactId( cluster.getArtifactId() );
-        mavenModel.setVersion( cluster.getVersion() );
-//        mavenModel.setPackaging("nbm-application");
-        mavenModel.setPackaging( "pom" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null ) {
-            mavenModel.setParent( artefactParent );
-        }
-        List<Dependency> deps = new ArrayList<Dependency>();
-        for ( ModuleWrapper wr : mods )
-        {
-            Dependency dep = new Dependency();
-            dep.setArtifactId( wr.getArtifact() );
-            dep.setGroupId( wr.getGroup() );
-            dep.setVersion( wr.getVersion() );
-            if ( wr.getModuleManifest().isNetBeansModule() )
-            {
-                dep.setType( "nbm-file" );
-            }
-            deps.add( dep );
-        }
-        mavenModel.setDependencies( deps );
-//        
-//        
-//        Build build = new Build();
-//        Plugin plg = new Plugin();
-//        plg.setGroupId("org.codehaus.mojo");
-//        plg.setArtifactId("nbm-maven-plugin");
-//        plg.setVersion("2.7-SNAPSHOT");
-//        plg.setExtensions(true);
-//        build.addPlugin(plg);
-//        mavenModel.setBuild(build);
-
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-        }
-        finally
-        {
-            IOUtil.close( writer );
-        }
-        return fil;
-    }
-
-    Artifact createArtifact( String artifact, String version, String group )
-    {
-        return artifactFactory.createBuildArtifact( group, artifact, version, "jar" );
-    }
-
-    private Artifact createClusterArtifact( String artifact, String version )
-    {
-        return artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_CLUSTER, artifact, version, "pom" );
-    }
-
-    private static Pattern PATTERN_CLUSTER = Pattern.compile( "([a-zA-Z]+)[0-9\\.]*" );
-    static String stripClusterName( String key )
-    {
-        Matcher m = PATTERN_CLUSTER.matcher( key );
-        if ( m.matches() )
-        {
-            return m.group( 1 );
-        }
-        return key;
-    }
-
-    private static class ExternalsWrapper
-    {
-
-        private File file;
-
-        private String artifact;
-
-        private String groupid;
-
-        public String getArtifact()
-        {
-            return artifact;
-        }
-
-        public void setArtifact( String artifact )
-        {
-            this.artifact = artifact;
-        }
-
-        public File getFile()
-        {
-            return file;
-        }
-
-        public void setFile( File file )
-        {
-            this.file = file;
-        }
-
-        public String getGroupid()
-        {
-            return groupid;
-        }
-
-        public void setGroupid( String groupid )
-        {
-            this.groupid = groupid;
-        }
-
-        public String getVersion()
-        {
-            return version;
-        }
-
-        public void setVersion( String version )
-        {
-            this.version = version;
-        }
-        private String version;
-
-    }
-
-    private static class ModuleWrapper
-    {
-
-        ExamineManifest man;
-
-        private String artifact;
-
-        private String version;
-
-        private String group;
-
-        private File file;
-
-        private String cluster;
-
-        String module;
-
-        List<Dependency> deps;
-
-        public ModuleWrapper( String module )
-        {
-            this.module = module;
-        }
-
-        public ModuleWrapper( String art, String ver, String grp, ExamineManifest manifest, File fil )
-        {
-            man = manifest;
-            artifact = art;
-            version = ver;
-            group = grp;
-            file = fil;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return getModule().hashCode();
-        }
-
-        @Override
-        public boolean equals( Object obj )
-        {
-            return obj instanceof ModuleWrapper && getModule().equals( ( (ModuleWrapper) obj ).getModule() );
-        }
-
-        public String getModule()
-        {
-            return module != null ? module : getModuleManifest().getModule();
-        }
-
-        public ExamineManifest getModuleManifest()
-        {
-            return man;
-        }
-
-        private String getArtifact()
-        {
-            return artifact;
-        }
-
-        private String getVersion()
-        {
-            return version;
-        }
-
-        private String getGroup()
-        {
-            return group;
-        }
-
-        private File getFile()
-        {
-            return file;
-        }
-
-        void setCluster( String clust )
-        {
-            cluster = clust;
-        }
-
-        String getCluster()
-        {
-            return cluster;
-        }
-    }
-
-    private static class NullOutputStream
-        extends OutputStream
-    {
-
-        @Override
-        public void write( int b )
-            throws IOException
-        {
-        }
-    }
-
-    /**
-     * Encodes a 128 bit or 160-bit byte array into a String.
-     *
-     * @param binaryData Array containing the digest
-     * @return Encoded hex string, or null if encoding failed
-     */
-    static String encode( byte[] binaryData )
-    {
-        int bitLength = binaryData.length * 8;
-        if ( bitLength != 128 && bitLength != 160 )
-        {
-            throw new IllegalArgumentException(
-                "Unrecognised length for binary data: " + bitLength + " bits" );
-        }
-        return String.format( "%0" + bitLength / 4 + "x", new BigInteger( 1, binaryData ) );
-    }
-}
diff --git a/nb-repository-plugin/src/site/apt/index.apt b/nb-repository-plugin/src/site/apt/index.apt
deleted file mode 100644
index ab28c76..0000000
--- a/nb-repository-plugin/src/site/apt/index.apt
+++ /dev/null
@@ -1,36 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License.
-
- ------
- Maven 2 NB Repository Plugin 
- ------
- Milos Kleint
- <mkleint@codehaus.org>
- ------
- 2012-10-19
-
-NetBeans Repository plugin
-
- The plugin is capable of populating the local or remote maven repository with module jars and NBM files from a given NetBeans installation. Useful for
-module development, modules with public APIs are separated from those without a public API.
-See the {{{./populate-mojo.html}<<<populate>>>}} goal and the {{{./repository.html}HOWTO document}} for details.
-
- To get access to a repository with NetBeans.org module artifacts and metadata, add {{{http://bits.netbeans.org/maven2/}http://bits.netbeans.org/maven2/}} repository to your project POM
-or the repository manager you are using. The repository hosts binaries of NetBeans 6.5 and later.
-
- Also see: {{{http://wiki.netbeans.org/NetBeansDeveloperFAQ#Mavenized_Builds}Maven NBM development FAQs}}
-
diff --git a/nb-repository-plugin/src/site/apt/repository.apt b/nb-repository-plugin/src/site/apt/repository.apt
deleted file mode 100644
index 758634b..0000000
--- a/nb-repository-plugin/src/site/apt/repository.apt
+++ /dev/null
@@ -1,58 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License.
-
- ------
- Maven 2 NB Repository Plugin 
- ------
- Milos Kleint
- <mkleint@codehaus.org>
- ------
- 2012-10-19
-
-HOWTO: Upload NetBeans release binaries to a Maven repository
-
-
- There is a goal that converts the NetBeans module information into Maven metadata
-and is capable of uploading the module jar file, javadoc, sources and nbm files to local
-and remote repositories. See {{{./populate-mojo.html}<<<populate>>> goal}} description.
-
- For a binary-only upload (jar files and nbm files only), it's possible to download the bits from official sites. See below for URLs.
-For the complete upload, you will need to checkout the sources of the IDE/Platform you
-want to upload. See this FAQ entry on {{{http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial}HowTo checkout sources from Hg}}
-
- To have external dependencies correctly identified by their real GAV, you will need to download the index from central (or other) repository. 
-See {{{./download-mojo.html}<<<download>>> goal}}
-
- The goal has multiple input parameters that link the goal to binaries prepared beforehand.
-
-   * <<netbeansInstallDirectory>> designates the base directory where resides the NetBeans installation
-that shall be uploaded. It can be either {{{http://www.netbeans.org/downloads/index.html}downloaded as zip}} or built from sources.
-Run <<<ant>>> in your local hg clone to build the distribution at <<<nbbuild/netbeans>>> sundirectory.
-
-   * <<netbeansNbmDirectory>> designates the base directory where the nbm files are located.
-Run <<<ant build-nbms>>> in your local <<<hg clone>>> to build the nbms at <<<nbbuild/nbms>>> directory or download it from the
-{{{http://updates.netbeans.org/netbeans}http://updates.netbeans.org/netbeans}} space eg.
-final <<6.5>> version at {{{http://updates.netbeans.org/netbeans/6.5/final/uc/}http://updates.netbeans.org/netbeans/<<6.5>>/final/uc/}}.
-Use a tool like <<<wget>>> to download the complete directory tree to a directory designated by the <<netbeansNbmDirectory>> parameter.
-
-  * <<netbeansSourcesDirectory>> designates the base directory containing zip files with module jar sources.
-Run <<<ant build-source-zips>>> in your local hg clone to build the nbms at <<<nbbuild/build/source-zips>>> directory.
-
-  * <<netbeansJavadocDirectory>> designates the base directory containing zip files with javadoc zips for modules with public apis.
-Run <<<ant build-javadoc>>> in your local hg clone to build the nbms at <<<nbbuild/build/javadoc>>> directory.
-
-
diff --git a/nb-repository-plugin/src/site/site.xml b/nb-repository-plugin/src/site/site.xml
deleted file mode 100644
index 9b708e3..0000000
--- a/nb-repository-plugin/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-    <skin>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>maven-netbeans-skin</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </skin>
-    <body>
-    <menu name="Overview">
-      <item name="Usage" href="index.html"/>
-      <item name="Plugin Goals" href="plugin-info.html"/>
-      <!-- <item name="Javadoc" href="apidocs/index.html"/> -->
-      <!--item name="FAQ" href="faq.html"/-->
-    </menu>
-    <!--<menu name="Upgrade">   
-      <item name="2.4 -> 2.5 upgrade" href="2425upgrade.html"/>
-      <item name="2.6 -> 3.0 upgrade" href="2630upgrade.html"/>
-    </menu>-->
-    <menu name="HOWTOs ">
-      <item name="Populate repository" href="repository.html"/>
-    </menu>
-  </body>
-</project>
-
diff --git a/nb-repository-plugin/src/test/java/org/netbeans/nbm/repository/PopulateRepositoryMojoTest.java b/nb-repository-plugin/src/test/java/org/netbeans/nbm/repository/PopulateRepositoryMojoTest.java
deleted file mode 100644
index 369544b..0000000
--- a/nb-repository-plugin/src/test/java/org/netbeans/nbm/repository/PopulateRepositoryMojoTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 2010 mkleint.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-
-package org.netbeans.nbm.repository;
-
-import org.netbeans.nbm.repository.PopulateRepositoryMojo;
-import java.io.File;
-import junit.framework.TestCase;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-import org.codehaus.plexus.util.FileUtils;
-
-public class PopulateRepositoryMojoTest extends TestCase /** AbstractMojoTestCase  the only way out of dependency hell.**/{
-    
-    public void testStripClusterName()
-    {
-        assertEquals( "platform", PopulateRepositoryMojo.stripClusterName( "platform9" ) );
-        assertEquals( "platform", PopulateRepositoryMojo.stripClusterName( "platform11" ) );
-        assertEquals( "nb", PopulateRepositoryMojo.stripClusterName( "nb6.9" ) );
-        assertEquals( "extra", PopulateRepositoryMojo.stripClusterName( "extra" ) );
-    }
-
-    public void testInstall() throws Exception
-    {
-//TODO how is this done on maven3?
-//        PopulateRepositoryMojo mojo = ( PopulateRepositoryMojo ) lookupMojo( "populate", new File( getBasedir(), "src/test/resources/PopulateMojoTest.xml" ) );
-//        File repo = new File( System.getProperty( "java.io.tmpdir" ), "PopulateRepositoryMojoTest" );
-//        FileUtils.deleteDirectory( repo );
-//        mojo.localRepository = new DefaultArtifactRepository( "test", repo.toURI().toString(), new DefaultRepositoryLayout() );
-//        Artifact art1 = mojo.createArtifact( "testarg", "1.0", "testgrp" );
-//        File f = File.createTempFile( "PopulateRepositoryMojoTest", ".nbm" );
-//        f.deleteOnExit();
-//        Artifact art2 = mojo.createAttachedArtifact( art1, f, "nbm-file", null );
-//        assertEquals( "nbm", art2.getArtifactHandler().getExtension() );
-//        //TODO does not work because of missing session
-////        mojo.install( f, art2 );
-////        assertTrue( new File( repo, "testgrp/testarg/1.0/testarg-1.0.nbm" ).isFile() );
-////        assertFalse( new File( repo, "testgrp/testarg/1.0/testarg-1.0.jar" ).isFile() );
-    }
-
-    public void testEncode() throws Exception
-    {
-        assertEquals( "057558504e1d03e57ce6fd80ad983b3c2e803b40", PopulateRepositoryMojo.encode( new byte[] {
-            (byte) 0x05, (byte) 0x75, (byte) 0x58, (byte) 0x50, (byte) 0x4e, (byte) 0x1d, (byte) 0x03, (byte) 0xe5, (byte) 0x7c, (byte) 0xe6,
-            (byte) 0xfd, (byte) 0x80, (byte) 0xad, (byte) 0x98, (byte) 0x3b, (byte) 0x3c, (byte) 0x2e, (byte) 0x80, (byte) 0x3b, (byte) 0x40,
-        } ) );
-        assertEquals( "ca70822c47a67fc3a11670270567c2d01566dae1", PopulateRepositoryMojo.encode( new byte[] {
-            (byte) 0xca, (byte) 0x70, (byte) 0x82, (byte) 0x2c, (byte) 0x47, (byte) 0xa6, (byte) 0x7f, (byte) 0xc3, (byte) 0xa1, (byte) 0x16,
-            (byte) 0x70, (byte) 0x27, (byte) 0x05, (byte) 0x67, (byte) 0xc2, (byte) 0xd0, (byte) 0x15, (byte) 0x66, (byte) 0xda, (byte) 0xe1,
-        } ) );
-    }
-
-}
diff --git a/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml b/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml
deleted file mode 100644
index 233d42c..0000000
--- a/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nb-repository-plugin</artifactId>
-                <configuration/>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/nbm-maven-harness/pom.xml b/nbm-maven-harness/pom.xml
deleted file mode 100644
index 69dd510..0000000
--- a/nbm-maven-harness/pom.xml
+++ /dev/null
@@ -1,255 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <artifactId>nbm-maven-harness</artifactId>
-    <version>9.0-SNAPSHOT</version>
-    <name>Apache NetBeans Maven Utilities - NBM Harness for Maven</name>
-    <url>http://bits.netbeans.org/mavenutilities/nbm-maven-harness</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANS</url>
-    </issueManagement>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.4</version>
-                <executions>
-                    <execution>
-                        <phase>generate-resources</phase>
-                        <id>unpack-harness</id>
-                        <goals>
-                            <goal>get</goal>
-                        </goals>
-                        <configuration>
-                            <artifact>org.netbeans.modules:org-netbeans-modules-apisupport-harness:${netbeans.version}:nbm</artifact>
-                            <transitive>false</transitive>
-                            <remoteRepositories>${netbeans.repo}</remoteRepositories>
-                            <destination>${project.build.directory}/harness.nbm</destination>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <phase>generate-resources</phase>
-                        <id>unpack-installer</id>
-                        <goals>
-                            <goal>get</goal>
-                        </goals>
-                        <configuration>
-                            <artifact>org.netbeans.modules:org-netbeans-libs-nbi-ant:${netbeans.version}:nbm</artifact>
-                            <transitive>false</transitive>
-                            <remoteRepositories>${netbeans.repo}</remoteRepositories>
-                            <destination>${project.build.directory}/nbi-ant.nbm</destination>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <phase>generate-resources</phase>
-                        <id>unpack-installer-engine</id>
-                        <goals>
-                            <goal>get</goal>
-                        </goals>
-                        <configuration>
-                            <artifact>org.netbeans.modules:org-netbeans-libs-nbi-engine:${netbeans.version}:nbm</artifact>
-                            <transitive>false</transitive>
-                            <remoteRepositories>${netbeans.repo}</remoteRepositories>
-                            <destination>${project.build.directory}/nbi-engine.nbm</destination>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-antrun-plugin</artifactId>
-                <version>1.6</version>
-                <executions>
-                    <execution>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>run</goal>
-                        </goals>
-                        <configuration>
-                            <target>
-                                <unzip src="${project.build.directory}/harness.nbm" dest="${project.build.directory}/classes">
-                                    <patternset>
-                                        <include name="netbeans/etc/app.conf" />
-                                        <include name="netbeans/etc/applicationIcon.icns*" />
-                                        <include name="netbeans/launchers/app*" />
-                                    </patternset>
-                                    <mapper type="glob" from="netbeans/*" to="harness/*" />
-                                </unzip>
-                                <unzip src="${project.build.directory}/harness.nbm" dest="${project.build.directory}">
-                                    <patternset>
-                                        <include name="netbeans/tasks.jar.pack.gz" />
-                                        <include name="netbeans/jnlp/jnlp-launcher.jar.pack.gz" />
-                                    </patternset>
-                                    <flattenmapper />
-                                </unzip>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/tasks.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/tasks.jar" />
-                                </exec>
-                                <mkdir dir="${project.build.directory}/classes/harness/jnlp" />
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/jnlp-launcher.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/jnlp/jnlp-launcher.jar" />
-                                </exec>
-                                <unzip src="${project.build.directory}/tasks.jar" dest="${project.build.directory}/classes" />
-                                <unzip src="${project.build.directory}/nbi-ant.nbm" dest="${project.build.directory}/classes">
-                                    <patternset>
-                                        <include name="netbeans/modules/" />
-                                        <include name="netbeans/nbi/" />
-                                    </patternset>
-                                    <mapper type="glob" from="netbeans/*" to="harness/*" />
-                                </unzip>
-                                <unzip src="${project.build.directory}/nbi-engine.nbm" dest="${project.build.directory}/classes">
-                                    <patternset>
-                                        <include name="netbeans/modules/" />
-                                    </patternset>
-                                    <mapper type="glob" from="netbeans/*" to="harness/*" />
-                                </unzip>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/classes/harness/modules/org-netbeans-libs-nbi-ant.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/modules/org-netbeans-libs-nbi-ant.jar" />
-                                </exec>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/classes/harness/modules/org-netbeans-libs-nbi-engine.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/modules/org-netbeans-libs-nbi-engine.jar" />
-                                </exec>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-engine.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-engine.jar" />
-                                </exec>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-registries-management.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-registries-management.jar" />
-                                </exec>
-                                <exec executable="unpack200" failonerror="true">
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-ant-tasks.jar.pack.gz" />
-                                    <arg file="${project.build.directory}/classes/harness/modules/ext/nbi-ant-tasks.jar" />
-                                </exec>
-                                <delete>
-                                    <fileset dir="${project.build.directory}/classes/harness/modules" includes="**/*.pack.gz" />
-                                </delete>
-                                <!-- patch product.xml - unable to delete temp files after build finishes -->
-                                <replace file="${project.build.directory}/classes/harness/nbi/.common/product.xml">
-                                    <replacetoken expandProperties="false"><![CDATA[<delete dir="${current.temp.dir}>"]]></replacetoken>
-                                    <replacevalue expandProperties="false"><![CDATA[<delete dir="${current.temp.dir}" deleteonexit="true">]]></replacevalue>
-                                </replace>
-                                <!-- patch replace exec with ant task in common.xml -->
-                                <replaceregexp file="${project.build.directory}/classes/harness/nbi/.common/common.xml" match="exec executable=.{3}ant.executable(.+?)/exec" replace="@EXEC@" flags="s" />
-                                <replace file="${project.build.directory}/classes/harness/nbi/.common/common.xml" failOnNoReplacements="true">
-                                    <replacetoken expandProperties="false">@EXEC@</replacetoken>
-                                    <replacevalue expandProperties="false"><![CDATA[ant inheritrefs="false" 
-                dir="${cvs.dir}/${nbproject.path}">
-                  <target name="clean" />
-                  <property name="ignore.native" value="true" />
-                  <property name="no.dependencies" value="true" />
-                  <property name="dont.build.custom.tasks" value="true" /> 
-                  <property name="custom.tasks.cls" value="${custom.tasks.cls}" />
-            </ant]]></replacevalue>
-                                </replace>
-                                <replaceregexp file="${project.build.directory}/classes/harness/nbi/.common/common.xml" match="exec executable=.{3}ant.executable(.+?)/exec" replace="@EXEC@" flags="s" />
-                                <replace file="${project.build.directory}/classes/harness/nbi/.common/common.xml" failOnNoReplacements="true">
-                                    <replacetoken expandProperties="false">@EXEC@</replacetoken>
-                                    <replacevalue expandProperties="false"><![CDATA[condition property="nb.jdk.home.value"
-                   value="${@java.home@}/.."
-                   else="${@java.home@}">
-                <not>
-                    <equals arg1="Apple Inc." arg2="${java.vendor}" />
-                </not>
-        </condition>
-        <condition property="custom.parameter.name" value="reference.NBI_Engine.jar">
-            <contains string="${nb.custom.parameter}" substring="reference.NBI_Engine.jar" />
-        </condition>
-        <condition property="custom.parameter.value" value="${core.engine.dist.file}">
-            <contains string="${nb.custom.parameter}" substring="reference.NBI_Engine.jar" />
-        </condition>
-        <condition property="custom.parameter.name" value="javac.classpath">
-            <contains string="${nb.custom.parameter}" substring="javac.classpath" />
-        </condition>
-        <condition property="custom.parameter.value" value="${engine.dist.file}">
-            <contains string="${nb.custom.parameter}" substring="javac.classpath" />
-        </condition>
-        <echoproperties />
-        <ant inheritRefs="false" dir="${cvs.dir}/${nbproject.path}" > 
-                  <target name="clean" />
-                  <target name="compile" />
-                  <property name="platforms.JDK_1.5.home" value="${nb.jdk.home.value}" />
-                  <property name="ignore.native" value="true" />
-                  <property name="no.dependencies" value="true" />
-                  <property name="dont.build.custom.tasks" value="true" /> 
-                  <property name="custom.tasks.cls" value="${custom.tasks.cls}" />
-                  <property name="${custom.parameter.name}" value="${custom.parameter.value}" />
-        </ant]]></replacevalue>
-                                </replace>
-                                <replace file="${project.build.directory}/classes/harness/nbi/.common/common.xml" failOnNoReplacements="true" token="@java.home@" value="java.home" />
-                            </target>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- No real effect on the build, but prevents NB IDE from thinking src/main/java should be considered in preference to the JAR: -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>1.5</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>plugins</report>
-                            <!-- <report>cim</report> -->
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-                <configuration>
-                    <excludes>
-                        <exclude>**/*.mf</exclude>
-                        <exclude>**/*.MF</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-    <properties>
-        <!--        XXX SHOULD BE RELEASE 9.0 and superior artefacts  changes to Apache Licence
-        <netbeans.repo>netbeans::default::http://bits.netbeans.org/nexus/content/groups/netbeans/</netbeans.repo>
-        <netbeans.version>RELEASE82</netbeans.version>-->
-    </properties>
-</project>
diff --git a/nbm-maven-harness/src/main/java/Dummy.java b/nbm-maven-harness/src/main/java/Dummy.java
deleted file mode 100644
index 2577fd9..0000000
--- a/nbm-maven-harness/src/main/java/Dummy.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * dummy class to keep central maven repository happy.
- *
- * @author mkleint
- */
-public class Dummy
-{
-
-}
diff --git a/nbm-maven-harness/src/main/java/dummy.txt b/nbm-maven-harness/src/main/java/dummy.txt
deleted file mode 100644
index 62aca8e..0000000
--- a/nbm-maven-harness/src/main/java/dummy.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-This jar doesn't have sources or javadoc.
-It contains a multitude of resources from the netbeans IDE, used by the nbm-maven-plugin.
diff --git a/nbm-maven-plugin/README.md b/nbm-maven-plugin/README.md
deleted file mode 100644
index d7a870c..0000000
--- a/nbm-maven-plugin/README.md
+++ /dev/null
@@ -1,215 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-
-# NetBeans Module Maven plugin
-
-[ ![Codeship Status for mojohaus/nbm-maven-plugin](https://codeship.com/projects/827d5e10-2da6-0133-ca32-7e50f7676400/status?branch=master)](https://codeship.com/projects/98910)
-
-This Apache Maven plugin is able to create NetBeans module(plugin) artifacts. It registers a new packaging type `nbm`. Any project with this packaging will be automatically turned into a NetBeans module project. Additionally it allows to create clusters of modules, generate an autoupdate site content or build and assemble an application on top of NetBeans platform.
-
-Note: The `nbm:populate-repository` goal has been moved to it's own plugin at [nb-repository-plugin](https://github.com/mojohaus/nb-repository-plugin/).
-
-To get access to a repository with NetBeans.org module artifacts and metadata, add [http://bits.netbeans.org/maven2/](http://bits.netbeans.org/maven2/) repository to your project POM or the repository manager you are using. The repository hosts binaries of NetBeans 6.5 and later.
-
-Also see: [Maven NBM development FAQs](http://wiki.netbeans.org/NetBeansDeveloperFAQ#Mavenized_Builds)
-
-Sample pom.xml excerpts for creation of a NetBeans module:
-```xml
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>example-netbeans-module</artifactId>
-  <groupId>org.mycompany.myproject</groupId>
-  <!--here is the packaging and lifecycle defined-->
-  <packaging>nbm</packaging>
-
-  <!-- .... -->
-  <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <version>3.8.1</version>
-                <extensions>true</extensions>
-            </plugin>
-            <plugin> <!-- required since nbm-plugin 3.0-->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.2</version>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-  </build>
-
- <!-- .... -->
-    <!-- this section is important only to access the binaries of NetBeans that you use as dependencies -->
-    <repositories>
-        <repository>
-            <id>netbeans</id>
-            <name>repository hosting netbeans.org api artifacts</name>
-            <url>http://bits.netbeans.org/maven2/</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-```    
-To build the project then, just type
-```
-mvn install
-```
-## Maven Dependency vs. NetBeans runtime dependency
-There are important differences between Maven's dependency mechanism and NetBeans runtime dependencies. Maven's dependencies are transitive, so at compile time you get not only direct dependencies you declared, but also dependencies of dependencies etc. In NetBeans, the module dependencies are non-transitive by nature, you have to explicitly declare all at runtime. Additionally next to module dependencies there are also library jars attached and shipped with the module's main artifact. In the NetBeans terminology there is a special sort of modules called "library wrappers". These library wrappers add the libraries on the module's classpath and allow other modules to depend on the libraries within the IDE's runtime.
-
-The ways in which the nbm-maven-plugin tries to adress these issues has changed over time.
-
-The plugin walks the dependency tree to detect and identify module dependencies and classpath libraries.
-
-A maven dependency is turned into a NetBeans runtime dependency when:
-
-* For NetBeans module dependencies (dependency jars that have the NetBeans specific entries in META-INF/MANIFEST.MF)
-  * It's a direct dependency (non-transitive) and is a NetBeans module itself. Preferred way of declaring module dependencies.
-  * It's defined in existing (though optional and deprecated) module.xml file in dependencies section. Try to avoid this, but still useful if one wants to put an explicit dependency value on the module, or use implementation dependency.
-  * When the dependency is of type nbm. Deprecated in **3.0.x**, only helpful in older versions. Such dependencies don't include their transitive deps on compilation classpath. That should allow one to simulate the rumtime dependencies at compilation time in maven, however there's one major drawback. Not only are the nbm's module dependencies hidden, but the libraries associated with the given nbm module are also hidden. So you can end up with less stuff on classpath as opposed to more stuff with jar typed dependencies.
-* For module libraries (jars that are packed together with the module and appear on it's classpath directly, not by a dependency relationship.)
-  * It's a direct dependency and is not of provided scope.
-  * It's a transitive dependency, pulled in by a direct dependency (only non-module one - see first bullet) This is new in **3.0+**
-  * It's defined in existing (though optional) module.xml file in libraries section. Consider this deprecated in **3.0+**.
-
-The complete nbm descriptor format documentation, and example descriptors are also available. 
-
-Please note that since **3.8** version, the descriptor is deprecated and replaced by plugin configuration parameters.
-
-Additionally we perform dependency analysis in order to warn the user when runtime dependencies are wrong. So project's own classes and it's classpath libraries' classes are checked against the module dependencies (with appropriate filtering for public packages/private packages). If the classes depend on declared module dependency's private classes or on transitive module dependency's classes, the build fails. That should prevent ClassNotFoundException's later at runtime, when the NetBeans module system constructs the classpath for the module based on our metadata generated.
-
-## Using OSGi bundles in NetBeans platform based applications
-Starting with version **3.2**, it's possible for the NetBeans modules to depend on OSGi bundles. A proper module dependency section will be generated. To include the bundle in the application, add dependency on the bundle from nbm-application. There are a few prerequisites.
-
-It works only in NetBeans 6.9 and later which support the embedding of bundles at runtime
-Add `<useOSGiDependencies>true</useOSGiDependencies>` configuration entry to all the modules depending on OSGi bundles. Existing applications/modules need to check modules wrapping external libraries for library jars that are also OSGi bundles. Such modules will no longer include the OSGi bundles as part of the module NBM but will include a modular dependency reference on the bundle only. Modules depending on these old wrapper modules shall depend directly on the bundle, eventually rendering the old library wrapper module obsolete.
-in the distribution, all bundles will be included in the default cluster (extra if not configured otherwise), in **3.10 and later** the plugin will attempt to guess the cluster based on modules depending on it.
-Before version **3.10** all bundles will be autoload, thus requiring at least one depending regular module to enable them. In **3.10 and later**, developers of the OSGi bundles can influence the autoload vs regular behaviour by adding Nbm-Maven-Plugin-Autoload attribute to the bundle's manifest with "true" or "false" values. False means the module will be enabled on start, even without any other modules depending on it.
-
-## Multi module setup
-If you have a set of NetBeans modules, or are building on top of NetBeans Platform, you will make use of the additional goals provided by the plugin.
-
-If you are building a Platform-based application, use a project with `nbm-application` packaging to perform the final application assembly. This packaging type (defined in nbm-maven-plugin) should have your module projects and all dependencies of the target NetBeans Platform included as dependencies.
-
-For the NetBeans Platform/IDE modules, there are artifacts that aggregate modules in clusters. These are put in the `org.netbeans.clusters` groupId (on `bits.netbeans.org` or in your own repository). The following snippet will include the basic NetBeans platform cluster and your own module in the application. You can use standard dependency exclusion lists to cut out modules from the Platform that you don't need.
-
-```xml
-    <artifactId>application</artifactId>
-    <packaging>nbm-application</packaging>
-    <version>1.0-SNAPSHOT</version>
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.cluster</groupId>
-            <artifactId>platform8</artifactId>
-            <version>${netbeans.version}</version>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>com.mycompany</groupId>
-            <artifactId>module1</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
-```    
-The nbm-application project/packaging defines a build lifecycle that creates a final application from the NBM files in local/remote repotories and bundles them in a ZIP file (also uploadable to the repository). In addition to that you can configure the project to generate an autoupdate site and/or webstartable binaries of the applications (typically in a deployment profile):
-
-```xml
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>extra</id>
-                        <goals>
-                            <goal>autoupdate</goal>
-                            <goal>webstart-app</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-```            
-See the `autoupdate` and `webstart-app` goals for more details.
-
-### mvn nbm:cluster
-This goal aggregates output of multiple NetBeans module projects and creates one or more clusters in the current project. So usually one runs this goal on the parent POM project, which aggregates the content of all its modules. The resulting cluster structure can later be used for running the application, creating an installer or similar. A variant of this goal is also included in the nbm-application project's default lifecycle.
-
-### mvn nbm:branding
-Branding is to used when one builds an application based on NetBeans Platform (as opposed to creating set of modules for the IDE). Branding contains all the resources that are to be changed in the platform binaries (resource bundles, images, HTML files etc.) to give the application its unique look.
-
-This goal can be attached to one of the nbm module projects that will be part of the NetBeans Platform-based application.
-
-For more detailed tutorial, check [NetBeans Platform Quick Start Using Maven tutorial](https://platform.netbeans.org/tutorials/nbm-maven-quickstart.html)
-
-The branding is included as part of a regular nbm subproject and cannot be attached to a pom packaged root project.
-
-### mvn nbm:run-ide nbm:run-platform
-These two goals do almost the same, they allow you to execute your projects content within the IDE or NetBeans platform.
-
-`nbm:run-platform` only makes sense to execute on projects with `nbm-application` packaging.
-
-For more information on plugin configuration and customization, see goal documentation.
-
-## Public packages declaration
-By default all your module's packages (and classes) and private to the given module. If you want to expose any API to other modules, you will need to declare those public packages in your `pom.xml`. This includes not only your own classes but also any other 3rd party library classes that are packaged with your module and are to be exposed for reuse by other modules.
-
-For example:
-```xml
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <version>3.8.1</version>
-                <extensions>true</extensions>
-                <configuration>
-                   <publicPackages>
-                       <publicPackage>org.foo.api</publicPackage>
-                       <publicPackage>org.apache.commons.*</publicPackage>
-                   </publicPackages>
-                </configuration>
-            </plugin>
-```            
-there is a package `org.foo.api` made public (but not `org.foo.api.impl` package) and any package starting with `org.apache.commons`, so both `org.apache.commons.io` and `org.apache.commons.exec` packages are exposed to the outside
-
-## Archetypes anyone?
-There are two basic archetypes:
-
-The first once creates a single project preconfigured to be a NetBeans module. Use this one if you are developing a NetBeans IDE module, or a module for a NetBeans Platform-based application.
-```
-mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=nbm-archetype \
-  -DarchetypeVersion=... -DgroupId=org.kleint -DartifactId=milos -Dversion=1.0 archetype:generate
-```  
-The second one creates a parent POM project containing configuration and application branding for your NetBeans Platform-based application.
-```
-mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=netbeans-platform-app-archetype \
-  -DarchetypeVersion=... -DgroupId=org.kleint -DartifactId=milos -Dversion=1.0 archetype:generate
-```  
-## IDE support
-The NetBeans IDE has Maven support. Among other features, it contains additional support for working with NetBeans module projects. The support includes file templates, important nodes in projects view, running module(s) in the IDE or Platform.
diff --git a/nbm-maven-plugin/pom.xml b/nbm-maven-plugin/pom.xml
deleted file mode 100644
index 0999b75..0000000
--- a/nbm-maven-plugin/pom.xml
+++ /dev/null
@@ -1,507 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>nbm-maven-plugin</artifactId>
-    <version>4.2-SNAPSHOT</version>
-    <packaging>maven-plugin</packaging>
-
-    <name>Apache NetBeans Maven Utilities - NBM Maven Plugin</name>
-    <description>Maven plugin for creating NetBeans modules. It defines a custom lifecycle called "nbm". During packaging, the module JAR is enhanced with NetBeans-specific manifest entries and, along with other required files, packed into a *.nbm file, ready for distribution. Additionally the plugin provides aggregator goals to create an update site or cluster for your module projects.
-    </description>
-    <inceptionYear>2005</inceptionYear>
-    <url>http://bits.netbeans.org/mavenutilities/nbm-maven-plugin</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANS</url>
-    </issueManagement>
-    <prerequisites>
-        <maven>3.0.5</maven>
-    </prerequisites>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>
-    <developers>
-        <developer>
-            <id>mkleint</id>
-            <name>Milos Kleint</name>
-            <email>mkleint@gmail.com</email>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>jglick</id>
-            <name>Jesse Glick</name>
-            <email>jglick@codehaus.org</email>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>ebarboni</id>
-            <name>Eric Barboni</name>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-    </developers>
-    <contributors>
-        <contributor>
-            <name>Johan Andrén</name>
-            <email>protected</email>
-            <roles>
-                <role>Patch Contributor</role>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Mykola Nikishov</name>
-            <email>mn@mn.com.ua</email>
-            <roles>
-                <role>Patch Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Frantisek Mantlik</name>
-            <email>frantisek@mantlik.cz</email>
-            <roles>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-    </contributors>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <!-- TODO need to override parent version value... I suppose this will eventually end up in mojo parent pom, check regularly -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.5</version>
-                <configuration>
-                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>mojo-descriptor</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>descriptor</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>help-goal</id>
-                        <goals>
-                            <goal>helpmojo</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.modello</groupId>
-                <artifactId>modello-maven-plugin</artifactId>
-                <version>1.8.3</version>
-                <executions>
-                    <execution>
-                        <id>build</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>xpp3-reader</goal>
-                            <goal>java</goal>
-                            <goal>xdoc</goal>
-                            <!--goal>xsd</goal-->
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>site</id>
-                        <phase>site-generate</phase>
-                        <goals>
-                            <goal>xdoc</goal>
-                            <!--goal>xsd</goal-->
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <models>
-                        <model>src/main/mdo/descriptor.mdo</model>
-                    </models>
-                    <version>1.0.0</version>
-                    <useJava5>true</useJava5>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.7</source>
-                    <target>1.7</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>animal-sniffer-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                        <configuration>
-                            <signature>
-                                <groupId>org.codehaus.mojo.signature</groupId>
-                                <artifactId>java17</artifactId>
-                                <version>1.0</version>
-                            </signature>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.apache.maven.shared</groupId>
-                        <artifactId>maven-shared-resources</artifactId>
-                        <version>2</version>
-                    </dependency>
-                    <dependency>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-invoker-plugin</artifactId>
-                        <version>1.10</version>
-                    </dependency>
-                </dependencies>
-            </plugin>
-        </plugins>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>plugins</report>
-                            <!-- <report>cim</report> -->
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-changes-plugin</artifactId>
-                <version>2.12.1</version>
-                 <configuration>
-                    <skip>true</skip>
-                </configuration>
-   
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>                            
-            </plugin>
-                        
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <quiet>true</quiet>
-                    <links>
-                        <!--<link>http://download-llnw.oracle.com/javaee/1.4/api/</link>-->
-                        <!-- unreachable site <link>http://commons.apache.org/collections/apidocs-COLLECTIONS_3_0/</link>-->
-                        <link>http://commons.apache.org/dbcp/apidocs/</link>
-                        <link>http://commons.apache.org/fileupload/apidocs/</link>
-                        <link>http://commons.apache.org/logging/apidocs/</link>
-                        <link>http://commons.apache.org/pool/apidocs/</link>
-                        <link>http://junit.sourceforge.net/javadoc/</link>
-                        <link>http://logging.apache.org/log4j/1.2/apidocs/</link>
-                        <!-- unreachable site <link>http://jakarta.apache.org/regexp/apidocs/</link> -->
-                        <link>http://velocity.apache.org/engine/releases/velocity-1.5/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-artifact/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-model/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-plugin-api/apidocs/</link>
-                        <!-- unreachable site <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-project/apidocs/</link>-->
-                        <!-- unreachable site <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-reporting/maven-reporting-api/apidocs/</link>-->
-                        <link>http://maven.apache.org/ref/${mojo.javadoc.mavenVersion}/maven-settings/apidocs/</link>
-                    </links>
-                    <tagletArtifacts>
-                        <tagletArtifact>
-                            <groupId>org.apache.maven.plugin-tools</groupId>
-                            <artifactId>maven-plugin-tools-javadoc</artifactId>
-                            <version>3.4</version>
-                        </tagletArtifact>
-                        <tagletArtifact>
-                            <groupId>org.codehaus.plexus</groupId>
-                            <artifactId>plexus-component-javadoc</artifactId>
-                            <version>1.6</version>
-                        </tagletArtifact>
-                    </tagletArtifacts>
-                </configuration>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>javadoc</report>
-                            <report>test-javadoc</report>
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-                        
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.5</version>
-                <configuration>
-                    <requirements>
-                        <!--
-                        NOTE: Maven 2.x does not interpolate properties of the form project.*|pom.* so the Maven Plugin Plugin
-                        gets garbage when manually examining the config of the Maven Compiler Plugin.
-                        -->
-                        <jdk>${mojo.java.target}</jdk>
-                    </requirements>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-pmd-plugin</artifactId>
-                <configuration>
-                    <targetJdk>1.5</targetJdk>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-linkcheck-plugin</artifactId>
-                <configuration>
-                    <excludedLinks>
-                        <excludedLink>../../images/codehaus-small.png</excludedLink>
-                        <excludedLink>../../images/mojo_logo.png</excludedLink>
-                        <excludedLink>plugin-info.html</excludedLink>
-                    </excludedLinks>
-                    <!--<excludedPages>
-                        <excludedPage>dependencies.html</excludedPage> 
-                    </excludedPages>-->
-                </configuration>	       
-            </plugin>                        
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>2.7</version>
-                <configuration>
-                    <instrumentation>
-                        <excludes>
-                            <exclude>**/HelpMojo.class</exclude>
-                        </excludes>
-                    </instrumentation>    
-                </configuration>
-            </plugin>
-            <plugin> 
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>taglist-maven-plugin</artifactId>
-                <version>2.4</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-                <configuration>
-                    <excludes>
-                        <exclude>**/*.mf</exclude>
-                        <exclude>**/*.MF</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-    <profiles>
-        <profile>
-            <id>tools.jar</id>
-            <activation>
-                <file>
-                    <exists>${java.home}/../lib/tools.jar</exists>
-                </file>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>com.sun</groupId>
-                    <artifactId>tools</artifactId>
-                    <version>1.5.0</version>
-                    <scope>system</scope>
-                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
-                </dependency>
-            </dependencies>
-        </profile>
-        <profile>
-            <id>run-its</id>
-            <build>
-
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-invoker-plugin</artifactId>
-                        <version>2.0.0</version>
-                        <configuration>
-                            <debug>true</debug>
-                            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
-                            <pomIncludes>
-                                <pomInclude>*/pom.xml</pomInclude>
-                            </pomIncludes>
-                            <postBuildHookScript>verify</postBuildHookScript>
-                            <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-                            <settingsFile>src/it/settings.xml</settingsFile>
-                            <goals>
-                                <!-- default build in netbeans IDE -->
-                                <goal>clean</goal>
-                                <goal>install</goal>
-                            </goals>
-                            <filterProperties>
-                                <netbeans.version>RELEASE82</netbeans.version>
-                            </filterProperties>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>integration-test</id>
-                                <goals>
-                                    <goal>install</goal>
-                                    <goal>integration-test</goal>
-                                    <goal>verify</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-
-            </build>
-        </profile>
-    </profiles>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-artifact</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-compat</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>3.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-tools</groupId>
-            <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.9.6</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-            <version>3.1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-archiver</artifactId>
-            <version>3.5</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>plexus-component-api</artifactId>
-                    <groupId>org.codehaus.plexus</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.shared</groupId>
-            <artifactId>maven-dependency-tree</artifactId>
-            <version>2.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.shared</groupId>
-            <artifactId>maven-dependency-analyzer</artifactId>
-            <version>1.11.1</version>
-        </dependency>
-        <!-- maven dependecy analyser version 1.8 will have the correct dependency -->
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-model</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-container-default</artifactId>
-            <version>1.7.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.shared</groupId>
-            <artifactId>maven-filtering</artifactId>
-            <version>3.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-core</artifactId>
-            <version>${maven.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-testing</groupId>
-            <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>1.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <!-- use harness from NetBeans 8.2  --> 
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>nbm-maven-harness</artifactId>
-            <version>8.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-io</artifactId>
-            <version>3.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>nb-shared</artifactId>
-            <version>1.3-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>18.0</version>
-            <type>jar</type>
-        </dependency>
-    </dependencies>
-    <properties>
-        <mojo.java.target>1.7</mojo.java.target>
-        <maven.version>3.0.5</maven.version>
-    </properties>
-</project>
diff --git a/nbm-maven-plugin/src/it/full/application/pom.xml b/nbm-maven-plugin/src/it/full/application/pom.xml
deleted file mode 100644
index 7cbdd41..0000000
--- a/nbm-maven-plugin/src/it/full/application/pom.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId> 
-        <artifactId>ittest-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>ittest-app</artifactId>
-    <packaging>nbm-application</packaging>
-
-    <name>ittest-app</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <all.clusters>${project.build.directory}/${brandingToken}</all.clusters>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.cluster</groupId>
-            <artifactId>platform</artifactId>
-            <version>${netbeans.version}</version>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>ittest-branding</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <!-- NbModuleSuite functional in RELEASE70 or later: -->
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-netbeans-modules-nbjunit</artifactId>
-            <version>${netbeans.version}</version>
-            <scope>test</scope> <!-- beyond platform cluster, this often needs to be dropped down to compile/runtime, some other modules in IDE clusters depend on it -->
-        </dependency>
-        <!-- To use Jelly Tools in your functional tests, add or replace with:
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-netbeans-modules-jellytools-platform</artifactId>
-            <version>${netbeans.version}</version>
-            <scope>test</scope>
-        </dependency>
-        -->
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>ittest-sample</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-            </plugin>
-            <!-- Permits NbModuleSuite to be run in integration-test phase: -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.12.2</version>
-                <configuration>
-                    <systemPropertyVariables>
-                        <all.clusters>${all.clusters}</all.clusters>
-                        <branding.token>${brandingToken}</branding.token>
-                    </systemPropertyVariables>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deployment</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>nbm-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>extra</id>
-                                <goals>
-                                    <goal>autoupdate</goal>
-                                    <goal>webstart-app</goal>
-                                    <goal>build-installers</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/nbm-maven-plugin/src/it/full/application/src/test/java/nbmmavenpluginit/ittest/ApplicationTest.java b/nbm-maven-plugin/src/it/full/application/src/test/java/nbmmavenpluginit/ittest/ApplicationTest.java
deleted file mode 100644
index 45ab644..0000000
--- a/nbm-maven-plugin/src/it/full/application/src/test/java/nbmmavenpluginit/ittest/ApplicationTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ==========================================================================
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package nbmmavenpluginit.ittest;
-
-import java.util.logging.Level;
-import junit.framework.Test;
-import org.netbeans.junit.NbModuleSuite;
-import org.netbeans.junit.NbTestCase;
-
-public class ApplicationTest extends NbTestCase {
-
-    public static Test suite() {
-        return NbModuleSuite.createConfiguration(ApplicationTest.class).
-                gui(false).
-                failOnMessage(Level.WARNING). // works at least in RELEASE71
-                failOnException(Level.INFO).
-                enableClasspathModules(false). 
-                clusters(".*").
-                suite(); // RELEASE71+, else use NbModuleSuite.create(NbModuleSuite.createConfiguration(...))
-    }
-
-    public ApplicationTest(String n) {
-        super(n);
-    }
-
-    public void testApplication() {
-        // pass if there are merely no warnings/exceptions
-        /* Example of using Jelly Tools (additional test dependencies required) with gui(true):
-        new ActionNoBlock("Help|About", null).performMenu();
-        new NbDialogOperator("About").closeByButton();
-         */
-    }
-
-}
diff --git a/nbm-maven-plugin/src/it/full/branding/pom.xml b/nbm-maven-plugin/src/it/full/branding/pom.xml
deleted file mode 100644
index 6767f99..0000000
--- a/nbm-maven-plugin/src/it/full/branding/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>ittest-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>ittest-branding</artifactId>
-    <packaging>nbm</packaging>
-
-    <name>ittest-branding</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-netbeans-api-annotations-common</artifactId>
-            <version>${netbeans.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>${jar.plugin.version}</version>
-                <!-- to have the jar plugin pickup the nbm generated manifest -->
-                 
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
deleted file mode 100644
index 6a0b0f3..0000000
--- a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-currentVersion=ittest {0}
-LBL_splash_window_title=Starting ittest
diff --git a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
deleted file mode 100644
index 47f937c..0000000
--- a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-CTL_MainWindow_Title=ittest {0}
-CTL_MainWindow_Title_No_Project=ittest {0}
diff --git a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties b/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
deleted file mode 100644
index 883602b..0000000
--- a/nbm-maven-plugin/src/it/full/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-LBL_ProductInformation=ittest
diff --git a/nbm-maven-plugin/src/it/full/branding/src/main/nbm/manifest.mf b/nbm-maven-plugin/src/it/full/branding/src/main/nbm/manifest.mf
deleted file mode 100644
index fec80e2..0000000
--- a/nbm-maven-plugin/src/it/full/branding/src/main/nbm/manifest.mf
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-OpenIDE-Module-Localizing-Bundle: nbmmavenpluginit/ittest/branding/Bundle.properties
-AutoUpdate-Essential-Module: true
diff --git a/nbm-maven-plugin/src/it/full/branding/src/main/resources/nbmmavenpluginit/ittest/branding/Bundle.properties b/nbm-maven-plugin/src/it/full/branding/src/main/resources/nbmmavenpluginit/ittest/branding/Bundle.properties
deleted file mode 100644
index 73da94c..0000000
--- a/nbm-maven-plugin/src/it/full/branding/src/main/resources/nbmmavenpluginit/ittest/branding/Bundle.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Localized module labels. Defaults taken from POM (<name>, <description>, <groupId>) if unset.
-#OpenIDE-Module-Name=
-#OpenIDE-Module-Short-Description=
-#OpenIDE-Module-Long-Description=
-#OpenIDE-Module-Display-Category=
diff --git a/nbm-maven-plugin/src/it/full/ittest-sample/pom.xml b/nbm-maven-plugin/src/it/full/ittest-sample/pom.xml
deleted file mode 100644
index a03e2db..0000000
--- a/nbm-maven-plugin/src/it/full/ittest-sample/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>ittest-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-    <artifactId>ittest-sample</artifactId>
-    <packaging>nbm</packaging>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <extensions>true</extensions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>${jar.plugin.version}</version>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-netbeans-api-annotations-common</artifactId>
-            <version>${netbeans.version}</version>
-        </dependency>
-    </dependencies>
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-</project>
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/it/full/ittest-sample/src/main/nbm/manifest.mf b/nbm-maven-plugin/src/it/full/ittest-sample/src/main/nbm/manifest.mf
deleted file mode 100644
index 50de95d..0000000
--- a/nbm-maven-plugin/src/it/full/ittest-sample/src/main/nbm/manifest.mf
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-OpenIDE-Module-Localizing-Bundle: nbmmavenpluginit/ittest/Bundle.properties
-
diff --git a/nbm-maven-plugin/src/it/full/ittest-sample/src/main/resources/nbmmavenpluginit/ittest/Bundle.properties b/nbm-maven-plugin/src/it/full/ittest-sample/src/main/resources/nbmmavenpluginit/ittest/Bundle.properties
deleted file mode 100644
index 7c715ee..0000000
--- a/nbm-maven-plugin/src/it/full/ittest-sample/src/main/resources/nbmmavenpluginit/ittest/Bundle.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#Localized module labels. Defaults taken from POM (<name>, <description>, <groupId>) if unset.
-#OpenIDE-Module-Name=
-#OpenIDE-Module-Short-Description=
-#OpenIDE-Module-Long-Description=
-#OpenIDE-Module-Display-Category=
-#Tue Aug 25 17:58:31 CEST 2015
diff --git a/nbm-maven-plugin/src/it/full/pom.xml b/nbm-maven-plugin/src/it/full/pom.xml
deleted file mode 100644
index 852676e..0000000
--- a/nbm-maven-plugin/src/it/full/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>nbm-maven-plugin-it-root</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <artifactId>ittest-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-
-    <name>ittest-parent</name>
-
-   
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>nbm-maven-plugin</artifactId>
-                    <extensions>true</extensions>
-                    <configuration>
-                        <brandingToken>${brandingToken}</brandingToken>
-                        <cluster>${brandingToken}</cluster>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <!-- NetBeans 6.9+ requires JDK 6, starting NetBeans 7.4 source 1.7 is required -->
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>2.5.1</version>
-                    <configuration>
-                        <source>1.7</source>
-                        <target>1.7</target>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <version>${jar.plugin.version}</version>
-                    <configuration>
-                        <archive>
-                            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                        </archive>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <modules>
-        <module>branding</module>
-        <module>application</module>
-        <module>ittest-sample</module>
-    </modules>
-
-    <properties>
-        <netbeans.version>@netbeans.version@</netbeans.version>
-        <brandingToken>ittest</brandingToken>
-    </properties>
-</project>
diff --git a/nbm-maven-plugin/src/it/pom.xml b/nbm-maven-plugin/src/it/pom.xml
deleted file mode 100644
index 080113f..0000000
--- a/nbm-maven-plugin/src/it/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.codehaus.mojo</groupId>
-    <artifactId>nbm-maven-plugin-it-root</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <repositories>
-        <!--
-        Repository hosting NetBeans modules, especially APIs.
-        Versions are based on IDE releases, e.g.: RELEASE691
-        To create your own repository, use: nbm:populate-repository
-        -->
-        <repository>
-            <id>netbeans</id>
-            <name>NetBeans</name>
-            <url>http://bits.netbeans.org/nexus/content/groups/netbeans/</url>
-        </repository>
-    </repositories>
-    <build>
-        <pluginManagement>
-            <plugins>
-               
-                <plugin>  
-                    <groupId>@project.groupId@</groupId>
-                    <artifactId>@project.artifactId@</artifactId>  
-                    <version>@project.version@</version>
-                </plugin>
-                <!--<plugin>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>@compilerPluginVersion@</version>
-                    <configuration>
-                        <source>@testJavaVersion@</source>
-                        <target>@testJavaVersion@</target>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>@surefirePluginVersion@</version>
-                </plugin>-->
-            </plugins>
-        </pluginManagement>
-    </build>
-    <properties>
-        <jar.plugin.version>3.0.2</jar.plugin.version>
-    </properties>
-</project>
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/it/settings.xml b/nbm-maven-plugin/src/it/settings.xml
deleted file mode 100644
index 5ee363c..0000000
--- a/nbm-maven-plugin/src/it/settings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<settings>
-    <profiles>
-        <profile>
-            <id>it-repo</id>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <repositories>
-                <repository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </pluginRepository>
-            </pluginRepositories>
-        </profile>
-    </profiles>
-</settings>
diff --git a/nbm-maven-plugin/src/it/single/pom.xml b/nbm-maven-plugin/src/it/single/pom.xml
deleted file mode 100644
index 916e6c1..0000000
--- a/nbm-maven-plugin/src/it/single/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>nbm-maven-plugin-it-root</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <artifactId>nbm-maven-plugin-it-single-module</artifactId>
-    <packaging>nbm</packaging>
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.api</groupId>
-            <artifactId>org-openide-util</artifactId>
-            <version>@netbeans.version@</version>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-                
-            <plugin>  
-                <groupId>@project.groupId@</groupId>
-                <artifactId>@project.artifactId@</artifactId>  
-                <extensions>true</extensions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>${jar.plugin.version}</version>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-     
-    </build>
-</project>
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AbstractNbmMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AbstractNbmMojo.java
deleted file mode 100644
index c17e520..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AbstractNbmMojo.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.netbeans.nbm.model.Dependency;
-import org.netbeans.nbm.model.NetBeansModule;
-import org.netbeans.nbm.model.io.xpp3.NetBeansModuleXpp3Reader;
-import org.netbeans.nbm.utils.AbstractNetbeansMojo;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-
-import org.codehaus.plexus.util.IOUtil;
-
-public abstract class AbstractNbmMojo
-    extends AbstractNetbeansMojo
-{
-
-    static boolean matchesLibrary( Artifact artifact, List<String> libraries, ExamineManifest depExaminator,
-        Log log, boolean useOsgiDependencies )
-    {
-        String artId = artifact.getArtifactId();
-        String grId = artifact.getGroupId();
-        String id = grId + ":" + artId;
-        boolean explicit = libraries.remove( id );
-        if ( explicit )
-        {
-            log.debug(
-                id + " included as module library, explicitly declared in module descriptor." );
-            return explicit;
-        }
-        if ( Artifact.SCOPE_PROVIDED.equals( artifact.getScope() ) || Artifact.SCOPE_SYSTEM.equals(
-            artifact.getScope() ) )
-        {
-            log.debug(
-                id + " omitted as module library, has scope 'provided/system'" );
-            return false;
-        }
-        if ( "nbm".equals( artifact.getType() ) )
-        {
-            return false;
-        }
-        if ( depExaminator.isNetBeansModule() || ( useOsgiDependencies && depExaminator.isOsgiBundle() ) )
-        {
-            //TODO I can see how someone might want to include an osgi bundle as library, not dependency.
-            // I guess it won't matter much in 6.9+, in older versions it could be a problem.
-            return false;
-        }
-        log.debug(
-            id + " included as module library, squeezed through all the filters." );
-        return true;
-    }
-
-    static Dependency resolveNetBeansDependency( Artifact artifact, List<Dependency> deps,
-        ExamineManifest manifest, Log log )
-    {
-        String artId = artifact.getArtifactId();
-        String grId = artifact.getGroupId();
-        String id = grId + ":" + artId;
-        for ( Dependency dep : deps )
-        {
-            if ( id.equals( dep.getId() ) )
-            {
-                if ( manifest.isNetBeansModule() )
-                {
-                    return dep;
-                }
-                else
-                {
-                    if ( dep.getExplicitValue() != null )
-                    {
-                        return dep;
-                    }
-                    log.warn(
-                        id + " declared as module dependency in descriptor, but not a NetBeans module" );
-                    return null;
-                }
-            }
-        }
-        if ( "nbm".equals( artifact.getType() ) )
-        {
-            Dependency dep = new Dependency();
-            dep.setId( id );
-            dep.setType( "spec" );
-            log.debug( "Adding nbm module dependency - " + id );
-            return dep;
-        }
-        if ( manifest.isNetBeansModule() )
-        {
-            Dependency dep = new Dependency();
-            dep.setId( id );
-            dep.setType( "spec" );
-            log.debug( "Adding direct NetBeans module dependency - " + id );
-            return dep;
-        }
-        return null;
-    }
-
-    protected final NetBeansModule readModuleDescriptor( File descriptor )
-        throws MojoExecutionException
-    {
-        if ( descriptor == null )
-        {
-            throw new MojoExecutionException(
-                "The module descriptor has to be configured." );
-        }
-        if ( !descriptor.exists() )
-        {
-            throw new MojoExecutionException(
-                "The module descriptor is missing: '" + descriptor + "'." );
-        }
-        Reader r = null;
-        try
-        {
-            r = new FileReader( descriptor );
-            NetBeansModuleXpp3Reader reader = new NetBeansModuleXpp3Reader();
-            NetBeansModule module = reader.read( r );
-            return module;
-        }
-        catch ( IOException exc )
-        {
-            throw new MojoExecutionException(
-                "Error while reading module descriptor '" + descriptor + "'.",
-                exc );
-        }
-        catch ( XmlPullParserException xml )
-        {
-            throw new MojoExecutionException(
-                "Error while reading module descriptor '" + descriptor + "'.",
-                xml );
-        }
-        finally
-        {
-            IOUtil.close( r );
-        }
-    }
-
-    protected final NetBeansModule createDefaultDescriptor( MavenProject project, boolean log )
-    {
-
-        if ( log )
-        {
-            getLog().info(
-                "No Module Descriptor defined, trying to fallback to generated values:" );
-        }
-        NetBeansModule module = new NetBeansModule();
-        return module;
-    }
-
-    static List<Artifact> getLibraryArtifacts( DependencyNode treeRoot, NetBeansModule module,
-                                               List<Artifact> runtimeArtifacts,
-                                               Map<Artifact, ExamineManifest> examinerCache, Log log,
-                                               boolean useOsgiDependencies )
-        throws MojoExecutionException
-    {
-        List<Artifact> include = new ArrayList<Artifact>();
-        if ( module != null )
-        {
-            List<String> librList = new ArrayList<String>();
-            if ( module.getLibraries() != null )
-            {
-                librList.addAll( module.getLibraries() );
-            }
-            CollectLibrariesNodeVisitor visitor = new CollectLibrariesNodeVisitor( librList,
-                runtimeArtifacts, examinerCache, log, treeRoot, useOsgiDependencies );
-            treeRoot.accept( visitor );
-            include.addAll( visitor.getArtifacts() );
-        }
-        return include;
-    }
-
-    static List<ModuleWrapper> getModuleDependencyArtifacts( DependencyNode treeRoot, NetBeansModule module,
-                                                             Dependency[] customDependencies, MavenProject project,
-                                                             Map<Artifact, ExamineManifest> examinerCache,
-                                                             List<Artifact> libraryArtifacts, Log log,
-                                                             boolean useOsgiDependencies )
-        throws MojoExecutionException
-    {
-        List<Dependency> deps = new ArrayList<Dependency>();
-        if (customDependencies != null) {
-            deps.addAll( Arrays.asList( customDependencies ));
-        }
-        if (module != null && !module.getDependencies().isEmpty()) {
-            log.warn( "dependencies in module descriptor are deprecated, use the plugin's parameter moduleDependencies");
-            //we need to make sure a dependency is not twice there, module deps override the config (as is the case with other
-            //configurations)
-            for (Dependency d : module.getDependencies()) {
-                Dependency found = null;
-                for (Dependency d2 : deps) {
-                    if (d2.getId().equals(d.getId())) {
-                        found = d2;
-                        break;
-                    }
-                }
-                if (found != null) {
-                    deps.remove( found );
-                }
-                deps.add(d);
-            }
-        }
-        List<ModuleWrapper> include = new ArrayList<ModuleWrapper>();
-        
-            @SuppressWarnings( "unchecked" )
-            List<Artifact> artifacts = project.getCompileArtifacts();
-            for ( Artifact artifact : artifacts )
-            {
-                if ( libraryArtifacts.contains( artifact ) )
-                {
-                    continue;
-                }
-                ExamineManifest depExaminator = examinerCache.get( artifact );
-                if ( depExaminator == null )
-                {
-                    depExaminator = new ExamineManifest( log );
-                    depExaminator.setArtifactFile( artifact.getFile() );
-                    depExaminator.checkFile();
-                    examinerCache.put( artifact, depExaminator );
-                }
-                Dependency dep = resolveNetBeansDependency( artifact, deps, depExaminator, log );
-                if ( dep != null )
-                {
-                    ModuleWrapper wr = new ModuleWrapper();
-                    wr.dependency = dep;
-                    wr.artifact = artifact;
-                    wr.transitive = false;
-                    //only direct deps matter to us..
-                    if ( depExaminator.isNetBeansModule() && artifact.getDependencyTrail().size() > 2 )
-                    {
-                        log.debug(
-                            artifact.getId() + " omitted as NetBeans module dependency, not a direct one. Declare it in the pom for inclusion." );
-                        wr.transitive = true;
-
-                    }
-                    include.add( wr );
-                }
-                else
-                {
-                    if ( useOsgiDependencies && depExaminator.isOsgiBundle() )
-                    {
-                        ModuleWrapper wr = new ModuleWrapper();
-                        wr.osgi = true;
-                        String id = artifact.getGroupId() + ":" + artifact.getArtifactId();
-                        for ( Dependency depe : deps )
-                        {
-                            if ( id.equals( depe.getId() ) )
-                            {
-                                wr.dependency = depe;
-                            }
-                        }
-                        boolean print = false;
-                        if ( wr.dependency == null )
-                        {
-                            Dependency depe = new Dependency();
-                            depe.setId( id );
-                            depe.setType( "spec" );
-                            wr.dependency = depe;
-                            print = true;
-                        }
-
-                        wr.artifact = artifact;
-                        wr.transitive = false;
-                        //only direct deps matter to us..
-                        if ( artifact.getDependencyTrail().size() > 2 )
-                        {
-                            log.debug(
-                                artifact.getId() + " omitted as NetBeans module OSGi dependency, not a direct one. Declare it in the pom for inclusion." );
-                            wr.transitive = true;
-
-                        }
-                        else
-                        {
-                            if ( print )
-                            {
-                                log.info( "Adding OSGi bundle dependency - " + id );
-                            }
-                        }
-
-                        include.add( wr );
-                    }
-                }
-            }
-        return include;
-    }
-
-    static class ModuleWrapper
-    {
-
-        Dependency dependency;
-
-        Artifact artifact;
-
-        boolean transitive = true;
-        
-        boolean osgi = false;
-
-    }
-
-    //copied from dependency:tree mojo
-    protected DependencyNode createDependencyTree( MavenProject project, DependencyGraphBuilder dependencyGraphBuilder,
-                                                   String scope )
-        throws MojoExecutionException
-    {
-        ArtifactFilter artifactFilter = createResolvingArtifactFilter( scope );
-        try
-        {
-            return dependencyGraphBuilder.buildDependencyGraph( project, artifactFilter );
-        }
-        catch ( DependencyGraphBuilderException exception )
-        {
-            throw new MojoExecutionException( "Cannot build project dependency tree", exception );
-        }
-
-    }
-
-    //copied from dependency:tree mojo
-    /**
-     * Gets the artifact filter to use when resolving the dependency tree.
-     *
-     * @return the artifact filter
-     */
-    private ArtifactFilter createResolvingArtifactFilter( String scope )
-    {
-        ArtifactFilter filter;
-
-        // filter scope
-        if ( scope != null )
-        {
-            getLog().debug( "+ Resolving dependency tree for scope '" + scope + "'" );
-
-            filter = new ScopeArtifactFilter( scope );
-        }
-        else
-        {
-            filter = null;
-        }
-
-        return filter;
-    }
-
-    protected final ArtifactResult turnJarToNbmFile( Artifact art, ArtifactFactory artifactFactory,
-                                                     ArtifactResolver artifactResolver, MavenProject project,
-                                                     ArtifactRepository localRepository )
-        throws MojoExecutionException
-    {
-        if ( "jar".equals( art.getType() ) || "nbm".equals( art.getType() ) )
-        {
-            //TODO, it would be nice to have a check to see if the
-            // "to-be-created" module nbm artifact is actually already in the
-            // list of dependencies (as "nbm-file") or not..
-            // that would be a timesaver
-            ExamineManifest mnf = new ExamineManifest( getLog() );
-            File jar = art.getFile();
-            if ( !jar.isFile() )
-            {
-                //MNBMODULE-210 with recent CoS changes in netbeans (7.4) jar will be file as we link open projects in the build
-                // via WorkspaceReader. That's fine here, as all we need is to know if project is osgi or nbm module.
-                // the nbm file has to be in local repository though.
-                String path = localRepository.pathOf( art );
-                File jar2 = new File(localRepository.getBasedir(), path.replace( "/", File.separator));
-                File manifest = new File(jar, "META-INF/MANIFEST.MF" );
-                
-                if (! jar2.isFile() || !manifest.isFile() ) {
-                    getLog().warn( "MNBMODULE-131: need to at least run install phase on " + jar2 );
-                    return new ArtifactResult( null, null );
-                }
-                mnf.setManifestFile( manifest );
-            } else {
-                mnf.setJarFile( jar );
-            }
-            mnf.checkFile();
-            if ( mnf.isNetBeansModule() )
-            {
-                Artifact nbmArt = artifactFactory.createDependencyArtifact(
-                    art.getGroupId(),
-                    art.getArtifactId(),
-                    art.getVersionRange(),
-                    "nbm-file",
-                    art.getClassifier(),
-                    art.getScope() );
-                try
-                {
-                    artifactResolver.resolve( nbmArt, project.getRemoteArtifactRepositories(), localRepository );
-                }
-
-                catch ( ArtifactResolutionException ex )
-                {
-                    //shall be check before actually resolving from repos?
-                    checkReactor( art, nbmArt );
-                    if ( !nbmArt.isResolved() )
-                    {
-                        throw new MojoExecutionException( "Failed to retrieve the nbm file from repository", ex );
-                    }
-                }
-                catch ( ArtifactNotFoundException ex )
-                {
-                    //shall be check before actually resolving from repos?
-                    checkReactor( art, nbmArt );
-                    if ( !nbmArt.isResolved() )
-                    {
-                        throw new MojoExecutionException( "Failed to retrieve the nbm file from repository", ex );
-                    }
-                }
-                return new ArtifactResult( nbmArt, mnf );
-            }
-            if ( mnf.isOsgiBundle() )
-            {
-                return new ArtifactResult( null, mnf );
-            }
-        }
-        return new ArtifactResult( null, null );
-    }
-
-    protected static final class ArtifactResult
-    {
-        private final Artifact converted;
-        private final ExamineManifest manifest;
-
-        ArtifactResult( Artifact conv, ExamineManifest manifest )
-        {
-            converted = conv;
-            this.manifest = manifest;
-        }
-
-        boolean hasConvertedArtifact()
-        {
-            return converted != null;
-        }
-
-        Artifact getConvertedArtifact()
-        {
-            return converted;
-        }
-
-        public boolean isOSGiBundle()
-        {
-            return manifest != null && manifest.isOsgiBundle();
-        }
-
-        public ExamineManifest getExaminedManifest()
-        {
-            return manifest;
-        }
-    }
-
-    private void checkReactor( Artifact art, Artifact nbmArt )
-    {
-        if ( art.getFile().getName().endsWith( ".jar" ) )
-        {
-            String name = art.getFile().getName();
-            name = name.substring( 0, name.length() - ".jar".length() ) + ".nbm";
-            File fl = new File( art.getFile().getParentFile(), name );
-            if ( fl.exists() )
-            {
-                nbmArt.setFile( fl );
-                nbmArt.setResolved( true );
-            }
-        }
-    }
-
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AdaptNbVersion.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AdaptNbVersion.java
deleted file mode 100644
index 79d15e9..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/AdaptNbVersion.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
-
-/**
- *  will try to convert the maven version number to a NetBeans friendly version number.
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-public class AdaptNbVersion
-{
-
-    public static final String TYPE_SPECIFICATION = "spec"; //NOI18N
-    public static final String TYPE_IMPLEMENTATION = "impl"; //NOI18N
-    private static final String SNAPSHOT = "SNAPSHOT"; //NOI18N
-
-    public static String adaptVersion( String version, Object type, Date date )
-    {
-        StringTokenizer tok = new StringTokenizer( version, "." );
-        if ( SNAPSHOT.equals( version ) && TYPE_IMPLEMENTATION.equals( type ) )
-        {
-            return "0.0.0." + generateSnapshotValue( date );
-        }
-        StringBuffer toReturn = new StringBuffer();
-        while ( tok.hasMoreTokens() )
-        {
-            String token = tok.nextToken();
-            if ( TYPE_IMPLEMENTATION.equals( type ) )
-            {
-                int snapshotIndex = token.indexOf( SNAPSHOT );
-                if ( snapshotIndex > 0 )
-                {
-                    String repl = token.substring( 0, snapshotIndex ) + generateSnapshotValue( date );
-                    if ( token.length() > snapshotIndex + SNAPSHOT.length() )
-                    {
-                        repl = token.substring(
-                                snapshotIndex + SNAPSHOT.length() );
-                    }
-                    token = repl;
-                }
-            }
-            if ( TYPE_SPECIFICATION.equals( type ) )
-            {
-                // strip the trailing -RC1, -BETA5, -SNAPSHOT
-                if ( token.indexOf( '-' ) > 0 )
-                {
-                    token = token.substring( 0, token.indexOf( '-' ) );
-                } else if ( token.indexOf( '_' ) > 0 )
-                {
-                    token = token.substring( 0, token.indexOf( '_' ) );
-                }
-                try
-                {
-                    Integer intValue = Integer.valueOf( token );
-                    token = intValue.toString();
-                }
-                catch ( NumberFormatException exc )
-                {
-                    // ignore, will just not be added to the
-                    token = "";
-                }
-            }
-            if ( token.length() > 0 )
-            {
-                if ( toReturn.length() != 0 )
-                {
-                    toReturn.append( "." );
-                }
-                toReturn.append( token );
-            }
-
-        }
-        if ( toReturn.length() == 0 )
-        {
-            toReturn.append( "0.0.0" );
-        }
-        return toReturn.toString();
-    }
-
-    private static String generateSnapshotValue( Date date )
-    {
-        SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyyMMdd" );
-        dateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
-        return dateFormat.format( date );
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BrandingMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BrandingMojo.java
deleted file mode 100644
index ff7140d..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BrandingMojo.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/* ==========================================================================
- * Copyright 2007 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.archiver.jar.JarArchiver;
-import org.codehaus.plexus.util.DirectoryScanner;
-import org.codehaus.plexus.util.FileUtils;
-
-/**
- * Package branding resources for NetBeans platform/IDE based application.
- * The format of branding resources is the same as in
- * NetBeans Ant-based projects.
- * 
- * The <code>src/main/nbm-branding</code> folder of the project is assumed to 
- * contain the branding content. Within the directory, the following folder structure is assumed:
- * <ul>
- * <li>
- * 1. pick the IDE/platform module which contents you want to brand. eg. org-openide-windows.jar
- * </li><li>
- * 2. locate the jar within the IDE/platform installation and it's cluster, eg. modules/org-openide-windows.jar 
- * </li><li>
- * 3. create the same folder structure in src/main/nbm-branding, make folder with the module's jar name as well.
- * eg. create folder by name modules/org-openide-windows.jar
- * </li><li>
- * 4. within that folder place your branding modifications at the same location, as if they were withn the jar,
- * eg. org/openide/windows/ui/Bundle.properties and place the changed bundle keys there.
- * </li></ul>
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- *
- */
-@Mojo(name="branding",
-        requiresProject=true,
-        threadSafe = true,
-        defaultPhase= LifecyclePhase.PACKAGE)
-public class BrandingMojo
-        extends AbstractNbmMojo
-{
-
-    /**
-     * directory where the the binary content is created.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}/nbm")
-    protected File nbmBuildDir;
-    
-    /**
-    * output directory.
-    */
-    @Parameter(defaultValue="${project.build.directory}", required=true)
-    protected File outputDirectory;
-    
-    /**
-     * Location of the branded resources.
-     */
-    @Parameter(required=true, defaultValue="${basedir}/src/main/nbm-branding")
-    private File brandingSources;
-    /**
-     * The branding token used by the application.
-     * Required unless {@code nbmBuildDir} does not exist and the mojo is thus skipped.
-     */
-    @Parameter(property="netbeans.branding.token")
-    private String brandingToken;
-    /**
-     * cluster of the branding.
-     */
-    @Parameter(required=true, defaultValue="extra")
-    protected String cluster;
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    public void execute()
-        throws MojoExecutionException
-    {
-        if ( !"nbm".equals( project.getPackaging() ) ) 
-        {
-            getLog().error( "The nbm:branding goal shall be used within a NetBeans module project only (packaging 'nbm')" );
-        }
-        if ( !brandingSources.isDirectory() )
-        {
-            getLog().info( "No branding to process." );
-            return;
-        }
-        if ( brandingToken == null )
-        {
-            throw new MojoExecutionException( "brandingToken must be defined for mojo:branding" );
-        }
-        try
-        {
-
-            DirectoryScanner scanner = new DirectoryScanner();
-            scanner.setIncludes( new String[]
-                    {
-                        "**/*.*"
-                    } );
-            scanner.addDefaultExcludes();
-            scanner.setBasedir( brandingSources );
-            scanner.scan();
-
-            final String clusterPathPart = "netbeans" + File.separator + cluster;
-            File outputDir = new File(outputDirectory, "branding_and_locales");
-            outputDir.mkdirs();
-            File clusterDir = new File( nbmBuildDir, clusterPathPart );
-            clusterDir.mkdirs();
-
-            // copy all files and see to it that they get the correct names
-            for ( String brandingFilePath : scanner.getIncludedFiles() )
-            {
-                File brandingFile = new File( brandingSources, brandingFilePath );
-                String[] locale = getLocale( brandingFile.getName());
-                String token = locale[1] == null ? brandingToken : brandingToken + "_" + locale[1];
-                File root = new File(outputDir, token);
-                root.mkdirs();
-                String destinationName = locale[0] + "_" + token + locale[2];
-                File brandingDestination = new File( root, brandingFilePath.replace( brandingFile.getName(), destinationName) );
-                if ( !brandingDestination.getParentFile().exists() )
-                {
-                    brandingDestination.getParentFile().mkdirs();
-                }
-                FileUtils.copyFile( brandingFile, brandingDestination );
-            }
-            for (File rootDir : outputDir.listFiles()) {
-                if (!rootDir.isDirectory()) {
-                    continue;
-                }
-                String effectiveBranding = rootDir.getName();
-                // create jar-files from each toplevel .jar directory
-                scanner.setIncludes( new String[]
-                    {
-                        "**/*.jar"
-                    } );
-                scanner.setBasedir( rootDir );
-                scanner.scan();
-                for ( String jarDirectoryPath : scanner.getIncludedDirectories() )
-                {
-                    // move nnn.jar directory to nnn.jar.tmp
-                    File jarDirectory = new File( rootDir, jarDirectoryPath );
-                    File destinationLocation = new File(clusterDir, jarDirectoryPath).getParentFile();
-                    destinationLocation.mkdirs();
-                    // jars should be placed in locales/ under the same directory the jar-directories are
-                    File destinationJar =
-                        new File( destinationLocation + File.separator + "locale"
-                            + File.separator + destinationFileName( jarDirectory.getName(), effectiveBranding ) );
-
-                    // create nnn.jar archive of contents
-                    JarArchiver archiver = new JarArchiver();
-                    archiver.setDestFile( destinationJar );
-                    archiver.addDirectory( jarDirectory );
-                    archiver.createArchive();
-                }
-            }
-
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "Error creating branding", ex );
-        }
-    }
-
-    static  String destinationFileName( String brandingFilePath, String branding )
-    {
-        // use first underscore in filename 
-        int lastSeparator = brandingFilePath.lastIndexOf( File.separator );
-        String infix = "_" + branding;
-
-        // no underscores, use dot
-        int lastDot = brandingFilePath.lastIndexOf( "." );
-        if (lastDot == -1 || lastDot < lastSeparator) {
-            return brandingFilePath + infix;
-        }
-        return brandingFilePath.substring( 0, lastDot ) + infix + brandingFilePath.substring( lastDot );
-    }
-    
-    //[0] prefix
-    //[1] locale
-    //[2] suffix
-    static String[] getLocale(String name) {
-        String suffix = "";
-        int dot = name.indexOf( ".");
-        if (dot > -1) { //remove file extension
-            suffix = name.substring( dot );
-            name = name.substring( 0, dot);
-        }
-        String locale = null;
-        int count = 1;
-        //iterate from back of the string, max 3 times and see if the pattern patches local pattern
-        while (count <= 3) {
-            int underscore = name.lastIndexOf( '_');
-            if (underscore > -1) {
-                String loc1 = name.substring( underscore  + 1);
-                if (loc1.length() != 2) {
-                    break;
-                } 
-                locale = loc1 + (locale == null ? "" : "_" + locale);
-                name = name.substring( 0, underscore);
-            } else {
-                break;
-            }
-            count = count + 1;
-        }
-        return new String[] {name, locale, suffix};
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BuildInstallersMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BuildInstallersMojo.java
deleted file mode 100644
index 26e92b9..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/BuildInstallersMojo.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright 2012 Frantisek Mantlik <frantisek at mantlik.cz>.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * under the License.
- */
-package org.netbeans.nbm;
-
-import java.io.*;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.*;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.ProjectHelper;
-import org.apache.tools.ant.util.StringUtils;
-
-/**
- * Build installers for Mavenized NetBeans application.
- * Creates installers for supported operating systems
- * and packages each installer as a deployable artifact.
- * <p>See a <a href="http://www.mojohaus.org/nbm-maven-plugin/buildinstexample.html">how-to</a> on customizing the installer.
- * @author <a href="mailto:frantisek@mantlik.cz">Frantisek Mantlik</a>
- */
-@Mojo(name="build-installers", 
-        requiresProject=true, 
-        requiresDependencyResolution=ResolutionScope.RUNTIME,
-        threadSafe = true,
-        defaultPhase=LifecyclePhase.PACKAGE )
-public class BuildInstallersMojo
-        extends AbstractNbmMojo
-{
-
-    /**
-    * output directory.
-    */
-    @Parameter(defaultValue="${project.build.directory}", required=true)
-    protected File outputDirectory;
-    /**
-    * The branding token for the application based on NetBeans platform.
-    */
-    @Parameter(property="netbeans.branding.token", required=true)
-    protected String brandingToken;
-    /**
-    * Installation directory name at the destination system
-    * Deprecated, to be removed, was never actually used.
-    */
-    @Parameter(property="netbeans.branding.token")
-    protected String installDirName;
-    /**
-    * Prefix of all generated installers files
-    */
-    @Parameter(defaultValue="${project.build.finalName}")
-    private String installersFilePrefix;
-    /**
-     * Create installer for Windows
-     */
-    @Parameter(defaultValue="true")
-    private boolean installerOsWindows;
-    /**
-     * Create installer for Solaris
-     */
-    @Parameter(defaultValue="true")
-    private boolean installerOsSolaris;
-    /**
-     * Create installer for Linux
-     */
-    @Parameter(defaultValue="true")    
-    private boolean installerOsLinux;
-    /**
-     * Create installer for MacOSx
-     */
-    @Parameter(defaultValue="true")    
-    private boolean installerOsMacosx;
-    /**
-     * Enable Pack200 compression
-     */
-    @Parameter(defaultValue="true")
-    private boolean installerPack200Enable;
-    /**
-     * License file
-     */
-    @Parameter(defaultValue="${basedir}/license.txt")
-    private File installerLicenseFile;
-    /**
-     * Custom installer template.
-     * This file, if provided, will replace default template from
-     * &lt;NetBeansInstallation&gt;/harness/nbi/stub/template.xml
-     */
-    @Parameter
-    private File templateFile;
-    /**
-     * Parameters passed to templateFile 
-     * or to installer/nbi/stub/template.xml 
-     * to customize generated installers.
-     *
-     */
-    @Parameter
-    private Map<String, String> userSettings;
-    
-    /**
-     * Name of the zip artifact used to produce installers from (without .zip extension)
-     */
-    @Parameter(defaultValue="${project.build.finalName}")
-    private String finalName;
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-    /**
-     * Used for attaching the artifact in the project
-     */
-    @Component
-    private MavenProjectHelper projectHelper;
-        
-    @Parameter(readonly=true, required=true, property="basedir")
-    private File basedir;
-    /**
-    * The Maven Project.
-    */
-    @Parameter(required=true, readonly=true, property="project")    
-    private MavenProject project;    
-
-    // </editor-fold>
-    @Override
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        Project antProject = antProject();
-
-        if ( !"nbm-application".equals( project.getPackaging() ) )
-        {
-            throw new MojoExecutionException(
-                    "This goal only makes sense on project with 'nbm-application' packaging." );
-        }
-        
-        if (!installerOsLinux && !installerOsMacosx && !installerOsSolaris && !installerOsWindows) {
-            getLog().warn( "None of the Operating System Installers selected, skipping 'build-installers' goal.");
-            return;
-        }
-
-        String zipName = finalName + ".zip";
-        File zipFile = new File( outputDirectory, zipName );
-        getLog().info( String.format( "Running Build Installers action for (existing=%2$s) zip file %1$s",
-                zipFile, zipFile.exists() ) );
-
-
-        File appIconIcnsFile;
-
-        // Copy Netbeans Installer resources
-        FileUrlUtils fu = new FileUrlUtils();
-        File harnessDir = new File( outputDirectory, "installer" );
-        fu.copyResourcesRecursively( getClass().getClassLoader().getResource( "harness" ), harnessDir );
-
-        // Overwrite template file with modified version to accept branded images etc.
-        if ( templateFile != null )
-        {
-            File template = new File( harnessDir, "nbi/stub/template.xml" );
-            fu.copyFile( templateFile, template );
-        }
-
-        appIconIcnsFile = new File( harnessDir, "etc" + File.separatorChar + "applicationIcon.icns" );
-        getLog().info( "Application icon:" + appIconIcnsFile.getAbsolutePath() );
-
-        Map<String, String> props = new HashMap<String, String> ();
-
-        props.put( "suite.location", basedir.getAbsolutePath().replace( "\\", "/" ) );
-        props.put( "suite.props.app.name", brandingToken);
-        props.put( "suite.dist.zip", zipFile.getAbsolutePath().replace( "\\", "/" ) );
-        props.put( "suite.dist.directory", outputDirectory.getAbsolutePath().replace( "\\", "/" ) );
-        props.put( "installer.build.dir", new File( outputDirectory, "installerbuild" ).getAbsolutePath().replace( "\\", "/" ) );
-        
-        props.put( "installers.file.prefix", installersFilePrefix );
-
-//        props.put( "install.dir.name", installDirName );
-
-        //mkleint: this is a flawed pattern! cannot make any assumption on multimodule layout
-        String appName = project.getParent().getArtifactId().replace( ".", "" ).replace( "-", "" ).replace( "_", "" ).replaceAll( "[0-9]+", "" );
-        props.put( "suite.nbi.product.uid", appName.toLowerCase( Locale.ENGLISH ) );
-
-        props.put( "suite.props.app.title", ( project.getName() + " " + project.getVersion() ).replaceAll( "-SNAPSHOT", "" ) );
-
-        String appVersion = project.getVersion().replaceAll( "-SNAPSHOT", "" );
-        props.put( "suite.nbi.product.version.short", appVersion );
-        while ( appVersion.split( "\\." ).length < 5 )
-        {
-            appVersion += ".0";
-        }
-        props.put( "suite.nbi.product.version", appVersion );
-
-        props.put( "nbi.stub.location", new File( harnessDir, "nbi/stub" ).getAbsolutePath().replace( "\\", "/" ) );
-
-        props.put( "nbi.stub.common.location", new File( harnessDir, "nbi/.common" ).getAbsolutePath().replace( "\\", "/" ) );
-
-        props.put( "nbi.ant.tasks.jar", new File( harnessDir, "modules/ext/nbi-ant-tasks.jar" ).getAbsolutePath().replace( "\\", "/" ) );
-
-        props.put( "nbi.registries.management.jar", new File( harnessDir, "modules/ext/nbi-registries-management.jar" ).getAbsolutePath().replace( "\\", "/" ) );
-
-        props.put( "nbi.engine.jar", new File( harnessDir, "modules/ext/nbi-engine.jar" ).getAbsolutePath().replace( "\\", "/" ) );
-
-        if ( installerLicenseFile != null )
-        {
-            getLog().info( String.format( "License file is at %1s, exist = %2$s", installerLicenseFile, installerLicenseFile.exists() ) );
-            props.put( "nbi.license.file", installerLicenseFile.getAbsolutePath() ); //mkleint: no path replacement here??
-        }
-
-        List<String> platforms = new ArrayList<String>();
-
-        if ( this.installerOsLinux )
-        {
-            platforms.add( "linux" );
-            File linuxFile = new File( outputDirectory, installersFilePrefix + "-linux.sh" );
-            projectHelper.attachArtifact( project, "sh", "linux", linuxFile );
-        }
-        if ( this.installerOsSolaris )
-        {
-            platforms.add( "solaris" );
-            File solarisFile = new File( outputDirectory, installersFilePrefix + "-solaris.sh" );
-            projectHelper.attachArtifact( project, "sh", "solaris", solarisFile );
-        }
-        if ( this.installerOsWindows )
-        {
-            platforms.add( "windows" );
-            File windowsFile = new File( outputDirectory, installersFilePrefix + "-windows.exe" );
-            projectHelper.attachArtifact( project, "exe", "windows", windowsFile );
-        }
-        if ( this.installerOsMacosx )
-        {
-            platforms.add( "macosx" );
-            File macosxFile = new File( outputDirectory, installersFilePrefix + "-macosx.tgz" );
-            projectHelper.attachArtifact( project, "tgz", "macosx", macosxFile );
-        }
-
-        StringBuilder sb = new StringBuilder();
-        for ( int i = 0; i < platforms.size(); i++ )
-        {
-            if ( i != 0 )
-            {
-                sb.append( " " );
-            }
-            sb.append( platforms.get( i ) );
-        }
-        if ( sb.length() == 0 )
-        {
-            //nothing to build
-            getLog().warn( "Nothing to build." );
-        }
-
-        props.put( "generate.installer.for.platforms", sb.toString() );
-
-        File javaHome = new File( System.getProperty( "java.home" ) );
-        if ( new File( javaHome, "lib/rt.jar" ).exists() && javaHome.getName().equals( "jre" ) ) //mkleint: does this work on mac? no rt.jar there
-        {
-            javaHome = javaHome.getParentFile();
-        }
-        props.put( "generator-jdk-location-forward-slashes", javaHome.getAbsolutePath().replace( "\\", "/" ) );
-
-        props.put( "pack200.enabled", "" + installerPack200Enable );
-
-        if ( appIconIcnsFile != null )
-        {
-            props.put( "nbi.dock.icon.file", appIconIcnsFile.getAbsolutePath() );
-        }
-
-        try
-        {
-            antProject.setUserProperty( "ant.file", new File( harnessDir, "nbi/stub/template.xml" ).getAbsolutePath().replace( "\\", "/" ) );
-            ProjectHelper helper = ProjectHelper.getProjectHelper();
-            antProject.addReference( "ant.projectHelper", helper );
-            helper.parse( antProject, new File( harnessDir, "nbi/stub/template.xml" ) );
-            for ( Map.Entry<String, String> e : props.entrySet() )
-            {
-                antProject.setProperty( e.getKey(), e.getValue() );
-            }
-            if ( userSettings != null )
-            {
-                for ( Map.Entry<String, String> e : userSettings.entrySet() )
-                {
-                    antProject.setProperty( e.getKey(), e.getValue() );
-                }
-            }
-            antProject.executeTarget( "build" );
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "Installers creation failed: " + ex, ex );
-        }
-    }
-
-    //mkleint: could this be replaced by something from plexus-utils?
-    private class FileUrlUtils
-    {
-
-        boolean copyFile( final File toCopy, final File destFile )
-            throws MojoExecutionException
-        {
-            try
-            {
-                return copyStream( new FileInputStream( toCopy ), new FileOutputStream( destFile ) );
-            }
-            catch ( final FileNotFoundException e )
-            {
-                throw new MojoExecutionException( "Installers creation failed: " + e, e );
-            }
-        }
-
-        boolean copyFilesRecusively( final File toCopy, final File destDir )
-            throws MojoExecutionException
-        {
-            assert destDir.isDirectory();
-
-            if ( !toCopy.isDirectory() )
-            {
-                return copyFile( toCopy, new File( destDir, toCopy.getName() ) );
-            }
-            else
-            {
-                final File newDestDir = new File( destDir, toCopy.getName() );
-                if ( !newDestDir.exists() && !newDestDir.mkdir() )
-                {
-                    return false;
-                }
-                for ( final File child : toCopy.listFiles() )
-                {
-                    if ( !copyFilesRecusively( child, newDestDir ) )
-                    {
-                        return false;
-                    }
-                }
-            }
-            return true;
-        }
-
-        boolean copyJarResourcesRecursively( final File destDir, final JarURLConnection jarConnection )
-            throws IOException, MojoExecutionException
-        {
-
-            final JarFile jarFile = jarConnection.getJarFile();
-
-            for ( final Enumeration<JarEntry> e = jarFile.entries(); e.hasMoreElements(); )
-            {
-                final JarEntry entry = e.nextElement();
-                if ( entry.getName().startsWith( jarConnection.getEntryName() ) )
-                {
-                    final String filename = StringUtils.removePrefix( entry.getName(), //
-                            jarConnection.getEntryName() );
-
-                    final File f = new File( destDir, filename );
-                    if ( !entry.isDirectory() )
-                    {
-                        final InputStream entryInputStream = jarFile.getInputStream( entry );
-                        if ( !copyStream( entryInputStream, f ) )
-                        {
-                            return false;
-                        }
-                        entryInputStream.close();
-                    }
-                    else
-                    {
-                        if ( !ensureDirectoryExists( f ) )
-                        {
-                            throw new IOException( "Could not create directory: "
-                                    + f.getAbsolutePath() );
-                        }
-                    }
-                }
-            }
-            return true;
-        }
-
-        boolean copyResourcesRecursively( final URL originUrl, final File destination )
-            throws MojoExecutionException
-        {
-            try
-            {
-                final URLConnection urlConnection = originUrl.openConnection();
-                if ( urlConnection instanceof JarURLConnection )
-                {
-                    return copyJarResourcesRecursively( destination, (JarURLConnection) urlConnection );
-                }
-                else
-                {
-                    return copyFilesRecusively( new File( originUrl.getPath() ), destination );
-                }
-            }
-            catch ( final IOException e )
-            {
-                throw new MojoExecutionException( "Installers creation failed: " + e, e );
-            }
-        }
-
-        boolean copyStream( final InputStream is, final File f )
-            throws MojoExecutionException
-        {
-            try
-            {
-                return copyStream( is, new FileOutputStream( f ) );
-            }
-            catch ( final FileNotFoundException e )
-            {
-                throw new MojoExecutionException( "Installers creation failed: " + e, e );
-            }
-        }
-
-        boolean copyStream( final InputStream is, final OutputStream os )
-            throws MojoExecutionException
-        {
-            try
-            {
-                final byte[] buf = new byte[1024];
-
-                int len;
-                while ( ( len = is.read( buf ) ) > 0 )
-                {
-                    os.write( buf, 0, len );
-                }
-                is.close();
-                os.close();
-                return true;
-            }
-            catch ( final IOException e )
-            {
-                throw new MojoExecutionException( "Installers creation failed: " + e, e );
-            }
-        }
-
-        boolean ensureDirectoryExists( final File f )
-        {
-            return f.exists() || f.mkdir();
-        }
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectLibrariesNodeVisitor.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectLibrariesNodeVisitor.java
deleted file mode 100644
index 05642fd..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectLibrariesNodeVisitor.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/* ==========================================================================
- * Copyright 2008 mkleint
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
-import org.netbeans.nbm.utils.ExamineManifest;
-
-/**
- * A dependency node visitor that collects visited nodes that are known libraries or are
- * children of known libraries
- * @author milos kleint
- */
-public class CollectLibrariesNodeVisitor
-    implements DependencyNodeVisitor
-{
-
-    /**
-     * The collected list of nodes.
-     */
-    private final List<Artifact> nodes;
-
-    private Map<String, Artifact> artifacts;
-
-    private Map<Artifact, ExamineManifest> examinerCache;
-
-    private List<String> explicitLibs;
-
-    private final Log log;
-
-    private MojoExecutionException throwable;
-
-    private DependencyNode root;
-
-    private Set<String> duplicates;
-
-    private Set<String> conflicts;
-
-    private Set<String> includes;
-
-    private final boolean useOsgiDependencies;
-
-    /**
-     * Creates a dependency node visitor that collects visited nodes for further processing.
-     * @param explicitLibraries list of explicit libraries
-     * @param runtimeArtifacts list of runtime artifacts
-     * @param examinerCache cache of netbeans manifest for artifacts
-     * @param log mojo logger
-     * @param root dependency to start collect with
-     * @param useOsgiDependencies whether to allow osgi dependencies or not
-     */
-    public CollectLibrariesNodeVisitor( List<String> explicitLibraries,
-        List<Artifact> runtimeArtifacts, Map<Artifact, ExamineManifest> examinerCache,
-        Log log, DependencyNode root, boolean useOsgiDependencies )
-    {
-        nodes = new ArrayList<Artifact>();
-        artifacts = new HashMap<String, Artifact>();
-        for ( Artifact a : runtimeArtifacts )
-        {
-            artifacts.put( a.getDependencyConflictId(), a );
-        }
-        this.examinerCache = examinerCache;
-        this.explicitLibs = explicitLibraries;
-        this.log = log;
-        this.root = root;
-        this.useOsgiDependencies = useOsgiDependencies;
-        duplicates = new HashSet<String>();
-        conflicts = new HashSet<String>();
-        includes = new HashSet<String>();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        if ( throwable != null )
-        {
-            return false;
-        }
-        if ( root == node )
-        {
-            return true;
-        }
-        try
-        {
-            Artifact artifact = node.getArtifact();
-            if ( !artifacts.containsKey( artifact.getDependencyConflictId() ) )
-            {
-                //ignore non-runtime stuff..
-                return false;
-            }
-            // somehow the transitive artifacts in the  tree are not always resolved?
-            artifact = artifacts.get( artifact.getDependencyConflictId() );
-
-            ExamineManifest depExaminator = examinerCache.get( artifact );
-            if ( depExaminator == null )
-            {
-                depExaminator = new ExamineManifest( log );
-                depExaminator.setArtifactFile( artifact.getFile() );
-                depExaminator.checkFile();
-                examinerCache.put( artifact, depExaminator );
-            }
-            if ( AbstractNbmMojo.matchesLibrary( artifact, explicitLibs, depExaminator, log, useOsgiDependencies ) )
-            {
-                if ( depExaminator.isNetBeansModule() )
-                {
-                    log.warn(
-                        "You are using a NetBeans Module as a Library (classpath extension): " + artifact.getId() );
-                }
-
-                nodes.add( artifact );
-                includes.add( artifact.getDependencyConflictId() );
-                // if a library, iterate to it's child nodes.
-                return true;
-            }
-        }
-        catch ( MojoExecutionException mojoExecutionException )
-        {
-            throwable = mojoExecutionException;
-        }
-        //don't bother iterating to childs if the current node is not a library.
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        if ( throwable != null )
-        {
-            return false;
-        }
-        if ( node == root )
-        {
-            if ( nodes.size() > 0 )
-            {
-                log.info( "Adding on module's Class-Path:" );
-                for ( Artifact inc : nodes )
-                {
-                    log.info( "    " + inc.getId() );
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Gets the list of collected dependency nodes.
-     * 
-     * @return the list of collected dependency nodes
-     * @throws MojoExecutionException if a throwable is set
-     */
-    public List<Artifact> getArtifacts()
-        throws MojoExecutionException
-    {
-        if ( throwable != null )
-        {
-            throw throwable;
-        }
-        return nodes;
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectModuleLibrariesNodeVisitor.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectModuleLibrariesNodeVisitor.java
deleted file mode 100644
index 713b406..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CollectModuleLibrariesNodeVisitor.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/* ==========================================================================
- * Copyright 2008 mkleint
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
-import org.netbeans.nbm.utils.ExamineManifest;
-
-/**
- * A dependency node visitor that collects visited nodes that are known libraries or are
- * children of known libraries
- * @author milos kleint
- */
-public class CollectModuleLibrariesNodeVisitor
-    implements DependencyNodeVisitor
-{
-
-    /**
-     * The collected list of nodes.
-     */
-    private final Map<String, List<Artifact>> directNodes;
-
-    private final Map<String, List<Artifact>> transitiveNodes;
-
-    private Map<String, Artifact> artifacts;
-
-    private Map<Artifact, ExamineManifest> examinerCache;
-
-    private final Log log;
-
-    private MojoExecutionException throwable;
-
-    private DependencyNode root;
-
-    private Stack<String> currentModule = new Stack<String>();
-    private static final String LIB_ID = "!@#$%^&ROOT";
-
-    private final boolean useOSGiDependencies;
-
-    /**
-     * Creates a dependency node visitor that collects visited nodes for further processing.
-     * @param runtimeArtifacts list of runtime artifacts
-     * @param examinerCache cache of netbeans manifest for artifacts
-     * @param log mojo logger
-     * @param root dependency to start collect with
-     * @param useOSGiDependencies whether to allow osgi dependencies or not
-     */
-    public CollectModuleLibrariesNodeVisitor(
-        List<Artifact> runtimeArtifacts, Map<Artifact, ExamineManifest> examinerCache,
-        Log log, DependencyNode root, boolean useOSGiDependencies )
-    {
-        directNodes = new HashMap<String, List<Artifact>>();
-        transitiveNodes = new HashMap<String, List<Artifact>>();
-        artifacts = new HashMap<String, Artifact>();
-        for ( Artifact a : runtimeArtifacts )
-        {
-            artifacts.put( a.getDependencyConflictId(), a );
-        }
-        this.examinerCache = examinerCache;
-        this.log = log;
-        this.root = root;
-        this.useOSGiDependencies = useOSGiDependencies;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean visit( DependencyNode node )
-    {
-        if ( throwable != null )
-        {
-            return false;
-        }
-        if ( root == node )
-        {
-            return true;
-        }
-        try
-        {
-            Artifact artifact = node.getArtifact();
-            if ( !artifacts.containsKey( artifact.getDependencyConflictId() ) )
-            {
-                //ignore non-runtime stuff..
-                return false;
-            }
-            // somehow the transitive artifacts in the  tree are not always resolved?
-            artifact = artifacts.get( artifact.getDependencyConflictId() );
-
-            ExamineManifest depExaminator = examinerCache.get( artifact );
-            if ( depExaminator == null )
-            {
-                depExaminator = new ExamineManifest( log );
-                depExaminator.setArtifactFile( artifact.getFile() );
-                depExaminator.checkFile();
-                examinerCache.put( artifact, depExaminator );
-            }
-            if ( depExaminator.isNetBeansModule() || ( useOSGiDependencies && depExaminator.isOsgiBundle() ) )
-            {
-                currentModule.push( artifact.getDependencyConflictId() );
-                ArrayList<Artifact> arts = new ArrayList<Artifact>();
-                arts.add( artifact );
-                if ( currentModule.size() == 1 )
-                {
-                    directNodes.put( currentModule.peek(), arts );
-                }
-                else
-                {
-                    transitiveNodes.put( currentModule.peek(), arts );
-                }
-                return true;
-            }
-            if ( currentModule.size() > 0 )
-            {
-                ////MNBMODULE-95 we are only interested in the module owned libraries
-                if ( !currentModule.peek().startsWith( LIB_ID ) &&
-                        AbstractNbmMojo.matchesLibrary( artifact, Collections.<String>emptyList(), depExaminator, log, useOSGiDependencies ) )
-                {
-                    if ( currentModule.size() == 1 )
-                    {
-                        directNodes.get( currentModule.peek() ).add( artifact );
-                    }
-                    else
-                    {
-                        transitiveNodes.get( currentModule.peek() ).add( artifact );
-                    }
-                    // if a library, iterate to it's child nodes.
-                    return true;
-                }
-            }
-            else
-            {
-                //MNBMODULE-95 we check the non-module dependencies to see if they
-                // depend on modules/bundles. these bundles are transitive, so
-                // we add the root module as the first currentModule to keep
-                //any bundle/module underneath it as transitive
-                currentModule.push( LIB_ID + artifact.getDependencyConflictId() );
-            }
-        }
-        catch ( MojoExecutionException mojoExecutionException )
-        {
-            throwable = mojoExecutionException;
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean endVisit( DependencyNode node )
-    {
-        if ( throwable != null )
-        {
-            return false;
-        }
-        if ( !currentModule.empty()
-            && ( currentModule.peek().equals( node.getArtifact().getDependencyConflictId() )
-                            || currentModule.peek().equals( LIB_ID + node.getArtifact().getDependencyConflictId() ) ) )
-        {
-            currentModule.pop();
-        }
-        return true;
-    }
-
-    /**
-     * modules declared in the project's pom
-     * @return a map of module artifact lists, key is the dependencyConflictId
-     * @throws MojoExecutionException if an unexpected problem occurs
-     */
-    public Map<String, List<Artifact>> getDeclaredArtifacts()
-        throws MojoExecutionException
-    {
-        if ( throwable != null )
-        {
-            throw throwable;
-        }
-        return directNodes;
-    }
-
-    /**
-     * modules that were picked up transitively
-     * @return a map of module artifact lists, key is the dependencyConflictId
-     * @throws MojoExecutionException if an unexpected problem occurs
-     */
-    public Map<String, List<Artifact>> getTransitiveArtifacts()
-        throws MojoExecutionException
-    {
-        if ( throwable != null )
-        {
-            throw throwable;
-        }
-        return transitiveNodes;
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterAppMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterAppMojo.java
deleted file mode 100644
index 1bdf9bb..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterAppMojo.java
+++ /dev/null
@@ -1,1268 +0,0 @@
-/* ==========================================================================
- * Copyright Milos Kleint
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import com.google.common.collect.Sets;
-import java.io.*;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Pack200;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.CRC32;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.filters.StringInputStream;
-import org.apache.tools.ant.taskdefs.Chmod;
-import org.apache.tools.ant.types.FileSet;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.io.InputStreamFacade;
-import org.netbeans.nbbuild.MakeListOfNBM;
-
-/**
- * Create the NetBeans module clusters/application for the 'nbm-application' packaging
- * projects
- *
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- */
-@Mojo(name="cluster-app", 
-        defaultPhase= LifecyclePhase.PACKAGE, 
-        requiresProject=true, 
-        threadSafe = true,
-        requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class CreateClusterAppMojo
-    extends AbstractNbmMojo
-{
-
-    /**
-     * output directory where the the NetBeans application will be created.
-     */
-    @Parameter(defaultValue="${project.build.directory}", required=true)
-    private File outputDirectory;
-
-    /**
-     * The Maven Project.
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    /**
-     * The branding token for the application based on NetBeans platform.
-     */
-    @Parameter(property="netbeans.branding.token", required=true)
-    protected String brandingToken;
-
-    /**
-     * Optional path to custom etc/${brandingToken}.conf file. If not defined,
-     * a default template will be used.
-     */
-    @Parameter( property="netbeans.conf.file")
-    private File etcConfFile;
-
-    /**
-     * Optional path to custom etc/${brandingToken}.clusters file. If not defined,
-     * a default one will be generated.
-     */
-    @Parameter(property="netbeans.clusters.file")
-    private File etcClustersFile;
-
-    /**
-     * Directory which contains the executables that will be copied to
-     * the final application's bin/ directory.
-     * Please note that the name of the executables shall generally
-     * match the brandingToken parameter. Otherwise the application can be wrongly branded.
-     */
-    @Parameter(property="netbeans.bin.directory")
-    private File binDirectory;
-
-    /**
-     * If the depending NBM file doesn't contain any application cluster information,
-     * use this value as default location for such module NBMs.
-     * @since 3.2
-     */
-    @Parameter(defaultValue="extra")
-    private String defaultCluster;
-    
-    /**
-     * attempts to verify the integrity of module artifacts making sure that all dependencies are included
-     * and that all required tokens are provided
-     * @since 3.10
-     */
-    @Parameter(defaultValue = "true", property = "netbeans.verify.integrity")
-    private boolean verifyIntegrity;
-    
-    /**
-     * @since 4.12
-     */
-    @Parameter(defaultValue ="org.netbeans", property = "groupIdPrefix")
-    private String groupIdPrefix;
-    
-    private final Collection<String> defaultPlatformTokens = Arrays.asList( new String[] {
-                    "org.openide.modules.os.Windows",
-                    "org.openide.modules.os.Unix",
-                    "org.openide.modules.os.MacOSX",
-                    "org.openide.modules.os.OS2",
-                    "org.openide.modules.os.PlainUnix",    
-                    "org.openide.modules.os.Linux",
-                    "org.openide.modules.os.Solaris",
-                    "org.openide.modules.ModuleFormat1",
-                    "org.openide.modules.ModuleFormat2",
-                    "org.openide.modules.jre.JavaFX" //MNBMODULE-234
-    });
-
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-    
-    @Component
-    private ArtifactFactory artifactFactory;
-
-    @Component
-    private ArtifactResolver artifactResolver;
-
-    /**
-     * Local maven repository.
-     *
-     */
-    @Parameter(required=true, readonly=true, property="localRepository")
-    protected ArtifactRepository localRepository;
-
-// end of component params custom code folding
-// </editor-fold>
-
-    @Override
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-
-        File nbmBuildDirFile = new File( outputDirectory, brandingToken );
-        if ( !nbmBuildDirFile.exists() )
-        {
-            nbmBuildDirFile.mkdirs();
-        }
-
-        if ( "nbm-application".equals( project.getPackaging() ) )
-        {
-            Project antProject = registerNbmAntTasks();
-
-            Set<String> wrappedBundleCNBs = new HashSet<>(100);
-            Map<String, Set<String>> clusterDependencies = new HashMap<>();
-            Map<String, Set<String>> clusterModules = new HashMap<>();
-            
-            //verify integrity
-            Set<String> modulesCNBs = new HashSet<>(200);
-            Set<String> dependencyCNBs = new HashSet<>(200);
-            Map<String, Set<String>> dependencyCNBBacktraces = new HashMap<>(50);
-            Set<String> requireTokens = new HashSet<>(50);
-            Map<String, Set<String>> requireTokensBacktraces = new HashMap<>(50);
-            Set<String> provideTokens = new HashSet<>(50);
-            Set<String> osgiImports = new HashSet<>(50);
-            Map<String, Set<String>> osgiImportsBacktraces = new HashMap<>(50);
-            Set<String> osgiExports = new HashSet<>(50);
-            Set<String> osgiExportsSubs = new HashSet<>(50); //a way to deal with nb module declaring xxx.** (subpackages) declaration that is consumed by osgi imports
-            
-            List<BundleTuple> bundles = new ArrayList<>();
-
-            @SuppressWarnings( "unchecked" )
-            Set<Artifact> artifacts = project.getArtifacts();
-            for ( Artifact art : artifacts )
-            {
-                ArtifactResult res = turnJarToNbmFile( art, artifactFactory, artifactResolver, project, localRepository );
-                if ( res.hasConvertedArtifact() )
-                {
-                    art = res.getConvertedArtifact();
-                }
-
-                if ( art.getType().equals( "nbm-file" ) )
-                {
-                    try
-                    {
-                        JarFile jf = new JarFile( art.getFile() );
-                        try
-                        {
-                            String clusterName = findCluster( jf );                            
-                            ClusterTuple cluster = processCluster( clusterName, nbmBuildDirFile, art );
-                            
-                                getLog().debug( "Copying " + art.getId() + " to cluster " + clusterName );
-                                Enumeration<JarEntry> enu = jf.entries();
-
-                                // we need to trigger this ant task to generate the update_tracking file.
-                                MakeListOfNBM makeTask = (MakeListOfNBM) antProject.createTask( "genlist" );
-                                antProject.setNewProperty( "module.name", art.getFile().getName() ); // TODO
-                                antProject.setProperty( "cluster.dir", clusterName );
-                                FileSet set = makeTask.createFileSet();
-                                set.setDir( cluster.location );
-                                makeTask.setOutputfiledir( cluster.location );
-                                String[] executables = null;
-                                File classpathRoot = null;
-                                String classPath = null;
-                                while ( enu.hasMoreElements() )
-                                {
-                                    JarEntry ent = enu.nextElement();
-                                    String name = ent.getName();
-                                    //MNBMODULE-176
-                                    if (name.equals("Info/executables.list")) {
-                                        if (cluster.newer) {
-                                            InputStream is = jf.getInputStream( ent );
-                                            executables = StringUtils.split( IOUtil.toString( is, "UTF-8" ), "\n");
-                                        }
-                                    }
-                                    else if ( name.startsWith( "netbeans/" ) )
-                                    { // ignore everything else.
-                                        String path = clusterName + name.substring( "netbeans".length() );
-                                        boolean ispack200 = path.endsWith( ".jar.pack.gz" );
-                                        if ( ispack200 )
-                                        {
-                                            path = path.replace( ".jar.pack.gz", ".jar" );
-                                        }
-                                        File fl = new File( nbmBuildDirFile, path.replace( "/", File.separator ) );
-                                        String part = name.substring( "netbeans/".length() );
-                                        if ( ispack200 )
-                                        {
-                                            part = part.replace( ".jar.pack.gz", ".jar" );
-                                        }
-                                        if (cluster.newer) 
-                                        {
-                                            if ( ent.isDirectory() )
-                                            {
-                                                fl.mkdirs();
-                                            }
-                                            else if ( path.endsWith( ".external" ) ) // MNBMODULE-138
-                                            {
-                                                InputStream is = jf.getInputStream( ent );
-                                                try
-                                                {
-                                                    externalDownload( new File( fl.getParentFile(),
-                                                                                fl.getName().replaceFirst( "[.]external$",
-                                                                                                           "" ) ), is );
-                                                }
-                                                finally
-                                                {
-                                                    is.close();
-                                                }
-                                                //MNBMODULE-192
-                                                set.appendIncludes( new String[] { name.substring( "netbeans/".length(), name.length() - ".external".length() ) } );
-                                            }
-                                            else
-                                            {
-                                                set.appendIncludes( new String[] { part } );
-
-                                                fl.getParentFile().mkdirs();
-                                                fl.createNewFile();
-                                                BufferedOutputStream outstream = null;
-                                                try
-                                                {
-                                                    outstream = new BufferedOutputStream( new FileOutputStream( fl ) );
-                                                    InputStream instream = jf.getInputStream( ent );
-                                                    if ( ispack200 )
-                                                    {
-                                                        Pack200.Unpacker unp = Pack200.newUnpacker();
-                                                        JarOutputStream jos = new JarOutputStream( outstream );
-                                                        GZIPInputStream gzip = new GZIPInputStream( instream );
-                                                        try
-                                                        {
-                                                            unp.unpack( gzip, jos );
-                                                        }
-                                                        finally
-                                                        {
-                                                            jos.close();
-                                                        }
-                                                    }
-                                                    else
-                                                    {
-                                                        IOUtil.copy( instream, outstream );
-                                                    }
-                                                }
-                                                finally
-                                                {
-                                                    IOUtil.close( outstream );
-                                                }
-                                            }
-                                        }
-                                            
-                                            //TODO examine netbeans/config/Modules to see if the module is autoload/eager
-                                            // in verifyIntegrity these could be handled more gracefully than regular modules.
-                                            //eager is simpler, does not need to have module dependencies satisfied.
-                                            //autoload needs checking if any of the other modules declares a dependency on it. if not, also safe to ignore?
-                                            
-                                            
-                                            // now figure which one of the jars is the module jar..
-                                            if ( part.matches("(modules|core|lib)/[^/]+[.]jar") )
-                                            {
-                                                ExamineManifest ex = new ExamineManifest( getLog() );
-                                                ex.setJarFile( fl );
-                                                ex.setPopulateDependencies( true );
-                                                ex.checkFile();
-                                                if ( ex.isNetBeansModule() )
-                                                {
-                                                    makeTask.setModule( part );
-                                                    addToMap(clusterDependencies, clusterName, ex.getDependencyTokens());
-                                                    addToMap(clusterModules, clusterName, Collections.singletonList( ex.getModule() ));
-                                                    if (ex.getClasspath().length() > 0) { //MNBMODULE-220
-                                                        classPath = ex.getClasspath();
-                                                        classpathRoot = fl.getParentFile();
-                                                    }
-                                                }
-                                                if (verifyIntegrity) {
-                                                    dependencyCNBs.addAll(ex.getDependencyTokens());
-                                                    modulesCNBs.add(ex.getModule());
-                                                    for (String d : ex.getDependencyTokens()) {
-                                                        addToMap(dependencyCNBBacktraces, d, Collections.singletonList( ex.getModule() ));
-                                                    }
-                                                    if (ex.isNetBeansModule()) {
-                                                        requireTokens.addAll(ex.getNetBeansRequiresTokens());
-                                                        for (String r : ex.getNetBeansRequiresTokens()) {
-                                                            addToMap( requireTokensBacktraces, r, Collections.singletonList( ex.getModule()));
-                                                        }
-                                                        provideTokens.addAll(ex.getNetBeansProvidesTokens());
-                                                        for (String pack : ex.getPackages()) {
-                                                            if (pack.endsWith( ".**")) {
-                                                                //what to do with subpackages?
-                                                                pack = pack.substring( 0, pack.length() - ".**".length());
-                                                                osgiExportsSubs.add( pack );
-                                                            } else if (pack.endsWith( ".*")) {
-                                                                pack = pack.substring( 0, pack.length() - ".*".length());
-                                                                osgiExports.add(pack);                                                            
-                                                            }
-                                                        }
-                                                        
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                    if (classPath != null) { //MNBMODULE-220 collect wrappedbundleCNBs, later useful in assignClustersToBundles(), these get removed from list of bundles.
-                                        String[] paths = StringUtils.split( classPath, " ");
-                                        for (String path : paths) {
-                                            path = path.trim();
-                                            File classpathFile = new File(classpathRoot, path);
-                                            if (path.equals("${java.home}/lib/ext/jfxrt.jar")) { //MNBMODULE-228
-                                                String jhm = System.getProperty("java.home");
-                                                classpathFile = new File(new File(new File(new File(jhm), "lib"), "ext"), "jfxrt.jar");
-                                                if (!classpathFile.exists()) {
-                                                    File jdk7 = new File(new File(new File(jhm), "lib"), "jfxrt.jar");
-                                                    if (jdk7.exists()) {
-                                                        classpathFile = jdk7;
-                                                    }
-                                                }
-                                            }
-                                            if (!classpathFile.isFile()) {
-                                                getLog().warn( "Could not resolve Class-Path item in " + art.getId() + ", path is:" + path +  ", skipping");
-                                                continue; //try to guard against future failures
-                                            } 
-                                            ExamineManifest ex = new ExamineManifest( getLog() );
-                                            ex.setJarFile( classpathFile );
-                                            //ex.setPopulateDependencies( true );
-                                            ex.checkFile();
-                                            if (ex.isOsgiBundle()) {
-                                                if ( art.getId().contains( groupIdPrefix + ".modules:org-netbeans-modules-maven-embedder") )
-                                                {
-                                                    // in this case we dont want module-maven-embedder to be considered as wrapper for his libs                                                     
-                                                    // guava is provided but ide have it also 
-                                                } else 
-                                                {
-                                                    getLog().info(ex.getModule() + " added by " + art.getId() + "" + classpathFile);
-                                                    wrappedBundleCNBs.add(ex.getModule());
-                                                }
-                                            }
-                                        }
-                                    }
-                            if ( cluster.newer )
-                            {
-                                try
-                                {
-                                    makeTask.execute();
-                                }
-                                catch ( BuildException e )
-                                {
-                                    getLog().error( "Cannot Generate update_tracking XML file from " + art.getFile() );
-                                    throw new MojoExecutionException( e.getMessage(), e );
-                                }
-
-                                if ( executables != null )
-                                {
-                                    //MNBMODULE-176
-                                    for ( String exec : executables )
-                                    {
-                                        exec = exec.replace( "/", File.separator );
-                                        File execFile = new File( cluster.location, exec );
-                                        if ( execFile.exists() )
-                                        {
-                                            execFile.setExecutable( true, false );
-                                        }
-                                    }
-                                }
-                            }
-                            
-                        }
-                        finally
-                        {
-                            jf.close();
-                        }
-                    }
-                    catch ( IOException ex )
-                    {
-                        getLog().error( art.getFile().getAbsolutePath(), ex );
-                    }
-                }
-                if ( res.isOSGiBundle() )
-                {
-                    ExamineManifest ex = res.getExaminedManifest();
-                    bundles.add( new BundleTuple( art,  ex) );
-                    if (verifyIntegrity) {
-                        dependencyCNBs.addAll(ex.getDependencyTokens());
-                        for ( String d : ex.getDependencyTokens() )
-                        {
-                            addToMap( dependencyCNBBacktraces, d, Collections.singletonList( ex.getModule() ) );
-                        }
-                        modulesCNBs.add(ex.getModule());
-                        osgiImports.addAll( ex.getOsgiImports());
-                        for ( String d : ex.getOsgiImports() )
-                        {
-                            addToMap( osgiImportsBacktraces, d, Collections.singletonList( ex.getModule() ) );
-                        }
-                        
-                        osgiExports.addAll( ex.getOsgiExports());
-                    }
-                } 
-            }
-            
-            if (verifyIntegrity) {
-                if (getLog().isDebugEnabled()) {
-                    getLog().debug( "All found codenamebases:" + Arrays.toString( modulesCNBs.toArray()) );
-                    getLog().debug( "All found OSGI exports:" + Arrays.toString( osgiExports.toArray()) );
-                    getLog().debug( "All found provided tokens:" + Arrays.toString( provideTokens.toArray()) );
-                }
-                dependencyCNBs.removeAll( modulesCNBs );
-                if (modulesCNBs.contains( "org.netbeans.modules.netbinox")) {
-                    dependencyCNBs.remove( "org.eclipse.osgi"); //this is special.
-                }
-                osgiImports.removeAll( osgiExports );
-                Iterator<String> it = osgiImports.iterator();
-                while (it.hasNext()) {
-                    String s = it.next();
-                    if (s.startsWith( "java.") || s.startsWith( "javax.") || s.startsWith( "sun.") || s.startsWith( "org.xml.sax") || s.startsWith( "org.w3c.dom") || s.startsWith( "org.ietf.jgss")) {
-                        it.remove();
-                        continue;
-                    }
-                    for (String sub : osgiExportsSubs) {
-                        if (s.startsWith( sub )) {
-                            it.remove();
-                            break;
-                        }
-                    }
-                }
-                requireTokens.removeAll( provideTokens );
-                requireTokens.removeAll( defaultPlatformTokens );
-                if (!dependencyCNBs.isEmpty() || !osgiImports.isEmpty() ||!requireTokens.isEmpty()) {
-                    if (!dependencyCNBs.isEmpty()) {
-                        getLog().error( "Some included modules/bundles depend on these codenamebases but they are not included. The application will fail starting up. The missing codenamebases are:" );
-                        for (String s : dependencyCNBs) {
-                            Set<String> back = dependencyCNBBacktraces.get( s );
-                            getLog().error("   " + s + (back != null ? "          ref: " + Arrays.toString( back.toArray()) : ""));
-                        }
-                    }
-                    if (!osgiImports.isEmpty()) {
-                        getLog().error("Some OSGi imports are not satisfied by included bundles' exports. The application will fail starting up. The missing imports are:");
-                        for (String s : osgiImports) {
-                            Set<String> back = osgiImportsBacktraces.get( s );
-                            getLog().error("   " + s + (back != null ? "          ref: " + Arrays.toString( back.toArray()) : ""));
-                        }
-                    }
-                     if (!requireTokens.isEmpty()) {
-                        getLog().error("Some tokens required by included modules are not provided by included modules. The application will fail starting up. The missing tokens are:");
-                        for (String s : requireTokens) {
-                            Set<String> back = requireTokensBacktraces.get( s );
-                            getLog().error("   " + s + (back != null ? "          ref: " + Arrays.toString( back.toArray()) : ""));
-                        }
-                    }
-                    throw new MojoFailureException("See above for consistency validation check failures. Either fix those by adding the relevant dependencies to the application or disable the check by setting the verifyIntegrity parameter to false or by running with -Dnetbeans.verify.integrity=false cmd line parameter.");
-                } else {
-                    getLog().info( "Integrity verification passed.");
-                }
-            } else {
-                getLog().info( "Integrity verification skipped.");
-            }
-            
-            //attempt to sort clusters based on the dependencies and cluster content.
-            Map<String, Set<String>> cluster2depClusters = computeClusterOrdering( clusterDependencies, clusterModules );
-            clusterModules.clear();
-        
-            //now assign the cluster to bundles based on dependencies..
-            assignClustersToBundles( bundles, wrappedBundleCNBs, clusterDependencies, cluster2depClusters, getLog() );
-            
-            
-            for (BundleTuple ent : bundles) {
-                Artifact art = ent.artifact;
-                final ExamineManifest ex = ent.manifest;
-                
-                String clstr = ent.cluster;
-                if (clstr == null) {
-                    clstr = defaultCluster;
-                }
-                
-                ClusterTuple cluster = processCluster( clstr, nbmBuildDirFile, art );
-                if ( cluster.newer )
-                {
-                    getLog().info( "Copying " + art.getId() + " to cluster " + clstr );
-                    File modules = new File( cluster.location, "modules" );
-                    modules.mkdirs();
-                    File config = new File( cluster.location, "config" );
-                    File confModules = new File( config, "Modules" );
-                    confModules.mkdirs();
-                    File updateTracking = new File( cluster.location, "update_tracking" );
-                    updateTracking.mkdirs();
-                    final String cnb = ex.getModule();
-                    final String cnbDashed = cnb.replace( ".", "-" );
-                    final File moduleArt = new File( modules, cnbDashed + ".jar" ); //do we need the file in some canotical name pattern?
-                    final String specVer = ex.getSpecVersion();
-                    try
-                    {
-                        FileUtils.copyFile( art.getFile(), moduleArt );
-                        final File moduleConf = new File( confModules, cnbDashed + ".xml" );
-                        FileUtils.copyStreamToFile( new InputStreamFacade() {
-                            @Override
-                            public InputStream getInputStream() throws IOException
-                            {
-                                return new StringInputStream( createBundleConfigFile( cnb, ex.isBundleAutoload() ), "UTF-8" );
-                            }
-                        }, moduleConf );
-                        FileUtils.copyStreamToFile( new InputStreamFacade() {
-                            @Override
-                            public InputStream getInputStream() throws IOException
-                            {
-                                return new StringInputStream( createBundleUpdateTracking( cnb, moduleArt, moduleConf, specVer ), "UTF-8" );
-                            }
-                        }, new File( updateTracking, cnbDashed + ".xml" ) );
-                    }
-                    catch ( IOException exc )
-                    {
-                        getLog().error( exc );
-                    }
-                }
-            }
-
-            getLog().info(
-                "Created NetBeans module cluster(s) at " + nbmBuildDirFile.getAbsoluteFile() );
-
-        }
-        else
-        {
-            throw new MojoExecutionException(
-                "This goal only makes sense on project with nbm-application packaging" );
-        }
-        //in 6.1 the rebuilt modules will be cached if the timestamp is not touched.
-        File[] files = nbmBuildDirFile.listFiles();
-        for ( File file : files )
-        {
-            if ( file.isDirectory() )
-            {
-                File stamp = new File( file, ".lastModified" );
-                if ( !stamp.exists() )
-                {
-                    try
-                    {
-                        stamp.createNewFile();
-                    }
-                    catch ( IOException ex )
-                    {
-                        ex.printStackTrace();
-                    }
-                }
-                stamp.setLastModified( new Date().getTime() );
-            }
-        }
-        try
-        {
-            createBinEtcDir( nbmBuildDirFile, brandingToken );
-        }
-        catch ( IOException ex )
-        {
-            throw new MojoExecutionException(
-                "Cannot process etc folder content creation.", ex );
-        }
-    }
-    private final static Pattern patt = Pattern.compile(
-        ".*targetcluster=\"([a-zA-Z0-9_\\.\\-]+)\".*", Pattern.DOTALL );
-
-    private String findCluster( JarFile jf )
-        throws MojoFailureException, IOException
-    {
-        ZipEntry entry = jf.getEntry( "Info/info.xml" );
-        InputStream ins = jf.getInputStream( entry );
-        String str = IOUtil.toString( ins, "UTF8" );
-        Matcher m = patt.matcher( str );
-        if ( !m.matches() )
-        {
-            getLog().info( "Cannot find cluster for " + jf.getName() + " Falling back to default value - '"
-                               + defaultCluster + "'." );
-            return defaultCluster;
-        }
-        else
-        {
-            return m.group( 1 );
-        }
-    }
-
-    /**
-     * 
-     * @param buildDir Directory where the platform bundle is built
-     * @param brandingToken
-     * 
-     * @throws java.io.IOException
-     */
-    private void createBinEtcDir( File buildDir, String brandingToken )
-        throws IOException, MojoExecutionException
-    {
-        File etcDir = new File( buildDir + File.separator + "etc" );
-        etcDir.mkdir();
-
-        // create app.clusters which contains a list of clusters to include in the application
-
-        File clusterConf = new File( etcDir + File.separator + brandingToken + ".clusters" );
-        String clustersString;
-        if ( etcClustersFile != null )
-        {
-            clustersString = FileUtils.fileRead( etcClustersFile, "UTF-8" );
-        }
-        else
-        {
-            clusterConf.createNewFile();
-            StringBuilder buffer = new StringBuilder();
-            File[] clusters = buildDir.listFiles( new FileFilter()
-            {
-
-                @Override
-                public boolean accept( File pathname )
-                {
-                    return new File( pathname, ".lastModified" ).exists();
-                }
-            } );
-            for ( File cluster : clusters )
-            {
-                buffer.append( cluster.getName() );
-                buffer.append( "\n" );
-            }
-            clustersString = buffer.toString();
-        }
-
-        FileUtils.fileWrite( clusterConf.getAbsolutePath(), clustersString );
-
-        File confFile = etcConfFile;
-        String str;
-        if ( confFile == null )
-        {
-            File harnessDir = new File( buildDir, "harness" );
-            // app.conf contains default options and other settings
-            confFile = new File(
-                    harnessDir.getAbsolutePath() + File.separator + "etc" + File.separator + "app.conf" );
-            if ( confFile.exists() )
-            {
-                str = FileUtils.fileRead( confFile, "UTF-8" );
-            }
-            else 
-            {
-                getLog().debug( "Using fallback app.conf shipping with the nbm-maven-plugin." );
-                InputStream instream = null;
-                try
-                {
-                    instream = getClass().getClassLoader().getResourceAsStream( "harness/etc/app.conf" );
-                    str = IOUtil.toString( instream, "UTF-8" );
-                }
-                finally
-                {
-                    IOUtil.close( instream );
-                }
-            }
-        }
-        else
-        {
-            str = FileUtils.fileRead( confFile, "UTF-8" );
-        }
-        File confDestFile = new File(
-            etcDir.getAbsolutePath() + File.separator + brandingToken + ".conf" );
-
-        str = str.replace( "${branding.token}", brandingToken );
-        FileUtils.fileWrite( confDestFile.getAbsolutePath(), "UTF-8", str );
-
-        File destBinDir = new File( buildDir + File.separator + "bin" );
-        destBinDir.mkdir();
-
-        File binDir;
-        File destExeW = new File( destBinDir, brandingToken + "_w.exe" );
-        File destExe = new File( destBinDir, brandingToken + ".exe" );
-        File destExe64 = new File( destBinDir, brandingToken + "64.exe" );
-        File destSh = new File( destBinDir, brandingToken );
-
-        if ( binDirectory != null )
-        {
-            //we have custom launchers.
-            binDir = binDirectory;
-            File[] fls = binDir.listFiles();
-            if ( fls == null )
-            {
-                throw new MojoExecutionException( "Parameter 'binDirectory' has to point to an existing folder." );
-            }
-            for ( File fl : fls )
-            {
-                String name = fl.getName();
-                File dest = null;
-                if ( name.endsWith( "_w.exe" ) ) 
-                {
-                    dest = destExeW;
-                }
-                else if ( name.endsWith( "64.exe" ) )
-                {
-                    dest = destExe64;
-                }
-                else if ( name.endsWith( ".exe" ) )
-                {
-                    dest = destExe;
-                }
-                else if ( !name.contains( "." ) || name.endsWith( ".sh" ) )
-                {
-                    dest = destSh;
-                }
-                if ( dest != null  && fl.exists() ) //in 6.7 the _w.exe file is no more.
-                {
-                    FileUtils.copyFile( fl, dest );
-                }
-                else
-                {
-                    //warn about file not being copied
-                }
-            }
-        }
-        else
-        {
-            File harnessDir = new File( buildDir, "harness" );
-            //we have org-netbeans-modules-apisupport-harness in target area, just use it's own launchers.
-            binDir = new File(
-                    harnessDir.getAbsolutePath() + File.separator + "launchers" );
-            if ( binDir.exists() )
-            {
-                File exe = new File( binDir, "app.exe" );
-                FileUtils.copyFile( exe, destExe );
-                File exe64 = new File( binDir, "app64.exe" );
-                if ( exe64.isFile() )
-                {
-                    FileUtils.copyFile( exe64, destExe64 );
-                }
-                File exew = new File( binDir, "app_w.exe" );
-                if ( exew.exists() ) //in 6.7 the _w.exe file is no more.
-                {
-                    FileUtils.copyFile( exew, destExeW );
-                }
-                File sh = new File( binDir, "app.sh" );
-                FileUtils.copyFile( sh, destSh );
-            }
-            else
-            {
-                File nbm = getHarnessNbm();
-                try (ZipFile zip = new ZipFile( nbm )) {
-                    getLog().debug( "Using fallback executables from downloaded org-netbeans-modules-apisupport-harness nbm file." );
-                    writeFromZip(zip, "netbeans/launchers/app.sh",  destSh, true );
-                    writeFromZip(zip, "netbeans/launchers/app.exe",  destExe, true );
-                    writeFromZip(zip, "netbeans/launchers/app64.exe",  destExe64, false );
-                    writeFromZip(zip, "netbeans/launchers/app_w.exe",  destExeW, false );
-                }
-            }
-        }
-
-        Project antProject = antProject();
-
-        Chmod chmod = (Chmod) antProject.createTask( "chmod" );
-        FileSet fs = new FileSet();
-        fs.setDir( destBinDir );
-        fs.setIncludes( "*" );
-        chmod.addFileset( fs );
-        chmod.setPerm( "755" );
-        chmod.execute();
-    }
-
-    private void writeFile( String path, File destSh )
-        throws IOException
-    {
-        InputStream instream = null;
-        OutputStream output = null;
-        try
-        {
-            instream = getClass().getClassLoader().getResourceAsStream( path );
-            if ( instream == null )
-            {
-                throw new FileNotFoundException( path );
-            }
-            destSh.createNewFile();
-            output = new BufferedOutputStream( new FileOutputStream( destSh ) );
-            IOUtil.copy( instream, output );
-        }
-        finally
-        {
-            IOUtil.close( instream );
-            IOUtil.close( output );
-        }
-    }
-
-    private ClusterTuple processCluster( String cluster, File nbmBuildDirFile, Artifact art )
-    {
-        File clusterFile = new File( nbmBuildDirFile, cluster );
-        boolean newer = false;
-        if ( !clusterFile.exists() )
-        {
-            clusterFile.mkdir();
-            newer = true;
-        }
-        else
-        {
-            File stamp = new File( clusterFile, ".lastModified" );
-            if ( stamp.lastModified() < art.getFile().lastModified() )
-            {
-                newer = true;
-            }
-        }
-        return new ClusterTuple( clusterFile, newer );
-    }
-
-    private void externalDownload( File f, InputStream is )
-        throws IOException
-    {
-        // Cf. org.netbeans.nbbuild.AutoUpdate
-        BufferedReader r = new BufferedReader( new InputStreamReader( is, "UTF-8" ) );
-        long crc = -1;
-        long size = -1;
-        boolean found = false;
-        String line;
-        while ( ( line = r.readLine() ) != null )
-        {
-            if ( line.startsWith( "CRC:" ) )
-            {
-                crc = Long.parseLong( line.substring( 4 ).trim() );
-            }
-            else if ( line.startsWith( "URL:m2:/" ) )
-            {
-                if ( ! found )
-                {
-                    String[] coords = line.substring( 8 ).trim().split( ":" );
-                    Artifact artifact;
-                    if ( coords.length == 4 )
-                    {
-                        artifact = artifactFactory.createArtifact( coords[0], coords[1], coords[2], null, coords[3] );
-                    }
-                    else
-                    {
-                        artifact = artifactFactory.createArtifactWithClassifier( coords[0], coords[1], coords[2], coords[3], coords[4] );
-                    }
-                    try
-                    {
-                        artifactResolver.resolve( artifact, project.getRemoteArtifactRepositories(), localRepository );
-                        FileUtils.copyFile( artifact.getFile(), f );
-                        found = true;
-                    }
-                    catch ( AbstractArtifactResolutionException x )
-                    {
-                        getLog().warn( "Cannot find " + line.substring( 8 ), x );
-                    }
-                }
-            }
-            else if ( line.startsWith( "URL:" ) )
-            {
-                if ( ! found )
-                {
-                    String url = line.substring( 4 ).trim();
-                    try
-                    {
-                        // XXX use Wagon API instead
-                        FileUtils.copyURLToFile( new URL( url ), f );
-                        found = true;
-                    }
-                    catch ( IOException x )
-                    {
-                        getLog().warn( "Cannot download " + url, x );
-                    }
-                }
-            }
-            else if ( line.startsWith( "SIZE:" ) )
-            {
-                size = Long.parseLong( line.substring( 5 ).trim() );
-            }
-            else
-            {
-                getLog().warn( "Unrecognized line: " + line );
-            }
-        }
-        if ( ! found )
-        {
-            throw new IOException( "Could not download " + f );
-        }
-        if ( crc != -1 && crc != crcForFile( f ).getValue() )
-        {
-            throw new IOException( "CRC-32 of " + f + " does not match declared " + crc );
-        }
-        if ( size != -1 && size != f.length() )
-        {
-            throw new IOException( "Size of " + f + " does not match declared " + size );
-        }
-    }
-
-    private File getHarnessNbm() throws MojoExecutionException
-    {
-        @SuppressWarnings( "unchecked" )
-        Set<Artifact> artifacts = project.getArtifacts();
-        String version = null;
-        for (Artifact a : artifacts) {
-            if ( (groupIdPrefix + ".modules").equals(a.getGroupId()) && "org-netbeans-bootstrap".equals(a.getArtifactId())) {
-                version = a.getBaseVersion(); //base version in non-snapshot should equals version, in snapshots to X-SNAPSHOT, not timestamp
-                break;
-            }
-        }
-        if (version == null) {
-            throw new MojoExecutionException( "We could not find org-netbeans-bootstrap among the modules in the application. Launchers could not be found.");
-        }
-        Artifact nbmArt = artifactFactory.createArtifact(
-            groupIdPrefix + ".modules",
-            "org-netbeans-modules-apisupport-harness",
-            version,
-            "compile",
-            "nbm-file");
-        try
-        {
-            artifactResolver.resolve( nbmArt, project.getRemoteArtifactRepositories(), localRepository );
-        }
-
-        catch ( ArtifactResolutionException | ArtifactNotFoundException ex )
-        {
-            throw new MojoExecutionException( "Failed to retrieve the nbm file from repository", ex );
-        }
-        return nbmArt.getFile();
-    }
-
-    private void writeFromZip( final ZipFile zip, String zipPath, File destFile, boolean mandatory ) throws MojoExecutionException, IOException
-    {
-        final ZipEntry path = zip.getEntry( zipPath );
-        if (path == null) {
-            if (mandatory) {
-                throw new MojoExecutionException( zipPath + " not found in " + zip.getName());
-            }
-            getLog().debug(zipPath + " is not present in " + zip.getName());
-            return;
-        }
-        FileUtils.copyStreamToFile( new InputStreamFacade() {
-            
-            @Override
-            public InputStream getInputStream() throws IOException
-            {
-                return zip.getInputStream( path );
-            }
-        }, destFile);
-    }
-
-    private static void addToMap( Map<String, Set<String>> map, String clusterName, List<String> newValues )
-    {
-        Set<String> lst = map.get( clusterName );
-        if ( lst == null )
-        {
-            lst = new HashSet<>();
-            map.put( clusterName, lst );
-        }
-        if ( newValues != null )
-        {
-            lst.addAll( newValues );
-        }
-    }
-    
-    private static List<String> findByDependencies( Map<String, Set<String>> clusterDependencies, String spec)
-    {
-        List<String> toRet = new ArrayList<>();
-        for ( Map.Entry<String, Set<String>> entry : clusterDependencies.entrySet() )
-        {
-            if ( entry.getValue().contains( spec ) )
-            {
-                toRet.add(entry.getKey());
-            }
-        }
-        return toRet;
-    }
-
-    //the basic idea is that bundle's cluster can be determined by who depends on it.
-    //simplest case is when a module depends on it. If there are more, we need to pick one that is "lower in the stack, that's what cluster2depClusters is for.
-    //the rest needs to be determined in more sofisticated manner.
-    //start from bundles with known cluster and see what other bundles they depend on. stamp all these with the same cluster. do it recursively.
-    //At the end process the remaining bundles in reverse order. Check if *they* depend on a bundle with known cluster and so on..
-    //A few unsolved cases:
-    // - we never update the cluster information once a match was found, but there is a possibility that later in the processing the cluster could be "lowered".
-    // - 2 or more modules from unrelated clusters we cannot easily decide, most likely should be in common denominator cluster but our cluster2depClusters map is not transitive, only lists direct dependencies
-    static void assignClustersToBundles( List<BundleTuple> bundles, Set<String> wrappedBundleCNBs, Map<String, Set<String>> clusterDependencies, Map<String, Set<String>> cluster2depClusters, Log log)
-    {
-        List<BundleTuple> toProcess = new ArrayList<>();
-        List<BundleTuple> known = new ArrayList<>();
-        for ( Iterator<BundleTuple> it = bundles.iterator(); it.hasNext(); )
-        {
-            BundleTuple ent = it.next();
-            Artifact art = ent.artifact;
-            ExamineManifest ex = ent.manifest;
-            String spec = ex.getModule();
-            //null check for tests
-            //have a way to force inclusion of osgi items. Direct dependency is never wrapped by modules.
-            if ( art != null && art.getDependencyTrail().size() > 2 && wrappedBundleCNBs.contains( spec ) )
-            {
-                // we already have this one as a wrapped module.
-                log.debug( "Not including bundle " + art.getDependencyConflictId()
-                                    + ". It is already included in a NetBeans module" );
-                it.remove();
-                continue;
-            }
-            List<String> depclusters = findByDependencies(clusterDependencies, spec);
-            if (depclusters.size() == 1) {
-                ent.cluster = depclusters.get( 0 );
-                known.add( ent );
-            } else if (depclusters.isEmpty()) {
-                toProcess.add(ent);
-            } else {
-                //more results.. from 2 dependent clusters pick the one that is lower in the stack.
-                for ( Iterator<String> it2 = depclusters.iterator(); it2.hasNext(); )
-                {
-                    String s = it2.next();
-                    Set<String> depsCs = cluster2depClusters.get( s );
-                    boolean removeS = false;
-                    for (String sDep : depclusters) {
-                        if (s.equals( sDep) ) {
-                            continue;
-                        }
-                        if (depsCs != null && depsCs.contains( sDep ) ) {
-                            removeS = true;
-                        }
-                    }
-                    if (removeS) {
-                        it2.remove();
-                    }
-                }
-                ent.cluster = depclusters.get( 0 ); //TODO still some free room there, what if they don't directly depend on each other but still are related
-                known.add (ent);
-            }
-        }
-        if (!toProcess.isEmpty())
-        {
-            walkKnownBundleDependenciesDown(known, toProcess);
-        }
-        if (!toProcess.isEmpty())
-        {
-            walkKnownBundleDependenciesUp(known, toProcess);
-        }
-    }
-
-    private static void walkKnownBundleDependenciesDown( List<BundleTuple> known, List<BundleTuple> toProcess )
-    {
-        boolean atLeastOneWasFound = false;
-        for ( Iterator<BundleTuple> it = toProcess.iterator(); it.hasNext(); )
-        {
-            BundleTuple bundleTuple = it.next();
-            boolean found = false;
-            for ( BundleTuple knownBT : known)
-            {
-                Sets.SetView<String> is = Sets.intersection(bundleTuple.manifest.getOsgiExports() , knownBT.manifest.getOsgiImports() );
-                if (!is.isEmpty()) {
-                    found = true;
-                    bundleTuple.cluster = knownBT.cluster;
-                    break;
-                }
-                //dependencyTokens are requireBundle - matches the module property
-                is = Sets.intersection(Collections.singleton( bundleTuple.manifest.getModule()), new HashSet(knownBT.manifest.getDependencyTokens()) );
-                if (!is.isEmpty()) {
-                    found = true;
-                    bundleTuple.cluster = knownBT.cluster;
-                    break;
-                }
-                
-            }
-            if (found) {
-                atLeastOneWasFound = true;
-                it.remove();
-                known.add(bundleTuple);
-            }
-            
-        }
-        if (!toProcess.isEmpty() && atLeastOneWasFound) {
-            walkKnownBundleDependenciesDown( known, toProcess );
-        }
-    }
-
-    private static void walkKnownBundleDependenciesUp( List<BundleTuple> known, List<BundleTuple> toProcess )
-    {
-        boolean atLeastOneWasFound = false;
-        for ( Iterator<BundleTuple> it = toProcess.iterator(); it.hasNext(); )
-        {
-            BundleTuple bundleTuple = it.next();
-            boolean found = false;
-            for ( BundleTuple knownBT : known)
-            {
-                Sets.SetView<String> is = Sets.intersection(bundleTuple.manifest.getOsgiImports() , knownBT.manifest.getOsgiExports() );
-                if (!is.isEmpty()) {
-                    found = true;
-                    bundleTuple.cluster = knownBT.cluster;
-                    break;
-                }
-                //dependencyTokens are requireBundle - matches the module property
-                is = Sets.intersection(Collections.singleton( knownBT.manifest.getModule()), new HashSet(bundleTuple.manifest.getDependencyTokens()) );
-                if (!is.isEmpty()) {
-                    found = true;
-                    bundleTuple.cluster = knownBT.cluster;
-                    break;
-                }
-                
-            }
-            if (found) {
-                atLeastOneWasFound = true;
-                it.remove();
-                known.add(bundleTuple);
-            }
-            
-        }
-        if (!toProcess.isEmpty() && atLeastOneWasFound) {
-            walkKnownBundleDependenciesDown( known, toProcess );
-        }
-        if (!toProcess.isEmpty() && atLeastOneWasFound) {
-            walkKnownBundleDependenciesUp( known, toProcess );
-        }
-    }
-
-    //static and default for tests..
-    static Map<String, Set<String>> computeClusterOrdering( Map<String, Set<String>> clusterDependencies, Map<String, Set<String>> clusterModules )
-    {
-        Map<String, Set<String>> cluster2depClusters = new HashMap<>();
-        for ( Map.Entry<String, Set<String>> entry : clusterDependencies.entrySet() )
-        {
-            String cluster = entry.getKey();
-            Set<String> deps = entry.getValue();
-            for (Map.Entry<String, Set<String>> subEnt : clusterModules.entrySet()) {
-                if (subEnt.getKey().equals( cluster) ) {
-                    continue;
-                }
-                Sets.SetView<String> is = Sets.intersection(subEnt.getValue(), deps );
-                if (!is.isEmpty()) {
-                    addToMap( cluster2depClusters, cluster, Collections.singletonList( subEnt.getKey() ) );
-                }
-            }
-        }
-        return cluster2depClusters;
-    }
-    
-    static class BundleTuple {
-        final Artifact artifact;
-        final ExamineManifest manifest;
-        String cluster;
-
-        BundleTuple( Artifact artifact, ExamineManifest manifest )
-        {
-            this.artifact = artifact;
-            this.manifest = manifest;
-        }
-        
-    }
-
-    private static class ClusterTuple
-    {
-        final File location;
-        final boolean newer;
-
-        private ClusterTuple( File clusterFile, boolean newer )
-        {
-            location = clusterFile;
-            this.newer = newer;
-        }
-    }
-
-    static String createBundleConfigFile( String cnb, boolean autoload)
-    {
-        return
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
-"<!DOCTYPE module PUBLIC \"-//NetBeans//DTD Module Status 1.0//EN\"\n" +
-"                        \"http://www.netbeans.org/dtds/module-status-1_0.dtd\">\n" +
-"<module name=\"" + cnb +"\">\n" +
-"    <param name=\"autoload\">" + autoload + "</param>\n" +
-"    <param name=\"eager\">false</param>\n" + (autoload ? "" : "    <param name=\"enabled\">true</param>\n") +
-"    <param name=\"jar\">modules/" + cnb.replace( ".", "-") + ".jar</param>\n" +
-"    <param name=\"reloadable\">false</param>\n" +
-"</module>\n";
-    }
-
-    static String createBundleUpdateTracking( String cnb, File moduleArt, File moduleConf, String specVersion )
-        throws FileNotFoundException, IOException
-    {
-
-        return
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
-"<module codename=\"" + cnb + "\">\n" +
-"    <module_version install_time=\"" + System.currentTimeMillis() + "\" last=\"true\" origin=\"installer\" specification_version=\"" + specVersion + "\">\n" +
-"        <file crc=\"" + crcForFile( moduleConf ).getValue() + "\" name=\"config/Modules/" + cnb.replace( ".", "-" ) + ".xml\"/>\n" +
-"        <file crc=\"" + crcForFile( moduleArt ).getValue() + "\" name=\"modules/" + cnb.replace( ".", "-" ) + ".jar\"/>\n" +
-"    </module_version>\n" +
-"</module>";
-
-    }
-
-    static CRC32 crcForFile( File inFile )
-        throws FileNotFoundException, IOException
-    {
-        CRC32 crc = new CRC32();
-        try (InputStream inFileStream = new FileInputStream( inFile )) {
-            byte[] array = new byte[(int) inFile.length()];
-            int len = inFileStream.read( array );
-            if ( len != array.length )
-            {
-                throw new IOException( "Cannot fully read " + inFile );
-            }
-            crc.update( array );
-        }
-        return crc;
-    }
-
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterMojo.java
deleted file mode 100644
index d872258..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateClusterMojo.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Date;
-import java.util.List;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.filters.StringInputStream;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.types.FileSet;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.io.InputStreamFacade;
-
-/**
- * Create the NetBeans module clusters from reactor.
- * Semi-deprecated; used only for standalone modules and "suites".
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- */
-@Mojo(name="cluster",aggregator=true, requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class CreateClusterMojo
-        extends AbstractNbmMojo
-{
-
-    /**
-     * directory where the the NetBeans cluster will be created.
-     */
-    @Parameter(defaultValue="${project.build.directory}/netbeans_clusters", required=true)
-    protected File nbmBuildDir;
-
-    /**
-     * default cluster value for reactor projects without cluster information,
-     * typically OSGi bundles
-     * @since 3.2
-     */
-    @Parameter(defaultValue="extra")
-    private String defaultCluster;
-    /**
-     * If the executed project is a reactor project, this will contains the full list of projects in the reactor.
-     */
-    @Parameter(required=true, readonly=true, property="reactorProjects")
-    private List<MavenProject> reactorProjects;
-
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        Project antProject = registerNbmAntTasks();
-
-        if ( !nbmBuildDir.exists() )
-        {
-            nbmBuildDir.mkdirs();
-        }
-
-        if ( reactorProjects != null && reactorProjects.size() > 0 )
-        {
-            for ( MavenProject proj : reactorProjects )
-            {
-                //TODO how to figure where the the buildDir/nbm directory is
-                File nbmDir = new File( proj.getBasedir(),
-                        "target" + File.separator + "nbm" + File.separator + "netbeans" );
-                if ( nbmDir.exists() )
-                {
-                    Copy copyTask = (Copy) antProject.createTask( "copy" );
-                    copyTask.setTodir( nbmBuildDir );
-                    copyTask.setOverwrite( true );
-                    FileSet set = new FileSet();
-                    set.setDir( nbmDir );
-                    set.createInclude().setName( "**" );
-                    copyTask.addFileset( set );
-
-                    try
-                    {
-                        copyTask.execute();
-                    }
-                    catch ( BuildException ex )
-                    {
-                        getLog().error( "Cannot merge modules into cluster" );
-                        throw new MojoExecutionException(
-                                "Cannot merge modules into cluster", ex );
-                    }
-                }
-                else
-                {
-                    if ( "nbm".equals( proj.getPackaging() ) )
-                    {
-                        String error =
-                            "The NetBeans binary directory structure for "
-                                + proj.getId()
-                                + " is not created yet."
-                                + "\n Please execute 'mvn install nbm:cluster' to build all relevant projects in the reactor.";
-                        throw new MojoFailureException( error );
-                    }
-                    if ( "bundle".equals( proj.getPackaging() ) )
-                    {
-                        Artifact art = proj.getArtifact();
-                        final ExamineManifest mnf = new ExamineManifest( getLog() );
-
-                        File jar = new File( proj.getBuild().getDirectory(), proj.getBuild().getFinalName() + ".jar" );
-                        if ( !jar.exists() )
-                        {
-                            getLog().error( "Skipping " + proj.getId()
-                                                + ". Cannot find the main artifact in output directory." );
-                            continue;
-                        }
-                        mnf.setJarFile( jar );
-                        mnf.checkFile();
-
-                        File cluster = new File( nbmBuildDir, defaultCluster );
-                        getLog().debug( "Copying " + art.getId() + " to cluster " + defaultCluster );
-                        File modules = new File( cluster, "modules" );
-                        modules.mkdirs();
-                        File config = new File( cluster, "config" );
-                        File confModules = new File( config, "Modules" );
-                        confModules.mkdirs();
-                        File updateTracting = new File( cluster, "update_tracking" );
-                        updateTracting.mkdirs();
-
-                        final String cnb = mnf.getModule();
-                        final String cnbDashed = cnb.replace( ".", "-" );
-                        final File moduleArt = new File( modules, cnbDashed + ".jar" ); //do we need the file in some canotical name pattern?
-                        final String specVer = mnf.getSpecVersion();
-                        try
-                        {
-                            FileUtils.copyFile( jar, moduleArt );
-                            final File moduleConf = new File( confModules, cnbDashed + ".xml" );
-                            FileUtils.copyStreamToFile( new InputStreamFacade() {
-                                public InputStream getInputStream() throws IOException
-                                {
-                                    return new StringInputStream( CreateClusterAppMojo.createBundleConfigFile( cnb, mnf.isBundleAutoload() ), "UTF-8" );
-                                }
-                            }, moduleConf );
-                            FileUtils.copyStreamToFile( new InputStreamFacade() {
-                                public InputStream getInputStream() throws IOException
-                                {
-                                    return new StringInputStream( CreateClusterAppMojo.createBundleUpdateTracking( cnb, moduleArt, moduleConf, specVer ), "UTF-8" );
-                                }
-                            }, new File( updateTracting, cnbDashed + ".xml" ) );
-                        }
-                        catch ( IOException exc )
-                        {
-                            getLog().error( exc );
-                        }
-
-                    }
-                }
-            }
-            //in 6.1 the rebuilt modules will be cached if the timestamp is not touched.
-            File[] files = nbmBuildDir.listFiles();
-            for ( int i = 0; i < files.length; i++ )
-            {
-                if ( files[i].isDirectory() )
-                {
-                    File stamp = new File( files[i], ".lastModified" );
-                    if ( !stamp.exists() )
-                    {
-                        try
-                        {
-                            stamp.createNewFile();
-                        }
-                        catch ( IOException ex )
-                        {
-                            ex.printStackTrace();
-                        }
-                    }
-                    stamp.setLastModified( new Date().getTime() );
-                }
-            }
-            getLog().info( "Created NetBeans module cluster(s) at " + nbmBuildDir );
-        }
-        else
-        {
-            throw new MojoExecutionException( "This goal only makes sense on reactor projects." );
-        }
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNbmMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNbmMojo.java
deleted file mode 100644
index d36737f..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNbmMojo.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.model.Developer;
-import org.apache.maven.model.License;
-import org.apache.maven.model.Organization;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.util.FileUtils;
-import org.codehaus.plexus.PlexusConstants;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.context.ContextException;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
-import org.netbeans.nbbuild.MakeNBM;
-import org.netbeans.nbbuild.MakeNBM.Blurb;
-import org.netbeans.nbbuild.MakeNBM.Signature;
-
-/**
- * Create the NetBeans module artifact (nbm file), part of "nbm" lifecycle/packaging.
- * 
- *
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- */
-@Mojo(name="nbm", 
-        requiresProject=true, 
-        threadSafe = true,
-        requiresDependencyResolution= ResolutionScope.RUNTIME, 
-        defaultPhase= LifecyclePhase.PACKAGE )
-public class CreateNbmMojo
-        extends CreateNetBeansFileStructure
-        implements Contextualizable
-{
-
-    /**
-     * keystore location for signing the nbm file
-     */
-    @Parameter(property="keystore")
-    private String keystore;
-    /**
-     * keystore password
-     */
-    @Parameter(property="keystorepass")
-    private String keystorepassword;
-    /**
-     * keystore alias
-     */
-    @Parameter(property="keystorealias")
-    private String keystorealias;
-
-    /**
-     * Boolean parameter denoting if creation of NBM file shall be skipped or not.
-     * If skipped, just the expanded directory for cluster is created
-     * @since 3.0
-     */
-    @Parameter(defaultValue="false", property="maven.nbm.skip")
-    private boolean skipNbm;
-    
-    /**
-     * if true, upon installing the NBM the platform app/IDE restart is requested. Not necessary in most cases.
-     * @since 3.8
-     */
-    @Parameter(defaultValue="false")
-    private boolean requiresRestart;
-    
-    /**
-     * Get homepage URL of the module. Is accessible from NetBeans
-     * UI upon installation, should point to place with additional
-     * information about the functionality. 
-     * @since 3.8
-     */
-    @Parameter(defaultValue="${project.url}")
-    private String homePageUrl;
-    
-    /**
-     * Author of the module. Shown in the Module manager UI.
-     * @since 3.8
-     */
-    @Parameter(defaultValue="${project.organization.name}")
-    private String author;
-    
-    /**
-     * Distribution base URL for the NBM at runtime deployment time.
-     * Note: Usefulness of the parameter is questionable, it doesn't allow for mirrors and
-     * usually when downloading the nbm, one already knows the location anyway.
-     * Please note that the netbeans.org Ant scripts put a dummy url here.
-     * The actual correct value used when constructing update site is
-     * explicitly set there. The general assumption there is that all modules from one update
-     * center come from one base URL. Also see <code>distBase</code> parameter in auto-update mojo.
-     * <p/>
-     * The value is either a direct http protocol based URL that points to
-     * the location under which nbm file will be located, or
-     * <p/>
-     * it allows to create an update site based on maven repository content.
-     * The later created autoupdate site document can use this information and
-     * compose the application from one or multiple maven repositories.
-     * <br/>
-     * Format: id::layout::url same as in maven-deploy-plugin
-     * <br/>
-     * with the 'default' and 'legacy' layouts. (maven2 vs maven1 layout)
-     * <br/>
-     * If the value doesn't contain :: characters,
-     * it's assumed to be the flat structure and the value is just the URL.
-     * 
-     */
-    @Parameter(property="maven.nbm.distributionURL")
-    private String distributionUrl;
-    
-    /**
-     * name of the license applicable to the NBM. The value should be equal across modules with the same license. If the user already agreed to the
-     * same license before, he/she won't be asked again to agree and for multiple one installed at the same time, just one license agreement is shown.
-     * When defined, <code>licenseFile</code> needs to be defined as well.
-     * @since 3.8
-     */
-    @Parameter
-    private String licenseName;
-    
-    /**
-     * path to the license agreement file that will be shown when installing the module. When defined, <code>licenseName</code> needs to be defined as well.
-     * @since 3.8
-     */
-    @Parameter
-    private File licenseFile;
-    
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-
-    /**
-     * Contextualized.
-     */
-    private PlexusContainer container;
-
-    @Component
-    private ArtifactFactory artifactFactory;
-    /**
-     * Used for attaching the artifact in the project
-     */
-    @Component
-    private MavenProjectHelper projectHelper;
-
-    // end of component params custom code folding
-    // </editor-fold>
-    
-    private final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat ("yyyy/MM/dd");
-
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( skipNbm )
-        {
-            getLog().info( "Skipping generation of NBM file." );
-            return;
-        }
-
-        if ( "pom".equals( project.getPackaging() ) )
-        {
-            getLog().info(
-                    "Skipping " + project.getId() + ", no nbm:nbm execution for 'pom' packaging" );
-            return;
-        }
-        super.execute();
-
-
-        // 3. generate nbm
-        File nbmFile = new File( nbmBuildDir, finalName + ".nbm" );
-        MakeNBM nbmTask = (MakeNBM) antProject.createTask( "makenbm" );
-        nbmTask.setFile( nbmFile );
-        nbmTask.setProductDir( clusterDir );
-
-        nbmTask.setModule( "modules" + File.separator + moduleJarName + ".jar" );
-        boolean reqRestart = requiresRestart;
-        if (!reqRestart && module.isRequiresRestart()) {
-            reqRestart = module.isRequiresRestart();
-            getLog().warn( "Module descriptor's requiresRestart field is deprecated, use plugin's configuration in pom.xml");
-        }
-        nbmTask.setNeedsrestart( Boolean.toString( reqRestart ) );
-        String moduleAuthor = author;
-        if (module.getAuthor() != null) {
-            moduleAuthor = module.getAuthor();
-            getLog().warn( "Module descriptor's requiresRestart field is deprecated, use plugin's configuration in pom.xml");
-        }
-        nbmTask.setModuleauthor( moduleAuthor );
-        if ( keystore != null && keystorealias != null && keystorepassword != null )
-        {
-            File ks = new File( keystore );
-            if ( !ks.exists() )
-            {
-                getLog().warn( "Cannot find keystore file at " + ks.getAbsolutePath() );
-            }
-            else
-            {
-                Signature sig = nbmTask.createSignature();
-                sig.setKeystore( ks );
-                sig.setAlias( keystorealias );
-                sig.setStorepass( keystorepassword );
-                getLog().debug( "Setup the Ant task to sign the NBM file." );
-            }
-        }
-        else if ( keystore != null || keystorepassword != null || keystorealias != null )
-        {
-            getLog().warn(
-                    "If you want to sign the nbm file, you need to define all three keystore related parameters." );
-        }
-        String licName = licenseName;
-        File licFile = licenseFile;
-        if (module.getLicenseName() != null) {
-            licName = module.getLicenseName();
-            getLog().warn( "Module descriptor's licenseName field is deprecated, use plugin's configuration in pom.xml");
-        }
-        if (module.getLicenseFile() != null) {
-            File lf = new File( project.getBasedir(), module.getLicenseFile() );
-            licFile = lf;
-            getLog().warn( "Module descriptor's licenseFile field is deprecated, use plugin's configuration in pom.xml");
-            
-        }
-        if ( licName != null && licFile != null )
-        {
-            if ( !licFile.exists() || !licFile.isFile() )
-            {
-                getLog().warn( "Cannot find license file at " + licFile.getAbsolutePath() );
-            }
-            else
-            {
-                Blurb lb = nbmTask.createLicense();
-                lb.setFile( licFile );
-                lb.addText( licName );
-            }
-        }
-        else if ( licName != null || licFile != null )
-        {
-            getLog().warn(
-                    "To set license for the nbm, you need to specify both licenseName and licenseFile parameters." );
-        }
-        else
-        {
-            Blurb lb = nbmTask.createLicense();
-            lb.addText( createDefaultLicenseHeader() );
-            lb.addText( createDefaultLicenseText() );
-        }
-        String hpUrl = homePageUrl;
-        if (module.getHomepageUrl() != null) {
-            getLog().warn( "Module descriptor's homePageUrl field is deprecated, use plugin's configuration in pom.xml");
-            hpUrl = module.getHomepageUrl();
-        }
-        if ( hpUrl != null )
-        {
-            nbmTask.setHomepage( hpUrl );
-        }
-        String distribUrl = distributionUrl;
-        if (module.getDistributionUrl() != null) {
-            distribUrl = module.getDistributionUrl();
-            getLog().warn( "Module descriptor's distributionUrl field is deprecated, use plugin's configuration in pom.xml");
-        }
-        if ( distribUrl != null )
-        {
-            ArtifactRepository distRepository = CreateUpdateSiteMojo.getDeploymentRepository(
-                    distribUrl, container, getLog() );
-            String dist = null;
-            if ( distRepository == null )
-            {
-                if ( !distribUrl.contains( "::" ) )
-                {
-                    dist =
-                        distribUrl + ( distribUrl.endsWith( "/" ) ? "" : "/" )
-                            + nbmFile.getName();
-                }
-            }
-            else
-            {
-                Artifact art = artifactFactory.createArtifact(
-                        project.getGroupId(), project.getArtifactId(),
-                        project.getVersion(), null, "nbm-file" );
-
-                dist =
-                    distRepository.getUrl() + ( distRepository.getUrl().endsWith( "/" ) ? "" : "/" )
-                        + distRepository.pathOf( art );
-
-            }
-            nbmTask.setDistribution( dist );
-        }
-        else
-        {
-            nbmTask.setDistribution( nbmFile.getName() );
-        }
-        if ( ! "extra".equals( cluster ) )
-        {
-            nbmTask.setTargetcluster( cluster );
-        }
-        //MNBMODULE-217 avoid using the static DATE_FORMAT variable in MavenNBM.java (in ant harness)
-        nbmTask.setReleasedate( DATE_FORMAT.format(new Date(System.currentTimeMillis())) );
-        try
-        {
-            nbmTask.execute();
-        }
-        catch ( BuildException e )
-        {
-            throw new MojoExecutionException( "Cannot Generate nbm file:" + e.getMessage(), e );
-        }
-        try
-        {
-            File nbmfile = new File( buildDir, nbmFile.getName() );
-            FileUtils.getFileUtils().copyFile( nbmFile, nbmfile );
-            projectHelper.attachArtifact( project, "nbm-file", null, nbmfile );
-        }
-        catch ( IOException ex )
-        {
-            throw new MojoExecutionException( "Cannot copy nbm to build directory", ex );
-        }
-    }
-
-    public void contextualize( Context context )
-            throws ContextException
-    {
-        this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
-    }
-
-    private String createDefaultLicenseHeader()
-    {
-        String organization = "";
-        Organization org = project.getOrganization();
-        if (org != null) {
-            organization = org.getName();
-}
-        if (organization == null) {
-            List devs = project.getDevelopers();
-            if (devs.size() > 0) {
-                Iterator dvs = devs.iterator();
-                String devsString = "";
-                while (dvs.hasNext()) {
-                    Developer d = ( Developer )dvs.next();
-                    devsString = devsString + "," + d.getName() != null ? d.getName() : d.getId();
-                }
-                organization = devsString.substring( 1 );    
-            }
-        }
-        if (organization == null) {
-            organization = ""; //what's a good default value?
-        }
-        String date = "";
-        if (project.getInceptionYear() != null) {
-            date = project.getInceptionYear();
-        }
-        String year = Integer.toString( Calendar.getInstance().get( Calendar.YEAR ));
-        if (!year.equals( date ) ) {
-            date = date.length() == 0 ? year : date + "-" + year;
-        }
-        return "Copyright " + organization + " " + date;
-    }
-    
-    private String createDefaultLicenseText() {
-        String toRet = "License terms:\n";
-        
-        List licenses = project.getLicenses();
-        if (licenses != null && licenses.size() > 0) {
-            Iterator lic = licenses.iterator();
-            while (lic.hasNext()) {
-                License ll = ( License )lic.next();
-                
-                if (ll.getName() != null) {
-                   toRet = toRet + ll.getName() + " - "; 
-                }
-                if (ll.getUrl() != null) {
-                    toRet = toRet + ll.getUrl();
-                }
-                if (lic.hasNext()) {
-                    toRet = toRet + ",\n";
-                }
-            }
-        } else {
-           toRet = toRet + "Unknown";
-        }
-        return toRet;
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNetBeansFileStructure.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNetBeansFileStructure.java
deleted file mode 100644
index 8b42e0e..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateNetBeansFileStructure.java
+++ /dev/null
@@ -1,660 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.*;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-//import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.shared.filtering.MavenFilteringException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.filtering.MavenResourcesExecution;
-import org.apache.maven.shared.filtering.MavenResourcesFiltering;
-import org.netbeans.nbm.model.NbmResource;
-import org.netbeans.nbm.model.NetBeansModule;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.taskdefs.Jar;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.PatternSet;
-import org.apache.tools.ant.util.FileUtils;
-import org.netbeans.nbbuild.CreateModuleXML;
-import org.netbeans.nbbuild.MakeListOfNBM;
-import org.codehaus.plexus.util.ReaderFactory;
-import org.codehaus.plexus.util.StringUtils;
-import org.netbeans.nbbuild.JHIndexer;
-
-/**
- * Create the NetBeans module directory structure, a prerequisite for nbm creation and cluster creation.
- * 
- *
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-public abstract class CreateNetBeansFileStructure
-        extends AbstractNbmMojo
-{
-
-    /**
-     * NetBeans module assembly build directory.
-     * directory where the the NetBeans jar and nbm file get constructed.
-     */
-    @Parameter(defaultValue="${project.build.directory}/nbm", property="maven.nbm.buildDir")
-    protected File nbmBuildDir;
-    /**
-     * Build directory
-     */
-    @Parameter(required=true, readonly=true, property="project.build.directory")
-    protected File buildDir;
-    /**
-     * Name of the jar packaged by the jar:jar plugin
-     */
-    @Parameter(alias="jarname", property="project.build.finalName")
-    protected String finalName;
-    /**
-     * a NetBeans module descriptor containing dependency information and more..
-     * @deprecated all content from the module descriptor can be defined as plugin configuration now, will be removed in 4.0 entirely
-     */
-    @Parameter(defaultValue="${basedir}/src/main/nbm/module.xml")
-    protected File descriptor;
-    /**
-     * NetBeans module's cluster. Replaces the cluster element in module descriptor.
-     *
-     */
-    @Parameter(required=true, defaultValue="extra")
-    protected String cluster;
-    /**
-     * The location of JavaHelp sources for the project. The documentation
-     * itself is expected to be in the directory structure based on codenamebase of the module.
-     * eg. if your codenamebase is "org.netbeans.modules.apisupport", then the actual docs
-     * files shall go to ${basedir}/src/main/javahelp/org/netbeans/modules/apisupport/docs.
-     * @deprecated Obsolete as of NetBeans 7.0 with &#64;HelpSetRegistration.
-     * @since 2.7
-     */
-    @Deprecated
-    @Parameter(defaultValue="${basedir}/src/main/javahelp")
-    protected File nbmJavahelpSource;
-
-    @Parameter(required=true, readonly=true, property="project")
-    protected MavenProject project;
-
-    /**
-     * A list of additional resources to include in the NBM file.
-     * (Not in the module JAR; see <code>InstalledFileLocator</code> for retrieval.)
-     * Supersedes similarly-named configuration in the module descriptor file.
-     * <p>For example, to include native libraries:</p>
-     *
-     <pre>
-            &lt;nbmResource&gt;
-            &nbsp;&nbsp;&lt;directory&gt;src/main/libs&lt;/directory&gt;
-            &nbsp;&nbsp;&lt;targetPath&gt;modules/lib&lt;/targetPath&gt;
-            &nbsp;&nbsp;&lt;includes&gt;
-            &nbsp;&nbsp;&nbsp;&nbsp;&lt;include&gt;*.dll&lt;/include&gt;
-            &nbsp;&nbsp;&nbsp;&nbsp;&lt;include&gt;*.so&lt;/include&gt;
-            &nbsp;&nbsp;&lt;/includes&gt;
-            &lt;/nbmResource&gt;
-     </pre>
-     *
-     * @since 3.2
-     */
-    @Parameter
-    protected Resource[] nbmResources;
-
-    /**
-     * The character encoding scheme to be applied when filtering nbm resources.
-     *
-     * @since 3.2
-     */
-    @Parameter(property="encoding", defaultValue="${project.build.sourceEncoding}")
-    
-    protected String encoding;
-    
-    /**
-     * Deployment type of the module, allowed values are <code>normal</code>,<code>eager</code>,<code>autoload</code>,
-     * <code>disabled</code>.
-     * <p>
-     * <code>autoload</code> - Such a module is
-     * automatically enabled when some other module requires it and
-     * automatically disabled otherwise.</p>
-     *                     <p><code>eager</code> - This module type gets
-     * automatically enabled when all it's dependencies are
-     * satisfied. Disabled otherwise.</p>
-     *                     <p><code>normal</code> - This is the default
-     * value. This kind of module is enabled/disabled manually by
-     * the user. It installs enabled.</p>
-     *                     <p><code>disabled</code> - This kind of module is enabled/disabled manually by
-     * the user. It installs disabled. Since 3.11</p>
-     *
-     * For details, see <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#enablement">Netbeans Module system docs</a>
-     *
-     * Since 3.14, for autoload and eager modules, we automatically set AutoUpdate-Show-In-Client manifest entry to false, if not defined already otherwise in the manifest.
-     * See issue <a href="http://jira.codehaus.org/browse/MNBMODULE-194">MNBMODULE-194</a>
-     *
-     * 
-     * @since 3.8
-     */ 
-    @Parameter(defaultValue="normal")
-    protected String moduleType;
-    
-    /**
-     * codename base of the module, uniquely identifying the module within the NetBeans runtime. usually the package name equivalent.
-     * Can include the major release version.
-     * See <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#how-manifest"> NetBeans Module system docs</a>
-     * @since 3.8
-     */
-    @Parameter(defaultValue="${project.groupId}.${project.artifactId}")
-    private String codeNameBase;
-    
-    /**
-     * list of groupId:artifactId pairs describing libraries that go into the nbm file and will only include the .external reference in the nbm
-     * instead of the actual binary. See <a href="http://netbeans.org/bugzilla/show_bug.cgi?id=195041">NetBeans issue #195041</a> for details.
-     * Please note that the scheme will only work for artifacts present in central repository but no effort is made at build time to enforce that.
-     * Additionally at runtime when installing the module, the user has to be online and be capable of reaching central using maven. 
-     * You have been warned.
-     * @since 3.8
-     */ 
-    @Parameter
-    private List<String> externals;
-
-
-    @Component
-    protected MavenResourcesFiltering mavenResourcesFiltering;
-
-    @Parameter(property="session", readonly=true, required=true)
-    protected MavenSession session;
-
-
-    //items used by the CreateNBMMojo.
-    protected Project antProject;
-    protected NetBeansModule module;
-    protected File clusterDir;
-    protected String moduleJarName;
-
-    public void execute()
-            throws MojoExecutionException, MojoFailureException
-    {
-        antProject = registerNbmAntTasks();
-        if ( descriptor != null && descriptor.exists() )
-        {
-            module = readModuleDescriptor( descriptor );
-        } else
-        {
-            module = createDefaultDescriptor( project, false );
-        }
-        //same moduleType related code in NetBeansManifestUpdateMojo.java
-        String type = moduleType;
-        if ("normal".equals(type) && module.getModuleType() != null) {
-            type = module.getModuleType();
-            getLog().warn( "moduleType in module descriptor is deprecated, use the plugin's parameter moduleType");
-        }
-        if (!"normal".equals(type) && !"autoload".equals(type) && !"eager".equals(type) && !"disabled".equals(type)) {
-            getLog().error( "Only 'normal,autoload,eager,disabled' are allowed values in the moduleType parameter");
-        }
-        boolean autoload = "autoload".equals( type );
-        boolean eager = "eager".equals( type );
-        boolean disabled = "disabled".equals( type );
-        // 1. initialization
-        String moduleName = codeNameBase;
-        if (module.getCodeNameBase() != null) {
-            moduleName = module.getCodeNameBase();
-            getLog().warn( "codeNameBase in module descriptor is deprecated, use the plugin's parameter codeNameBase");
-        }
-        moduleName = NetBeansManifestUpdateMojo.stripVersionFromCodebaseName( moduleName.replaceAll( "-", "." ) );
-        moduleJarName = moduleName.replace( '.', '-' );
-        if ( "extra".equals( cluster ) && module.getCluster() != null )
-        {
-            getLog().warn(
-                    "Parameter cluster in module descriptor is deprecated, use the plugin configuration element." );
-            cluster = module.getCluster();
-        }
-        File jarFile = new File( buildDir, finalName + ".jar" );
-        clusterDir = new File( nbmBuildDir, "netbeans" + File.separator + cluster );
-        File moduleJarLocation = new File( clusterDir, "modules" );
-        moduleJarLocation.mkdirs();
-
-        //2. create nbm resources
-        File moduleFile = new File( moduleJarLocation, moduleJarName + ".jar" );
-
-        try
-        {
-            boolean needPlainCopy = false;
-            InputStream is = new FileInputStream( jarFile );
-            try
-            {
-                JarInputStream jis = new JarInputStream( is );
-                Manifest m = jis.getManifest();
-                Attributes a = m.getMainAttributes();
-                String classPath = ( String ) a.remove( new Attributes.Name( "X-Class-Path" ) );
-                if ( classPath == null )
-                {
-                    needPlainCopy = true;
-                }
-                else // MNBMODULE-133
-                {
-                    getLog().info( "Copying module JAR to " + moduleJarLocation + " with manifest updates" );
-                    a.putValue( "Class-Path", classPath );
-                    a.remove( new Attributes.Name( "Maven-Class-Path" ) );
-                    OutputStream os = new FileOutputStream( moduleFile );
-                    try
-                    {
-                        JarOutputStream jos = new JarOutputStream( os, m );
-                        JarEntry entry;
-                        while ( ( entry = jis.getNextJarEntry() ) != null )
-                        {
-                            JarEntry entry2 = new JarEntry( entry );
-                            jos.putNextEntry( entry2 );
-                            int c;
-                            while ( ( c = jis.read() ) != -1 )
-                            {
-                                jos.write( c );
-                            }
-                            jos.closeEntry();
-                        }
-                        jos.finish();
-                        jos.close();
-                    }
-                    finally
-                    {
-                        os.close();
-                    }
-                }
-            }
-            finally
-            {
-                is.close();
-            }
-            if ( needPlainCopy )
-            {
-                getLog().info( "Copying module JAR to " + moduleJarLocation );
-                FileUtils.getFileUtils().copyFile( jarFile, moduleFile, null, true, false );
-            }
-        }
-        catch ( IOException x )
-        {
-            throw new MojoExecutionException( "Cannot copy module jar", x );
-        }
-
-        ExamineManifest modExaminator = new ExamineManifest( getLog() );
-        modExaminator.setJarFile( moduleFile );
-        modExaminator.checkFile();
-        String classpathValue = modExaminator.getClasspath();
-
-        if ( module != null )
-        {
-            // copy libraries to the designated place..
-            @SuppressWarnings("unchecked")
-            List<Artifact> artifacts = project.getRuntimeArtifacts();
-            for ( Artifact artifact : artifacts )
-            {
-                File source = artifact.getFile();
-                
-                String path = NetBeansManifestUpdateMojo.artifactToClassPathEntry( artifact, codeNameBase );
-                
-                if ( classpathValue.contains( path ) )
-                {
-                    File target = new File( moduleJarLocation, path );
-
-                    File targetDir = target.getParentFile();
-                    targetDir.mkdirs();
-
-                    try
-                    {
-                        FileUtils.getFileUtils().copyFile( source, target, null, true, false );
-                        if ( externals != null && externals.contains(artifact.getGroupId() + ":" + artifact.getArtifactId())) // MNBMODULE-138
-                        {
-                            String name = target.getName();
-                            getLog().info( "Using *.external replacement for " + name );
-                            PrintWriter external = new PrintWriter( new File( targetDir, name + ".external" ), "UTF-8" );
-                            try
-                            {
-                                writeExternal( external, artifact );
-                            }
-                            finally
-                            {
-                                external.close();
-                            }
-                        }
-                    }
-                    catch ( IOException ex )
-                    {
-                        getLog().error( "Cannot copy library jar" );
-                        throw new MojoExecutionException( "Cannot copy library jar", ex );
-                    }
-                }
-            }
-            if ( nbmResources != null )
-            {
-                copyNbmResources();
-            }
-            copyDeprecatedNbmResources();
-        }
-
-        //javahelp stuff.
-        if ( nbmJavahelpSource.exists() )
-        {
-            getLog().warn( "src/main/javahelp/ deprecated; use @HelpSetRegistration instead" );
-            File javahelp_target = new File( buildDir, "javahelp" );
-            String javahelpbase = moduleJarName.replace( '-', File.separatorChar ) + File.separator + "docs";
-            String javahelpSearch = "JavaHelpSearch";
-            File b = new File( javahelp_target, javahelpbase );
-            File p = new File( b, javahelpSearch );
-            p.mkdirs();
-            Copy cp = (Copy) antProject.createTask( "copy" );
-            cp.setTodir( javahelp_target );
-            FileSet set = new FileSet();
-            set.setDir( nbmJavahelpSource );
-            cp.addFileset( set );
-            cp.execute();
-            getLog().info( "Generating JavaHelp Index..." );
-
-            JHIndexer jhTask = (JHIndexer) antProject.createTask( "jhindexer" );
-            jhTask.setBasedir( b );
-            jhTask.setDb( p );
-            jhTask.setIncludes( "**/*.html" );
-            jhTask.setExcludes( javahelpSearch );
-            Path path = new Path( antProject );
-            jhTask.setClassPath( path );
-            clearStaticFieldsInJavaHelpIndexer();
-            try
-            {
-                jhTask.execute();
-            }
-            catch ( BuildException e )
-            {
-                getLog().error( "Cannot generate JavaHelp index." );
-                throw new MojoExecutionException( e.getMessage(), e );
-            }
-            File helpJarLocation = new File( clusterDir, "modules/docs" );
-            helpJarLocation.mkdirs();
-            Jar jar = (Jar) antProject.createTask( "jar" );
-            jar.setDestFile( new File( helpJarLocation, moduleJarName + ".jar" ) );
-            set = new FileSet();
-            set.setDir( javahelp_target );
-            jar.addFileset( set );
-            jar.execute();
-        }
-
-        File configDir = new File( clusterDir, "config" + File.separator + "Modules" );
-        configDir.mkdirs();
-        CreateModuleXML moduleXmlTask = (CreateModuleXML) antProject.createTask( "createmodulexml" );
-        moduleXmlTask.setXmldir( configDir );
-        FileSet fs = new FileSet();
-        fs.setDir( clusterDir );
-        fs.setIncludes( "modules" + File.separator + moduleJarName + ".jar" );
-        if ( autoload )
-        {
-            moduleXmlTask.addAutoload( fs );
-        }
-        else if ( eager )
-        {
-            moduleXmlTask.addEager( fs );
-        }
-        else if ( disabled )
-        {
-            moduleXmlTask.addDisabled( fs );
-        }
-        else
-        {
-            moduleXmlTask.addEnabled( fs );
-        }
-        try
-        {
-            moduleXmlTask.execute();
-        }
-        catch ( BuildException e )
-        {
-            getLog().error( "Cannot generate config file." );
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-        MakeListOfNBM makeTask = (MakeListOfNBM) antProject.createTask( "genlist" );
-        antProject.setNewProperty( "module.name", finalName );
-        antProject.setProperty( "cluster.dir", cluster );
-        FileSet set = makeTask.createFileSet();
-        set.setDir( clusterDir );
-        PatternSet pattern = set.createPatternSet();
-        pattern.setIncludes( "**" );
-        makeTask.setModule( "modules" + File.separator + moduleJarName + ".jar" );
-        makeTask.setOutputfiledir( clusterDir );
-        try
-        {
-            makeTask.execute();
-        }
-        catch ( BuildException e )
-        {
-            getLog().error( "Cannot Generate nbm list" );
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-
-    }
-
-    private void copyDeprecatedNbmResources()
-        throws BuildException, MojoExecutionException
-    {
-        // copy additional resources..
-        List<NbmResource> ress = module.getNbmResources();
-        if ( ress.size() > 0 )
-        {
-            getLog().warn( "NBM resources defined in module descriptor are deprecated. Please configure NBM resources in plugin configuration." );
-            Copy cp = (Copy) antProject.createTask( "copy" );
-            cp.setTodir( clusterDir );
-            HashMap<File, Collection<FileSet>> customPaths = new HashMap<File, Collection<FileSet>>();
-            boolean hasStandard = false;
-            for ( NbmResource res : ress )
-            {
-                if ( res.getBaseDirectory() != null )
-                {
-                    File base = new File( project.getBasedir(), res.getBaseDirectory() );
-                    FileSet set = new FileSet();
-                    set.setDir( base );
-                    for ( String inc : res.getIncludes() )
-                    {
-                        set.createInclude().setName( inc );
-                    }
-                    for ( String exc : res.getExcludes() )
-                    {
-                        set.createExclude().setName( exc );
-                    }
-
-                    if ( res.getRelativeClusterPath() != null )
-                    {
-                        File path = new File( clusterDir, res.getRelativeClusterPath() );
-                        Collection<FileSet> col = customPaths.get( path );
-                        if ( col == null )
-                        {
-                            col = new ArrayList<FileSet>();
-                            customPaths.put( path, col );
-                        }
-                        col.add( set );
-                    }
-                    else
-                    {
-                        cp.addFileset( set );
-                        hasStandard = true;
-                    }
-                }
-            }
-            try
-            {
-                if ( hasStandard )
-                {
-                    cp.execute();
-                }
-                if ( customPaths.size() > 0 )
-                {
-                    for ( Map.Entry<File, Collection<FileSet>> ent : customPaths.entrySet() )
-                    {
-                        cp = (Copy) antProject.createTask( "copy" );
-                        cp.setTodir( ent.getKey() );
-                        for ( FileSet set : ent.getValue() )
-                        {
-                            cp.addFileset( set );
-                        }
-                        cp.execute();
-                    }
-                }
-            }
-            catch ( BuildException e )
-            {
-                getLog().error( "Cannot copy additional resources into the nbm file" );
-                throw new MojoExecutionException( e.getMessage(), e );
-            }
-        }
-    }
-
-    // repeated invokation of the javahelp indexer (possibly via multiple classloaders)
-    // is causing trouble, residue from previous invokations seems to cause errors
-    // this is a nasty workaround for the problem.
-    // alternatively we could try invoking the indexer from a separate jvm i guess,
-    // ut that's more work.
-    private void clearStaticFieldsInJavaHelpIndexer() // MNBMODULE-51 hack
-    {
-        try
-        {
-            Class clazz = Class.forName( "com.sun.java.help.search.Indexer" );
-            Field fld = clazz.getDeclaredField( "kitRegistry" );
-            fld.setAccessible( true );
-            Hashtable hash = (Hashtable) fld.get( null );
-            hash.clear();
-
-            clazz = Class.forName( "com.sun.java.help.search.HTMLIndexerKit" );
-            fld = clazz.getDeclaredField( "defaultParser" );
-            fld.setAccessible( true );
-            fld.set( null, null);
-
-            fld = clazz.getDeclaredField( "defaultCallback" );
-            fld.setAccessible( true );
-            fld.set( null, null);
-
-        }
-        catch ( IllegalArgumentException ex )
-        {
-            Logger.getLogger( CreateNetBeansFileStructure.class.getName() ).log( Level.SEVERE, null, ex );
-        }
-        catch ( IllegalAccessException ex )
-        {
-            Logger.getLogger( CreateNetBeansFileStructure.class.getName() ).log( Level.SEVERE, null, ex );
-        }
-        catch ( NoSuchFieldException ex )
-        {
-            Logger.getLogger( CreateNetBeansFileStructure.class.getName() ).log( Level.SEVERE, null, ex );
-        }
-        catch ( SecurityException ex )
-        {
-            Logger.getLogger( CreateNetBeansFileStructure.class.getName() ).log( Level.SEVERE, null, ex );
-        }
-        catch ( ClassNotFoundException ex )
-        {
-            Logger.getLogger( CreateNetBeansFileStructure.class.getName() ).log( Level.SEVERE, null, ex );
-        }
-    }
-
-    private void copyNbmResources()
-        throws MojoExecutionException
-    {
-        try
-        {
-            if ( StringUtils.isEmpty( encoding ) && isFilteringEnabled( nbmResources ) )
-            {
-                getLog().warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING
-                                   + ", i.e. build is platform dependent!" );
-            }
-            MavenResourcesExecution mavenResourcesExecution =
-                new MavenResourcesExecution( Arrays.asList( nbmResources ), clusterDir, project, encoding,
-                                             Collections.EMPTY_LIST, Collections.EMPTY_LIST, session );
-            mavenResourcesExecution.setEscapeWindowsPaths( true );
-            mavenResourcesFiltering.filterResources( mavenResourcesExecution );
-        }
-        catch ( MavenFilteringException ex )
-        {
-            throw new MojoExecutionException( ex.getMessage(), ex );
-        }
-    }
-
-    /**
-     * Determines whether filtering has been enabled for any resource.
-     *
-     * @param resources The set of resources to check for filtering.
-     * @return <code>true</code> if at least one resource uses filtering, <code>false</code> otherwise.
-     */
-    private boolean isFilteringEnabled( Resource[] resources )
-    {
-        for ( Resource resource : resources )
-        {
-            if ( resource.isFiltering() )
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    static void writeExternal( PrintWriter w, Artifact artifact )
-        throws IOException
-    {
-        w.write( "CRC:" );
-        File file = artifact.getFile();
-        w.write( Long.toString( CreateClusterAppMojo.crcForFile( file ).getValue() ) );
-        w.write( "\nSIZE:" );
-        w.write( Long.toString( file.length() ) );
-        w.write( "\nURL:m2:/" );
-        w.write( artifact.getGroupId() );
-        w.write( ':' );
-        w.write( artifact.getArtifactId() );
-        w.write( ':' );
-        w.write( artifact.getVersion() );
-        w.write( ':' );
-        w.write( artifact.getType() );
-        if ( artifact.getClassifier() != null )
-        {
-            w.write( ':' );
-            w.write( artifact.getClassifier() );
-        }
-        w.write( "\nURL:" );
-        // artifact.repository is null, so cannot use its url, and anyway might be a mirror
-        w.write( /* M3: RepositorySystem.DEFAULT_REMOTE_REPO_URL + '/' */ "http://repo.maven.apache.org/maven2/" );
-        w.write( new DefaultRepositoryLayout().pathOf( artifact ) );
-        w.write( '\n' );
-        w.flush();
-    }
-
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateStandaloneMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateStandaloneMojo.java
deleted file mode 100644
index 48b78c4..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateStandaloneMojo.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright 2008 Johan Andrén.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.archiver.util.DefaultFileSet;
-import org.codehaus.plexus.archiver.zip.ZipArchiver;
-
-/**
- * Create a standalone application out of the composed clusters of nbm-application
- *
- * @author <a href="mailto:johan.andren@databyran.se">Johan Andrén</a>
- * @author Milos Kleint
- */
-@Mojo(name="standalone-zip", requiresProject=true, threadSafe = true)
-public class CreateStandaloneMojo
-        extends AbstractMojo
-{
-
-    /**
-     * The branding token for the application based on NetBeans platform.
-     */
-    @Parameter(property="netbeans.branding.token", required=true)
-    protected String brandingToken;
-    /**
-     * output directory where the the NetBeans application will be created.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}")
-    private File outputDirectory;
-    /**
-     * Name of the zip artifact produced by the goal (without .zip extension)
-     */
-    @Parameter(defaultValue="${project.build.finalName}")
-    private String finalName;
-    /**
-     * The Maven project.
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    /**
-     * 
-     * @throws MojoExecutionException if an unexpected problem occurs
-     * @throws MojoFailureException if an expected problem occurs
-     */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-
-        try
-        {
-            File nbmBuildDirFile = new File( outputDirectory, brandingToken );
-
-            ZipArchiver archiver = new ZipArchiver();
-            DefaultFileSet fs = new DefaultFileSet();
-            fs.setDirectory( outputDirectory );
-            fs.setIncludes( new String[] {
-                brandingToken + "/**",
-            } );
-            fs.setExcludes( new String[] {
-                brandingToken + "/bin/*",
-            } );
-            archiver.addFileSet( fs );
-            File bins = new File( nbmBuildDirFile, "bin" );
-            for ( File bin : bins.listFiles() )
-            {
-                archiver.addFile( bin, brandingToken + "/bin/" + bin.getName(), 0755 );
-            }
-            File zipFile = new File( outputDirectory, finalName + ".zip" );
-            //TODO - somehow check for last modified content to see if we shall be
-            //recreating the zip file.
-            archiver.setDestFile( zipFile );
-            archiver.setForced( false );
-            archiver.createArchive();
-            project.getArtifact().setFile( zipFile );
-
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "", ex );
-        }
-
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateUpdateSiteMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateUpdateSiteMojo.java
deleted file mode 100644
index e959457..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateUpdateSiteMojo.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.types.FileSet;
-import org.codehaus.plexus.PlexusConstants;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.archiver.gzip.GZipArchiver;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.context.ContextException;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
-import org.netbeans.nbbuild.MakeUpdateDesc;
-
-/**
- * Create the NetBeans auto update site definition.
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-@Mojo(name="autoupdate", 
-        defaultPhase= LifecyclePhase.PACKAGE, 
-        aggregator=true, 
-        requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class CreateUpdateSiteMojo
-        extends AbstractNbmMojo
-        implements Contextualizable
-{
-
-    /**
-     * output directory.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}")
-    protected File outputDirectory;
-    /**
-     * autoupdate site xml file name.
-     */
-    @Parameter( defaultValue="updates.xml", property="maven.nbm.updatesitexml")
-    protected String fileName;
-    /**
-     * A custom distribution base for the nbms in the update site.
-     * If NOT defined, the update site will use a simple relative URL, which is generally what you want.
-     * Defining it as "auto" will pick up the distribution URL from each NBM, which is generally wrong. 
-     * See <code>distributionUrl</code> in nbm mojo for what url will be used in that case.
-     * <p/>
-     * The value is either a direct http protocol based URL that points to
-     * the location under which all nbm files are located, or
-     * <p/>
-     * allows to create an update site based on maven repository content.
-     * The resulting autoupdate site document can be uploaded as tar.gz to repository as well
-     * as attached artifact to the 'nbm-application' project.
-     * <br/>
-     * Format: id::layout::url same as in maven-deploy-plugin
-     * <br/>
-     * with the 'default' and 'legacy' layouts. (maven2 vs maven1 layout)
-     * <br/>
-     * If the value doesn't contain :: characters,
-     * it's assumed to be the flat structure and the value is just the URL.
-     * 
-     * @since 3.0 it's also possible to add remote repository as base
-     */
-    @Parameter(defaultValue=".", property="maven.nbm.customDistBase")
-    private String distBase;
-
-    /**
-     * The Maven Project.
-     *
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    /**
-     * If the executed project is a reactor project, this will contains the full list of projects in the reactor.
-     */
-    @Parameter(required=true, readonly=true, defaultValue="${reactorProjects}")
-    private List reactorProjects;
-    
-    /**
-     * List of Ant style patterns on artifact GA (groupID:artifactID) that should be included in the update site.
-     * Eg. org.netbeans.* matches all artifacts with any groupID starting with 'org.netbeans.',
-     * org.*:api will match any artifact with artifactId of 'api' and groupId starting with 'org.'
-     * @since 3.14
-     */
-    @Parameter
-    private List<String> updateSiteIncludes;
-    
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-
-    @Component
-    private ArtifactFactory artifactFactory;
-    /**
-     * Contextualized.
-     */
-    private PlexusContainer container;
-    /**
-     * Used for attaching the artifact in the project
-     *
-     */
-    @Component
-    private MavenProjectHelper projectHelper;
-
-    @Component
-    private ArtifactResolver artifactResolver;
-
-    /**
-     * Local maven repository.
-     *
-     */
-    @Parameter(readonly=true, required=true, defaultValue="${localRepository}")
-    protected ArtifactRepository localRepository;
-
-    // </editor-fold>
-
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        Project antProject = registerNbmAntTasks();
-        File nbmBuildDirFile = new File( outputDirectory, "netbeans_site" );
-        if ( !nbmBuildDirFile.exists() )
-        {
-            nbmBuildDirFile.mkdirs();
-        }
-
-        boolean isRepository = false;
-        if ( "auto".equals( distBase ) )
-        {
-            distBase = null;
-        }
-        ArtifactRepository distRepository = getDeploymentRepository( distBase, container, getLog() );
-        String oldDistBase = null;
-        if ( distRepository != null )
-        {
-            isRepository = true;
-        }
-        else
-        {
-            if ( distBase != null && !distBase.contains( "::" ) )
-            {
-                oldDistBase = distBase;
-            }
-        }
-
-        if ( "nbm-application".equals( project.getPackaging() ) )
-        {
-            @SuppressWarnings( "unchecked" )
-            Set<Artifact> artifacts = project.getArtifacts();
-            for ( Artifact art : artifacts )
-            {
-                if (!matchesIncludes(art)) {
-                    continue;
-                }
-                ArtifactResult res =
-                    turnJarToNbmFile( art, artifactFactory, artifactResolver, project, localRepository );
-                if ( res.hasConvertedArtifact() )
-                {
-                    art = res.getConvertedArtifact();
-                }
-
-                if ( art.getType().equals( "nbm-file" ) )
-                {
-                    Copy copyTask = (Copy) antProject.createTask( "copy" );
-                    copyTask.setOverwrite( true );
-                    copyTask.setFile( art.getFile() );
-                    if ( !isRepository )
-                    {
-                        copyTask.setFlatten( true );
-                        copyTask.setTodir( nbmBuildDirFile );
-                    }
-                    else
-                    {
-                        String path = distRepository.pathOf( art );
-                        File f = new File( nbmBuildDirFile, path.replace( '/', File.separatorChar ) );
-                        copyTask.setTofile( f );
-                    }
-                    try
-                    {
-                        copyTask.execute();
-                    }
-                    catch ( BuildException ex )
-                    {
-                        throw new MojoExecutionException( "Cannot merge nbm files into autoupdate site", ex );
-                    }
-
-                }
-                if ( res.isOSGiBundle() )
-                {
-                    // TODO check for bundles
-                }
-            }
-            getLog().info( "Created NetBeans module cluster(s) at " + nbmBuildDirFile.getAbsoluteFile() );
-
-        }
-        else if ( reactorProjects != null && reactorProjects.size() > 0 )
-        {
-
-            Iterator it = reactorProjects.iterator();
-            while ( it.hasNext() )
-            {
-                MavenProject proj = (MavenProject) it.next();
-                //TODO how to figure where the the buildDir/nbm directory is
-                File moduleDir = proj.getFile().getParentFile();
-                if ( moduleDir != null && moduleDir.exists() )
-                {
-                    Copy copyTask = (Copy) antProject.createTask( "copy" );
-                    if ( !isRepository )
-                    {
-                        FileSet fs = new FileSet();
-                        File projOutputDirectory = new File( proj.getBuild().getDirectory() );
-                        fs.setDir( projOutputDirectory );
-                        fs.createInclude().setName( "*.nbm" );
-                        copyTask.addFileset( fs );
-                        copyTask.setOverwrite( true );
-                        copyTask.setFlatten( true );
-                        copyTask.setTodir( nbmBuildDirFile );
-                    }
-                    else
-                    {
-                        File target = new File( proj.getBuild().getDirectory() );
-                        boolean has = false;
-                        File[] fls = target.listFiles();
-                        if ( fls != null )
-                        {
-                            for ( File fl : fls )
-                            {
-                                if ( fl.getName().endsWith( ".nbm" ) )
-                                {
-                                    copyTask.setFile( fl );
-                                    has = true;
-                                    break;
-                                }
-                            }
-                        }
-                        if ( !has )
-                        {
-                            continue;
-                        }
-                        Artifact art =
-                            artifactFactory.createArtifact( proj.getGroupId(), proj.getArtifactId(), proj.getVersion(),
-                                                            null, "nbm-file" );
-                        String path = distRepository.pathOf( art );
-                        File f = new File( nbmBuildDirFile, path.replace( '/', File.separatorChar ) );
-                        copyTask.setTofile( f );
-                    }
-                    try
-                    {
-                        copyTask.execute();
-                    }
-                    catch ( BuildException ex )
-                    {
-                        throw new MojoExecutionException( "Cannot merge nbm files into autoupdate site", ex );
-                    }
-                }
-            }
-        }
-        else
-        {
-            throw new MojoExecutionException(
-                    "This goal only makes sense on reactor projects or project with 'nbm-application' packaging." );
-
-        }
-        MakeUpdateDesc descTask = (MakeUpdateDesc) antProject.createTask( "updatedist" );
-        File xmlFile = new File( nbmBuildDirFile, fileName );
-        descTask.setDesc( xmlFile );
-        if ( oldDistBase != null )
-        {
-            descTask.setDistBase( oldDistBase );
-        }
-        if ( distRepository != null )
-        {
-            descTask.setDistBase( distRepository.getUrl() );
-        }
-        FileSet fs = new FileSet();
-        fs.setDir( nbmBuildDirFile );
-        fs.createInclude().setName( "**/*.nbm" );
-        descTask.addFileset( fs );
-        try
-        {
-            descTask.execute();
-        }
-        catch ( BuildException ex )
-        {
-            throw new MojoExecutionException( "Cannot create autoupdate site xml file", ex );
-        }
-        getLog().info( "Generated autoupdate site content at " + nbmBuildDirFile.getAbsolutePath() );
-
-        try
-        {
-            GZipArchiver gz = new GZipArchiver();
-            gz.addFile( xmlFile, fileName );
-            File gzipped = new File( nbmBuildDirFile, fileName + ".gz" );
-            gz.setDestFile( gzipped );
-            gz.createArchive();
-            if ( "nbm-application".equals( project.getPackaging() ) )
-            {
-                projectHelper.attachArtifact( project, "xml.gz", "updatesite", gzipped );
-            }
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "Cannot create gzipped version of the update site xml file.", ex );
-        }
-
-    }
-
-    private static final Pattern ALT_REPO_SYNTAX_PATTERN = Pattern.compile( "(.+)::(.+)::(.+)" );
-
-    static ArtifactRepository getDeploymentRepository( String distBase, PlexusContainer container, Log log )
-        throws MojoExecutionException, MojoFailureException
-    {
-
-        ArtifactRepository repo = null;
-
-        if ( distBase != null )
-        {
-
-            Matcher matcher = ALT_REPO_SYNTAX_PATTERN.matcher( distBase );
-
-            if ( !matcher.matches() )
-            {
-                if ( !distBase.contains( "::" ) )
-                {
-                    //backward compatibility gag.
-                    return null;
-                }
-                throw new MojoFailureException( distBase,
-                        "Invalid syntax for repository.",
-                        "Invalid syntax for alternative repository. Use \"id::layout::url\"." );
-            }
-            else
-            {
-                String id = matcher.group( 1 ).trim();
-                String layout = matcher.group( 2 ).trim();
-                String url = matcher.group( 3 ).trim();
-
-                ArtifactRepositoryLayout repoLayout;
-                try
-                {
-                    repoLayout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.ROLE, layout );
-                }
-                catch ( ComponentLookupException e )
-                {
-                    throw new MojoExecutionException( "Cannot find repository layout: " + layout, e );
-                }
-
-                repo = new DefaultArtifactRepository( id, url, repoLayout );
-            }
-        }
-        return repo;
-    }
-
-    public void contextualize( Context context )
-        throws ContextException
-    {
-        this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
-    }
-
-    private boolean matchesIncludes( Artifact art )
-    {
-        if (updateSiteIncludes != null) {
-            String s = art.getGroupId() + ":" + art.getArtifactId();
-            for (String p : updateSiteIncludes) {
-                //TODO optimize and only do once per execution.
-                p = p.replace(".", "\\.").replace( "*", ".*");
-                Pattern patt = Pattern.compile( p );
-                if (patt.matcher( s).matches()) {
-                    return true;
-                }
-            }
-            return false;    
-        }
-        return true;
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateWebstartAppMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateWebstartAppMojo.java
deleted file mode 100644
index 0ad1add..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/CreateWebstartAppMojo.java
+++ /dev/null
@@ -1,698 +0,0 @@
-/*
- *  Copyright 2008 Johan Andrén.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-package org.netbeans.nbm;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URL;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.GenerateKey;
-import org.apache.tools.ant.taskdefs.SignJar;
-import org.apache.tools.ant.taskdefs.Taskdef;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.types.Parameter;
-import org.apache.tools.ant.types.selectors.AndSelector;
-import org.apache.tools.ant.types.selectors.FilenameSelector;
-import org.apache.tools.ant.types.selectors.OrSelector;
-import org.codehaus.plexus.archiver.zip.ZipArchiver;
-import org.codehaus.plexus.components.io.resources.PlexusIoResource;
-import org.codehaus.plexus.util.DirectoryScanner;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.InterpolationFilterReader;
-import org.netbeans.nbbuild.MakeJNLP;
-import org.netbeans.nbbuild.ModuleSelector;
-import org.netbeans.nbbuild.VerifyJNLP;
-
-/**
- * Create webstartable binaries for a 'nbm-application'.
- * @author <a href="mailto:johan.andren@databyran.se">Johan Andrén</a>
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- * @since 3.0
- */
-@Mojo(name="webstart-app", defaultPhase= LifecyclePhase.PACKAGE )
-public class CreateWebstartAppMojo
-    extends AbstractNbmMojo
-{
-
-    /**
-     * The Maven project.
-
-     */
-    @org.apache.maven.plugins.annotations.Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    @Component
-    protected MavenProjectHelper projectHelper;
-
-    /**
-     * The branding token for the application based on NetBeans platform.
-     */
-    @org.apache.maven.plugins.annotations.Parameter(required=true, property="netbeans.branding.token")
-    protected String brandingToken;
-
-    /**
-     * output directory where the the NetBeans application will be created.
-     */
-    @org.apache.maven.plugins.annotations.Parameter(required=true, defaultValue="${project.build.directory}")
-    private File outputDirectory;
-
-    /**
-     * Ready-to-deploy WAR containing application in JNLP packaging.
-     * 
-     */
-    @org.apache.maven.plugins.annotations.Parameter(required=true, defaultValue="${project.build.directory}/${project.artifactId}-${project.version}-jnlp.war")
-    private File destinationFile;
-
-    /**
-     * Artifact Classifier to use for the webstart distributable zip file.
-     * @since 3.1
-     */
-    @org.apache.maven.plugins.annotations.Parameter(defaultValue="webstart", property="nbm.webstart.classifier")
-    private String webstartClassifier;
-
-    /**
-     * Codebase value within *.jnlp files.
-     * <strong>Defining this parameter is generally a bad idea.</strong>
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="nbm.webstart.codebase")
-    private String codebase;
-
-    /**
-     * A custom master JNLP file. If not defined, the 
-     * <a href="http://mojo.codehaus.org/nbm-maven-plugin/masterjnlp.txt">default one</a> is used.
-     * The following expressions can be used within the file and will
-     * be replaced when generating content.
-     * <ul>
-     * <li>${jnlp.resources}</li>
-     * <li>${jnlp.codebase} - the 'codebase' parameter value is passed in.</li>
-     * <li>${app.name}</li>
-     * <li>${app.title}</li>
-     * <li>${app.vendor}</li>
-     * <li>${app.description}</li>
-     * <li>${branding.token} - the 'brandingToken' parameter value is passed in.</li>
-     * <li>${netbeans.jnlp.fixPolicy}</li>
-     * </ul>
-     */
-    @org.apache.maven.plugins.annotations.Parameter
-    private File masterJnlpFile;
-    
-    /**
-     * The basename (minus .jnlp extension) of the master JNLP file in the output.
-     * This file will be the entry point for javaws.
-     * Defaults to the branding token.
-     * @since 3.5
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="master.jnlp.file.name")
-    private String masterJnlpFileName;
-
-    /**
-     * keystore location for signing the nbm file
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="keystore")
-    private String keystore;
-
-    /**
-     * keystore password
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="keystorepass")
-    private String keystorepassword;
-
-    /**
-     * keystore alias
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="keystorealias")
-    private String keystorealias;
-
-    /**
-     * keystore type
-     * @since 3.5
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="keystoretype")
-    private String keystoretype;
-
-    /**
-     * If set true, build-jnlp target creates versioning info in jnlp descriptors and version.xml files.
-     * This allows for incremental updates of Webstart applications, but requires download via
-     * JnlpDownloadServlet
-     * Defaults to false, which means versioning
-     * info is not generated (see
-     * http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/downloadservletguide.html#resources).
-     *
-     */
-    @org.apache.maven.plugins.annotations.Parameter(defaultValue="false", property="nbm.webstart.versions")
-    private boolean processJarVersions;
-    /**
-     * additional command line arguments. Eg.
-     * -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,suspend=n,server=n,address=8888
-     * can be used to debug the IDE.
-     */
-    @org.apache.maven.plugins.annotations.Parameter(property="netbeans.run.params")
-    private String additionalArguments;
-
-    /**
-     * 
-     * @throws MojoExecutionException if an unexpected problem occurs
-     * @throws MojoFailureException if an expected problem occurs
-     */
-    @Override
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( !"nbm-application".equals( project.getPackaging() ) )
-        {
-            throw new MojoExecutionException(
-                "This goal only makes sense on project with nbm-application packaging." );
-        }
-        Project antProject = antProject();
-        
-        getLog().warn( "WARNING: Unsigned and self-signed WebStart applications are deprecated from JDK7u21 onwards. To ensure future correct functionality please use trusted certificate.");
-
-        if ( keystore != null && keystorealias != null && keystorepassword != null )
-        {
-            File ks = new File( keystore );
-            if ( !ks.exists() )
-            {
-                throw new MojoFailureException( "Cannot find keystore file at " + ks.getAbsolutePath() );
-            }
-            else
-            {
-                //proceed..
-            }
-        }
-        else if ( keystore != null || keystorepassword != null || keystorealias != null )
-        {
-            throw new MojoFailureException(
-                "If you want to sign the jnlp application, you need to define all three keystore related parameters." );
-        }
-        else
-        {
-            File generatedKeystore = new File( outputDirectory, "generated.keystore" );
-            if ( ! generatedKeystore.exists() )
-            {
-                getLog().warn( "Keystore related parameters not set, generating a default keystore." );
-                GenerateKey genTask = (GenerateKey) antProject.createTask( "genkey" );
-                genTask.setAlias( "jnlp" );
-                genTask.setStorepass( "netbeans" );
-                genTask.setDname( "CN=" + System.getProperty( "user.name" ) );
-                genTask.setKeystore( generatedKeystore.getAbsolutePath() );
-                genTask.execute();
-            }
-            keystore = generatedKeystore.getAbsolutePath();
-            keystorepassword = "netbeans";
-            keystorealias = "jnlp";
-        }
-
-        Taskdef taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.MakeJNLP" );
-        taskdef.setName( "makejnlp" );
-        taskdef.execute();
-
-        taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.VerifyJNLP" );
-        taskdef.setName( "verifyjnlp" );
-        taskdef.execute();
-
-
-        try
-        {
-            File webstartBuildDir = new File(
-                outputDirectory + File.separator + "webstart" + File.separator + brandingToken );
-            if ( webstartBuildDir.exists() )
-            {
-                FileUtils.deleteDirectory( webstartBuildDir );
-            }
-            webstartBuildDir.mkdirs();
-            final String localCodebase = codebase != null ? codebase : webstartBuildDir.toURI().toString();
-            getLog().info( "Generating webstartable binaries at " + webstartBuildDir.getAbsolutePath() );
-
-            File nbmBuildDirFile = new File( outputDirectory, brandingToken );
-
-//            FileUtils.copyDirectoryStructureIfModified( nbmBuildDirFile, webstartBuildDir );
-
-            MakeJNLP jnlpTask = (MakeJNLP) antProject.createTask( "makejnlp" );
-            jnlpTask.setDir( webstartBuildDir );
-            jnlpTask.setCodebase( localCodebase );
-            //TODO, how to figure verify excludes..
-            jnlpTask.setVerify( false );
-            jnlpTask.setPermissions( "<security><all-permissions/></security>" );
-            jnlpTask.setSignJars( true );
-
-            jnlpTask.setAlias( keystorealias );
-            jnlpTask.setKeystore( keystore );
-            jnlpTask.setStorePass( keystorepassword );
-            if ( keystoretype != null )
-            {
-                jnlpTask.setStoreType( keystoretype );
-            }
-            jnlpTask.setProcessJarVersions( processJarVersions );
-
-            FileSet fs = jnlpTask.createModules();
-            fs.setDir( nbmBuildDirFile );
-            OrSelector or = new OrSelector();
-            AndSelector and = new AndSelector();
-            FilenameSelector inc = new FilenameSelector();
-            inc.setName( "*/modules/**/*.jar" );
-            or.addFilename( inc );
-            inc = new FilenameSelector();
-            inc.setName( "*/lib/**/*.jar" );
-            or.addFilename( inc );
-            inc = new FilenameSelector();
-            inc.setName( "*/core/**/*.jar" );
-            or.addFilename( inc );
-
-            ModuleSelector ms = new ModuleSelector();
-            Parameter included = new Parameter();
-            included.setName( "includeClusters" );
-            included.setValue( "" );
-            Parameter excluded = new Parameter();
-            excluded.setName( "excludeClusters" );
-            excluded.setValue( "" );
-            Parameter exModules = new Parameter();
-            exModules.setName( "excludeModules" );
-            exModules.setValue( "" );
-            ms.setParameters( new Parameter[]
-                {
-                    included,
-                    excluded,
-                    exModules
-                } );
-            and.add( or );
-            and.add( ms );
-            fs.addAnd( and );
-            jnlpTask.execute();
-
-            //TODO is it really netbeans/
-            String extSnippet = generateExtensions( fs, antProject, "" ); // "netbeans/"
-
-            if ( masterJnlpFileName == null )
-            {
-               masterJnlpFileName = brandingToken;
-            }
-
-            Properties props = new Properties();
-            props.setProperty( "jnlp.codebase", localCodebase );
-            props.setProperty( "app.name", brandingToken );
-            props.setProperty( "app.title", project.getName() );
-            if ( project.getOrganization() != null )
-            {
-                props.setProperty( "app.vendor", project.getOrganization().getName() );
-            }
-            else
-            {
-                props.setProperty( "app.vendor", "Nobody" );
-            }
-            String description = project.getDescription() != null ? project.getDescription() : "No Project Description";
-            props.setProperty( "app.description", description );
-            props.setProperty( "branding.token", brandingToken );
-            props.setProperty( "master.jnlp.file.name", masterJnlpFileName );
-            props.setProperty( "netbeans.jnlp.fixPolicy", "false" );
-
-            StringBuilder stBuilder = new StringBuilder();
-            if ( additionalArguments != null )
-            {
-                StringTokenizer st = new StringTokenizer( additionalArguments );
-                while ( st.hasMoreTokens() )
-                {
-                    String arg = st.nextToken();
-                    if ( arg.startsWith( "-J" ) )
-                    {
-                        if ( stBuilder.length() > 0 )
-                        {
-                            stBuilder.append( ' ' );
-                        }
-                        stBuilder.append( arg.substring( 2 ) );
-                    }
-                }
-            }
-            props.setProperty( "netbeans.run.params", stBuilder.toString() );
-
-            File masterJnlp = new File(
-                webstartBuildDir.getAbsolutePath() + File.separator + masterJnlpFileName + ".jnlp" );
-            filterCopy( masterJnlpFile, "master.jnlp", masterJnlp, props );
-
-
-            File startup = copyLauncher( outputDirectory, nbmBuildDirFile );
-            File jnlpDestination = new File(
-                webstartBuildDir.getAbsolutePath() + File.separator + "startup.jar" );
-
-            SignJar signTask = (SignJar) antProject.createTask( "signjar" );
-            signTask.setKeystore( keystore );
-            signTask.setStorepass( keystorepassword );
-            signTask.setAlias( keystorealias );
-            if ( keystoretype != null )
-            {
-                signTask.setStoretype( keystoretype );
-            }
-            signTask.setSignedjar( jnlpDestination );
-            signTask.setJar( startup );
-            signTask.execute();
-
-            //branding
-            DirectoryScanner ds = new DirectoryScanner();
-            ds.setBasedir( nbmBuildDirFile );
-            ds.setIncludes( new String[]
-                {
-                    "**/locale/*.jar"
-                } );
-            ds.scan();
-            String[] includes = ds.getIncludedFiles();
-            StringBuilder brandRefs = new StringBuilder();
-            if ( includes != null && includes.length > 0 )
-            {
-                File brandingDir = new File( webstartBuildDir, "branding" );
-                brandingDir.mkdirs();
-                for ( String incBran : includes )
-                {
-                    File source = new File( nbmBuildDirFile, incBran );
-                    File dest = new File( brandingDir, source.getName() );
-                    FileUtils.copyFile( source, dest );
-                    brandRefs.append( "    <jar href=\'branding/" ).append( dest.getName() ).append( "\'/>\n" );
-                }
-
-                signTask = (SignJar) antProject.createTask( "signjar" );
-                signTask.setKeystore( keystore );
-                signTask.setStorepass( keystorepassword );
-                signTask.setAlias( keystorealias );
-                if ( keystoretype != null )
-                {
-                    signTask.setStoretype( keystoretype );
-                }
-                
-                FileSet set = new FileSet();
-                set.setDir( brandingDir );
-                set.setIncludes( "*.jar" );
-                signTask.addFileset( set );
-                signTask.execute();
-            }
-
-            File modulesJnlp = new File(
-                webstartBuildDir.getAbsolutePath() + File.separator + "modules.jnlp" );
-            props.setProperty( "jnlp.branding.jars", brandRefs.toString() );
-            props.setProperty( "jnlp.resources", extSnippet );
-            filterCopy( null, /* filename is historical */"branding.jnlp", modulesJnlp, props );
-
-            getLog().info( "Verifying generated webstartable content." );
-            VerifyJNLP verifyTask = (VerifyJNLP) antProject.createTask( "verifyjnlp" );
-            FileSet verify = new FileSet();
-            verify.setFile( masterJnlp );
-            verifyTask.addConfiguredFileset( verify );
-            verifyTask.execute();
-
-
-            // create zip archive
-            if ( destinationFile.exists() )
-            {
-                destinationFile.delete();
-            }
-            ZipArchiver archiver = new ZipArchiver();
-            if ( codebase != null )
-            {
-                getLog().warn( "Defining <codebase>/${nbm.webstart.codebase} is generally unnecessary" );
-                archiver.addDirectory( webstartBuildDir );
-            }
-            else
-            {
-                archiver.addDirectory( webstartBuildDir, null, new String[] { "**/*.jnlp" } );
-                for ( final File jnlp : webstartBuildDir.listFiles() )
-                {
-                    if ( !jnlp.getName().endsWith( ".jnlp" ) )
-                    {
-                        continue;
-                    }
-                    archiver.addResource( new PlexusIoResource() {
-                        public @Override InputStream getContents() throws IOException
-                        {
-                            return new ByteArrayInputStream( FileUtils.fileRead( jnlp, "UTF-8" ).replace( localCodebase, "$$codebase" ).getBytes( "UTF-8" ) );
-                        }
-                        public @Override long getLastModified()
-                        {
-                            return jnlp.lastModified();
-                        }
-                        public @Override boolean isExisting()
-                        {
-                            return true;
-                        }
-                        public @Override long getSize()
-                        {
-                            return UNKNOWN_RESOURCE_SIZE;
-                        }
-                        public @Override URL getURL() throws IOException
-                        {
-                            return null;
-                        }
-                        public @Override String getName()
-                        {
-                            return jnlp.getAbsolutePath();
-                        }
-                        public @Override boolean isFile()
-                        {
-                            return true;
-                        }
-                        public @Override boolean isDirectory()
-                        {
-                            return false;
-                        }
-
-                        @Override
-                        public boolean isSymbolicLink()
-                        {
-                            return false;
-                        }
-                    }, jnlp.getName(), archiver.getDefaultFileMode() );
-                }
-            }
-            File jdkhome = new File( System.getProperty( "java.home" ) );
-            File servlet = new File( jdkhome, "sample/jnlp/servlet/jnlp-servlet.jar" );
-            if ( ! servlet.isFile() )
-            {
-                servlet = new File( jdkhome.getParentFile(), "sample/jnlp/servlet/jnlp-servlet.jar" );
-            }
-            if ( servlet.isFile() )
-            {
-                archiver.addFile( servlet, "WEB-INF/lib/jnlp-servlet.jar" );
-                archiver.addResource( new PlexusIoResource() {
-                    public @Override InputStream getContents() throws IOException
-                    {
-                        return new ByteArrayInputStream( ( "" +
-                            "<web-app>\n" +
-                            "    <servlet>\n" +
-                            "        <servlet-name>JnlpDownloadServlet</servlet-name>\n" +
-                            "        <servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>\n" +
-                            "    </servlet>\n" +
-                            "    <servlet-mapping>\n" +
-                            "        <servlet-name>JnlpDownloadServlet</servlet-name>\n" +
-                            "        <url-pattern>*.jnlp</url-pattern>\n" +
-                            "    </servlet-mapping>\n" +
-                            "</web-app>\n" ).getBytes() );
-                    }
-                    public @Override long getLastModified()
-                    {
-                        return UNKNOWN_MODIFICATION_DATE;
-                    }
-                    public @Override boolean isExisting()
-                    {
-                        return true;
-                    }
-                    public @Override long getSize()
-                    {
-                        return UNKNOWN_RESOURCE_SIZE;
-                    }
-                    public @Override URL getURL() throws IOException
-                    {
-                        return null;
-                    }
-                    public @Override String getName()
-                    {
-                        return "web.xml";
-                    }
-                    public @Override boolean isFile()
-                    {
-                        return true;
-                    }
-                    public @Override boolean isDirectory()
-                    {
-                        return false;
-                    }
-
-                    @Override
-                    public boolean isSymbolicLink()
-                    {
-                        return false;
-                    }
-                }, "WEB-INF/web.xml", archiver.getDefaultFileMode() );
-            }
-            archiver.setDestFile( destinationFile );
-            archiver.createArchive();
-
-            // attach standalone so that it gets installed/deployed
-            projectHelper.attachArtifact( project, "war", webstartClassifier, destinationFile );
-
-        }
-        catch ( Exception ex )
-        {
-            throw new MojoExecutionException( "Error creating webstartable binary.", ex );
-        }
-    }
-
-    /**
-     * @param standaloneBuildDir
-     * @return The name of the jnlp-launcher jarfile in the build directory
-     */
-    private File copyLauncher( File standaloneBuildDir, File builtInstallation )
-        throws IOException
-    {
-        File jnlpStarter =
-            new File( builtInstallation.getAbsolutePath() + File.separator + "harness" + File.separator + "jnlp"
-                + File.separator + "jnlp-launcher.jar" );
-        // buffer so it isn't reading a byte at a time!
-        InputStream source = null;
-        FileOutputStream outstream = null;
-        try
-        {
-            if ( !jnlpStarter.exists() )
-            {
-                source = getClass().getClassLoader().getResourceAsStream(
-                    "harness/jnlp/jnlp-launcher.jar" );
-            }
-            else
-            {
-                source = new FileInputStream( jnlpStarter );
-            }
-            File jnlpDestination = new File(
-                standaloneBuildDir.getAbsolutePath() + File.separator + "jnlp-launcher.jar" );
-
-            outstream = new FileOutputStream( jnlpDestination );
-            IOUtil.copy( source, outstream );
-            return jnlpDestination;
-        }
-        finally
-        {
-            IOUtil.close( source );
-            IOUtil.close( outstream );
-        }
-    }
-
-    private void filterCopy( File sourceFile, String resourcePath, File destinationFile, Properties filterProperties )
-        throws IOException
-    {
-        // buffer so it isn't reading a byte at a time!
-        Reader source = null;
-        Writer destination = null;
-        try
-        {
-            InputStream instream;
-            if ( sourceFile != null )
-            {
-                instream = new FileInputStream( sourceFile );
-            }
-            else
-            {
-                instream = getClass().getClassLoader().getResourceAsStream( resourcePath );
-            }
-            FileOutputStream outstream = new FileOutputStream( destinationFile );
-
-            source = new BufferedReader( new InputStreamReader( instream, "UTF-8" ) );
-            destination = new OutputStreamWriter( outstream, "UTF-8" );
-
-            // support ${token}
-            Reader reader = new InterpolationFilterReader( source, filterProperties, "${", "}" );
-
-            IOUtil.copy( reader, destination );
-        }
-        finally
-        {
-            IOUtil.close( source );
-            IOUtil.close( destination );
-        }
-    }
-
-    /**
-     * copied from MakeMasterJNLP ant task.
-     * @param files
-     * @param antProject
-     * @param masterPrefix
-     * @return
-     * @throws java.io.IOException
-     */
-    private String generateExtensions( FileSet files, Project antProject, String masterPrefix )
-        throws IOException
-    {
-        StringBuilder buff = new StringBuilder();
-        for ( String nm : files.getDirectoryScanner( antProject ).getIncludedFiles() )
-        {
-            File jar = new File( files.getDir( antProject ), nm );
-
-            if ( !jar.canRead() )
-            {
-                throw new IOException( "Cannot read file: " + jar );
-            }
-
-            JarFile theJar = new JarFile( jar );
-            Attributes attr = theJar.getManifest().getMainAttributes();
-            String codenamebase = attr.getValue( "OpenIDE-Module" );
-            if ( codenamebase == null )
-            {
-                codenamebase = attr.getValue("Bundle-SymbolicName");
-            }
-            if ( codenamebase == null )
-            {
-                throw new IOException( "Not a NetBeans Module: " + jar );
-            }
-            
-            // see http://hg.netbeans.org/main-silver/rev/87823abb86d9
-            if (codenamebase.equals("org.objectweb.asm.all")
-                    && jar.getParentFile().getName().equals("core")
-                    && jar.getParentFile().getParentFile().getName().startsWith("platform")) {
-                continue;
-            }
-            {
-                int slash = codenamebase.indexOf( '/' );
-                if ( slash >= 0 )
-                {
-                    codenamebase = codenamebase.substring( 0, slash );
-                }
-            }
-            String dashcnb = codenamebase.replace( '.', '-' );
-
-            buff.append( "    <extension name='" ).append( codenamebase ).append( "' href='" ).append( masterPrefix ).append( dashcnb ).append( ".jnlp' />\n" );
-            theJar.close();
-        }
-        return buff.toString();
-
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/NetBeansManifestUpdateMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/NetBeansManifestUpdateMojo.java
deleted file mode 100644
index 548c9c3..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/NetBeansManifestUpdateMojo.java
+++ /dev/null
@@ -1,926 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2007 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.net.URL;
-import java.text.BreakIterator;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.regex.Pattern;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.dependency.analyzer.DefaultClassAnalyzer;
-import org.apache.maven.shared.dependency.analyzer.asm.ASMDependencyAnalyzer;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.netbeans.nbm.model.Dependency;
-import org.netbeans.nbm.model.NetBeansModule;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.taskdefs.Manifest;
-import org.apache.tools.ant.taskdefs.ManifestException;
-import org.codehaus.plexus.util.IOUtil;
-
-/**
- * Goal for generating NetBeans module system specific manifest entries, part of <code>nbm</code> lifecycle/packaging.
- *
- * In order to have the generated manifest picked up by the maven-jar-plugin,
- * one shall add the following configuration snippet to maven-jar-plugin.
- * 
- * <pre>
- *  {@code
-   <plugin>
-       <groupId>org.apache.maven.plugins</groupId>
-       <artifactId>maven-jar-plugin</artifactId>
-       <version>3.0.2</version>
-       <configuration>
-           <archive>
-               <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-           </archive>
-       </configuration>
-   </plugin>
- * }
- * </pre>
- *
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- */
-@Mojo(name="manifest", 
-        defaultPhase= LifecyclePhase.PROCESS_CLASSES, 
-        requiresProject=true, 
-        threadSafe = true,
-        requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class NetBeansManifestUpdateMojo
-    extends AbstractNbmMojo
-{
-
-    /**
-     * NetBeans module assembly build directory.
-     * directory where the the NetBeans jar and nbm file get constructed.
-     */
-    @Parameter(defaultValue="${project.build.directory}/nbm", property="maven.nbm.buildDir")
-    protected File nbmBuildDir;
-
-    /**
-     * a NetBeans module descriptor containing dependency information and more
-     * @deprecated all content from the module descriptor can be defined as plugin configuration now, will be removed in 4.0 entirely
-     */
-    @Parameter(defaultValue="${basedir}/src/main/nbm/module.xml")
-    protected File descriptor;
-
-    /**
-     * maven project
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    /**
-     * The location of JavaHelp sources for the project. The documentation
-     * itself is expected to be in the directory structure based on codenamebase of the module.
-     * eg. if your codenamebase is "org.netbeans.modules.apisupport", then the actual docs
-     * files shall go to ${basedir}/src/main/javahelp/org/netbeans/modules/apisupport/docs.
-     * Obsolete as of NetBeans 7.0 with &#64;HelpSetRegistration.
-     * @since 2.7
-     */
-    @Parameter(defaultValue="${basedir}/src/main/javahelp")
-    protected File nbmJavahelpSource;
-
-    /**
-     * Path to manifest file that will be used as base and enhanced with generated content. Any entry specified in the original file
-     * will not be overwritten
-     * @since 3.0
-     */
-    @Parameter(required=true, defaultValue="${basedir}/src/main/nbm/manifest.mf")
-    private File sourceManifestFile;
-
-    /**
-     * Path to the generated MANIFEST file to use. It will be used by jar:jar plugin.
-     * @since 3.0
-     */
-    @Parameter(required=true, readonly=true, defaultValue="${project.build.outputDirectory}/META-INF/MANIFEST.MF")
-    private File targetManifestFile;
-
-    /**
-     * Verify the runtime NetBeans module dependencies and Class-Path items
-     * generated from Maven dependencies. The check is done by matching classes used
-     * in current project. Allowed values for the parameter are <code>fail</code>, <code>warn</code> and <code>skip</code>.
-     * The default is <code>fail</code> in which case the validation failure results in a failed build,
-     * in the vast majority of cases the module would fail at runtime anyway.
-     *
-     * @since 3.0
-     */
-    @Parameter(property="maven.nbm.verify", defaultValue="fail")
-    private String verifyRuntime;
-    
-    private static final String FAIL = "fail";
-    private static final String WARN = "warn";
-    private static final String SKIP = "skip";
-
-    /**
-     * A list of module's public packages. If not defined, no packages are exported as public.
-     * Allowed values are single package names
-     * or package names ending with .* which represent the package and all subpackages.
-     * <p/>
-     * Eg. "org.kleint.milos.api" designates just the one package, while "org.kleint.milos.spi.*"
-     * denotes the spi package an all it's subpackages.
-     * @since 3.0
-     */
-    @Parameter
-    private List<String> publicPackages;
-
-    /**
-     * When encountering an OSGi bundle among dependencies, the plugin will generate a direct dependency
-     * on the bundle and will not include the bundle's jar into the nbm. Will only work with NetBeans 6.9+ runtime.
-     * Therefore it is off by default.
-     * WARNING: Additionally existing applications/modules need to check modules wrapping
-     * external libraries for library jars that are also OSGi bundles. Such modules will no longer include the OSGi bundles
-     * as part of the module but will include a modular dependency on the bundle. Modules depending on these old wrappers
-     * shall depend directly on the bundle, eventually rendering the old library wrapper module obsolete.
-     *
-     * @since 3.2
-     */
-    @Parameter(defaultValue="false")
-    private boolean useOSGiDependencies;
-    
-    /**
-     * codename base of the module, uniquely identifying the module within the NetBeans runtime. usually the package name equivalent.
-     * Can include the major release version.
-     * See <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#how-manifest"> NetBeans Module system docs</a>
-     * @since 3.8
-     */
-    @Parameter(defaultValue="${project.groupId}.${project.artifactId}")
-    private String codeNameBase;
-    
-    /**
-     * List of explicit module dependency declarations overriding the default specification dependency. Useful when depending on a range of major versions,
-     * depending on implementation version etc.
-     * <p>The format is:
-     * <pre>
-     * &lt;dependency&gt;
-     *    &lt;id&gt;groupId:artifactId&lt;/id&gt;
-     *    &lt;type&gt;spec|impl|loose&lt;/type&gt;
-     *    &lt;explicitValue&gt;the entire dependency token&lt;/explicitValue&gt;
-     * &lt;/dependency&gt;
-     * </pre>
-     * </p>
-     * <p>
-     * where <code>id</code> is composed of grouId and artifactId of a dependency defined in effective pom, separated by double colon. This is mandatory.</p>
-     * <p>
-     * Then there are 2 exclusively optional fields <code>type</code> and <code>explicitValue</code>, if both are defined <code>explicitValue</code> gets applied.
-     * </p>
-     * <p><code>type</code> values: <code>spec</code> means specification dependency.That's the default. 
-     * <code>impl</code> means implementation dependency, only the exact version match will satisfy the constraint. 
-     * <code>loose</code> means loose dependency, no requirement on version, the module just has to be present. Not very common option.
-     * 
-     * @since 3.8
-     */
-    @Parameter
-    private Dependency[] moduleDependencies;
-    
-/**
-     * Deployment type of the module, allowed values are <code>normal</code>,<code>eager</code>,<code>autoload</code>,
-     * <code>disabled</code>.
-     * <p>
-     * <code>autoload</code> - Such a module is
-     * automatically enabled when some other module requires it and
-     * automatically disabled otherwise.</p>
-     *                     <p><code>eager</code> - This module type gets
-     * automatically enabled when all it's dependencies are
-     * satisfied. Disabled otherwise.</p>
-     *                     <p><code>normal</code> - This is the default
-     * value. This kind of module is enabled/disabled manually by
-     * the user. It installs enabled.</p>
-     *                     <p><code>disabled</code> - This kind of module is enabled/disabled manually by
-     * the user. It installs disabled. Since 3.11</p>
-     *
-     * For details, see <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#enablement">Netbeans Module system docs</a>
-     * 
-     * Since 3.14, for autoload and eager modules, we automatically set AutoUpdate-Show-In-Client manifest entry to false, if not defined already otherwise in the manifest.
-     * See issue <a href="http://jira.codehaus.org/browse/MNBMODULE-194">MNBMODULE-194</a>
-     * 
-     * @since 3.8 (3.14 in manifest goal)
-     */ 
-    @Parameter(defaultValue="normal")
-    protected String moduleType;    
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-
-    /**
-     * The artifact repository to use.
-
-     */
-    @Parameter(required=true, readonly=true, defaultValue="${localRepository}")
-    private ArtifactRepository localRepository;
-
-    /**
-     * The artifact factory to use.
-     */
-    @Component
-    private ArtifactFactory artifactFactory;
-
-    /**
-     * The artifact metadata source to use.
-     */
-    @Component
-    private ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * The artifact collector to use.
-     */
-    @Component
-    private ArtifactCollector artifactCollector;
-
-    /**
-     * The dependency tree builder to use.
-     */
-    @Component( hint = "default" )
-    private DependencyGraphBuilder dependencyGraphBuilder;
-
-// end of component params custom code folding
-// </editor-fold> 
-
-    /**
-     * execute plugin
-     * @throws MojoExecutionException if an unexpected problem occurs
-     * @throws MojoFailureException if an expected problem occurs
-     */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-
-    {
-        //need to do this to chekc for javahelp on CP.
-        super.registerNbmAntTasks();
-        NetBeansModule module;
-        if ( descriptor != null && descriptor.exists() )
-        {
-            module = readModuleDescriptor( descriptor );
-            getLog().warn( "descriptor parameter is deprecated, use equivalent mojo parameters instead.");
-        }
-        else
-        {
-            module = createDefaultDescriptor( project, false );
-        }
-        
-        String mtype = moduleType;
-        //same moduleType related code in CreateNetBeansFileStructure.java
-        if ("normal".equals(mtype) && module.getModuleType() != null) {
-            mtype = module.getModuleType();
-            getLog().warn( "moduleType in module descriptor is deprecated, use the plugin's parameter moduleType");
-        }
-        if (!"normal".equals(mtype) && !"autoload".equals(mtype) && !"eager".equals(mtype) && !"disabled".equals(mtype)) {
-            getLog().error( "Only 'normal,autoload,eager,disabled' are allowed values in the moduleType parameter");
-        }
-        boolean autoload = "autoload".equals( mtype );
-        boolean eager = "eager".equals( mtype );
-        
-
-        String moduleName = codeNameBase;
-        if (module.getCodeNameBase() != null) {
-            moduleName = module.getCodeNameBase();
-            getLog().warn( "codeNameBase in module descriptor is deprecated, use the plugin's parameter codeNameBase");
-        }
-        moduleName = moduleName.replaceAll( "-", "." );
-//<!-- if a NetBeans specific manifest is defined, examine this one, otherwise the already included one.
-// ignoring the case when some of the NetBeans attributes are already defined in the jar and more is included.
-        File specialManifest = sourceManifestFile;
-        File nbmManifest = ( module.getManifest() != null ? new File(
-            project.getBasedir(), module.getManifest() ) : null );
-        if ( nbmManifest != null && nbmManifest.exists() )
-        {
-            //deprecated, but if actually defined, will use it.
-            specialManifest = nbmManifest;
-        }
-        ExamineManifest examinator = new ExamineManifest( getLog() );
-        if ( specialManifest != null && specialManifest.exists() )
-        {
-            examinator.setManifestFile( specialManifest );
-            examinator.checkFile();
-        }
-        else
-        {
-//            examinator.setJarFile( jarFile );
-        }
-
-        getLog().info( "NBM Plugin generates manifest" );
-
-        Manifest manifest = null;
-        if ( specialManifest != null && specialManifest.exists() )
-        {
-            Reader reader = null;
-            try
-            {
-                reader = new InputStreamReader( new FileInputStream( specialManifest ) );
-                manifest = new Manifest( reader );
-            }
-            catch ( IOException exc )
-            {
-                manifest = new Manifest();
-                getLog().warn( "Error reading manifest at " + specialManifest, exc );
-            }
-            catch ( ManifestException ex )
-            {
-                getLog().warn( "Error reading manifest at " + specialManifest, ex );
-                manifest = new Manifest();
-            }
-            finally
-            {
-                IOUtil.close( reader );
-            }
-        }
-        else
-        {
-            manifest = new Manifest();
-        }
-        Date date = new Date();
-        String specVersion = AdaptNbVersion.adaptVersion( project.getVersion(),
-            AdaptNbVersion.TYPE_SPECIFICATION, date );
-        String implVersion = AdaptNbVersion.adaptVersion( project.getVersion(),
-            AdaptNbVersion.TYPE_IMPLEMENTATION, date );
-        Manifest.Section mainSection = manifest.getMainSection();
-        conditionallyAddAttribute( mainSection,
-            "OpenIDE-Module-Specification-Version", specVersion );
-        conditionallyAddAttribute( mainSection,
-            "OpenIDE-Module-Implementation-Version", implVersion );
-        if (autoload || eager) { //MNBMODULE-194
-            conditionallyAddAttribute( mainSection, "AutoUpdate-Show-In-Client", "false");
-        }
-        final String timestamp = createTimestamp( date );
-        conditionallyAddAttribute( mainSection, "OpenIDE-Module-Build-Version",
-            timestamp );
-        String projectCNB = conditionallyAddAttribute( mainSection, "OpenIDE-Module", moduleName );
-        String packagesValue;
-        if ( publicPackages != null && publicPackages.size() > 0 )
-        {
-            StringBuilder sb = new StringBuilder();
-            for ( String pub : publicPackages )
-            {
-                if (pub == null) { //#MNBMODULE-237
-                    continue;
-                }
-                if ( pub.endsWith( ".**" ) )
-                {
-                    // well, just sort of wrong value but accept
-                    sb.append( pub );
-                }
-                else if ( pub.endsWith( ".*" ) )
-                {
-                    //multipackage value
-                    sb.append( pub ).append( "*" );
-                }
-                else
-                {
-                    sb.append( pub ).append( ".*" );
-                }
-                sb.append( ", " );
-            }
-            if (sb.length() > 1) { //if only item is null, we have empty builder
-                sb.setLength( sb.length() - 2 ); //cut the last 2 ", " characters
-                packagesValue = sb.toString();
-            } else {
-                // no packages available
-                packagesValue = "-";
-            }
-        }
-        else
-        {
-            // no packages available
-            packagesValue = "-";
-        }
-        conditionallyAddAttribute( mainSection, "OpenIDE-Module-Public-Packages", packagesValue );
-
-        //See http://www.netbeans.org/download/dev/javadoc/org-openide-modules/apichanges.html#split-of-openide-jar
-        conditionallyAddAttribute( mainSection, "OpenIDE-Module-Requires",
-            "org.openide.modules.ModuleFormat1" );
-//        conditionallyAddAttribute(mainSection, "OpenIDE-Module-IDE-Dependencies", "IDE/1 > 3.40");
-        // localization items
-        if ( !examinator.isLocalized() )
-        {
-            conditionallyAddAttribute( mainSection,
-                "OpenIDE-Module-Display-Category", project.getGroupId() );
-            conditionallyAddAttribute( mainSection, "OpenIDE-Module-Name",
-                project.getName() );
-            conditionallyAddAttribute( mainSection,
-                "OpenIDE-Module-Short-Description", shorten( project.getDescription() ) );
-            conditionallyAddAttribute( mainSection,
-                "OpenIDE-Module-Long-Description", project.getDescription() );
-        }
-        getLog().debug( "module =" + module );
-        
-            DependencyNode treeroot = createDependencyTree( project, dependencyGraphBuilder, "compile" );
-            Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-            @SuppressWarnings( "unchecked" )
-            List<Artifact> libArtifacts = getLibraryArtifacts( treeroot, module, project.getRuntimeArtifacts(),
-                examinerCache, getLog(), useOSGiDependencies );
-            List<ModuleWrapper> moduleArtifacts = getModuleDependencyArtifacts( treeroot, module, moduleDependencies, project, examinerCache,
-                libArtifacts, getLog(), useOSGiDependencies );
-            StringBuilder classPath = new StringBuilder();
-            StringBuilder mavenClassPath = new StringBuilder();
-            String dependencies = "";
-            String depSeparator = " ";
-
-            for ( Artifact a : libArtifacts )
-            {
-                if (classPath.length() > 0)
-                {
-                    classPath.append(' ');
-                }
-                classPath.append(artifactToClassPathEntry( a, codeNameBase ));
-                if ( mavenClassPath.length() > 0 )
-                {
-                    mavenClassPath.append( ' ' );
-                }
-                mavenClassPath.append( a.getGroupId() ).append( ':' ).append( a.getArtifactId() ).append( ':' ).append( a.getBaseVersion() );
-                if (a.getClassifier() != null) 
-                {
-                    mavenClassPath.append(":").append(a.getClassifier());
-            }
-            }
-
-            for ( ModuleWrapper wr : moduleArtifacts )
-            {
-                if ( wr.transitive )
-                {
-                    continue;
-                }
-                Dependency dep = wr.dependency;
-                Artifact artifact = wr.artifact;
-                ExamineManifest depExaminator = examinerCache.get( artifact );
-                String type = dep.getType();
-                String depToken = dep.getExplicitValue();
-                if ( depToken == null )
-                {
-                    if ( "loose".equals( type ) )
-                    {
-                        depToken = depExaminator.getModuleWithRelease();
-                    }
-                    else if ( "spec".equals( type ) )
-                    {
-                        depToken =
-                            depExaminator.getModuleWithRelease()
-                                + " > "
-                                + ( depExaminator.isNetBeansModule() ? depExaminator.getSpecVersion()
-                                                : AdaptNbVersion.adaptVersion( depExaminator.getSpecVersion(),
-                                                                               AdaptNbVersion.TYPE_SPECIFICATION, date ) );
-                    }
-                    else if ( "impl".equals( type ) )
-                    {
-                        depToken =
-                            depExaminator.getModuleWithRelease()
-                                + " = "
-                                + ( depExaminator.isNetBeansModule() ? depExaminator.getImplVersion()
-                                                : AdaptNbVersion.adaptVersion( depExaminator.getImplVersion(),
-                                                                               AdaptNbVersion.TYPE_IMPLEMENTATION, date ) );
-                    }
-                    else
-                    {
-                        throw new MojoExecutionException(
-                            "Wrong type of NetBeans dependency: " + type + " Allowed values are: loose, spec, impl." );
-                    }
-                }
-                if ( depToken == null )
-                {
-                    //TODO report
-                    getLog().error(
-                        "Cannot properly resolve the NetBeans dependency for " + dep.getId() );
-                }
-                else
-                {
-                    dependencies = dependencies + depSeparator + depToken;
-                    depSeparator = ", ";
-                }
-            }
-            if ( !verifyRuntime.equalsIgnoreCase( SKIP ) )
-            {
-                try
-                {
-                    checkModuleClassPath( treeroot, libArtifacts, examinerCache, moduleArtifacts, projectCNB );
-                }
-                catch ( IOException ex )
-                {
-                    throw new MojoExecutionException( "Error while checking runtime dependencies", ex );
-                }
-            }
-
-            if ( nbmJavahelpSource.exists() )
-            {
-                String moduleJarName = stripVersionFromCodebaseName( moduleName ).replace( ".", "-" );
-                classPath.append( " docs/").append( moduleJarName ).append( ".jar" );
-            }
-
-            if ( classPath.length() > 0 )
-            {
-                conditionallyAddAttribute( mainSection, "X-Class-Path", classPath.toString().trim() );
-            }
-            if ( mavenClassPath.length() > 0)
-            {
-                conditionallyAddAttribute( mainSection, "Maven-Class-Path", mavenClassPath.toString() );
-            }
-            if ( dependencies.length() > 0 )
-            {
-                conditionallyAddAttribute( mainSection, "OpenIDE-Module-Module-Dependencies", dependencies );
-            }
-//            if ( librList.size() > 0 )
-//            {
-//                String list = "";
-//                for ( int i = 0; i < librList.size(); i++ )
-//                {
-//                    list = list + " " + librList.get( i );
-//                }
-//                getLog().warn(
-//                        "Some libraries could not be found in the dependency chain: " + list );
-//            }
-        PrintWriter writer = null;
-        try
-        {
-            if ( !targetManifestFile.exists() )
-            {
-                targetManifestFile.getParentFile().mkdirs();
-                targetManifestFile.createNewFile();
-            }
-            writer = new PrintWriter( targetManifestFile, "UTF-8" ); //TODO really UTF-8??
-            manifest.write( writer );
-        }
-        catch ( IOException ex )
-        {
-            throw new MojoExecutionException( ex.getMessage(), ex );
-        }
-        finally
-        {
-            IOUtil.close( writer );
-        }
-    }
-
-    //MNBMODULE-137
-    static String artifactToClassPathEntry( Artifact a, String codenamebase )
-    {
-        return "ext/" + codenamebase + "/" + a.getGroupId().replace( '.', '-') + "/" + a.getArtifactId() + ( a.getClassifier() != null ? "-" + a.getClassifier() : "" ) + "." + a.getArtifactHandler().getExtension();
-    }
-
-    /**
-     * Create a timestamp for <code>OpenIDE-Module-Build-Version</code> manifest
-     * entry.
-     *
-     * It's created from the current time and formatted using a UTC timezone
-     * explicitly which makes created timestamp timezone-independent.
-     *
-     * @return timestamp represented as <code>201012292045</code>
-     */
-    private static String createTimestamp( Date date )
-    {
-        final SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyyMMddHHmm" );
-        dateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
-        final String timestamp = dateFormat.format( date );
-        return timestamp;
-    }
-
-    static String stripVersionFromCodebaseName( String cnb )
-    {
-        // it can happen the moduleName is in format org.milos/1
-        String base = cnb;
-        int index = base.indexOf( '/' );
-        if ( index > -1 )
-        {
-            base = base.substring( 0, index ).trim();
-        }
-        return base;
-    }
-
-    String conditionallyAddAttribute( Manifest.Section section, String key, String value )
-    {
-        Manifest.Attribute attr = section.getAttribute( key );
-        if ( attr == null )
-        {
-            attr = new Manifest.Attribute();
-            attr.setName( key );
-            attr.setValue( value != null ? value.replaceAll("\\s+", " ").trim() : "<undefined>" );
-            try
-            {
-                section.addConfiguredAttribute( attr );
-            }
-            catch ( ManifestException ex )
-            {
-                getLog().error( "Cannot update manifest (key=" + key + ")" );
-                ex.printStackTrace();
-            }
-        }
-        return attr.getValue();
-    }
-
-    /**
-     * Pick out the first sentence of a paragraph.
-     * @param paragraph some text (may be null)
-     * @return the first sentence (may be null)
-     */
-    static String shorten( String paragraph )
-    {
-        if ( paragraph == null || paragraph.length() == 0 )
-        {
-            return null;
-        }
-        BreakIterator breaker = BreakIterator.getSentenceInstance();
-        breaker.setText( paragraph );
-        return paragraph.substring( 0, breaker.following( 0 ) ).trim();
-    }
-
-//----------------------------------------------------------------------------------
-// classpat checking related.
-//----------------------------------------------------------------------------------
-    private void checkModuleClassPath( DependencyNode treeroot,
-        List<Artifact> libArtifacts,
-        Map<Artifact, ExamineManifest> examinerCache, List<ModuleWrapper> moduleArtifacts, String projectCodeNameBase )
-        throws IOException, MojoExecutionException, MojoFailureException
-    {
-        Set<String> deps = buildProjectDependencyClasses( project, libArtifacts );
-        deps.retainAll( allProjectClasses( project ) );
-
-        Set<String> own = projectModuleOwnClasses( project, libArtifacts );
-        deps.removeAll( own );
-        CollectModuleLibrariesNodeVisitor visitor = new CollectModuleLibrariesNodeVisitor(
-            project.getRuntimeArtifacts(), examinerCache, getLog(), treeroot, useOSGiDependencies );
-        treeroot.accept( visitor );
-        Map<String, List<Artifact>> modules = visitor.getDeclaredArtifacts();
-        Map<Artifact, Set<String>> moduleAllClasses = new HashMap<Artifact, Set<String>>();
-
-        for ( ModuleWrapper wr : moduleArtifacts )
-        {
-            if ( modules.containsKey( wr.artifact.getDependencyConflictId() ) )
-            {
-                ExamineManifest man = examinerCache.get( wr.artifact );
-                List<Artifact> arts = modules.get( wr.artifact.getDependencyConflictId() );
-                Set<String>[] classes = visibleModuleClasses( arts, man, wr.dependency, projectCodeNameBase, false );
-                deps.removeAll( classes[0] );
-                moduleAllClasses.put( wr.artifact, classes[1] );
-            }
-        }
-
-        //now we have the classes that are not in public packages of declared modules,
-        //but are being used
-        if ( !deps.isEmpty() )
-        {
-            Map<String, List<Artifact>> transmodules = visitor.getTransitiveArtifacts();
-            for ( ModuleWrapper wr : moduleArtifacts )
-            {
-                if ( transmodules.containsKey( wr.artifact.getDependencyConflictId() ) )
-                {
-                    ExamineManifest man = examinerCache.get( wr.artifact );
-                    List<Artifact> arts = transmodules.get( wr.artifact.getDependencyConflictId() );
-                    Set<String>[] classes = visibleModuleClasses( arts, man, wr.dependency, projectCodeNameBase, true );
-                    classes[0].retainAll( deps );
-                    if ( classes[0].size() > 0 )
-                    {
-                        String module = wr.osgi ? "OSGi bundle" : "module";
-                        getLog().error(
-                            "Project uses classes from transitive " + module + " " + wr.artifact.getId() + " which will not be accessible at runtime." );
-                        getLog().info( "    To fix the problem, add this module as direct dependency. For OSGi bundles that are supposed to be wrapped in NetBeans modules, use the useOSGiDependencies=false parameter");
-                        deps.removeAll( classes[0] );
-                    }
-                    classes[1].retainAll( deps );
-                    if ( classes[1].size() > 0 )
-                    {
-                        getLog().info( "Private classes referenced in transitive module: " + Arrays.toString( classes[1].toArray() ) );
-                        getLog().error(
-                            "Project depends on packages not accessible at runtime in transitive module " + wr.artifact.getId() + " which will not be accessible at runtime." );
-                        deps.removeAll( classes[1] );
-                    }
-                }
-            }
-            for ( Map.Entry<Artifact, Set<String>> e : moduleAllClasses.entrySet() )
-            {
-                List<String> strs = new ArrayList<String>( deps );
-                if ( deps.removeAll( e.getValue() ) )
-                {
-                    strs.retainAll( e.getValue() );
-                    getLog().info( "Private classes referenced in module: " + Arrays.toString( strs.toArray() ) );
-                    getLog().error( "Project depends on packages not accessible at runtime in module " + e.getKey().getId() );
-                }
-            }
-            if ( verifyRuntime.equalsIgnoreCase( FAIL ) )
-            {
-                if ( !deps.isEmpty() )
-                {
-                    throw new MojoFailureException( "Uncategorized problems with NetBeans dependency verification (maybe MNBMODULE-102 or wrong maven dependency metadata). Supposedly external classes are used in the project's binaries but the classes are not found on classpath. Class usages: " + deps );
-                }
-                else
-                {
-                    throw new MojoFailureException( "See above for failures in runtime NetBeans dependencies verification." );
-                }
-            }
-        }
-    }
-
-    /**
-     * The current projects's dependencies, includes classes used in teh module itself
-     * and the classpath libraries as well.
-     * @param project
-     * @param libraries
-     * @return
-     * @throws java.io.IOException
-     */
-    private Set<String> buildProjectDependencyClasses( MavenProject project, List<Artifact> libraries )
-        throws IOException
-    {
-        Set<String> dependencyClasses = new HashSet<String>();
-
-        String outputDirectory = project.getBuild().getOutputDirectory();
-        dependencyClasses.addAll( buildDependencyClasses( outputDirectory ) );
-
-        for ( Artifact lib : libraries )
-        {
-            dependencyClasses.addAll( buildDependencyClasses( lib.getFile().getAbsolutePath() ) );
-        }
-        return dependencyClasses;
-    }
-
-    @SuppressWarnings( "unchecked" )
-    private Set<String> projectModuleOwnClasses( MavenProject project, List<Artifact> libraries )
-        throws IOException
-    {
-        Set<String> projectClasses = new HashSet<String>();
-        DefaultClassAnalyzer analyzer = new DefaultClassAnalyzer();
-
-        String outputDirectory = project.getBuild().getOutputDirectory();
-        URL fl = new File( outputDirectory ).toURI().toURL();
-        projectClasses.addAll( analyzer.analyze( fl ) );
-
-        for ( Artifact lib : libraries )
-        {
-            URL url = lib.getFile().toURI().toURL();
-            projectClasses.addAll( analyzer.analyze( url ) );
-        }
-
-        return projectClasses;
-    }
-
-    /**
-     * complete list of classes on project runtime classpath (excluding
-     * jdk bit)
-     * @param project
-     * @return
-     * @throws java.io.IOException
-     */
-    @SuppressWarnings( "unchecked" )
-    private Set<String> allProjectClasses( MavenProject project )
-        throws IOException
-    {
-        Set<String> projectClasses = new HashSet<String>();
-        DefaultClassAnalyzer analyzer = new DefaultClassAnalyzer();
-
-        String outputDirectory = project.getBuild().getOutputDirectory();
-        URL fl = new File( outputDirectory ).toURI().toURL();
-        projectClasses.addAll( analyzer.analyze( fl ) );
-
-        List<Artifact> libs = project.getRuntimeArtifacts();
-
-        for ( Artifact lib : libs )
-        {
-            URL url = lib.getFile().toURI().toURL();
-            projectClasses.addAll( analyzer.analyze( url ) );
-        }
-
-        return projectClasses;
-    }
-
-    private Set<String>[] visibleModuleClasses( List<Artifact> moduleLibraries,
-        ExamineManifest manifest, Dependency dep, String projectCodeNameBase,
-        boolean transitive)
-        throws IOException, MojoFailureException
-    {
-        Set<String> moduleClasses = new HashSet<String>();
-        Set<String> visibleModuleClasses = new HashSet<String>();
-        DefaultClassAnalyzer analyzer = new DefaultClassAnalyzer();
-        String type = dep.getType();
-        if ( dep.getExplicitValue() != null )
-        {
-            if ( dep.getExplicitValue().contains( "=" ) )
-            {
-                type = "impl";
-            }
-        }
-        if ( type == null || "loose".equals( type ) )
-        {
-            type = "spec";
-        }
-
-        for ( Artifact lib : moduleLibraries )
-        {
-            URL url = lib.getFile().toURI().toURL();
-            moduleClasses.addAll( analyzer.analyze( url ) );
-        }
-
-        if ( "spec".equals( type ) )
-        {
-            String cnb = stripVersionFromCodebaseName( projectCodeNameBase );
-            if ( !transitive && manifest.hasFriendPackages() && !manifest.getFriends().contains( cnb ) )
-            {
-                String message = "Module has friend dependency on " + manifest.getModule() + " but is not listed as a friend.";
-                if ( verifyRuntime.equalsIgnoreCase( FAIL ) )
-                {
-                    throw new MojoFailureException( message );
-                }
-                else
-                {
-                    getLog().warn( message );
-                }
-            }
-            List<Pattern> compiled = createCompiledPatternList( manifest.getPackages() );
-            if ( useOSGiDependencies && manifest.isOsgiBundle() )
-            {
-                // TODO how to extract the public packages in osgi bundles easily..
-                compiled = Collections.singletonList( Pattern.compile( "(.+)" ) );
-            }
-            for ( String clazz : moduleClasses )
-            {
-                for ( Pattern patt : compiled )
-                {
-                    if ( patt.matcher( clazz ).matches() ) 
-                    {
-                        visibleModuleClasses.add( clazz );
-                        break;
-                    }
-                }
-            }
-
-        }
-        else if ( "impl".equals( type ) )
-        {
-            visibleModuleClasses.addAll( moduleClasses );
-        }
-        else
-        {
-            //HUH?
-            throw new MojoFailureException( "Wrong type of module dependency " + type );
-        }
-
-        return new Set[]
-            {
-                visibleModuleClasses,
-                moduleClasses
-            };
-    }
-
-    static List<Pattern> createCompiledPatternList( List<String> packages )
-    {
-        List<Pattern> toRet = new ArrayList<Pattern>();
-        for ( String token : packages )
-        {
-            if ( token.endsWith( ".**" ) )
-            {
-                String patt = "^" + Pattern.quote( token.substring( 0, token.length() - 2 ) ) + "(.+)";
-                toRet.add( 0, Pattern.compile( patt ) );
-            }
-            else
-            {
-                String patt = "^" + Pattern.quote( token.substring( 0, token.length() - 1 ) ) + "([^\\.]+)";
-                toRet.add( Pattern.compile( patt ) );
-            }
-        }
-        return toRet;
-    }
-
-    @SuppressWarnings( "unchecked" )
-    private Set<String> buildDependencyClasses( String path )
-        throws IOException
-    {
-        URL url = new File( path ).toURI().toURL();
-        ASMDependencyAnalyzer dependencyAnalyzer = new ASMDependencyAnalyzer();
-        return dependencyAnalyzer.analyze( url );
-    }
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunNetBeansMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunNetBeansMojo.java
deleted file mode 100644
index 08036dc..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunNetBeansMojo.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2007 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.Os;
-import org.codehaus.plexus.util.cli.CommandLineUtils;
-import org.codehaus.plexus.util.cli.Commandline;
-import org.codehaus.plexus.util.cli.StreamConsumer;
-
-/**
- * Run NetBeans IDE with additional custom module clusters, 
- * to be used in conjunction with nbm:cluster.
- * Semi-deprecated; used only for standalone modules and "suites".
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-@Mojo(name="run-ide", aggregator=true, requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class RunNetBeansMojo
-        extends AbstractMojo
-{
-
-    /**
-     * directory where the module(s)' NetBeans cluster(s) are located.
-     * is related to nbm:cluster goal.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}/netbeans_clusters")
-    protected File clusterBuildDir;
-    /**
-     * directory where the the NetBeans platform/IDE installation is,
-     * denotes the root directory of NetBeans installation.
-     */
-    @Parameter(required=true, property="netbeans.installation")
-    protected File netbeansInstallation;
-    /**
-     * NetBeans user directory for the executed instance.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}/userdir", property="netbeans.userdir")
-    protected File netbeansUserdir;
-    /**
-     * additional command line arguments. 
-     */
-    @Parameter(property="netbeans.run.params")
-    protected String additionalArguments;
-    
-    /**
-     * Attach a debugger to the application JVM. If set to "true", the process will suspend and wait for a debugger to attach
-     * on port 5005. If set to some other string, that string will be appended to the <code>additionalArguments</code>, allowing you to configure
-     * arbitrary debug-ability options (without overwriting the other options specified through the <code>additionalArguments</code>
-     * parameter).
-     * @since 3.11.1
-     */
-    @Parameter(property="netbeans.run.params.debug")
-    protected String debugAdditionalArguments;    
-
-    /**
-     * 
-     * @throws MojoExecutionException if an unexpected problem occurs
-     * @throws MojoFailureException if an expected problem occurs
-     */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        netbeansUserdir.mkdirs();
-
-        List<File> clusters = new ArrayList<File>();
-        if ( !clusterBuildDir.exists() || clusterBuildDir.listFiles() == null )
-        {
-            throw new MojoExecutionException(
-                                              "No clusters to include in execution found. Please run the nbm:cluster or nbm:cluster-app goals before this one." );
-        }
-        File[] fls = clusterBuildDir.listFiles();
-        for ( int i = 0; i < fls.length; i++ )
-        {
-            if ( fls[i].isDirectory() )
-            {
-                clusters.add( fls[i] );
-            }
-        }
-        StringBuilder buff = new StringBuilder();
-        for ( File cluster : clusters )
-        {
-            buff.append( cluster.getAbsolutePath() );
-            buff.append( ":" );
-        }
-        if ( buff.lastIndexOf( ":" ) > -1 )
-        {
-            buff.deleteCharAt( buff.lastIndexOf( ":" ) );
-        }
-        //http://www.netbeans.org/issues/show_bug.cgi?id=174819
-        StringReader sr =
-            new StringReader( "netbeans_extraclusters=\"" + buff.toString() + "\"\n" + "extraclusters=\""
-                + buff.toString() + "\"\n" + "extra_clusters=\"" + buff.toString() + "\"" );
-
-        //now check what the exec names are to figure the right XXX.clusters name
-        File binDir = new File( netbeansInstallation, "bin" );
-        File[] execs = binDir.listFiles();
-        String clust = null;
-        if ( execs != null )
-        {
-            for ( File f : execs )
-            {
-                String name = f.getName();
-                if ( name.contains( "_w.exe" ) )
-                {
-                    continue;
-                }
-                name = name.replaceFirst( "(64)?([.]exe)?$", "" );
-                if ( !name.contains( "." ) )
-                {
-                    if ( clust == null )
-                    {
-                        clust = name;
-                    }
-                    else
-                    {
-                        if ( !clust.equals( name ) )
-                        {
-                            getLog().debug( "When examining executable names, found clashing results " + f.getName()
-                                                + " " + clust );
-                        }
-                    }
-                }
-            }
-        }
-        if ( clust == null )
-        {
-            clust = "netbeans";
-        }
-
-        // write XXX.conf file with cluster information...
-        File etc = new File( netbeansUserdir, "etc" );
-        etc.mkdirs();
-        File confFile = new File( etc, clust + ".conf" );
-        FileOutputStream conf = null;
-        try
-        {
-            conf = new FileOutputStream( confFile );
-            IOUtil.copy( sr, conf );
-        }
-        catch ( IOException ex )
-        {
-            throw new MojoExecutionException( "Error writing " + confFile, ex );
-        }
-        finally
-        {
-            IOUtil.close( conf );
-        }
-
-        boolean windows = Os.isFamily( "windows" );
-        Commandline cmdLine = new Commandline();
-        File exec;
-        if ( windows )
-        {
-            exec = new File( netbeansInstallation, "bin\\nb.exe" );
-            if ( !exec.exists() )
-            {
-                // in 6.7 and onward, there's no nb.exe file.
-                exec = new File( netbeansInstallation, "bin\\" + clust + ".exe" );
-                String jdkHome = System.getenv( "JAVA_HOME" );
-                if ( jdkHome != null )
-                {
-                    if ( new File( jdkHome, "jre\\lib\\amd64\\jvm.cfg" ).exists() )
-                    {
-                        File exec64 = new File( netbeansInstallation, "bin\\" + clust + "64.exe" );
-                        if ( exec64.isFile() )
-                        {
-                            exec = exec64;
-                        }
-                    }
-                }
-                cmdLine.addArguments( new String[] { "--console", "suppress" } );
-            }
-        }
-        else
-        {
-            exec = new File( netbeansInstallation, "bin/" + clust );
-        }
-        cmdLine.setExecutable( exec.getAbsolutePath() );
-
-        try
-        {
-            String[] args = new String[]
-            {
-                //TODO --jdkhome
-                "--userdir",
-                netbeansUserdir.getAbsolutePath(),
-                "-J-Dnetbeans.logger.console=true",
-                "-J-ea",
-            };
-            cmdLine.addArguments( args );
-            getLog().info( "Additional arguments=" + additionalArguments );
-            cmdLine.addArguments( CommandLineUtils.translateCommandline( additionalArguments ) );
-            cmdLine.addArguments( CommandLineUtils.translateCommandline( getDebugAdditionalArguments() ) );
-            for ( int i = 0; i < cmdLine.getArguments().length; i++ )
-            {
-                getLog().info( "      " + cmdLine.getArguments()[i] );
-            }
-            getLog().info( "Executing: " + cmdLine.toString() );
-            StreamConsumer out = new StreamConsumer()
-            {
-
-                public void consumeLine( String line )
-                {
-                    getLog().info( line );
-                }
-            };
-            CommandLineUtils.executeCommandLine( cmdLine, out, out );
-
-        }
-        catch ( Exception e )
-        {
-            throw new MojoExecutionException( "Failed executing NetBeans", e );
-        }
-    }
-    
-    private String getDebugAdditionalArguments()
-    {
-       if ( "true".equals( debugAdditionalArguments ) )
-        {
-            return "-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005";
-        }
-        return debugAdditionalArguments;
-    }    
-}
diff --git a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunPlatformAppMojo.java b/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunPlatformAppMojo.java
deleted file mode 100644
index c70b4e4..0000000
--- a/nbm-maven-plugin/src/main/java/org/netbeans/nbm/RunPlatformAppMojo.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ==========================================================================
- * Copyright 2007 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm;
-
-import java.io.File;
-import java.util.List;
-import java.util.ArrayList;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.Os;
-import org.codehaus.plexus.util.cli.CommandLineUtils;
-import org.codehaus.plexus.util.cli.Commandline;
-import org.codehaus.plexus.util.cli.StreamConsumer;
-
-/**
- * Run a branded application on top of NetBeans Platform. To be used with projects
- * with nbm-application packaging only and the project needs to be built first.
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-@Mojo(name="run-platform", requiresDependencyResolution= ResolutionScope.RUNTIME )
-public class RunPlatformAppMojo
-        extends AbstractMojo
-{
-
-    /**
-     * The branding token for the application based on NetBeans platform.
-     */
-    @Parameter(required=true, property="netbeans.branding.token")
-    protected String brandingToken;
-    /**
-     * output directory where the the NetBeans application is created.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}")
-    private File outputDirectory;
-
-    /**
-     * NetBeans user directory for the executed instance.
-     */
-    @Parameter(required=true, defaultValue="${project.build.directory}/userdir", property="netbeans.userdir")
-    protected File netbeansUserdir;
-    /**
-     * additional command line arguments passed to the application.
-     * can be used to debug the IDE.
-     */
-    @Parameter(property="netbeans.run.params")
-    protected String additionalArguments;
-    
-    /**
-     * Attach a debugger to the application JVM. If set to "true", the process will suspend and wait for a debugger to attach
-     * on port 5005. If set to some other string, that string will be appended to the <code>additionalArguments</code>, allowing you to configure
-     * arbitrary debug-ability options (without overwriting the other options specified through the <code>additionalArguments</code>
-     * parameter).
-     * @since 3.11
-     */
-    @Parameter(property="netbeans.run.params.debug")
-    protected String debugAdditionalArguments;
-    
-    /**
-     * The Maven Project.
-     *
-     */
-    @Parameter(required=true, readonly=true, property="project")
-    private MavenProject project;
-
-    /**
-     *
-     * @throws MojoExecutionException if an unexpected problem occurs
-     * @throws MojoFailureException if an expected problem occurs
-     */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( !"nbm-application".equals( project.getPackaging() ) )
-        {
-            throw new MojoFailureException( "The nbm:run-platform goal shall be used within a NetBeans Application project only ('nbm-application' packaging)");
-        }
-
-        netbeansUserdir.mkdirs();
-
-        File appbasedir = new File( outputDirectory, brandingToken );
-
-        if ( !appbasedir.exists() )
-        {
-            throw new MojoExecutionException( "The directory that shall contain built application, doesn't exist ("
-                + appbasedir.getAbsolutePath() + ")\n Please invoke 'mvn install' on the project first" );
-        }
-
-        boolean windows = Os.isFamily( "windows" );
-
-        Commandline cmdLine = new Commandline();
-        File exec;
-        if ( windows )
-        {
-            exec = new File( appbasedir, "bin" + brandingToken + "_w.exe" );
-            if ( !exec.exists() )
-            { // Was removed as of nb 6.7
-                exec = new File( appbasedir, "bin\\" + brandingToken + ".exe" );
-                // if jdk is 32 or 64-bit
-                String jdkHome = System.getenv( "JAVA_HOME" );
-                if ( jdkHome != null )
-                {
-                    /* Detect whether the JDK is 32-bit or 64-bit. Since Oracle has "no plans to ship 32-bit builds of
-                    JDK 9" [1] or beyond, assume 64-bit unless we can positively identify the JDK as 32-bit. The file
-                    below is confirmed to exist on 32-bit Java 8, Java 9, and Java 10 [2], and confirmed _not_ to exist
-                    on 64-bit Oracle Java 10 nor on OpenJDK 8, 9, or 10.
-
-                    [1] Mark Reinhold on 2017-09-25
-                        https://twitter.com/mreinhold/status/912311207935090689
-                    [2] Downloaded from https://www.azul.com/downloads/zulu/zulu-windows on 2018-09-05. */
-                    if (!new File(jdkHome, "jre\\bin\\JavaAccessBridge-32.dll").exists() && // 32-bit Java 8
-                        !new File(jdkHome, "\\bin\\javaaccessbridge-32.dll").exists()) // 32-bit Java 9 or 10
-                    {
-                        File exec64 = new File( appbasedir, "bin\\" + brandingToken + "64.exe" );
-                        if ( exec64.isFile() )
-                        {
-                            exec = exec64;
-                        }
-                    }
-                }
-                cmdLine.addArguments( new String[] { "--console", "suppress" } );
-            }
-        }
-        else
-        {
-            exec = new File( appbasedir, "bin/" + brandingToken );
-        }
-
-        cmdLine.setExecutable( exec.getAbsolutePath() );
-
-        try
-        {
-
-            List<String> args = new ArrayList<String>();
-            args.add( "--userdir" );
-            args.add( netbeansUserdir.getAbsolutePath() );
-            args.add( "-J-Dnetbeans.logger.console=true" );
-            args.add( "-J-ea" );
-            args.add( "--branding" );
-            args.add( brandingToken );
-
-            // use JAVA_HOME if set
-            if ( System.getenv( "JAVA_HOME" ) != null )
-            {
-                args.add( "--jdkhome" );
-                args.add( System.getenv( "JAVA_HOME" ) );
-            }
-
-            cmdLine.addArguments( args.toArray( new String[0] ) );
-            cmdLine.addArguments( CommandLineUtils.translateCommandline( additionalArguments ) );
-            cmdLine.addArguments( CommandLineUtils.translateCommandline( getDebugAdditionalArguments() ) );
-            getLog().info( "Executing: " + cmdLine.toString() );
-            StreamConsumer out = new StreamConsumer()
-            {
-
-                public void consumeLine( String line )
-                {
-                    getLog().info( line );
-                }
-            };
-            CommandLineUtils.executeCommandLine( cmdLine, out, out );
-        }
-        catch ( Exception e )
-        {
-            throw new MojoExecutionException( "Failed executing NetBeans", e );
-        }
-    }
-
-    private String getDebugAdditionalArguments()
-    {
-       if ( "true".equals( debugAdditionalArguments ) )
-        {
-            return "-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005";
-        }
-        return debugAdditionalArguments;
-    }
-}
diff --git a/nbm-maven-plugin/src/main/mdo/descriptor.mdo b/nbm-maven-plugin/src/main/mdo/descriptor.mdo
deleted file mode 100644
index 1931551..0000000
--- a/nbm-maven-plugin/src/main/mdo/descriptor.mdo
+++ /dev/null
@@ -1,246 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<model>
-    <id>nbm</id>
-    <name>NetBeansModule</name>
-    <description><![CDATA[Maven's model for the NetBeans module descriptor.]]></description>
-    <defaults>
-        <default>
-            <key>package</key>
-            <value>org.netbeans.nbm.model</value>
-        </default>
-    </defaults>
-    <classes>
-        <class rootElement="true" xml.tagName="nbm">
-            <name>NetBeansModule</name>
-            <description>Describes the layout, dependencies and packaging of a NetBeans module.</description>
-            <version>1.0.0+</version>
-            <fields>
-                <field>
-                    <name>moduleType</name>
-                    <version>1.0.0+</version>
-                    <description><![CDATA[
-                    <p>DEPRECATED, use the plugin configuration instead. Type of the module. Possible values are </p>
-                    <p><b>autoload</b> - Such a module is automatically enabled when some other module requires it and automatically disabled otherwise.</p>
-                    <p><b>eager</b> - This module type gets automatically enabled when all it's dependencies are satisfied. Disabled otherwise.</p>
-                    <p><b>normal</b> - This is the default value. This kind of module is enabled/disabled manually by the user. It installs enabled.</p>
-                    ]]>        </description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>codeNameBase</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Codenamebase of the module. Primary identification of the module. Usually the package name. Eg. "org.codehaus.mevenide.project". 
-                    If not defined here, the default value is constructed from groupId and artifactId.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>cluster</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Each modules should belong to a cluster. A cluster is a group of related modules. For individual modules it's not that important. Refer to netbeans.org documentation for more details.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>requiresRestart</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Determines if the module requires restart of the IDE/platform upon installation.</description>
-                    <type>boolean</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>manifest</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Location of the manifest file with NetBeans specific manifest entries.
-                        </description>
-                    <type>String</type>
-                    <!--defaultValue>src/main/nbm/manifest.mf</defaultValue-->
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>homepageUrl</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Homepage URL of the module. Is accessible from NetBeans UI upon installation, should point to place with additional information about the functionality. If not defined, it defaults to POM's url element.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>distributionUrl</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Http URL of the location where the module can be downloaded from the internet. This value put into the NBM and used when generating the Autoupdate Site. Should point directly to the NBM download.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>author</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Author of the module. Is used when generating the NBM file.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-        
-                <field>
-                    <name>licenseName</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Name of the license. If the user already agreed to the same license before, he/she won't be asked again to agree.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-                <field>
-                    <name>licenseFile</name>
-                    <version>1.0.0+</version>
-                    <description>DEPRECATED, use the plugin configuration instead. Path to the license agreement file.</description>
-                    <type>String</type>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-        
-                <field>
-                    <name>libraries</name>
-                    <version>1.0.0+</version>
-                    <description>groupId:artifactId of artifacts that shall become part of the module and be added on the classpath 
-                    (ClassPath: manifest entry gets created and the jar is included in the nbm file)</description>
-                    <association>
-                        <type>String</type>
-                        <multiplicity>*</multiplicity>
-                    </association>
-                </field>
-                 <field>
-                    <name>dependencies</name>
-                    <description>DEPRECATED, use the plugin configuration instead. List of module dependencies. The plugin will use it to Generate the OpenIDE-Module-Module-Dependencies manifest entry.</description>
-                    <version>1.0.0+</version>
-                    <association>
-                        <type>Dependency</type>
-                        <multiplicity>*</multiplicity>
-                    </association>
-                </field>
-                <field>
-                    <name>nbmResources</name>
-                    <description>DEPRECATED, use the plugin configuration instead. List of resources that shall be also included into the Nbm file along with the module jar and library jars.</description>
-                    <version>1.0.0+</version>
-                    <association>
-                        <type>NbmResource</type>
-                        <multiplicity>*</multiplicity>
-                    </association>
-                    <annotations>
-                        <annotation>@Deprecated</annotation>
-                    </annotations>
-                </field>
-            </fields>
-        </class>
-        <class>
-            <name>Dependency</name>
-            <description></description>
-            <version>1.0.0+</version>
-            <fields>
-                <field>
-                    <name>id</name>
-                    <description>groupId:artifactId of the dependency defined in the POM (or a transitive dependency)</description>
-                    <version>1.0.0+</version>
-                    <type>String</type>
-                    <required>true</required>
-                </field>
-                <field>
-                    <name>type</name>
-                    <description><![CDATA[
-                        Type of module dependency. 3 possible values allowed.
-                        <p><b>spec</b> - specification dependency, module can only use public APIs in public packages. Works with the version defined and any later version.</p>
-                        <p><b>impl</b> - implementation dependency, module can use any class in the dependency module, but works with just the one version of the module.</p>
-                        <p><b>loose</b> - similar to spec, but isa very loose connection, no version is required, just the module presence.</p>
-                        ]]>
-                    </description>
-                    <version>1.0.0+</version>
-                    <type>String</type>
-                    <defaultValue>spec</defaultValue>
-                </field>
-                <field>
-                    <name>explicitValue</name>
-                    <description><![CDATA[
-                        The plugin tries to resolve the correct module name and module specification/implementation version by examining the
-                        dependency jar's manifest.
-                        You can override this behaviour by explicitly defining the value here. For example org.openide.io/1 &gt; 10.1 for a "spec" type of dependency.
-          
-                        ]]>              
-                    </description>
-                    <version>1.0.0+</version>
-                    <type>String</type>
-                </field>
-            </fields>
-        </class>
-        <class>
-            <name>NbmResource</name>
-            <version>1.0.0+</version>
-            <fields>
-                <field>
-                    <name>baseDirectory</name>
-                    <description>The base directory, all paths within the nbm file will be the same as paths within the base directory.</description>
-                    <version>1.0.0+</version>
-                    <type>String</type>
-                    <required>true</required>
-                </field>
-                <field>
-                    <name>relativeClusterPath</name>
-                    <description>A relative path to be added to cluster root where the files will be copied to.</description>
-                    <version>1.0.0+</version>
-                    <type>String</type>
-                    <required>false</required>
-                </field>
-                <field>
-                    <name>includes</name>
-                    <description>Include pattern, what shall be included in the nbm. </description>
-                    <version>1.0.0+</version>
-                    <association>
-                        <type>String</type>
-                        <multiplicity>*</multiplicity>
-                    </association>
-                </field>
-                <field>
-                    <name>excludes</name>
-                    <description>Exclude pattern, what files within the basedir shall not be included. </description>
-                    <version>1.0.0+</version>
-                    <association>
-                        <type>String</type>
-                        <multiplicity>*</multiplicity>
-                    </association>
-                </field>
-            </fields>
-        </class>
-    </classes>
-</model>
-
diff --git a/nbm-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/nbm-maven-plugin/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index 2e489fb..0000000
--- a/nbm-maven-plugin/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<component-set>
-  <components>
-    <!--component>
-      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-      <role-hint>jar</role-hint>
-      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-      <configuration>
-        <type>jar</type>
-        <extension>jar</extension>
-      </configuration>
-    </component-->
-    <component>
-      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-      <role-hint>nbm</role-hint>
-      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-      <configuration>
-        <type>nbm</type>
-        <extension>jar</extension>
-        <packaging>nbm</packaging>
-        <addedToClasspath>true</addedToClasspath>
-        <language>java</language>
-        <includesDependencies>true</includesDependencies>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-      <role-hint>nbm-file</role-hint>
-      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-      <configuration>
-        <type>nbm-file</type>
-        <extension>nbm</extension>
-        <packaging>nbm-file</packaging>
-        <addedToClasspath>false</addedToClasspath>
-        <language>java</language>
-        <includesDependencies>true</includesDependencies>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
-      <role-hint>nbm-application</role-hint>
-      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
-      <configuration>
-        <type>nbm-application</type>
-        <extension>zip</extension>
-        <packaging>nbm-application</packaging>
-        <addedToClasspath>false</addedToClasspath>
-        <language>java</language>
-        <includesDependencies>false</includesDependencies>
-      </configuration>
-    </component>
-    
-    <component>
-      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-      <role-hint>nbm</role-hint>
-      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-      <configuration>
-        <phases>
-          <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
-          <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
-          <process-classes>org.apache.netbeans.utilities:nbm-maven-plugin:manifest</process-classes>
-          <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
-          <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
-          <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
-          <package>org.apache.maven.plugins:maven-jar-plugin:jar, 
-                   org.apache.netbeans.utilities:nbm-maven-plugin:branding,
-                   org.apache.netbeans.utilities:nbm-maven-plugin:nbm
-          </package>
-          <install>org.apache.maven.plugins:maven-install-plugin:install</install>
-          <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
-        </phases>
-      </configuration>
-    </component>
-
-    <component>
-      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-      <role-hint>nbm-application</role-hint>
-      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-      <configuration>
-        <phases>
-          <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
-          <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
-          <package>org.apache.netbeans.utilities:nbm-maven-plugin:cluster-app,org.apache.netbeans.utilities:nbm-maven-plugin:standalone-zip</package>
-          <integration-test>org.apache.maven.plugins:maven-surefire-plugin:test</integration-test>
-          <install>org.apache.maven.plugins:maven-install-plugin:install</install>
-          <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
-        </phases>
-      </configuration>
-    </component>
-  </components>
-</component-set>
diff --git a/nbm-maven-plugin/src/main/resources/branding.jnlp b/nbm-maven-plugin/src/main/resources/branding.jnlp
deleted file mode 100644
index 9185b59..0000000
--- a/nbm-maven-plugin/src/main/resources/branding.jnlp
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Descriptor 6.0//EN" "http://java.sun.com/dtd/JNLP-6.0.dtd">
-<jnlp spec="1.0+" codebase="${jnlp.codebase}">
-  <information>
-      <title>${app.title}</title>
-      <vendor>${app.vendor}</vendor>
-      <description>${app.description}</description>
-  </information>
-  <security><all-permissions/></security>
-  <resources>
-    ${jnlp.branding.jars}
-    ${jnlp.resources}
-  </resources>
-  <component-desc/>
-</jnlp>
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/main/resources/master.jnlp b/nbm-maven-plugin/src/main/resources/master.jnlp
deleted file mode 100644
index b6f4812..0000000
--- a/nbm-maven-plugin/src/main/resources/master.jnlp
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Descriptor 6.0//EN" "http://java.sun.com/dtd/JNLP-6.0.dtd">
-<jnlp spec="1.0+" codebase="${jnlp.codebase}" href="${master.jnlp.file.name}.jnlp">
-  <information>
-      <title>${app.title}</title>
-      <vendor>${app.vendor}</vendor>
-      <description>${app.description}</description>
-      <offline-allowed/>
-  </information>
-  <security><all-permissions/></security>
-  <resources>
-    <!-- The following property is needed when running with unsigned jars: -->
-    <property name="netbeans.jnlp.fixPolicy" value="${netbeans.jnlp.fixPolicy}"/>
-    <extension name="modules" href="modules.jnlp"/>
-    <java version="1.6+" href="http://java.sun.com/products/autodl/j2se" java-vm-args="${netbeans.run.params}"/>
-    <jar href="startup.jar"/>
-    <property name="netbeans.user" value="${user.home}/.${branding.token}"/>
-  </resources>
-  <resources os="Mac OS X">
-      <property name="netbeans.user" value="${user.home}/Library/Application Support/${branding.token}"/>
-  </resources>
-  <application-desc>
-    <argument>--branding</argument>
-    <argument>${branding.token}</argument>
-  </application-desc>
-</jnlp> 
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/site/apt/buildinstexample.apt b/nbm-maven-plugin/src/site/apt/buildinstexample.apt
deleted file mode 100644
index 7df8d19..0000000
--- a/nbm-maven-plugin/src/site/apt/buildinstexample.apt
+++ /dev/null
@@ -1,128 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License.
-
- ------
- Maven 2 NBM Plugin 
- ------
- Frantisek Mantlik
- <frantisek@mantlik.cz>
- ------
- 2012-02-12
-
-HOWTO: Customize installers generated by nbm:build-installers
-
- Generated installers can be customized by providing user-defined 
- customized templateFile and pass parameters to it with
- userSettings parameter.
- See {{{./build-installers-mojo.html}<<<build-installers>>> goal}} description.
-
- User defined template can be used to modify generated installer
- behavior, e.g. branding of installation environment etc.
-
-*Example 1: Simple change in installer code
-
- Simple changes into original Harness installer code can be made by filtering
- corresponding file using Ant in templateFile.
-
- Following code added into <<<prepare-sources>>> target takes rid of the "Run application
- when installer finished" checkbox at the last page of installer wizard:
-
-+-----+
-<replace file="${installer.build.dir}/ext/engine/src/org/mycompany/installer/wizard/components/panels/PostInstallSummaryPanel.java" encoding="utf-8">
-    <replacefilter token="runAppNow.doClick();" value="runAppNow.setVisible(false);"/>
-</replace>
-+-----+
-
-*Example 2: More complex installer code changes
-
- If the code changes become more complex better solution is to replace entire
- Harness files with modified versions.
-
- For example, you would like to register file associations for your application.
-
- First of all, prepare your modified version of the file ConfigurationLogic.java
- according to the instructions at {{{http://wiki.netbeans.org/NBIFileAssosiations}http://wiki.netbeans.org/NBIFileAssosiations}}.
- 
- As a next step add a copy task into <<<prepare-sources>>> target in your templateFile:
-
-+-----+
-<copy file="${configuration.logic.file}" overwrite="true" tofile="${installer.build.dir}/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java"/>
-+-----+
-
- and finally define <<<configuration.logic.file>>> parameter in the application's pom:
-
-+-----+
-<plugin>
-    <groupId>org.codehaus.mojo</groupId>
-    <artifactId>nbm-maven-plugin</artifactId>
-    <configuration>
-        <templateFile>${basedir}/installer/template.xml</templateFile>
-        <userSettings>
-            <configuration.logic.file>${basedir}/installer/ConfigurationLogic.java</configuration.logic.file>
-        </userSettings>
-    </configuration>
-</plugin>
-+-----+
-
-*Example 3: Branding of installer images
-
- If installer left corner image has to be branded,
- following code can be added to templateFile target
- <<<prepare-sources>>>:
-
-+-----+
-<condition property="ilc.path" value="${nbi.instleftcorner.file}">
-     <and>
-         <isset property="nbi.instleftcorner.file"/>
-         <available file="${nbi.instleftcorner.file}"/>
-     </and>
-</condition>
-<condition property="ilc.defined">
-     <and>
-         <isset property="nbi.instleftcorner.file"/>
-         <available file="${nbi.instleftcorner.file}"/>
-     </and>
-</condition> 
-<antcall target="-prepare-ilc"/>
-+-----+
-
- In addition, new target <<<-prepare-ilc>>> has to be defined, e.g. at the end of templateFile:
-
-+-----+
-<target name="-prepare-ilc" if="ilc.defined">
-    <copy file="${ilc.path}" tofile="${installer.build.dir}/ext/engine/src/org/mycompany/installer/wizard/wizard-description-background-left.png" overwrite="true"/>
-</target>
-+-----+
-
- which effectively replaces the desired image.
-
- Finally, update application's pom:
-
-+-----+
-<plugin>
-    <groupId>org.codehaus.mojo</groupId>
-    <artifactId>nbm-maven-plugin</artifactId>
-    <configuration>
-        <templateFile>${basedir}/installer/template.xml</templateFile>
-        <userSettings>
-            <nbi.instleftcorner.file>${basedir}/installer/ilc.png</nbi.instleftcorner.file>
-        </userSettings>
-    </configuration>
-</plugin>
-+-----+
-
- More information: {{{http://wiki.netbeans.org/NBI}http://wiki.netbeans.org/NBI}}
diff --git a/nbm-maven-plugin/src/site/apt/descriptor.apt b/nbm-maven-plugin/src/site/apt/descriptor.apt
deleted file mode 100644
index 8af0158..0000000
--- a/nbm-maven-plugin/src/site/apt/descriptor.apt
+++ /dev/null
@@ -1,111 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License.
-
- ------
- Maven 2 NBM Plugin 
- ------
- Milos Kleint
- <mkleint@codehaus.org>
- ------
- 2007-06-15
-
-Example nbm descriptors - since 3.8 DEPRECATED.
-
- These descriptors are referenced from the {{{./nbm-mojo.html}nbm:nbm}} mojo. The descriptor file is deprecated since version 3.8.
- 
-*Usual case
-
- A rather common module descriptor. Basic properties filled in, defines some libraries that ship with the module and
- declared dependencies on other NetBeans modules.
-
-+-----+
-<nbm>
-   <moduleType>normal</moduleType>
-   <codeNameBase>org.codehaus.mevenide.netbeans/2</codeNameBase>
-   <cluster>mevenide</cluster>
-   <manifest>src/main/nbm/manifest.mf</manifest>
-   <!-- distributionUrl important when creating an autoupdate center. The expected download URL for the module is:
-            ${distributionUrl}/${finalName}.nbm
-     -->
-   <distributionUrl>http://mevenide.codehaus.org/nbm_release2</distributionUrl>
-   <licenseName>Apache License, Version 2.0</licenseName>
-   <licenseFile>license.txt</licenseFile>
-   <libraries>
-       <!-- these dependencies get copied to modules/ext directory in the mevenide cluster and
-            get referenced from the module's jar usign the Class-Path manifest entry. 
-            Not necessary since 2.5 version of nbm-maven-plugin
-         -->
-       <library>org.netbeans.api:org-netbeans-graph</library>
-       <library>org.netbeans.api:org-netbeans-graph-vmd</library>
-   </libraries>
-   <dependencies>
-      <!-- all of these dependencies get referrenced as module dependencies of this project's artifact. 
-        Not necessary since 2.5 version of nbm-maven-plugin
-        -->
-      <dependency>
-          <id>org.codehaus.mevenide:run-jar-bridge</id>
-      </dependency>
-      <dependency>
-          <id>org.codehaus.mevenide:debugger-bridge</id>
-      </dependency>
-      <dependency>
-          <id>org.netbeans.api:org-netbeans-api-debugger-jpda</id>
-      </dependency>
-      <dependency>
-          <id>org.netbeans.api:org-netbeans-api-debugger</id>
-      </dependency>
-      <dependency>
-          <id>org.netbeans.api:org-netbeans-modules-options-api</id>
-      </dependency>
-      <dependency>
-          <id>org.netbeans.api:org-openide-io</id>
-      </dependency>
-      <dependency>
-          <id>org.netbeans.api:org-openide-modules</id>
-      </dependency>
-   </dependencies> 
-</nbm>
-+-----+
-
-*Additional custom files in module
-
- Apart from the usual properties, this one declares additional files that ought to be packed into the module.
-
-+-----+
-<nbm>
-   <moduleType>eager</moduleType>
-   <codeNameBase>org.codehaus.mevenide.netbeans.nbrepo/2</codeNameBase>
-   <cluster>mevenide</cluster>
-   <manifest>src/main/nbm/manifest.mf</manifest>
-   <distributionUrl>http://mevenide.codehaus.org/nbm_release2</distributionUrl>
-   <licenseName>Apache License, Version 2.0</licenseName>
-   <licenseFile>license.txt</licenseFile>
-   <dependencies>
-       <dependency>
-           <id>org.codehaus.mevenide:nb-project</id>
-       </dependency>
-   </dependencies> 
-   <nbmResources>
-       <nbmResource>
-           <baseDirectory>../ide-mojos/target</baseDirectory>
-           <includes>
-               <include>m2-repository/**</include>
-           </includes>
-       </nbmResource>
-   </nbmResources>
-</nbm>
-+-----+
diff --git a/nbm-maven-plugin/src/site/apt/index.apt.vm b/nbm-maven-plugin/src/site/apt/index.apt.vm
deleted file mode 100644
index 088b17d..0000000
--- a/nbm-maven-plugin/src/site/apt/index.apt.vm
+++ /dev/null
@@ -1,321 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License. 
-
- ------
- Maven 2 NBM Plugin 
- ------
- Milos Kleint
- <mkleint@codehaus.org>
- ------
- 2010-11-04
-
-NetBeans Module plugin
-
- This m2 plugin is able to create NetBeans module(plugin) artifacts. It registers a new packaging type <<<nbm>>>. Any project with
-this packaging will be automatically turned into a NetBeans module project. Additionally it allows to create clusters of modules, generate
-an autoupdate site content or build and assemble an application on top of NetBeans platform.
-
- Note: The <<<nbm:populate-repository>>> goal has been moved to it's own plugin {{{../nb-repository-plugin/index.html}nb-repository-plugin}}.
-
- To get access to a repository with NetBeans.org module artifacts and metadata, add {{{http://bits.netbeans.org/maven2/}http://bits.netbeans.org/maven2/}} repository to your project POM
-or the repository manager you are using. The repository hosts binaries of NetBeans 6.5 and later.
-
- Also see: {{{http://wiki.netbeans.org/NetBeansDeveloperFAQ#Mavenized_Builds}Maven NBM development FAQs}}
-
- Sample <<<pom.xml>>> excerpts for creation of a NetBeans module:
-
-+-----+
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>example-netbeans-module</artifactId>
-  <groupId>org.mycompany.myproject</groupId>
-  <!--here is the packaging and lifecycle defined-->
-  <packaging>nbm</packaging>
-
-....
-  <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <version>${project.version}</version>
-                <extensions>true</extensions>
-            </plugin>
-            <plugin> <!-- required since nbm-plugin 3.0-->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.2</version>
-                <configuration>
-                    <archive>
-                        <manifestFile>#[[${project.build.outputDirectory}]]#/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-  </build>
-
- ....
-    <!-- this section is important only to access the binaries of NetBeans that you use as dependencies -->
-    <repositories>
-        <repository>
-            <id>netbeans</id>
-            <name>repository hosting netbeans.org api artifacts</name>
-            <url>http://bits.netbeans.org/maven2/</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-+-----+
-
- To build the project then, just type
-
-+-------------------------------------------------------------------------------+
-mvn install
-+-------------------------------------------------------------------------------+
-
-
-Maven Dependency vs. NetBeans runtime dependency
-
- There are important differences between Maven's dependency mechanism and NetBeans runtime dependencies.
-Maven's dependencies are transitive, so at compile time you get not only direct dependencies you declared, but also
-dependencies of dependencies etc. In NetBeans, the module dependencies are non-transitive by nature, you have to explicitly declare all at runtime.
-Additionally next to module dependencies there are also library jars attached and shipped with the module's main artifact.
-In the NetBeans terminology there is a special sort of modules called "library wrappers". These library wrappers
-add the libraries on the module's classpath and allow other modules to depend on the libraries within the IDE's runtime.
-
- The ways in which the nbm-maven-plugin tries to adress these issues has changed over time.
-
- The plugin walks the dependency tree to detect and identify module dependencies
-and classpath libraries.
-
-  A maven dependency is turned into a NetBeans runtime dependency when:
-
-    * for NetBeans module dependencies (dependency jars that have the NetBeans specific entries in META-INF/MANIFEST.MF)
-
-        * It's a direct dependency (non-transitive) and is a NetBeans module itself. Preferred way of declaring
-module dependencies. 
-
-        * It's defined in existing (though optional) module.xml file in <<<dependencies>>> section.
-Try to avoid this, but still useful if one wants to put an explicit dependency value on the module, or use implementation dependency.
-
-        * When the dependency is of type <<<nbm>>>. Deprecated in 3.0.x, only helpful in older versions.
-Such dependencies don't include their transitive deps on compilation classpath.
-That should allow one to simulate the rumtime dependencies at compilation time in maven, however there's one major drawback. Not only are the nbm's module dependencies hidden, but the libraries associated with the
-given nbm module are also hidden. So you can end up with less stuff on classpath  as opposed to more stuff with <<<jar typed dependencies>>>.
-
-    * for module libraries (jars that are packed together with the module and appear on it's classpath directly, not by a dependency relationship.)
-
-        * It's a direct dependency and is not of <<<provided>>> scope.
-
-        * It's a transitive dependency, pulled in by a direct dependency (only non-module one - see first bullet) This is new in <<3.0+>>
-
-        * It's defined in existing (though optional) module.xml file in <libraries> section. Consider this deprecated in <<3.0+>>.
-
-
- The complete {{{./nbm.html}nbm descriptor format}} documentation, and {{{./descriptor.html}example descriptors}} are also available. 
-Please note that since 3.8 version, the descriptor is deprecated and replaced by plugin configuration parameters.
-
- Additionally we perform dependency analysis in order to warn the user when runtime dependencies are wrong.
-So project's own classes and it's classpath libraries' classes are checked against the module dependencies
-(with appropriate filtering for public packages/private packages).
-If the classes depend on declared module dependency's private classes or on transitive module dependency's classes,
-the build fails. That should prevent ClassNotFoundException's later at runtime, when the NetBeans module
-system constructs the classpath for the module based on our metadata generated.
-
-Using OSGi bundles in NetBeans platform based applications
-
- Starting with version <<3.2>>, it's possible for the NetBeans modules to depend on OSGi bundles. A proper module dependency section will be generated.
-To include the bundle in the application, add dependency on the bundle from nbm-application.
-There are a few prerequisites.
-
-   * It works only in NetBeans 6.9 and later which support the embedding of bundles at runtime
-
-   * Add <<<\<useOSGiDependencies\>true\</useOSGiDependencies\>>>> configuration entry to all the modules depending on OSGi bundles.
-     Existing applications/modules need to check modules wrapping
-     external libraries for library jars that are also OSGi bundles. Such modules will no longer include the OSGi bundles
-     as part of the module NBM but will include a modular dependency reference on the bundle only. Modules depending on these old wrapper modules
-     shall depend directly on the bundle, eventually rendering the old library wrapper module obsolete.
-
-   * in the distribution, all bundles will be included in the default cluster (<<<extra>>> if not configured otherwise), 
-    in <<3.10 and later>> the plugin will attempt to guess the cluster based on modules depending on it.
-
-   * Before version <<3.10>> all bundles will be autoload, thus requiring at least one depending regular module to enable them. In <<3.10 and later>>, developers of the OSGi bundles
-     can influence the autoload vs regular behaviour by adding <<Nbm-Maven-Plugin-Autoload>> attribute to the bundle's manifest with "true" or "false" values. 
-     False means the module will be enabled on start, even without any other modules depending on it.
-
-
-Multi module setup
-
- If you have a set of NetBeans modules, or are building on top of NetBeans Platform,
-you will make use of the additional goals provided by the plugin.
-
- If you are building a Platform-based application, use a project
-with <<<nbm-application>>> packaging to perform the final application assembly.
-This packaging type (defined in nbm-maven-plugin) should have your module projects
-and all dependencies of the target NetBeans Platform included as dependencies.
-
- For the NetBeans Platform/IDE modules, there are artifacts that aggregate modules in clusters.
-These are put in the <<<org.netbeans.clusters>>> groupId (on <<<bits.netbeans.org>>> or in your own repository).
-The following snippet will include the basic NetBeans platform cluster and your own
-module in the application. You can use standard dependency exclusion lists to cut out modules from the Platform that
-you don't need.
-
-+-----+
-    <artifactId>application</artifactId>
-    <packaging>nbm-application</packaging>
-    <version>1.0-SNAPSHOT</version>
-    <dependencies>
-        <dependency>
-            <groupId>org.netbeans.cluster</groupId>
-            <artifactId>platform8</artifactId>
-            <version>${netbeans.version}</version>
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>com.mycompany</groupId>
-            <artifactId>module1</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
-    ....
-+-----+
-
- The nbm-application project/packaging defines a build lifecycle that creates a final application
-from the NBM files in local/remote repotories and bundles them in a ZIP file (also uploadable to the repository).
-In addition to that you can configure the project to generate an autoupdate site and/or
-webstartable binaries of the applications (typically in a deployment profile):
-
-+-----+
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>extra</id>
-                        <goals>
-                            <goal>autoupdate</goal>
-                            <goal>webstart-app</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-+-----+
-
- See the {{{./autoupdate-mojo.html}autoupdate}} and {{{./webstart-app-mojo.html}webstart-app}} goals
-for more details.
-
-+-------------------------------------------------------------------------------+
-mvn nbm:cluster
-+-------------------------------------------------------------------------------+
-
- This goal aggregates output of multiple NetBeans module projects and creates one 
-or more clusters in the current project. So usually one runs this goal on the parent POM project,
-which aggregates the content of all its modules. 
-The resulting cluster structure can later be used for running the application, creating an installer or similar.
-A variant of this goal is also included in the nbm-application project's default lifecycle.
-
-+-------------------------------------------------------------------------------+
-mvn nbm:branding
-+-------------------------------------------------------------------------------+
-
- Branding is to used when one builds an application based on NetBeans Platform (as opposed to creating set of modules for the IDE).
-Branding contains all the resources that are to be changed in the platform binaries (resource bundles, images, HTML files etc.) 
-to give the application its unique look.
-
- This goal can be attached to one of the nbm module projects that will be part of the
-NetBeans Platform-based application.
-
- For more detailed tutorial, check the {{{http://netbeans.dzone.com/videos/screencast-maven-and-netbeans}Screencast: Maven and the NetBeans Platform}}
-video recorded by Fabrizio Giudici. It describes to Fabrizio's open source project {{{http://kenai.com/projects/forceten}ForceTen}} which can be used as reference setup for Maven NetBeans Platform based apps.
-
- The branding is included as part of a regular nbm subproject and cannot be attached to a <<<pom>>> packaged root project.
-
-+-------------------------------------------------------------------------------+
-mvn nbm:run-ide nbm:run-platform
-+-------------------------------------------------------------------------------+
- 
- These two goals do almost the same, they allow you to execute your projects content within
-the IDE or NetBeans platform.
-
- <<<nbm:run-platform>>> only makes sense to execute on projects with <<<nbm-application>>> packaging.
-
- For more information on plugin configuration and customization, see {{{./plugin-info.html}goal documentation}}.
-
-
-Public packages declaration
-
- By default all your module's packages (and classes) and private to the given module. If you want to expose
-any API to other modules, you will need to declare those public packages in your <<<pom.xml>>>. This includes
-not only your own classes but also any other 3rd party library classes that are packaged with your module
-and are to be exposed for reuse by other modules.
-
- For example:
-
-+-----+
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nbm-maven-plugin</artifactId>
-                <version>${project.version}</version>
-                <extensions>true</extensions>
-                <configuration>
-                   <publicPackages>
-                       <publicPackage>org.foo.api</publicPackage>
-                       <publicPackage>org.apache.commons.*</publicPackage>
-                   </publicPackages>
-                </configuration>
-            </plugin>
-+-----+
-
- there is a package <<<org.foo.api>>> made public (but not <<<org.foo.api.impl>>> package) and
-any package starting with <<<org.apache.commons>>>, so both <<<org.apache.commons.io>>> and <<<org.apache.commons.exec>>> packages are exposed to the outside
-
-
-
-Archetypes anyone?
- 
- There are two basic archetypes:
-
- The first once creates a single project preconfigured to be a NetBeans module. Use this
-one if you are developing a NetBeans IDE module, or a module for a NetBeans Platform-based application.
-
-+-------------------------------------------------------------------------------+
-mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=nbm-archetype -DarchetypeVersion=... \
-  -DgroupId=org.kleint -DartifactId=milos -Dversion=1.0 archetype:generate
-+-------------------------------------------------------------------------------+
-
- The second one creates a parent POM project containing configuration and application branding for your NetBeans Platform-based application.
-
-+-------------------------------------------------------------------------------+
-mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=netbeans-platform-app-archetype \
-  -DarchetypeVersion=... -DgroupId=org.kleint -DartifactId=milos -Dversion=1.0 archetype:generate
-+-------------------------------------------------------------------------------+
-
-IDE support
-
- The NetBeans IDE has Maven support. Among other features, it
-contains additional support for working with NetBeans module projects. The support includes file templates,
-important nodes in projects view, running module(s) in the IDE or Platform.
-
-Sample real life application
-
- Check the {{{http://netbeans.dzone.com/videos/screencast-maven-and-netbeans}Screencast: Maven and the NetBeans Platform}}
-video recorded by Fabrizio Giudici. It describes to Fabrizio's open source project {{{http://kenai.com/projects/forceten}ForceTen}} which can be used as reference setup for Maven NetBeans Platform based apps.
diff --git a/nbm-maven-plugin/src/site/apt/upgrade.apt b/nbm-maven-plugin/src/site/apt/upgrade.apt
deleted file mode 100644
index 11b0813..0000000
--- a/nbm-maven-plugin/src/site/apt/upgrade.apt
+++ /dev/null
@@ -1,144 +0,0 @@
-~~ Licensed to the Apache Software Foundation (ASF) under one
-~~ or more contributor license agreements.  See the NOTICE file
-~~ distributed with this work for additional information
-~~ regarding copyright ownership.  The ASF licenses this file
-~~ to you under the Apache License, Version 2.0 (the
-~~ "License"); you may not use this file except in compliance
-~~ with the License.  You may obtain a copy of the License at
-~~
-~~ http://www.apache.org/licenses/LICENSE-2.0
-~~
-~~ Unless required by applicable law or agreed to in writing,
-~~ software distributed under the License is distributed on an
-~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-~~ KIND, either express or implied.  See the License for the
-~~ specific language governing permissions and limitations
-~~ under the License.
-
- ------
- Maven 2 NBM Plugin 
- ------
- Milos Kleint
- <mkleint@codehaus.org>
- ------
- 2007-06-15 Sep 30, 2008  Jun 15, 2007
-
-
-HOW TO: Migrate from older version of the plugin
-
-
-  {{{Upgrading_to_3.9} Upgrading to 3.9}}
-
-  {{{Upgrading_to_3.8} Upgrading to 3.8}}
-
-  {{{Upgrading_from_2.6_version_to_3.0} Upgrading from 2.6 to 3.0}}
-
-  {{{Upgrading_from_2.4_version_to_2.5} Upgrading from 2.4 to 2.5}}
-
-{Upgrading to 3.9}
-
- In 3.9, the <<<populate-repository>>> goal is moved to separate plugin.
-
-{Upgrading to 3.8}
-
- In 3.8 the <<<descriptor>>> parameter is deprecated and is replaced by equivalent plugin parameters. 
-The values from descriptor are still applied, warnings are printed. In future releases the parameter will be removed.
-
-{Upgrading from 2.6 version to 3.0}
-
- There are a few significant incompatible changes introduced in <<3.0's>> version of
-NBM packaging lifecycle. The result should be easier to setup builds and better support for building
-NetBeans platform based applications.
-
-   * The lifecycle mappings have changed. There is no more <<<nbm:jar>>> goal and
-it was replaced by <<<nbm:manifest>>> which is executed at different phase, namely <<<process-classes>>>, right after
-the module's classes are compiled.
-
- <<Important>>: In order to have maven-jar-plugin to pick up the generated manifest, you need to add the following
-configuration snippet to your projects with <<<nbm>>> packaging.
-
-+-----+
-    <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <version>3.0.2</version>
-        <configuration>
-            <archive>
-                <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-            </archive>
-        </configuration>
-    </plugin>
-+-----+
-
-   * The project's dependencies that shall end up on <<Class-Path>> of the module and
-now processed transitively. In earlier versions, you had to either explicitly list
-all such items in the pom as direct dependencies, or list them in the module descriptor.
-Only transitive dependencies that descend from non-NetBeans module direct dependencies are
-included, eg. if you depend on module that includes Apache's commons-httpclient, the library will not
-be included (unless defined in your project directly). Possible trouble makers are transitive depedencies that are
-defined both in a dependening module and a regular jar dependency. Based on Maven dependency tree resolution,
-the binary could end up on the <<Class-Path>> or not. The resolution to the problem is to define
-The troubled dependency directly and either define the scope as <<<provided>>> if you don't want it included in <<Class-Path>>,
-or keep the default <<<compile>>> scope if you want.
-
-   * NBM file is always generated for any NetBeans module project. You can skip the NBM file
-generation by setting the parameter to nbm:nbm goal, but please be aware that having NBM files in local and
-remote repositories is crucial for the new tools that create a NetBeans Platform based application
-binaries.
-
-   * In previous versions the ultimate final binary for the platform based application,
- was a directory with the cluster(s) of modules. Now a new packaging is defined <<<nbm-application>>> that
-allows for creating a final application zip file, webstartable jnlp files, and an update site.
-All are constructed solely from the repository content (assuming all relevant modules have NBM files in repositories)
-and the primary project for the binaries is the <<<nbm-application>>> packaging project, unlike in previous versions
-where the root pom was the primary project and required all included modules to be built as part of the reactor
-in the same build.
-
-   * The <<<nbm:manifest>>> goal besides generating the manifest, will also check if the runtime dependencies
-match the actual classes being used in the project and it's libraries on <<Class-Path>>. That's analogous to
-the {{{http://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html}<<<dependency:analyze>>>}}
-goal but takes the NetBeans module system constraints into account (non-transitivity of module dependencies,
-public vs. private packages constraint etc)
-
-   * The previous versions didn't define the <<<OpenIDE-Module-Public-Packages>>> entry in the manifest file.
-The result was a deprecated state that made all classes publicly accessible from other modules
-and printed a warning to the application's log file. In <<3.0>>, we introduced a new optional parameter <<<publicPackages>>>
-that lists all public packages in the module. If not defined, no package is exported as public. See
-{{{https://github.com/mojohaus/nbm-maven-plugin/issues/3}issue}} for details. If you have previously
-placed the <<OpenIDE-Module-Public-Packages>> entry in the manifest file manually, it will not be overriden by the new parameter.
-
-=======================================================================
-
-{Upgrading from 2.4 version to 2.5}
-
- There are  significant changes in how NetBeans module system dependencies are mapped to maven's own 
-dependencies model. The <<2.4>> and older version all module system deps had to be explicitly defined in the module descriptor at <<<src/main/nbm/module.xml>>>.
-That is no longer a requirement in <<2.5>> for most cases. The plugin will try to decide based on the declaration
-in maven POM file. 
- 
- These are the rules:
-
-    * for NetBeans module dependencies (jars that have the NetBeans specific entries in META-INF/MANIFEST.MF)
-
-        * It's defined in existing (though optional) <<<module.xml>>> file in <<<dependencies>>> section.
-
-        * It's a direct dependency (non-transitive) and is a NetBeans module.
-
-        * When the dependency is of type <<<nbm>>>. Such dependencies don't include their transitive deps on compilation classpath.
-
-    * for module libraries (jars that are packed together with the module and appear on it's classpath directly, not by a dependency relationship.)
-
-        * It's defined in existing (though optional) <<<module.xml>>> file in <<<libraries>>> section
-
-        * It's a direct dependency (non-transitive) and is not of <<<provided>>> scope.
-
- So if you have used <<2.4>> and older before, you need to check your dependencies when upgrading to <<2.5>>.
-
-    * The <<2.5>> plugin can pick up and declare more module dependencies than the previous version. Module dependencies are safe. 
-You either declared them in your <<<module.xml>>> file. Some additional ones can appear if you have them as direct dependencies in your pom.
-Use the {{{http://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html}<<<dependency:analyze>>>}} goal to check for used/unused direct dependencies.
-
-    * The <<2.5>> plugin can also pick up and declare more module libraries. That's something to watch out for! That happens again only when you declared the jars as direct dependencies.
-You could end up with a single jar being added to multiple modules and get runtime classpath issues and of course your download size 
-will get higher than necessary. Again the {{{http://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html}<<<dependency:analyze>>>}} goal shall help. If you know the jar is required but is provided by a module you depend on, use the <<<provided>>> scope to prevent inclusion.
-
diff --git a/nbm-maven-plugin/src/site/resources/masterjnlp.txt b/nbm-maven-plugin/src/site/resources/masterjnlp.txt
deleted file mode 100644
index a1365d0..0000000
--- a/nbm-maven-plugin/src/site/resources/masterjnlp.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Discriptor 1.5//EN" "http://java.sun.com/dtd/JNLP-1.5.dtd">
-<jnlp spec="1.0+" codebase="${jnlp.codebase}">
-  <information>
-      <title>${app.title}</title>
-      <vendor>${app.title} vendor</vendor>
-      <description>${app.name} application</description>
-      <icon href="${app.icon}"/>
-  </information>
-  <security><all-permissions/></security>
-  <resources>
-    <!-- The following property is needed when running with unsigned jars: -->
-    <property name="netbeans.jnlp.fixPolicy" value="${netbeans.jnlp.fixPolicy}"/>
-    <extension name='branding' href='branding.jnlp' />
-    <j2se version="1.5+"/>
-    <jar href="startup.jar"/>
-    <property name="netbeans.user" value="${user.home}/.${branding.token}"/>
-
-<!-- The following line will be replaced with an automatically generated list of resources: -->
-    ${jnlp.resources}
-  </resources>
-  <resources os="Mac OS X">
-      <property name="netbeans.user" value="${user.home}/Library/Application Support/${branding.token}"/>
-  </resources>
-  <application-desc>
-    <argument>--branding</argument>
-    <argument>${branding.token}</argument>
-  </application-desc>
-</jnlp> 
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/site/site.xml b/nbm-maven-plugin/src/site/site.xml
deleted file mode 100644
index 5beda36..0000000
--- a/nbm-maven-plugin/src/site/site.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-    <skin>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>maven-netbeans-skin</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </skin>  
-    <body>
-    <menu name="Overview">
-      <item name="Usage" href="index.html"/>
-      <item name="Plugin Goals" href="plugin-info.html"/>
-      <!-- <item name="Javadoc" href="apidocs/index.html"/> -->
-      <!--item name="FAQ" href="faq.html"/-->
-    </menu>
-    <!--<menu name="Upgrade">   
-      <item name="2.4 -> 2.5 upgrade" href="2425upgrade.html"/>
-      <item name="2.6 -> 3.0 upgrade" href="2630upgrade.html"/>
-    </menu>-->
-    <menu name="HOWTOs ">
-      <item name="Customize installers" href="buildinstexample.html"/>
-      <item name="Upgrade from older versions" href="upgrade.html"/>
-    </menu>
-    <menu name="Deprecated">
-      <item name="Descriptor Format" href="nbm.html"/>
-      <item name="Example Descriptor" href="descriptor.html"/>
-    </menu>
-  </body>
-</project>
-
diff --git a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/AbstractNbmMojoTest.java b/nbm-maven-plugin/src/test/java/org/netbeans/nbm/AbstractNbmMojoTest.java
deleted file mode 100644
index 1459b67..0000000
--- a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/AbstractNbmMojoTest.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *  Copyright 2008 mkleint.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-
-package org.netbeans.nbm;
-
-import org.netbeans.nbm.AbstractNbmMojo;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import junit.framework.TestCase;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DefaultArtifact;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.plugin.logging.SystemStreamLog;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.internal.DefaultDependencyNode;
-import org.netbeans.nbm.model.Dependency;
-import org.netbeans.nbm.model.NetBeansModule;
-import org.netbeans.nbm.utils.ExamineManifest;
-
-/**
- *
- * @author mkleint
- */
-public class AbstractNbmMojoTest extends TestCase {
-    Log log = null;
-    DefaultDependencyNode treeRoot = null;
-    
-    public AbstractNbmMojoTest(String testName) {
-        super(testName);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        log = new SystemStreamLog();
-        treeRoot = createNode(null, "root", "root", "1.0", "jar", "", true, new ArrayList<Artifact>(), new HashMap<Artifact,ExamineManifest>());
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    /**
-     * Test of matchesLibrary method, of class AbstractNbmMojo.
-     */
-    public void testMatchesLibrary() {
-        System.out.println("matchesLibrary");
-        Artifact artifact = createArtifact("group", "artifact", "1.0", "jar", "compile");
-        List<String> libraries = new ArrayList<String>();
-        libraries.add("group:artifact");
-        ExamineManifest depExaminator = createNonModule();
-        boolean result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertTrue("explicitly defined libraries in descriptor are included", result);
-
-        artifact = createArtifact("group", "artifact", "1.0", "jar", "provided");
-        libraries = new ArrayList<String>();
-        result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertFalse("provided artifacts are not included", result);
-
-        artifact = createArtifact("group", "artifact", "1.0", "jar", "system");
-        libraries = new ArrayList<String>();
-        result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertFalse("system artifacts are not included", result);
-
-        artifact = createArtifact("group", "artifact", "1.0", "jar", "compile");
-        libraries = new ArrayList<String>();
-        libraries.add("group:artifact");
-        depExaminator = createModule();
-        result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertTrue("netbeans modules are included if explicitly marked in descriptor", result);
-
-        libraries = new ArrayList<String>();
-        result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertFalse("netbeans modules are omitted", result);
-
-        artifact = createArtifact("group", "artifact", "1.0", "nbm", "compile");
-        libraries = new ArrayList<String>();
-        result = AbstractNbmMojo.matchesLibrary(artifact, libraries, depExaminator, log, false);
-        assertFalse("netbeans modules are omitted", result);
-
-    }
-
-    /**
-     * Test of resolveNetBeansDependency method, of class AbstractNbmMojo.
-     */
-    public void testResolveNetBeansDependency() {
-        Artifact artifact = createArtifact("group", "artifact", "1.0", "jar", "compile");
-        List<Dependency> deps = new ArrayList<Dependency>();
-        ExamineManifest manifest = createNonModule();
-        Dependency result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertNull("not a NetBeans module", result);
-
-        manifest = createModule();
-        result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertNotNull("is a NetBeans module", result);
-
-        artifact = createArtifact("group", "artifact", "1.0", "nbm", "compile");
-        manifest = createNonModule();
-        result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertNotNull("nbm type is a NetBeans module", result);
-
-
-        artifact = createArtifact("group", "artifact", "1.0", "jar", "compile");
-        deps = new ArrayList<Dependency>();
-        Dependency d = new Dependency();
-        d.setId("group:artifact");
-        deps.add(d);
-        manifest = createNonModule();
-        result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertNull("not a NetBeans module, declared in deps but without explicit value", result);
-
-        d.setExplicitValue("XXX > 1.0");
-        result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertEquals("not a NetBeans module but declared with explicit value", result, d);
-
-        d.setExplicitValue(null);
-        manifest = createModule();
-        result = AbstractNbmMojo.resolveNetBeansDependency(artifact, deps, manifest, log);
-        assertEquals("netbeans module defined in descriptor", result, d);
-    }
-
-    /**
-     * Module is not a library
-     * @throws java.lang.Exception if AbstractNbmMojo.getLibraryArtifacts fail
-     */
-    public void testGetLibraryArtifacts1() throws Exception {
-        System.out.println("getLibraryArtifacts1");
-        Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-        List<Artifact> runtimes = new ArrayList<Artifact>();
-        DependencyNode module = createNode(treeRoot, "gr1", "ar1", "1.0", "jar", "compile", true, runtimes, examinerCache);
-        treeRoot.setChildren( Collections.singletonList( module ));
-        NetBeansModule mdl = new NetBeansModule();
-        List<Artifact> result = AbstractNbmMojo.getLibraryArtifacts(treeRoot, mdl, runtimes, examinerCache, log, false);
-        assertEquals(0, result.size());
-    }
-
-    /**
-     * direct dependency is a library
-     * @throws java.lang.Exception if AbstractNbmMojo.getLibraryArtifacts fail
-     */
-    public void testGetLibraryArtifact2() throws Exception {
-        System.out.println("getLibraryArtifacts2");
-        Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-        List<Artifact> runtimes = new ArrayList<Artifact>();
-        DependencyNode library = createNode(treeRoot, "gr1", "ar1", "1.0", "jar", "compile", false, runtimes, examinerCache);
-        treeRoot.setChildren( Collections.singletonList( library ));
-        NetBeansModule mdl = new NetBeansModule();
-        List<Artifact> result = AbstractNbmMojo.getLibraryArtifacts(treeRoot, mdl, runtimes, examinerCache, log, false);
-        assertEquals(1, result.size());
-    }
-
-    
-    /**
-     * transitive dependency gets included as well.
-     * @throws java.lang.Exception if AbstractNbmMojo.getLibraryArtifacts fail
-     */
-    public void testGetLibraryArtifact3() throws Exception {
-        System.out.println("getLibraryArtifacts3");
-        Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-        List<Artifact> runtimes = new ArrayList<Artifact>();
-        DependencyNode library = createNode(treeRoot, "gr1", "ar1", "1.0", "jar", "compile", false, runtimes, examinerCache);
-        treeRoot.setChildren( Collections.singletonList( library ));
-        DependencyNode translibrary = createNode(library, "gr2", "ar2", "1.0", "jar", "runtime", false, runtimes, examinerCache);
-        ((DefaultDependencyNode)library).setChildren( Collections.singletonList( translibrary ) );
-        
-        NetBeansModule mdl = new NetBeansModule();
-        List<Artifact> result = AbstractNbmMojo.getLibraryArtifacts(treeRoot, mdl, runtimes, examinerCache, log, false);
-        assertEquals(2, result.size());
-    }
-
-    /**
-     * transitive dependency of a module doesn't get included as library
-     * @throws java.lang.Exception if AbstractNbmMojo.getLibraryArtifacts fail
-     */
-    public void testGetLibraryArtifact4() throws Exception {
-        System.out.println("getLibraryArtifacts4");
-        Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-        List<Artifact> runtimes = new ArrayList<Artifact>();
-        DependencyNode module = createNode(treeRoot, "gr1", "ar1", "1.0", "jar", "compile", true, runtimes, examinerCache);
-        treeRoot.setChildren( Collections.singletonList( module ));
-        DependencyNode translibrary = createNode(module, "gr2", "ar2", "1.0", "jar", "runtime", false, runtimes, examinerCache);
-        ((DefaultDependencyNode)module).setChildren( Collections.singletonList( translibrary ) );
-        NetBeansModule mdl = new NetBeansModule();
-        List<Artifact> result = AbstractNbmMojo.getLibraryArtifacts(treeRoot, mdl, runtimes, examinerCache, log, false);
-        assertEquals(0, result.size());
-    }
-
-    /**
-     * transitive dependency of a library is a duplicate of a transitive dependency of a module
-     * -&gt;doesn't get included.
-     * @throws java.lang.Exception if AbstractNbmMojo.getLibraryArtifacts fail
-     */
-    public void testGetLibraryArtifact5() throws Exception {
-        System.out.println("getLibraryArtifacts5");
-        Map<Artifact, ExamineManifest> examinerCache = new HashMap<Artifact, ExamineManifest>();
-        List<Artifact> runtimes = new ArrayList<Artifact>();
-        DependencyNode module = createNode(treeRoot, "gr1", "ar1", "1.0", "jar", "compile", true, runtimes, examinerCache);
-        DependencyNode translibrary = createNode(module, "gr2", "ar2", "1.0", "jar", "runtime", false, runtimes, examinerCache);
-        ((DefaultDependencyNode)module).setChildren( Collections.singletonList( translibrary ) );
-
-        DependencyNode library = createNode(treeRoot, "gr3", "ar3", "1.0", "jar", "compile", false, runtimes, examinerCache);
-        DependencyNode translibrary2 = createNode(library, "gr4", "ar4", "1.0", "jar", "runtime", false, runtimes, examinerCache);
-        ((DefaultDependencyNode)library).setChildren( Collections.singletonList( translibrary2 ) );
-        treeRoot.setChildren( Arrays.asList( new DependencyNode[] { module, library}));
-
-
-        NetBeansModule mdl = new NetBeansModule();
-        List<Artifact> result = AbstractNbmMojo.getLibraryArtifacts(treeRoot, mdl, runtimes, examinerCache, log, false);
-        assertEquals(2, result.size());
-        assertEquals(result.get(0).getId(), library.getArtifact().getId());
-        assertEquals(result.get(1).getId(), translibrary2.getArtifact().getId());
-    }
-
-    private DefaultDependencyNode createNode(DependencyNode parent, String gr, String art, String ver, String pack, String scope, boolean isModule, List<Artifact> runtimes, Map<Artifact, ExamineManifest> cache) {
-        Artifact a = createArtifact(gr, art, ver, pack, scope);
-        DefaultDependencyNode nd = new DefaultDependencyNode(parent, a, ver, scope, ver);
-        ExamineManifest manifest = isModule ? createModule() : createNonModule();
-        runtimes.add(a);
-        cache.put(a, manifest);
-        nd.setChildren( Collections.<DependencyNode>emptyList() );
-        return nd;
-    }
-
-//    private DependencyNode createNode(Artifact a, int state) {
-//        DependencyNode nd = new DefaultDependencyNode(a, state, a);
-//        return nd;
-//    }
-
-    private Artifact createArtifact(String gr, String art, String ver, String pack, String scope) {
-        VersionRange rng = VersionRange.createFromVersion(ver);
-        Artifact a = new DefaultArtifact(gr, art, rng, scope, pack, "classifier", null);
-        a.setDependencyTrail(Collections.EMPTY_LIST);
-        a.setFile(new File(gr + File.separator + art + File.separator + art + "-"+ ver + ".jar"));
-        return a;
-    }
-
-    private ExamineManifest createNonModule() {
-        ExamineManifest manifest = new ExamineManifest(log);
-        manifest.setNetBeansModule(false);
-        return manifest;
-    }
-
-    private ExamineManifest createModule() {
-        ExamineManifest manifest = new ExamineManifest(log);
-        manifest.setNetBeansModule(true);
-        return manifest;
-    }
-}
diff --git a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/BrandingMojoTest.java b/nbm-maven-plugin/src/test/java/org/netbeans/nbm/BrandingMojoTest.java
deleted file mode 100644
index 3268e31..0000000
--- a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/BrandingMojoTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2013 Codehaus.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.netbeans.nbm;
-
-import org.netbeans.nbm.BrandingMojo;
-import java.io.File;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- *
- * @author mkleint
- */
-public class BrandingMojoTest
-{
-    
-    public BrandingMojoTest()
-    {
-    }
-
-    /**
-     * Test of destinationFileName method, of class BrandingMojo.
-     */
-    @Test
-    public void testDestinationFileName()
-    {
-        assertEquals( "cut_brandingToken.gif", BrandingMojo.destinationFileName( "cut.gif", "brandingToken" ) );
-        assertEquals( "cut_brandingToken", BrandingMojo.destinationFileName( "cut", "brandingToken" ) );
-        assertEquals( "cut_pressed_brandingToken.gif", BrandingMojo.destinationFileName( "cut_pressed.gif", "brandingToken" ) );
-        assertEquals( "path1" + File.separator + "path2" + File.separator + "cut_brandingToken", BrandingMojo.destinationFileName( "path1" + File.separator + "path2" + File.separator + "cut", "brandingToken" ) );
-        assertEquals( "path.1" + File.separator + "path.2" + File.separator + "cut_brandingToken", BrandingMojo.destinationFileName( "path.1" + File.separator + "path.2" + File.separator + "cut", "brandingToken" ) );
-        assertEquals( "path.1" + File.separator + "cut_pressed_brandingToken.gif", BrandingMojo.destinationFileName( "path.1" + File.separator + "cut_pressed.gif", "brandingToken" ) );
-    }
-    
-    @Test
-    public void testLocale() {
-        assertEquals("en_us", BrandingMojo.getLocale( "aaa_en_us.properties")[1]);
-        assertEquals("en_us_ca", BrandingMojo.getLocale( "aaa_en_us_ca.properties")[1]);
-        assertEquals("en_us_ca", BrandingMojo.getLocale( "aa_en_us_ca.properties")[1]);
-        assertEquals("en_us_ca", BrandingMojo.getLocale( "bb_aa_en_us_ca.properties")[1]);
-        assertEquals("en", BrandingMojo.getLocale( "bb_aaa_en.properties")[1]);
-        assertEquals(null, BrandingMojo.getLocale( "bb_aaa_end.properties")[1]);
-        assertEquals(null, BrandingMojo.getLocale( "bb_aa_end.properties")[1]);
-        assertEquals(null, BrandingMojo.getLocale( "bb.properties")[1]);
-    }
-}
diff --git a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateClusterAppMojoTest.java b/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateClusterAppMojoTest.java
deleted file mode 100644
index 0e95c07..0000000
--- a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateClusterAppMojoTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2013 Codehaus.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.netbeans.nbm;
-
-import org.netbeans.nbm.CreateClusterAppMojo;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.netbeans.nbm.utils.ExamineManifest;
-import org.netbeans.nbm.CreateClusterAppMojo.BundleTuple;
-import static org.junit.Assert.*;
-import org.junit.Test;
-
-/**
- *
- * @author mkleint
- */
-public class CreateClusterAppMojoTest
-{
-    
-    public CreateClusterAppMojoTest()
-    {
-    }
-    
-    @Test
-    public void computeClusterOrderingTest() throws Exception {
-        HashMap<String, Set<String>> clusterDeps = new HashMap<String, Set<String>>();
-        HashMap<String, Set<String>> clusterModules = new HashMap<String, Set<String>>();
-        clusterModules.put( "platform", new HashSet<String>(Arrays.asList( new String[] {"pl-a", "pl-b", "pl-c"})));
-        clusterModules.put( "ide", new HashSet<String>(Arrays.asList( new String[] {"i-a", "i-b", "i-c"})));
-        clusterModules.put( "java", new HashSet<String>(Arrays.asList( new String[] {"j-a", "j-b", "j-c"})));
-        
-        clusterDeps.put( "java", new HashSet<String>(Arrays.asList( new String[] {"i-a", "pl-b", "pl-c"})));
-        clusterDeps.put( "ide", new HashSet<String>(Arrays.asList( new String[] {"pl-b", "pl-c"})));
-        Map<String, Set<String>> res = CreateClusterAppMojo.computeClusterOrdering( clusterDeps, clusterModules);
-        assertNotNull( res );
-        Set<String> resJava = res.get( "java");
-        assertNotNull( resJava );
-        assertEquals( resJava.size(), 2);
-        assertTrue( resJava.contains( "ide"));
-        assertTrue( resJava.contains( "platform"));
-        
-        Set<String> resIde = res.get( "ide");
-        assertNotNull( resIde );
-        assertEquals( resIde.size(), 1);
-        assertTrue( resIde.contains( "platform"));
-        
-    }
-    
-    @Test
-    public void assignClustersToBundles() throws Exception {
-        ArrayList<BundleTuple> bundles = new ArrayList<BundleTuple>();
-        BundleTuple tup1 = createBundleTuple("a.b.c", new File(getClass().getResource( "/osgimanifests" + File.separator + "a.b.c.MF").toURI()));
-        bundles.add( tup1 );
-        BundleTuple tup2 = createBundleTuple("b.c.d", new File(getClass().getResource( "/osgimanifests" + File.separator + "b.c.d.MF").toURI()));
-        assertTrue(Arrays.toString( tup2.manifest.getOsgiImports().toArray()),  tup2.manifest.getOsgiImports().contains( "a.b.c"));
-        bundles.add( tup2 );
-        HashMap<String, Set<String>> clusterDeps = new HashMap<String, Set<String>>();
-        clusterDeps.put( "java", new HashSet<String>(Arrays.asList( new String[] {"i-a", "pl-b", "pl-c"})));
-        clusterDeps.put( "ide", new HashSet<String>(Arrays.asList( new String[] {"pl-b", "pl-c", "a.b.c"})));
-        
-        CreateClusterAppMojo.assignClustersToBundles(bundles, Collections.<String>emptySet(), clusterDeps, Collections.<String, Set<String>>emptyMap(), null);
-        assertEquals( "ide", tup1.cluster);
-        assertEquals( "ide", tup2.cluster);
-        
-        clusterDeps.clear();
-        clusterDeps.put( "ide", new HashSet<String>(Arrays.asList( new String[] {"i-a", "pl-b", "pl-c"})));
-        clusterDeps.put( "java", new HashSet<String>(Arrays.asList( new String[] {"pl-b", "pl-c", "b.c.d"})));
-        tup2.cluster = null;
-        tup1.cluster = null;
-        
-        CreateClusterAppMojo.assignClustersToBundles(bundles, Collections.<String>emptySet(), clusterDeps, Collections.<String, Set<String>>emptyMap(), null);
-        assertEquals( "java", tup2.cluster);
-        assertEquals( "java", tup1.cluster);
-        
-    }
-
-    private BundleTuple createBundleTuple( String cnb, File file ) throws MojoExecutionException
-    {
-        assertTrue( file.exists());
-        
-        ExamineManifest em = new ExamineManifest( null );
-        em.setManifestFile( file );
-        em.setPopulateDependencies( true);
-        em.checkFile();
-        assertEquals( cnb, em.getModule());
-        BundleTuple toRet = new BundleTuple( null, em);
-                
-        return toRet;
-    }
-}
\ No newline at end of file
diff --git a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateNetBeansFileStructureTest.java b/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateNetBeansFileStructureTest.java
deleted file mode 100644
index 22d9bd5..0000000
--- a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/CreateNetBeansFileStructureTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2012 Codehaus.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.netbeans.nbm;
-
-import org.netbeans.nbm.CreateNetBeansFileStructure;
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Collections;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-
-public class CreateNetBeansFileStructureTest
-        extends AbstractMojoTestCase
-{
-
-    public void testWriteExternal()
-            throws Exception
-    {
-        String localRepository = System.getProperty( "localRepository" );
-        ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
-        ArtifactResolver artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
-        Artifact a = artifactFactory.createBuildArtifact( "junit", "junit", "4.12", "jar" );
-//        DefaultArtifactRepository central = new DefaultArtifactRepository( "central", "http://repo.maven.apache.org/maven2", new DefaultRepositoryLayout() );
-        artifactResolver.resolve( a, Collections.<ArtifactRepository>emptyList(), new DefaultArtifactRepository( "local", new File(localRepository).toURI().toString(), new DefaultRepositoryLayout() ) );
-        StringWriter w = new StringWriter();
-        CreateNetBeansFileStructure.writeExternal( new PrintWriter( w ), a );
-        assertEquals( "CRC:1355517765\nSIZE:314932\nURL:m2:/junit:junit:4.12:jar\nURL:http://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.jar\n", w.toString() );
-    }
-
-}
diff --git a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/NetBeansManifestUpdateMojoTest.java b/nbm-maven-plugin/src/test/java/org/netbeans/nbm/NetBeansManifestUpdateMojoTest.java
deleted file mode 100644
index ecdeb6c..0000000
--- a/nbm-maven-plugin/src/test/java/org/netbeans/nbm/NetBeansManifestUpdateMojoTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright 2008 mkleint.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-
-package org.netbeans.nbm;
-
-import org.netbeans.nbm.NetBeansManifestUpdateMojo;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Pattern;
-import junit.framework.TestCase;
-import org.apache.tools.ant.taskdefs.Manifest;
-
-public class NetBeansManifestUpdateMojoTest extends TestCase {
-    
-    public NetBeansManifestUpdateMojoTest(String testName) {
-        super(testName);
-    }
-
-    public void testCreateCompiledPatternList()
-    {
-        List<String> subpackages = Arrays.asList( new String[] {
-                "org.milos.**",
-                "org.tomas.**"
-        });
-        List<Pattern> result = NetBeansManifestUpdateMojo.createCompiledPatternList( subpackages );
-        assertTrue( matches( "org.milos.Test", result));
-        assertTrue( matches( "org.milos.pack.Test", result));
-        assertTrue( matches( "org.tomas.pack.Test$Inside", result));
-        assertFalse( matches( "org.milan", result));
-        assertFalse( matches( "org.milosclass", result));
-
-        List<String> packages = Arrays.asList( new String[] {
-                "org.milos.*",
-                "org.tomas.*"
-        });
-        result = NetBeansManifestUpdateMojo.createCompiledPatternList( packages );
-        assertTrue( matches( "org.milos.Test", result));
-        assertFalse( matches( "org.milos.pack.Test", result));
-        assertFalse( matches( "org.tomas.pack.Test$Inside", result));
-        assertTrue( matches( "org.tomas.Test$Inside", result));
-        assertFalse( matches( "org.milan", result));
-        assertFalse( matches( "org.milosclass", result));
-
-    }
-
-    private boolean matches(String className, List<Pattern> matchers) {
-        for (Pattern patt : matchers) {
-            if (patt.matcher( className ).matches()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void testShorten()
-    {
-        Locale old = Locale.getDefault();
-        Locale.setDefault( Locale.US );
-        try
-        {
-            assertEquals( null, NetBeansManifestUpdateMojo.shorten ( null ) );
-            assertEquals( null, NetBeansManifestUpdateMojo.shorten ( "" ) );
-            assertEquals( "I typed some description here", NetBeansManifestUpdateMojo.shorten ( "I typed some description here" ) );
-            assertEquals( "Now I'm trying to be serious.", NetBeansManifestUpdateMojo.shorten ( "Now I'm trying to be serious." ) );
-            assertEquals( "A meaningful description.", NetBeansManifestUpdateMojo.shorten ( "A meaningful description. But will it work?" ) );
-            assertEquals( "I have no idea what this module does, do you?", NetBeansManifestUpdateMojo.shorten ( "I have no idea what this module does, do you? No? Fine." ) );
-        }
-        finally
-        {
-            Locale.setDefault( old );
-        }
-    }
-
-    public void testNewlines()
-        throws Exception
-    {
-        Manifest m = new Manifest();
-        Manifest.Section s = m.getMainSection();
-        new NetBeansManifestUpdateMojo().conditionallyAddAttribute( s, "Desc", "Something.\n   Else.\n" );
-        assertEquals( "Something. Else.", s.getAttributeValue( "Desc" ));
-    }
-
-}
diff --git a/nbm-maven-plugin/src/test/resources/osgimanifests/a.b.c.MF b/nbm-maven-plugin/src/test/resources/osgimanifests/a.b.c.MF
deleted file mode 100644
index 4b61376..0000000
--- a/nbm-maven-plugin/src/test/resources/osgimanifests/a.b.c.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Localization: plugin
-Bundle-SymbolicName: a.b.c; singleton:=true
-Require-Bundle: org.eclipse.osgi;bundle-version="[3.7.0,4.0.0)";visibi
- lity:=reexport,org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.
- 0)";visibility:=reexport,org.eclipse.core.jobs;bundle-version="[3.2.0
- ,4.0.0)";visibility:=reexport,org.eclipse.equinox.registry;bundle-ver
- sion="[3.4.0,4.0.0)";visibility:=reexport,org.eclipse.equinox.prefere
- nces;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,org.eclipse.
- core.contenttype;bundle-version="[3.3.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.runtime.compatibility.auth;bundle-version="[3.2.0,4.
- 0.0)";resolution:=optional,org.eclipse.equinox.app;bundle-version="1.
- 0.0";visibility:=reexport
-Export-Package: a.b.c;x-interna
- l:=true,a.b.c.d;x-friends:="org.eclipse.cor
- e.runtime.compatibility"
-Bundle-Version: 3.7.0.v20110110
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %providerName
-Bundle-Name: %pluginName
-Bundle-ManifestVersion: 2
-
diff --git a/nbm-maven-plugin/src/test/resources/osgimanifests/b.c.d.MF b/nbm-maven-plugin/src/test/resources/osgimanifests/b.c.d.MF
deleted file mode 100644
index 2b1c729..0000000
--- a/nbm-maven-plugin/src/test/resources/osgimanifests/b.c.d.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: CDC-1.1/Foundation-1.1,J2SE-1.4
-Bundle-SymbolicName: b.c.d; singleton:=true
-Eclipse-LazyStart: true
-Export-Package: b.c.d;x-friends:="org.eclipse
- .core.resources,org.eclipse.core.runtime.compatibility,org.eclipse.pd
- e.build",b.c.d.d;common=split;mandatory:=co
- mmon; x-friends:="org.eclipse.core.contenttype
-Bundle-Version: 3.6.0.v20110523
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %providerName
-Bundle-Name: %pluginName
-Import-Package: a.b.c;version="[1.0,2.0)",a.b.c.d;version="[1.1, 2.0)"
-Bundle-ManifestVersion: 2
-
diff --git a/nbm-shared/pom.xml b/nbm-shared/pom.xml
deleted file mode 100644
index 4530256..0000000
--- a/nbm-shared/pom.xml
+++ /dev/null
@@ -1,267 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>nb-shared</artifactId>
-    <version>1.3-SNAPSHOT</version>
-    <packaging>jar</packaging>
-
-    <name>Apache NetBeans Maven Utilities - NBM Plugins Utilities</name>
-    <description>Maven plugin for creating Maven Repository out of a Apache NetBeans installation (and other sources) for consumption by the projects using nbm-maven-plugin.
-    </description>
-    <inceptionYear>2005</inceptionYear>
-    <url>http://bits.netbeans.org/mavenutilities/nb-shared</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANS</url>
-    </issueManagement>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>
-    <developers>
-        <developer>
-            <id>mkleint</id>
-            <name>Milos Kleint</name>
-            <email>mkleint@codehaus.org</email>
-            <organization>Codehaus</organization>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>jglick</id>
-            <name>Jesse Glick</name>
-            <email>jglick@codehaus.org</email>
-            <organization>Codehaus</organization>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-    </developers>
-    <contributors>
-        <contributor>
-            <name>Johan Andrén</name>
-            <email>protected</email>
-            <roles>
-                <role>Patch Contributor</role>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Mykola Nikishov</name>
-            <email>mn@mn.com.ua</email>
-            <roles>
-                <role>Patch Contributor</role>
-            </roles>
-        </contributor>
-        <contributor>
-            <name>Frantisek Mantlik</name>
-            <email>frantisek@mantlik.cz</email>
-            <roles>
-                <role>Goal Contributor</role>
-            </roles>
-        </contributor>
-    </contributors>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>animal-sniffer-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                        <configuration>
-                            <signature>
-                                <groupId>org.codehaus.mojo.signature</groupId>
-                                <artifactId>java16</artifactId>
-                                <version>1.0</version>
-                            </signature>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-    <reporting>
-        <plugins>
-            <!--<plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>plugin-management</report>
-                            <report>plugins</report>
-                            <report>project-team</report>
-                            <report>scm</report>
-                            <report>summary</report>
-                           
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>-->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-changes-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                    <!-- <onlyCurrentVersion>true</onlyCurrentVersion>-->
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <quiet>true</quiet>
-                    <links>
-                        <!--<link>http://download-llnw.oracle.com/javaee/1.4/api/</link>-->
-                        <link>http://commons.apache.org/collections/apidocs-COLLECTIONS_3_0/</link>
-                        <link>http://commons.apache.org/dbcp/apidocs/</link>
-                        <link>http://commons.apache.org/fileupload/apidocs/</link>
-                        <link>http://commons.apache.org/logging/apidocs/</link>
-                        <link>http://commons.apache.org/pool/apidocs/</link>
-                        <link>http://junit.sourceforge.net/javadoc/</link>
-                        <link>http://logging.apache.org/log4j/1.2/apidocs/</link>
-                        <link>http://jakarta.apache.org/regexp/apidocs/</link>
-                        <link>http://velocity.apache.org/engine/releases/velocity-1.5/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-artifact/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-artifact-manager/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-model/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-plugin-api/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-project/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-reporting/maven-reporting-api/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-settings/apidocs/</link>
-                    </links>
-                    <tagletArtifacts>
-                        <tagletArtifact>
-                            <groupId>org.apache.maven.plugin-tools</groupId>
-                            <artifactId>maven-plugin-tools-javadoc</artifactId>
-                        </tagletArtifact>
-                        <tagletArtifact>
-                            <groupId>org.codehaus.plexus</groupId>
-                            <artifactId>plexus-component-javadoc</artifactId>
-                            <version>1.5.5</version>
-                        </tagletArtifact>
-                    </tagletArtifacts>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-pmd-plugin</artifactId>
-                <configuration>
-                    <targetJdk>1.6</targetJdk>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-linkcheck-plugin</artifactId>
-                <configuration>
-                    <excludedLinks>
-                        <excludedLink>../../images/codehaus-small.png</excludedLink>
-                        <excludedLink>../../images/mojo_logo.png</excludedLink>
-                        <excludedLink>plugin-info.html</excludedLink>
-                    </excludedLinks>
-                    <!--<excludedPages>
-                        <excludedPage>dependencies.html</excludedPage> 
-                    </excludedPages>-->
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>2.7</version>
-            </plugin> 
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>taglist-maven-plugin</artifactId>
-                <version>2.4</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.12</version>
-            </plugin>
-        </plugins>
-    </reporting>
-    <!--profiles>
-        <profile>
-            <id>tools.jar</id>
-            <activation>
-                <file>
-                    <exists>${java.home}/../lib/tools.jar</exists>
-                </file>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>com.sun</groupId>
-                    <artifactId>tools</artifactId>
-                    <version>1.5.0</version>
-                    <scope>system</scope>
-                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
-                </dependency>
-            </dependencies>
-        </profile>
-    </profiles-->
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>3.0.4</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.9.2</version>
-            <scope>compile</scope>
-            <type>jar</type>
-        </dependency>
-    </dependencies>
-    <properties>
-        <mojo.java.target>1.6</mojo.java.target>
-        <maven.version>3.0.4</maven.version>
-    </properties>
-</project>
diff --git a/nbm-shared/src/main/java/org/netbeans/nbm/utils/AbstractNetbeansMojo.java b/nbm-shared/src/main/java/org/netbeans/nbm/utils/AbstractNetbeansMojo.java
deleted file mode 100644
index db9918f..0000000
--- a/nbm-shared/src/main/java/org/netbeans/nbm/utils/AbstractNetbeansMojo.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm.utils;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Taskdef;
-
-public abstract class AbstractNetbeansMojo
-    extends AbstractMojo
-{
-
-    /**
-     * Creates a project initialized with the same logger.
-     * @return project
-     */
-    protected final Project antProject()
-    {
-        Project antProject = new Project();
-        antProject.init();
-        antProject.addBuildListener( new BuildListener()
-        {
-            @Override
-            public void buildStarted( BuildEvent be )
-            {
-                getLog().debug( "Ant build started" );
-            }
-            @Override
-            public void buildFinished( BuildEvent be )
-            {
-                if ( be.getException() != null )
-                {
-                    getLog().error( be.getMessage(), be.getException() );
-                }
-                else
-                {
-                    getLog().debug( "Ant build finished" );
-                }
-            }
-            @Override
-            public void targetStarted( BuildEvent be )
-            {
-                getLog().info( be.getTarget().getName() + ":" );
-            }
-            @Override
-            public void targetFinished( BuildEvent be )
-            {
-                getLog().debug( be.getTarget().getName() + " finished" );
-            }
-            @Override
-            public void taskStarted( BuildEvent be )
-            {
-                getLog().debug( be.getTask().getTaskName() + " started" );
-            }
-            @Override
-            public void taskFinished( BuildEvent be )
-            {
-                getLog().debug( be.getTask().getTaskName() + " finished" );
-            }
-            @Override
-            public void messageLogged( BuildEvent be )
-            {
-                switch ( be.getPriority() )
-                {
-                    case Project.MSG_ERR:
-                        getLog().error( be.getMessage() );
-                        break;
-                    case Project.MSG_WARN:
-                        getLog().warn( be.getMessage() );
-                        break;
-                    case Project.MSG_INFO:
-                        getLog().info( be.getMessage() );
-                        break;
-                    default:
-                        getLog().debug( be.getMessage() );
-                }
-            }
-        } );
-        return antProject;
-    }
-
-    protected final Project registerNbmAntTasks()
-    {
-        Project antProject = antProject();
-
-        Taskdef taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.MakeListOfNBM" );
-        taskdef.setName( "genlist" );
-        taskdef.execute();
-
-        taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.MakeNBM" );
-        taskdef.setName( "makenbm" );
-        taskdef.execute();
-
-        taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.MakeUpdateDesc" );
-        taskdef.setName( "updatedist" );
-        taskdef.execute();
-
-        taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.CreateModuleXML" );
-        taskdef.setName( "createmodulexml" );
-        taskdef.execute();
-
-        taskdef = (Taskdef) antProject.createTask( "taskdef" );
-        taskdef.setClassname( "org.netbeans.nbbuild.JHIndexer" );
-        taskdef.setName( "jhindexer" );
-        taskdef.execute();
-
-        return antProject;
-    }
-
-
-
-}
diff --git a/nbm-shared/src/main/java/org/netbeans/nbm/utils/ExamineManifest.java b/nbm-shared/src/main/java/org/netbeans/nbm/utils/ExamineManifest.java
deleted file mode 100644
index f75d5ec..0000000
--- a/nbm-shared/src/main/java/org/netbeans/nbm/utils/ExamineManifest.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/* ==========================================================================
- * Copyright 2003-2004 Mevenide Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * =========================================================================
- */
-package org.netbeans.nbm.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Tag examines the manifest of a jar file and retrieves NetBeans specific information.
- * @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
- *
- */
-public class ExamineManifest
-{
-
-    private final Log logger;
-    private File jarFile;
-    private File manifestFile;
-    private boolean netBeansModule;
-    private boolean osgiBundle;
-
-    private boolean localized;
-    private String specVersion;
-    private String implVersion;
-    private String module;
-    private String locBundle;
-    private String classpath;
-    private boolean publicPackages;
-    private boolean populateDependencies = false;
-    private List<String> dependencyTokens = Collections.<String>emptyList();
-    private Set<String> osgiImports = Collections.<String>emptySet();
-    private Set<String> osgiExports = Collections.<String>emptySet();
-
-    private boolean friendPackages = false;
-    private List<String> friends = Collections.<String>emptyList();
-    private List<String> packages = Collections.<String>emptyList();
-
-    private List<String> requires = Collections.<String>emptyList();
-
-    private List<String> provides = Collections.<String>emptyList();
-    //that's the default behaviour without the special manifest entry
-    private boolean bundleAutoload = true;
-
-    public ExamineManifest( Log logger )
-    {
-        this.logger = logger;
-    }
-
-    public void checkFile()
-        throws MojoExecutionException
-    {
-
-        resetExamination();
-
-        Manifest mf = null;
-        if ( jarFile != null )
-        {
-            JarFile jar = null;
-            try
-            {
-                jar = new JarFile( jarFile );
-                mf = jar.getManifest();
-            }
-            catch ( Exception exc )
-            {
-                throw new MojoExecutionException( "Could not open " + jarFile + ": " + exc.getMessage(), exc );
-            }
-            finally
-            {
-                if ( jar != null )
-                {
-                    try
-                    {
-                        jar.close();
-                    }
-                    catch ( IOException io )
-                    {
-                        throw new MojoExecutionException( io.getMessage(), io );
-                    }
-                }
-            }
-        }
-        else if ( manifestFile != null )
-        {
-            InputStream stream = null;
-            try
-            {
-                stream = new FileInputStream( manifestFile );
-                mf = new Manifest( stream );
-            }
-            catch ( Exception exc )
-            {
-                throw new MojoExecutionException( exc.getMessage(), exc );
-            }
-            finally
-            {
-                if ( stream != null )
-                {
-                    try
-                    {
-                        stream.close();
-                    }
-                    catch ( IOException io )
-                    {
-                        throw new MojoExecutionException( io.getMessage(), io );
-                    }
-                }
-            }
-        }
-        if ( mf != null )
-        {
-            processManifest( mf );
-        }
-        else
-        {
-            //MNBMODULE-22
-            File source = manifestFile;
-            if ( source == null )
-            {
-                source = jarFile;
-            }
-            if ( source == null )
-            {
-                logger.debug( "No manifest to examine" );
-            }
-            else
-            {
-                logger.debug( "Cannot find manifest entries in " + source.getAbsolutePath() );
-            }
-        }
-    }
-
-    private void resetExamination()
-    {
-        setNetBeansModule( false );
-        this.localized = false;
-        this.specVersion = null;
-        this.implVersion = null;
-        this.module = null;
-        this.locBundle = null;
-        this.publicPackages = false;
-        classpath = "";
-    }
-
-    private void processManifest( Manifest mf )
-    {
-        Attributes attrs = mf.getMainAttributes();
-        this.module = attrs.getValue( "OpenIDE-Module" );
-        setNetBeansModule( getModule() != null );
-        if ( isNetBeansModule() )
-        {
-            this.locBundle = attrs.getValue( "OpenIDE-Module-Localizing-Bundle" );
-            this.localized = locBundle != null;
-            this.specVersion = attrs.getValue( "OpenIDE-Module-Specification-Version" );
-            this.implVersion = attrs.getValue( "OpenIDE-Module-Implementation-Version" );
-            String cp = attrs.getValue( Attributes.Name.CLASS_PATH );
-            classpath = cp == null ? "" : cp;
-            String value = attrs.getValue( "OpenIDE-Module-Public-Packages" );
-            String frList = attrs.getValue( "OpenIDE-Module-Friends" );
-            if ( value == null || value.trim().equals( "-" ) )
-            {
-                this.publicPackages = false;
-            }
-            else
-            {
-                if ( frList != null )
-                {
-                    this.publicPackages = false;
-                    String[] friendList = StringUtils.stripAll( StringUtils.split( frList, "," ) );
-                    friendPackages = true;
-                    friends = Arrays.asList( friendList );
-                }
-                else
-                {
-                    this.publicPackages = true;
-                }
-                String[] packageList = StringUtils.stripAll( StringUtils.split( value, "," ) );
-                packages = Arrays.asList( packageList );
-            }
-            if ( populateDependencies )
-            {
-                String deps = attrs.getValue( "OpenIDE-Module-Module-Dependencies" );
-                if ( deps != null )
-                {
-                    StringTokenizer tokens = new StringTokenizer( deps, "," );
-                    List<String> depList = new ArrayList<String>();
-                    while ( tokens.hasMoreTokens() )
-                    {
-                        String tok = tokens.nextToken();
-                        //we are just interested in specification and loose dependencies.
-                        int spec = tok.indexOf( '>' );
-                        int impl = tok.indexOf( '=');
-                        if ( spec > 0 )
-                        {
-                            tok = tok.substring( 0, spec );
-                        }
-                        else if ( impl > 0 )
-                        {
-                            tok = tok.substring( 0, impl );
-                        }
-                        int slash = tok.indexOf( '/' );
-                        if ( slash > 0 )
-                        {
-                            tok = tok.substring( 0, slash );
-                        }
-                        depList.add( tok.trim().intern() );
-                    }
-                    this.dependencyTokens = depList;
-                }
-                String req = attrs.getValue( "OpenIDE-Module-Requires" );
-                String prov = attrs.getValue( "OpenIDE-Module-Provides" );
-                String needs = attrs.getValue( "OpenIDE-Module-Needs" );
-                if (prov != null) {
-                    provides = Arrays.asList( StringUtils.stripAll( StringUtils.split( prov, "," ) ));
-                }
-                if (req != null || needs != null) {
-                    requires = new ArrayList<String>();
-                    if (req != null) {
-                        requires.addAll(Arrays.asList( StringUtils.stripAll( StringUtils.split( req, "," ) )));
-                    }
-                    if (needs != null) {
-                        requires.addAll(Arrays.asList( StringUtils.stripAll( StringUtils.split( needs, "," ) )));
-                    }
-                }
-            }
-
-        }
-        else
-        {
-        
-            //check osgi headers first, let nb stuff override it, making nb default
-            String bndName = attrs.getValue( "Bundle-SymbolicName" );
-            if ( bndName != null )
-            {
-                this.osgiBundle = true;
-                this.module =
-                    bndName./* MNBMODULE-125 */replaceFirst( " *;.+", "" )./* MNBMODULE-96 */replace( '-', '_' );
-                this.specVersion = attrs.getValue( "Bundle-Version" );
-                String exp = attrs.getValue( "Export-Package" );
-                String autoload = attrs.getValue( "Nbm-Maven-Plugin-Autoload");
-                if (autoload != null) {
-                    bundleAutoload = Boolean.parseBoolean( autoload );
-                }
-                this.publicPackages = exp != null;
-                if ( populateDependencies )
-                {
-                    //well, this doesn't appear to cover the major way of declation dependencies in osgi - Import-Package
-                    String deps = attrs.getValue( "Require-Bundle" );
-                    if ( deps != null )
-                    {
-                        List<String> depList = new ArrayList<String>();
-                        // http://stackoverflow.com/questions/1757065/java-splitting-a-comma-separated-string-but-ignoring-commas-in-quotes
-                        for ( String piece : deps.split( ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)" ) )
-                        {
-                            depList.add( piece.replaceFirst( ";.+", "" ).trim().intern() );
-                        }
-                        this.dependencyTokens = depList;
-                    }
-                    String imps = attrs.getValue( "Import-Package" );
-                    if ( imps != null )
-                    {
-                        Set<String> depList = new HashSet<String>();
-                        // http://stackoverflow.com/questions/1757065/java-splitting-a-comma-separated-string-but-ignoring-commas-in-quotes
-                        for ( String piece : imps.split( ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)" ) )
-                        {
-                            depList.add( piece.replaceFirst( ";.+", "" ).trim().intern() );
-                        }
-                        this.osgiImports = depList;
-                    }
-                    String exps = attrs.getValue( "Export-Package" );
-                    if ( exps != null )
-                    {
-                        Set<String> depList = new HashSet<String>();
-                        // http://stackoverflow.com/questions/1757065/java-splitting-a-comma-separated-string-but-ignoring-commas-in-quotes
-                        for ( String piece : exps.split( ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)" ) )
-                        {
-                            depList.add( piece.replaceFirst( ";.+", "" ).trim().intern() );
-                        }
-                        this.osgiExports = depList;
-                    }
-                    
-                }
-            }
-            else
-            {
-
-                // for non-netbeans, non-osgi jars.
-                this.specVersion = attrs.getValue( "Specification-Version" );
-                this.implVersion = attrs.getValue( "Implementation-Version" );
-                this.module = attrs.getValue( "Package" );
-                this.publicPackages = false;
-                classpath = "";
-                /*    if ( module != null )
-                {
-                // now we have the package to make it a module definition, add the version there..
-                module = module + "/1";
-                }
-                 */
-                if ( getModule() == null )
-                {
-                    // do we want to do that?
-                    this.module = attrs.getValue( "Extension-Name" );
-                }
-            }
-        }
-
-    }
-
-    /**
-     * The jar file to examine. It is exclusive with manifestFile.
-     * @param jarFileLoc jar file
-     */
-    public void setJarFile( File jarFileLoc )
-    {
-        jarFile = jarFileLoc;
-    }
-
-    /** 
-     * Manifest file to be examined. It is exclusive with jarFile.
-     * @param manifestFileLoc manifedt file
-     */
-    public void setManifestFile( File manifestFileLoc )
-    {
-        manifestFile = manifestFileLoc;
-    }
-
-    /**
-     * Either call {@link #setJarFile} or {@link #setManifestFile} as appropriate.
-     * @param artifactFileLoc a JAR or folder
-     */
-    public void setArtifactFile( File artifactFileLoc )
-    {
-        if ( artifactFileLoc.isFile() )
-        {
-            setJarFile( artifactFileLoc );
-        }
-        else if ( artifactFileLoc.isDirectory() )
-        {
-            File mani = new File( artifactFileLoc, "META-INF/MANIFEST.MF" );
-            if ( mani.isFile() )
-            {
-                setManifestFile( mani );
-            } // else e.g. jarprj/target/classes has no manifest, so nothing to examine
-        }
-        else
-        {
-            throw new IllegalArgumentException( artifactFileLoc.getAbsolutePath() );
-        }
-    }
-
-    public String getClasspath()
-    {
-        return classpath;
-    }
-
-    public boolean isNetBeansModule()
-    {
-        return netBeansModule;
-    }
-
-    public void setNetBeansModule( boolean netBeansModule )
-    {
-        this.netBeansModule = netBeansModule;
-    }
-
-    public boolean isLocalized()
-    {
-        return localized;
-    }
-
-    public String getSpecVersion()
-    {
-        return specVersion;
-    }
-
-    public String getImplVersion()
-    {
-        return implVersion;
-    }
-
-    /**
-     * Code name base of the module only.
-     * Does not include any release version.
-     * @return module code name base
-     */
-    public String getModule()
-    {
-        return module != null ? module.replaceFirst( "/\\d+$", "" ) : module;
-    }
-
-    /**
-     * Full name of module: code name base, then optionally slash and major release version.
-     * @return module full name 
-     */
-    public String getModuleWithRelease()
-    {
-        return module;
-    }
-
-    /**
-     * returns true if there are defined public packages and there is no friend
-     * declaration.
-     * @return true if has public package
-     */
-    public boolean hasPublicPackages()
-    {
-        return publicPackages;
-    }
-
-    public void setPopulateDependencies( boolean populateDependencies )
-    {
-        this.populateDependencies = populateDependencies;
-    }
-
-    public List<String> getDependencyTokens()
-    {
-        return dependencyTokens;
-    }
-
-    /**
-     * returns true if both public packages and friend list are declared.
-     * @return true if has friend package
-     */
-    public boolean hasFriendPackages()
-    {
-        return friendPackages;
-    }
-
-    public List<String> getFriends()
-    {
-        return friends;
-    }
-
-    /**
-     * list of package statements from OpenIDE-Module-Public-Packages.
-     * All items end with .*
-     * @return list of package
-     */
-    public List<String> getPackages()
-    {
-        return packages;
-    }
-
-    public boolean isOsgiBundle()
-    {
-        return osgiBundle;
-    }
-
-    public Set<String> getOsgiImports()
-    {
-        return osgiImports;
-    }
-
-    public Set<String> getOsgiExports()
-    {
-        return osgiExports;
-    }
-    
-    public List<String> getNetBeansRequiresTokens()
-    {
-        return requires;
-    }
-
-    public List<String> getNetBeansProvidesTokens()
-    {
-        return provides;
-    }
-
-    public boolean isBundleAutoload()
-    {
-        return bundleAutoload;
-    }
-
-}
diff --git a/nbm-shared/src/site/site.xml b/nbm-shared/src/site/site.xml
deleted file mode 100644
index bffce38..0000000
--- a/nbm-shared/src/site/site.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-    <skin>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>maven-netbeans-skin</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </skin>  
-    <body>
-    </body>
-</project>
-
diff --git a/nbm-shared/src/test/java/org/netbeans/nbm/utils/ExamineManifestTest.java b/nbm-shared/src/test/java/org/netbeans/nbm/utils/ExamineManifestTest.java
deleted file mode 100644
index be99990..0000000
--- a/nbm-shared/src/test/java/org/netbeans/nbm/utils/ExamineManifestTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2010 jglick.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * under the License.
- */
-
-package org.netbeans.nbm.utils;
-
-import org.netbeans.nbm.utils.ExamineManifest;
-import java.io.File;
-import java.io.PrintWriter;
-import junit.framework.TestCase;
-import org.apache.maven.plugin.logging.SystemStreamLog;
-
-public class ExamineManifestTest extends TestCase
-{
-    
-    public ExamineManifestTest( String testName )
-    {
-        super(testName);
-    }
-
-    public void testDependencyParsing()
-            throws Exception
-    {
-        ExamineManifest em = new ExamineManifest( new SystemStreamLog() );
-        File mf = File.createTempFile( "ExamineManifestTes", ".mf" );
-        mf.deleteOnExit();
-        PrintWriter w = new PrintWriter( mf );
-        w.println( "OpenIDE-Module: org.netbeans.modules.nbjunit/1" );
-        w.println( "OpenIDE-Module-Module-Dependencies: org.netbeans.insane/1, org.netbeans.libs.junit4 > 1.0" );
-        w.flush();
-        w.close();
-        em.setManifestFile( mf );
-        em.setPopulateDependencies( true );
-        em.checkFile();
-        assertEquals( "[org.netbeans.insane, org.netbeans.libs.junit4]", em.getDependencyTokens().toString() );
-        assertEquals( "org.netbeans.modules.nbjunit", em.getModule() );
-        assertEquals( "org.netbeans.modules.nbjunit/1", em.getModuleWithRelease() );
-        em = new ExamineManifest( new SystemStreamLog() );
-        mf.delete();
-        w = new PrintWriter( mf );
-        w.println( "Manifest-Version: 1.0" );
-        w.flush();
-        w.close();
-        em.setManifestFile( mf );
-        em.setPopulateDependencies( true );
-        em.checkFile();
-        assertEquals( null, em.getModule() );
-        assertEquals( null, em.getModuleWithRelease() );
-    }
-
-    public void testBundles()
-            throws Exception
-    {
-        ExamineManifest em = new ExamineManifest( new SystemStreamLog() );
-        File mf = File.createTempFile( "ExamineManifestTest", ".mf" );
-        mf.deleteOnExit();
-        PrintWriter w = new PrintWriter( mf );
-        w.println( "Bundle-SymbolicName: org.eclipse.jdt.core; singleton:=true" );
-        w.println( "Bundle-Version: 3.1.0" );
-        w.println( "Export-Package: org.eclipse.jdt.core," );
-        w.println( " org.eclipse.jdt.internal.formatter.old;x-internal:=true" );
-        w.println( "Require-Bundle: org.eclipse.equinox.registry;bundle-version=\"[3.4.0,4." );
-        w.println( " 0.0)\",org.eclipse.equinox.common;bundle-version=\"[3.2.0,4.0.0)\"" );
-        w.flush();
-        w.close();
-        em.setManifestFile( mf );
-        em.setPopulateDependencies( true );
-        em.checkFile();
-        assertEquals( "org.eclipse.jdt.core", em.getModule() );
-        assertEquals( "3.1.0", em.getSpecVersion() );
-        assertTrue( em.hasPublicPackages() );
-        assertEquals( "[org.eclipse.equinox.registry, org.eclipse.equinox.common]", em.getDependencyTokens().toString() );
-    }
-
-}
diff --git a/netbeansparent/DISCLAIMER b/netbeansparent/DISCLAIMER
deleted file mode 100644
index d6f7fea..0000000
--- a/netbeansparent/DISCLAIMER
+++ /dev/null
@@ -1,8 +0,0 @@
-Apache NetBeans is an effort undergoing incubation at The Apache Software
-Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of
-all newly accepted projects until a further review indicates that the
-infrastructure, communications, and decision making process have stabilized in
-a manner consistent with other successful ASF projects. While incubation
-status is not necessarily a reflection of the completeness or stability of the
-code, it does indicate that the project has yet to be fully endorsed by the
-ASF.
diff --git a/netbeansparent/LICENSE b/netbeansparent/LICENSE
deleted file mode 100644
index de4b130..0000000
--- a/netbeansparent/LICENSE
+++ /dev/null
@@ -1,204 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
diff --git a/netbeansparent/NOTICE b/netbeansparent/NOTICE
deleted file mode 100644
index 96d9609..0000000
--- a/netbeansparent/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache NetBeans
-Copyright 2017-2019 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/netbeansparent/pom.xml b/netbeansparent/pom.xml
deleted file mode 100644
index 210ec15..0000000
--- a/netbeansparent/pom.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache</groupId>
-        <artifactId>apache</artifactId>
-        <version>21</version>
-    </parent>
-
-    <groupId>org.apache.netbeans</groupId>
-    <artifactId>netbeans-parent</artifactId>
-    <version>2-SNAPSHOT</version>
-    <packaging>pom</packaging>
-
-    <name>Apache Netbeans</name>
-    <description>Apache NetBeans (incubating) is an integrated development environment, tooling platform, and application framework.</description>
-    <url>https://netbeans.apache.org/</url>
-    <licenses>
-        <license>
-            <name>The Apache Software License, Version 2.0</name>
-            <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-
-    <developers>
-        <developer>
-            <id>apachenetbeansdev</id>
-            <name>Apache NetBeans Dev Mailing List</name>
-            <email>dev@netbeans.incubator.apache.org</email>
-        </developer>
-    </developers>
-
-    <mailingLists>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) Users List</name>
-            <subscribe>users-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>users-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:users@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-users/</archive>
-        </mailingList>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) Dev List</name>
-            <subscribe>dev-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>dev-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:dev@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-dev/</archive>
-        </mailingList>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) NetCAT List</name>
-            <subscribe>netcat-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>netcat-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:netcat@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-netcat/</archive>
-        </mailingList>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) Announcements List</name>
-            <subscribe>announce-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>announce-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:announce@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-announce/</archive>
-        </mailingList>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) Commits List</name>
-            <subscribe>commits-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>commits-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:commits@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-commits/</archive>
-        </mailingList>
-        <mailingList> 
-            <name>Apache Netbeans (incubating) Notifications List</name>
-            <subscribe>notifications-subscribe@netbeans.incubator.apache.org</subscribe>
-            <unsubscribe>notifications-unsubscribe@netbeans.incubator.apache.org</unsubscribe>
-            <post>mailto:notifications@netbeans.incubator.apache.org</post>
-            <archive>https://mail-archives.apache.org/mod_mbox/netbeans-notifications/</archive>
-        </mailingList>
-    </mailingLists>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-      <tag>HEAD</tag>
-  </scm>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/projects/NETBEANS</url>
-    </issueManagement>
-</project>
diff --git a/parent/pom.xml b/parent/pom.xml
deleted file mode 100644
index 959c232..0000000
--- a/parent/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-    <modelVersion>4.0.0</modelVersion>
-    
-    <parent>
-        <groupId>org.apache.netbeans</groupId>
-        <artifactId>netbeans-parent</artifactId>
-        <version>1</version>
-    </parent>
-    <groupId>org.apache.netbeans.utilities</groupId>
-    <artifactId>utilities-parent</artifactId>
-    <version>1-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Apache Netbeans Maven Utilities</name>
-    <description>Apache Netbeans Maven Utilities is a set of artefacts to build and populate Apache NetBeans artefacts using Apache Maven</description>
-    <url>http://bits.netbeans.org/mavenutilities/parent</url>
-    <licenses>
-        <license>
-            <name>The Apache Software License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>
-    <dependencyManagement>
-        <dependencies>
-            <dependency> 
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.12</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>animal-sniffer-maven-plugin</artifactId>
-                    <version>1.17</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-changes-plugin</artifactId>
-                    <version>2.12.1</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-checkstyle-plugin</artifactId>
-                    <version>3.0.0</version>
-                    <configuration>
-                        <configLocation>config/maven_checks.xml</configLocation>
-                        <headerLocation>config/maven-header.txt</headerLocation>
-                    </configuration>
-                    <dependencies>
-                        <dependency>
-                            <groupId>org.apache.maven.shared</groupId>
-                            <artifactId>maven-shared-resources</artifactId>
-                            <version>2</version>
-                        </dependency>
-                    </dependencies>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-jxr-plugin</artifactId>
-                    <version>3.0.0</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-pmd-plugin</artifactId>
-                    <version>3.10.0</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-linkcheck-plugin</artifactId>
-                    <version>1.2</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-</project>
diff --git a/parent/src/site/site.xml b/parent/src/site/site.xml
deleted file mode 100644
index b78cf91..0000000
--- a/parent/src/site/site.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-    http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-    <skin>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>maven-netbeans-skin</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </skin>
-  <body>  
-  </body>
-</project>
-
diff --git a/archetype/netbeans-platform-app-archetype/pom.xml b/pom.xml
similarity index 82%
rename from archetype/netbeans-platform-app-archetype/pom.xml
rename to pom.xml
index 78074cb..d125c07 100644
--- a/archetype/netbeans-platform-app-archetype/pom.xml
+++ b/pom.xml
@@ -1,11 +1,11 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <groupId>org.netbeans.maven</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
+        <groupId>org.apache.netbeans</groupId>
+        <artifactId>netbeans-parent</artifactId>
+        <version>1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.netbeans.maven.archetypes</groupId>
+    <groupId>org.apache.netbeans.archetypes</groupId>
     <artifactId>netbeans-platform-app-archetype</artifactId>
     <version>1.21-SNAPSHOT</version>
     <packaging>maven-archetype</packaging>
@@ -23,9 +23,9 @@
         <url>https://issues.apache.org/jira/projects/NETBEANS</url>
     </issueManagement>
     <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
+        <connection>scm:git:https://gitbox.apache.org/repos/asf/netbeans-mavenutils-archetype-netbeans-platform-app-archetype.git</connection>
+        <developerConnection>scm:git:gitbox.apache.org/repos/asf/netbeans-mavenutils-archetype-netbeans-platform-app-archetype.git</developerConnection>
+        <url>https://github.com/apache/netbeans-mavenutils-archetype-netbeans-platform-app-archetype</url>
         <tag>master</tag>
     </scm>
     <build>
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/src/main/resources/META-INF/maven/archetype-metadata.xml
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
rename to src/main/resources/META-INF/maven/archetype-metadata.xml
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/application/pom.xml b/src/main/resources/archetype-resources/application/pom.xml
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/application/pom.xml
rename to src/main/resources/archetype-resources/application/pom.xml
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/application/src/test/java/ApplicationTest.java b/src/main/resources/archetype-resources/application/src/test/java/ApplicationTest.java
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/application/src/test/java/ApplicationTest.java
rename to src/main/resources/archetype-resources/application/src/test/java/ApplicationTest.java
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/pom.xml b/src/main/resources/archetype-resources/branding/pom.xml
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/pom.xml
rename to src/main/resources/archetype-resources/branding/pom.xml
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/src/main/resources/archetype-resources/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
rename to src/main/resources/archetype-resources/branding/src/main/nbm-branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
rename to src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties b/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
rename to src/main/resources/archetype-resources/branding/src/main/nbm-branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm/manifest.mf b/src/main/resources/archetype-resources/branding/src/main/nbm/manifest.mf
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/nbm/manifest.mf
rename to src/main/resources/archetype-resources/branding/src/main/nbm/manifest.mf
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/resources/branding/Bundle.properties b/src/main/resources/archetype-resources/branding/src/main/resources/branding/Bundle.properties
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/branding/src/main/resources/branding/Bundle.properties
rename to src/main/resources/archetype-resources/branding/src/main/resources/branding/Bundle.properties
diff --git a/archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/pom.xml b/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from archetype/netbeans-platform-app-archetype/src/main/resources/archetype-resources/pom.xml
rename to src/main/resources/archetype-resources/pom.xml
diff --git a/webskin/pom.xml b/webskin/pom.xml
deleted file mode 100644
index 0139885..0000000
--- a/webskin/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>maven-netbeans-skin</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>jar</packaging>
-
-    <name>Apache NetBeans Maven Utilities - Web skin</name>
-    <description>Maven site skin for Apache Netbeans Utilities.
-    </description>
-    <inceptionYear>2018</inceptionYear>
-    <url>http://bits.netbeans.org/mavenutilities/maven-netbeans-skin</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANS</url>
-    </issueManagement>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</connection>
-        <developerConnection>scm:git:gitbox.apache.org/repos/asf/incubator-netbeans-mavenutils.git</developerConnection>
-        <url>https://github.com/apache/incubator-netbeans-mavenutils</url>
-    </scm>    
-</project>
diff --git a/webskin/src/main/resources/META-INF/maven/site.vm b/webskin/src/main/resources/META-INF/maven/site.vm
deleted file mode 100644
index cbffd58..0000000
--- a/webskin/src/main/resources/META-INF/maven/site.vm
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE html>
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-
-<html class="no-js" lang="en" dir="ltr">
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="x-ua-compatible" content="ie=edge">
-  <title>$title</title>
-  <link rel="stylesheet" href="$relativePath/css/netbeans.css" />
-  <link href="https://fonts.googleapis.com/css?family=Lato:400,700" rel="stylesheet">   
-</head>
-<body>
-<div class="top-bar" id="responsive-menu">
-    <div class='top-bar-left'>
-        <a class="title" href="http://netbeans.apache.org"><img src="./images/apache-netbeans.svg" style="padding: 8px; height: 48px;">Apache NetBeans (incubating)</a>
-    </div>
-    <div class="top-bar-right">
-        <ul class="vertical medium-horizontal menu" style="right: 90px;" data-responsive-menu="drilldown medium-dropdown">
-#* *##set( $stylecompensate = "style='line-height: 1;margin-bottom: 0;padding: 0.7rem 1rem;display: block;'" )
-#* *##if ($project.artifactId == 'nb-repository-plugin')
-            <li> <strong $stylecompensate >NB Repository Plugin</strong> </li>
-#* *##else
-            <li> <a href="../nb-repository-plugin/index.html">NB Repository Plugin</a> </li>
-#* *##end
-#* *##if ($project.artifactId == 'nbm-maven-plugin')
-            <li> <strong $stylecompensate >NBM Plugin</strong> </li>
-#* *##else
-            <li> <a href="../nbm-maven-plugin/index.html">NBM Plugin</a> </li>
-#* *##end
-#* *##if ($project.artifactId == 'nb-shared')
-            <li> <strong $stylecompensate>Shared</strong> </li>
-#* *##else
-            <li> <a href="../nbm-shared/index.html">Shared</a> </li>
-#* *##end
-#* *##if ($project.artifactId == 'utilities-parent')
-            <li> <strong $stylecompensate>Parent</strong> </li>
-#* *##else
-            <li> <a href="../parent/index.html">Parent</a> </li>
-#* *##end
-        </ul>
-    </div>
-</div>
-<div class='grid-container main-content'>
-            <div id="toc" class="toc">
-#* *##foreach( $menu in $decoration.body.menus )
-<div id="toctitle">$menu.name</div>
-<ul class="sectlevel1">
-#* *##foreach( $item in $menu.items )
-<li><a href="$item.href">$item.name</a></li>
-#* *##end
-</ul>
-#* *##end
-</div>
-<div id="preamble">
-<div class="sectionbody">
-$bodyContent
-</div>
-</div>
-</div>
-<div class='grid-container incubator-area' style='margin-top: 64px'>
-    <div class='grid-x grid-padding-x'>
-        <div class='large-auto cell text-center'>
-            <a href="https://www.apache.org/">
-                <img style="width: 320px" title="Apache Software Foundation" src="./images/asf_logo_wide.svg" />
-            </a>
-        </div>
-        <div class='large-auto cell text-center'>
-            <a href="https://www.apache.org/events/current-event.html">
-               <img style="width:234px; height: 60px;" title="Apache Software Foundation current event" src="https://www.apache.org/events/current-event-234x60.png"/>
-            </a>
-        </div>
-    </div>
-</div>
-<div class='footer-disclaimer'>
-    <div class="footer-disclaimer-content">
-        <p>Copyright &copy; 2017-2018 <a href="https://www.apache.org">The Apache Software Foundation</a>.</p>
-        <p>Licensed under the Apache <a href="https://www.apache.org/licenses/">license</a>, version 2.0</p>
-        <p><a href="https://incubator.apache.org/" alt="Apache Incubator"><img src="./images/incubator_feather_egg_logo_bw_crop.png" title="Apache Incubator" /></a></p>
-        <div style='max-width: 40em; margin: 0 auto'>
-            <p>Apache NetBeans is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p>
-            <p>Apache Incubator, Apache, the Apache feather logo, the Apache NetBeans logo, and the Apache Incubator project logo are trademarks of <a href="https://www.apache.org">The Apache Software Foundation</a>.</p>
-            <p>Oracle and Java are registered trademarks of Oracle and/or its affiliates.</p>
-        </div>
-        
-    </div>
-</div>
-<a href="${project.scm.url}"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png" alt="Fork me on GitHub"></a>
-
-
-
-        <script src="./js/vendor/jquery-3.2.1.min.js"></script>
-        <script src="./js/vendor/what-input.js"></script>
-        <script src="./js/vendor/jquery.colorbox-min.js"></script>
-        <script src="./js/vendor/foundation.min.js"></script>
-        <script src="./js/netbeans.js"></script>
-        <script>
-            
-            $(function(){ $(document).foundation(); });
-        </script>
-</body>
diff --git a/webskin/src/main/resources/css/netbeans.css b/webskin/src/main/resources/css/netbeans.css
deleted file mode 100644
index 6add186..0000000
--- a/webskin/src/main/resources/css/netbeans.css
+++ /dev/null
@@ -1 +0,0 @@
-pre,code{font-family:Consolas,Menlo,Monaco,"IBM Plex Mono",Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif}@media print, screen and (min-width: 40em){.reveal,.reveal.tiny,.reveal.small,.reveal.large{right:auto;left:auto;margin:0 auto}}/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}main{display:block}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}input{overflow:visible}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}details{display:block}summary{display:list-item}menu{display:block}canvas{display:inline-block}template{display:none}[hidden]{display:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{box-sizing:border-box;font-size:100%}*,*::before,*::after{box-sizing:inherit}body{margin:0;padding:0;background:#fefefe;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:1.5;color:#0a0a0a;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}textarea{height:auto;min-height:50px;border-radius:0}select{box-sizing:border-box;width:100%;border-radius:0}.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}button{padding:0;appearance:none;border:0;border-radius:0;background:transparent;line-height:1;cursor:auto}[data-whatinput='mouse'] button{outline:0}pre{overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block !important}.is-hidden{display:none !important}.grid-container{padding-right:.625rem;padding-left:.625rem;max-width:62.5rem;margin:0 auto}@media print, screen and (min-width: 40em){.grid-container{padding-right:.938rem;padding-left:.938rem}}.grid-container.fluid{padding-right:.625rem;padding-left:.625rem;max-width:100%;margin:0 auto}@media print, screen and (min-width: 40em){.grid-container.fluid{padding-right:.938rem;padding-left:.938rem}}.grid-container.full{padding-right:0;padding-left:0;max-width:100%;margin:0 auto}.grid-x{display:flex;flex-flow:row wrap}.cell{flex:0 0 auto;min-height:0px;min-width:0px;width:100%}.cell.auto{flex:1 1 0px}.cell.shrink{flex:0 0 auto}.grid-x>.auto{width:auto}.grid-x>.shrink{width:auto}.grid-x>.small-shrink,.grid-x>.small-full,.grid-x>.small-1,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12{flex-basis:auto}@media print, screen and (min-width: 40em){.grid-x>.medium-shrink,.grid-x>.medium-full,.grid-x>.medium-1,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12{flex-basis:auto}}@media print, screen and (min-width: 64em){.grid-x>.large-shrink,.grid-x>.large-full,.grid-x>.large-1,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12{flex-basis:auto}}.grid-x>.small-1{width:8.333%}.grid-x>.small-2{width:16.667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.333%}.grid-x>.small-5{width:41.667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.333%}.grid-x>.small-8{width:66.667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.333%}.grid-x>.small-11{width:91.667%}.grid-x>.small-12{width:100%}@media print, screen and (min-width: 40em){.grid-x>.medium-auto{flex:1 1 0px;width:auto}.grid-x>.medium-shrink{flex:0 0 auto;width:auto}.grid-x>.medium-1{width:8.333%}.grid-x>.medium-2{width:16.667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.333%}.grid-x>.medium-5{width:41.667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.333%}.grid-x>.medium-8{width:66.667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.333%}.grid-x>.medium-11{width:91.667%}.grid-x>.medium-12{width:100%}}@media print, screen and (min-width: 64em){.grid-x>.large-auto{flex:1 1 0px;width:auto}.grid-x>.large-shrink{flex:0 0 auto;width:auto}.grid-x>.large-1{width:8.333%}.grid-x>.large-2{width:16.667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.333%}.grid-x>.large-5{width:41.667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.333%}.grid-x>.large-8{width:66.667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.333%}.grid-x>.large-11{width:91.667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print, screen and (min-width: 40em){.grid-margin-x{margin-left:-.938rem;margin-right:-.938rem}}.grid-margin-x>.cell{width:calc(100% - 1.25rem);margin-left:.625rem;margin-right:.625rem}@media print, screen and (min-width: 40em){.grid-margin-x>.cell{width:calc(100% - 1.875rem);margin-left:.938rem;margin-right:.938rem}}.grid-margin-x>.auto{width:auto}.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print, screen and (min-width: 40em){.grid-margin-x>.auto{width:auto}.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto{width:auto}.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print, screen and (min-width: 64em){.grid-margin-x>.large-auto{width:auto}.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-right:-.625rem;margin-left:-.625rem}@media print, screen and (min-width: 40em){.grid-padding-x .grid-padding-x{margin-right:-.938rem;margin-left:-.938rem}}.grid-container:not(.full)>.grid-padding-x{margin-right:-.625rem;margin-left:-.625rem}@media print, screen and (min-width: 40em){.grid-container:not(.full)>.grid-padding-x{margin-right:-.938rem;margin-left:-.938rem}}.grid-padding-x>.cell{padding-right:.625rem;padding-left:.625rem}@media print, screen and (min-width: 40em){.grid-padding-x>.cell{padding-right:.938rem;padding-left:.938rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.667%}.small-up-7>.cell{width:14.286%}.small-up-8>.cell{width:12.5%}@media print, screen and (min-width: 40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.667%}.medium-up-7>.cell{width:14.286%}.medium-up-8>.cell{width:12.5%}}@media print, screen and (min-width: 64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.667%}.large-up-7>.cell{width:14.286%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.286% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print, screen and (min-width: 40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.286% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.286% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print, screen and (min-width: 64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.286% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse{margin-right:0;margin-left:0}.small-margin-collapse>.cell{margin-right:0;margin-left:0}.small-margin-collapse>.small-1{width:8.333%}.small-margin-collapse>.small-2{width:16.667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.333%}.small-margin-collapse>.small-5{width:41.667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.333%}.small-margin-collapse>.small-8{width:66.667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.333%}.small-margin-collapse>.small-11{width:91.667%}.small-margin-collapse>.small-12{width:100%}@media print, screen and (min-width: 40em){.small-margin-collapse>.medium-1{width:8.333%}.small-margin-collapse>.medium-2{width:16.667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.333%}.small-margin-collapse>.medium-5{width:41.667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.333%}.small-margin-collapse>.medium-8{width:66.667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.333%}.small-margin-collapse>.medium-11{width:91.667%}.small-margin-collapse>.medium-12{width:100%}}@media print, screen and (min-width: 64em){.small-margin-collapse>.large-1{width:8.333%}.small-margin-collapse>.large-2{width:16.667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.333%}.small-margin-collapse>.large-5{width:41.667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.333%}.small-margin-collapse>.large-8{width:66.667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.333%}.small-margin-collapse>.large-11{width:91.667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-right:0;margin-left:0}.small-padding-collapse>.cell{padding-right:0;padding-left:0}@media print, screen and (min-width: 40em){.medium-margin-collapse{margin-right:0;margin-left:0}.medium-margin-collapse>.cell{margin-right:0;margin-left:0}}@media print, screen and (min-width: 40em){.medium-margin-collapse>.small-1{width:8.333%}.medium-margin-collapse>.small-2{width:16.667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.333%}.medium-margin-collapse>.small-5{width:41.667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.333%}.medium-margin-collapse>.small-8{width:66.667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.333%}.medium-margin-collapse>.small-11{width:91.667%}.medium-margin-collapse>.small-12{width:100%}}@media print, screen and (min-width: 40em){.medium-margin-collapse>.medium-1{width:8.333%}.medium-margin-collapse>.medium-2{width:16.667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.333%}.medium-margin-collapse>.medium-5{width:41.667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.333%}.medium-margin-collapse>.medium-8{width:66.667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.333%}.medium-margin-collapse>.medium-11{width:91.667%}.medium-margin-collapse>.medium-12{width:100%}}@media print, screen and (min-width: 64em){.medium-margin-collapse>.large-1{width:8.333%}.medium-margin-collapse>.large-2{width:16.667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.333%}.medium-margin-collapse>.large-5{width:41.667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.333%}.medium-margin-collapse>.large-8{width:66.667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.333%}.medium-margin-collapse>.large-11{width:91.667%}.medium-margin-collapse>.large-12{width:100%}}@media print, screen and (min-width: 40em){.medium-padding-collapse{margin-right:0;margin-left:0}.medium-padding-collapse>.cell{padding-right:0;padding-left:0}}@media print, screen and (min-width: 64em){.large-margin-collapse{margin-right:0;margin-left:0}.large-margin-collapse>.cell{margin-right:0;margin-left:0}}@media print, screen and (min-width: 64em){.large-margin-collapse>.small-1{width:8.333%}.large-margin-collapse>.small-2{width:16.667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.333%}.large-margin-collapse>.small-5{width:41.667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.333%}.large-margin-collapse>.small-8{width:66.667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.333%}.large-margin-collapse>.small-11{width:91.667%}.large-margin-collapse>.small-12{width:100%}}@media print, screen and (min-width: 64em){.large-margin-collapse>.medium-1{width:8.333%}.large-margin-collapse>.medium-2{width:16.667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.333%}.large-margin-collapse>.medium-5{width:41.667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.333%}.large-margin-collapse>.medium-8{width:66.667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.333%}.large-margin-collapse>.medium-11{width:91.667%}.large-margin-collapse>.medium-12{width:100%}}@media print, screen and (min-width: 64em){.large-margin-collapse>.large-1{width:8.333%}.large-margin-collapse>.large-2{width:16.667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.333%}.large-margin-collapse>.large-5{width:41.667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.333%}.large-margin-collapse>.large-8{width:66.667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.333%}.large-margin-collapse>.large-11{width:91.667%}.large-margin-collapse>.large-12{width:100%}}@media print, screen and (min-width: 64em){.large-padding-collapse{margin-right:0;margin-left:0}.large-padding-collapse>.cell{padding-right:0;padding-left:0}}.small-offset-0{margin-left:0%}.grid-margin-x>.small-offset-0{margin-left:calc(0% + .625rem)}.small-offset-1{margin-left:8.333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.333% + .625rem)}.small-offset-2{margin-left:16.667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.333% + .625rem)}.small-offset-5{margin-left:41.667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.333% + .625rem)}.small-offset-8{margin-left:66.667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.333% + .625rem)}.small-offset-11{margin-left:91.667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.667% + .625rem)}@media print, screen and (min-width: 40em){.medium-offset-0{margin-left:0%}.grid-margin-x>.medium-offset-0{margin-left:calc(0% + .938rem)}.medium-offset-1{margin-left:8.333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.333% + .938rem)}.medium-offset-2{margin-left:16.667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.667% + .938rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .938rem)}.medium-offset-4{margin-left:33.333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.333% + .938rem)}.medium-offset-5{margin-left:41.667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.667% + .938rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .938rem)}.medium-offset-7{margin-left:58.333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.333% + .938rem)}.medium-offset-8{margin-left:66.667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.667% + .938rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .938rem)}.medium-offset-10{margin-left:83.333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.333% + .938rem)}.medium-offset-11{margin-left:91.667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.667% + .938rem)}}@media print, screen and (min-width: 64em){.large-offset-0{margin-left:0%}.grid-margin-x>.large-offset-0{margin-left:calc(0% + .938rem)}.large-offset-1{margin-left:8.333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.333% + .938rem)}.large-offset-2{margin-left:16.667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.667% + .938rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .938rem)}.large-offset-4{margin-left:33.333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.333% + .938rem)}.large-offset-5{margin-left:41.667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.667% + .938rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .938rem)}.large-offset-7{margin-left:58.333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.333% + .938rem)}.large-offset-8{margin-left:66.667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.667% + .938rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .938rem)}.large-offset-10{margin-left:83.333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.333% + .938rem)}.large-offset-11{margin-left:91.667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.667% + .938rem)}}.grid-y{display:flex;flex-flow:column nowrap}.grid-y>.cell{width:auto}.grid-y>.auto{height:auto}.grid-y>.shrink{height:auto}.grid-y>.small-shrink,.grid-y>.small-full,.grid-y>.small-1,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12{flex-basis:auto}@media print, screen and (min-width: 40em){.grid-y>.medium-shrink,.grid-y>.medium-full,.grid-y>.medium-1,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12{flex-basis:auto}}@media print, screen and (min-width: 64em){.grid-y>.large-shrink,.grid-y>.large-full,.grid-y>.large-1,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12{flex-basis:auto}}.grid-y>.small-1{height:8.333%}.grid-y>.small-2{height:16.667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.333%}.grid-y>.small-5{height:41.667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.333%}.grid-y>.small-8{height:66.667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.333%}.grid-y>.small-11{height:91.667%}.grid-y>.small-12{height:100%}@media print, screen and (min-width: 40em){.grid-y>.medium-auto{flex:1 1 0px;height:auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.333%}.grid-y>.medium-2{height:16.667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.333%}.grid-y>.medium-5{height:41.667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.333%}.grid-y>.medium-8{height:66.667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.333%}.grid-y>.medium-11{height:91.667%}.grid-y>.medium-12{height:100%}}@media print, screen and (min-width: 64em){.grid-y>.large-auto{flex:1 1 0px;height:auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.333%}.grid-y>.large-2{height:16.667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.333%}.grid-y>.large-5{height:41.667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.333%}.grid-y>.large-8{height:66.667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.333%}.grid-y>.large-11{height:91.667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print, screen and (min-width: 40em){.grid-padding-y .grid-padding-y{margin-top:-.938rem;margin-bottom:-.938rem}}.grid-padding-y>.cell{padding-top:.625rem;padding-bottom:.625rem}@media print, screen and (min-width: 40em){.grid-padding-y>.cell{padding-top:.938rem;padding-bottom:.938rem}}.grid-margin-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print, screen and (min-width: 40em){.grid-margin-y{margin-top:-.938rem;margin-bottom:-.938rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-top:.625rem;margin-bottom:.625rem}@media print, screen and (min-width: 40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-top:.938rem;margin-bottom:.938rem}}.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print, screen and (min-width: 40em){.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto{height:auto}.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print, screen and (min-width: 64em){.grid-margin-y>.large-auto{height:auto}.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame{overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;width:100vw}.cell .grid-frame{width:100%}.cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}.cell-block-y{overflow-y:auto;max-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}.cell-block-container{display:flex;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{max-height:100%;flex-wrap:nowrap}@media print, screen and (min-width: 40em){.medium-grid-frame{overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}.medium-cell-block-container{display:flex;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{max-height:100%;flex-wrap:nowrap}.medium-cell-block-y{overflow-y:auto;max-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}}@media print, screen and (min-width: 64em){.large-grid-frame{overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}.large-cell-block-container{display:flex;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{max-height:100%;flex-wrap:nowrap}.large-cell-block-y{overflow-y:auto;max-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-stype:-ms-autohiding-scrollbar}}.grid-y.grid-frame{width:auto;overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;height:100vh}@media print, screen and (min-width: 40em){.grid-y.medium-grid-frame{width:auto;overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;height:100vh}}@media print, screen and (min-width: 64em){.grid-y.large-grid-frame{width:auto;overflow:hidden;position:relative;flex-wrap:nowrap;align-items:stretch;height:100vh}}.cell .grid-y.grid-frame{height:100%}@media print, screen and (min-width: 40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print, screen and (min-width: 64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print, screen and (min-width: 40em){.grid-margin-y{margin-top:-.938rem;margin-bottom:-.938rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-top:.625rem;margin-bottom:.625rem}@media print, screen and (min-width: 40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-top:.938rem;margin-bottom:.938rem}}.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print, screen and (min-width: 40em){.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto{height:auto}.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print, screen and (min-width: 64em){.grid-margin-y>.large-auto{height:auto}.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print, screen and (min-width: 40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print, screen and (min-width: 64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print, screen and (min-width: 40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print, screen and (min-width: 64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}p{margin-bottom:1rem;font-size:inherit;line-height:1.6;text-rendering:optimizeLegibility}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:80%;line-height:inherit}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;color:inherit;text-rendering:optimizeLegibility}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small{line-height:0;color:#cacaca}h1,.h1{font-size:1.5rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h2,.h2{font-size:1.25rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h3,.h3{font-size:1.188rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h4,.h4{font-size:1.125rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h5,.h5{font-size:1.062rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h6,.h6{font-size:1rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}@media print, screen and (min-width: 40em){h1,.h1{font-size:3rem}h2,.h2{font-size:2.5rem}h3,.h3{font-size:1.938rem}h4,.h4{font-size:1.562rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}}a{line-height:inherit;color:#1779ba;text-decoration:none;cursor:pointer}a:hover,a:focus{color:#1468a0}a img{border:0}hr{clear:both;max-width:62.5rem;height:0;margin:1.25rem auto;border-top:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}ul,ol,dl{margin-bottom:1rem;list-style-position:outside;line-height:1.6}li{font-size:inherit}ul{margin-left:1.25rem;list-style-type:disc}ol{margin-left:1.25rem}ul ul,ol ul,ul ol,ol ol{margin-left:1.25rem;margin-bottom:0}dl{margin-bottom:1rem}dl dt{margin-bottom:.3rem;font-weight:bold}blockquote{margin:0 0 1rem;padding:.562rem 1.25rem 0 1.188rem;border-left:1px solid #cacaca}blockquote,blockquote p{line-height:1.6;color:#8a8a8a}cite{display:block;font-size:.812rem;color:#8a8a8a}cite:before{content:"— "}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure{margin:0}code{padding:.125rem .312rem .062rem;border:1px solid #cacaca;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;color:#0a0a0a}kbd{margin:0;padding:.125rem .25rem 0;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;color:#0a0a0a}.subheader{margin-top:.2rem;margin-bottom:.5rem;font-weight:normal;line-height:1.4;color:#8a8a8a}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ul.no-bullet,ol.no-bullet{margin-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print, screen and (min-width: 40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print, screen and (min-width: 64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none !important}@media print{*{background:transparent !important;box-shadow:none !important;color:black !important;text-shadow:none !important}.show-for-print{display:block !important}.hide-for-print{display:none !important}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^='javascript:']:after,a[href^='#']:after{content:''}abbr[title]:after{content:" (" attr(title) ")"}pre,blockquote{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}[type='text'],[type='password'],[type='date'],[type='datetime'],[type='datetime-local'],[type='month'],[type='week'],[type='email'],[type='number'],[type='search'],[type='tel'],[type='time'],[type='url'],[type='color'],textarea{display:block;box-sizing:border-box;width:100%;height:2.438rem;margin:0 0 1rem;padding:.5rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.5;color:#0a0a0a;transition:box-shadow 0.5s,border-color 0.25s ease-in-out;appearance:none}[type='text']:focus,[type='password']:focus,[type='date']:focus,[type='datetime']:focus,[type='datetime-local']:focus,[type='month']:focus,[type='week']:focus,[type='email']:focus,[type='number']:focus,[type='search']:focus,[type='tel']:focus,[type='time']:focus,[type='url']:focus,[type='color']:focus,textarea:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow 0.5s,border-color 0.25s ease-in-out}textarea{max-width:100%}textarea[rows]{height:auto}input::placeholder,textarea::placeholder{color:#cacaca}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type='submit'],[type='button']{appearance:none;border-radius:0}input[type='search']{box-sizing:border-box}[type='file'],[type='checkbox'],[type='radio']{margin:0 0 1rem}[type='checkbox']+label,[type='radio']+label{display:inline-block;vertical-align:baseline;margin-left:.5rem;margin-right:1rem;margin-bottom:0}[type='checkbox']+label[for],[type='radio']+label[for]{cursor:pointer}label>[type='checkbox'],label>[type='radio']{margin-right:.5rem}[type='file']{width:100%}label{display:block;margin:0;font-size:.875rem;font-weight:normal;line-height:1.8;color:#0a0a0a}label.middle{margin:0 0 1rem;padding:.562rem 0}.help-text{margin-top:-.5rem;font-size:.812rem;font-style:italic;color:#0a0a0a}.input-group{display:flex;width:100%;margin-bottom:1rem;align-items:stretch}.input-group>:first-child{border-radius:0 0 0 0}.input-group>:last-child>*{border-radius:0 0 0 0}.input-group-label,.input-group-field,.input-group-button,.input-group-button a,.input-group-button input,.input-group-button button,.input-group-button label{margin:0;white-space:nowrap}.input-group-label{padding:0 1rem;border:1px solid #cacaca;background:#e6e6e6;color:#0a0a0a;text-align:center;white-space:nowrap;display:flex;flex:0 0 auto;align-items:center}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{border-radius:0;flex:1 1 0px;height:auto;min-width:0}.input-group-button{padding-top:0;padding-bottom:0;text-align:center;display:flex;flex:0 0 auto}.input-group-button a,.input-group-button input,.input-group-button button,.input-group-button label{height:auto;align-self:stretch;padding-top:0;padding-bottom:0;font-size:1rem}fieldset{margin:0;padding:0;border:0}legend{max-width:100%;margin-bottom:.5rem}.fieldset{margin:1.125rem 0;padding:1.25rem;border:1px solid #cacaca}.fieldset legend{margin:0;margin-left:-.188rem;padding:0 .188rem}select{height:2.438rem;margin:0 0 1rem;padding:.5rem;appearance:none;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.5;color:#0a0a0a;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>");background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;padding-right:1.5rem;transition:box-shadow 0.5s,border-color 0.25s ease-in-out}@media screen and (min-width: 0\0){select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==")}}select:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow 0.5s,border-color 0.25s ease-in-out}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{height:auto;background-image:none}.is-invalid-input:not(:focus){border-color:#cc4b37;background-color:#f9ecea}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.is-invalid-label{color:#cc4b37}.form-error{display:none;margin-top:-.5rem;margin-bottom:1rem;font-size:.75rem;font-weight:bold;color:#cc4b37}.form-error.is-visible{display:block}.button{display:inline-block;vertical-align:middle;margin:0 0 1rem 0;font-family:inherit;padding:0.85em 1em;-webkit-appearance:none;border:1px solid transparent;border-radius:0;transition:background-color 0.25s ease-out,color 0.25s ease-out;font-size:0.9rem;line-height:1;text-align:center;cursor:pointer;background-color:#1779ba;color:#fefefe}[data-whatinput='mouse'] .button{outline:0}.button:hover,.button:focus{background-color:#14679e;color:#fefefe}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;width:100%;margin-right:0;margin-left:0}.button.primary{background-color:#1779ba;color:#fefefe}.button.primary:hover,.button.primary:focus{background-color:#126195;color:#fefefe}.button.secondary{background-color:#767676;color:#fefefe}.button.secondary:hover,.button.secondary:focus{background-color:#5e5e5e;color:#fefefe}.button.success{background-color:#3adb76;color:#0a0a0a}.button.success:hover,.button.success:focus{background-color:#22bb5b;color:#0a0a0a}.button.warning{background-color:#ffae00;color:#0a0a0a}.button.warning:hover,.button.warning:focus{background-color:#cc8b00;color:#0a0a0a}.button.alert{background-color:#cc4b37;color:#fefefe}.button.alert:hover,.button.alert:focus{background-color:#a53b2a;color:#fefefe}.button.disabled,.button[disabled]{opacity:.25;cursor:not-allowed}.button.disabled,.button.disabled:hover,.button.disabled:focus,.button[disabled],.button[disabled]:hover,.button[disabled]:focus{background-color:#1779ba;color:#fefefe}.button.disabled.primary,.button[disabled].primary{opacity:.25;cursor:not-allowed}.button.disabled.primary,.button.disabled.primary:hover,.button.disabled.primary:focus,.button[disabled].primary,.button[disabled].primary:hover,.button[disabled].primary:focus{background-color:#1779ba;color:#fefefe}.button.disabled.secondary,.button[disabled].secondary{opacity:.25;cursor:not-allowed}.button.disabled.secondary,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#767676;color:#fefefe}.button.disabled.success,.button[disabled].success{opacity:.25;cursor:not-allowed}.button.disabled.success,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#3adb76;color:#0a0a0a}.button.disabled.warning,.button[disabled].warning{opacity:.25;cursor:not-allowed}.button.disabled.warning,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#ffae00;color:#0a0a0a}.button.disabled.alert,.button[disabled].alert{opacity:.25;cursor:not-allowed}.button.disabled.alert,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cc4b37;color:#fefefe}.button.hollow{border:1px solid #1779ba;color:#1779ba}.button.hollow,.button.hollow:hover,.button.hollow:focus{background-color:transparent}.button.hollow.disabled,.button.hollow.disabled:hover,.button.hollow.disabled:focus,.button.hollow[disabled],.button.hollow[disabled]:hover,.button.hollow[disabled]:focus{background-color:transparent}.button.hollow:hover,.button.hollow:focus{border-color:#0c3d5d;color:#0c3d5d}.button.hollow:hover.disabled,.button.hollow:hover[disabled],.button.hollow:focus.disabled,.button.hollow:focus[disabled]{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:hover,.button.hollow.primary:focus{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary:hover.disabled,.button.hollow.primary:hover[disabled],.button.hollow.primary:focus.disabled,.button.hollow.primary:focus[disabled]{border:1px solid #1779ba;color:#1779ba}.button.hollow.secondary{border:1px solid #767676;color:#767676}.button.hollow.secondary:hover,.button.hollow.secondary:focus{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.secondary:hover.disabled,.button.hollow.secondary:hover[disabled],.button.hollow.secondary:focus.disabled,.button.hollow.secondary:focus[disabled]{border:1px solid #767676;color:#767676}.button.hollow.success{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:hover,.button.hollow.success:focus{border-color:#157539;color:#157539}.button.hollow.success:hover.disabled,.button.hollow.success:hover[disabled],.button.hollow.success:focus.disabled,.button.hollow.success:focus[disabled]{border:1px solid #3adb76;color:#3adb76}.button.hollow.warning{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:hover,.button.hollow.warning:focus{border-color:#805700;color:#805700}.button.hollow.warning:hover.disabled,.button.hollow.warning:hover[disabled],.button.hollow.warning:focus.disabled,.button.hollow.warning:focus[disabled]{border:1px solid #ffae00;color:#ffae00}.button.hollow.alert{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:hover,.button.hollow.alert:focus{border-color:#67251a;color:#67251a}.button.hollow.alert:hover.disabled,.button.hollow.alert:hover[disabled],.button.hollow.alert:focus.disabled,.button.hollow.alert:focus[disabled]{border:1px solid #cc4b37;color:#cc4b37}.button.clear{border:1px solid #1779ba;color:#1779ba}.button.clear,.button.clear:hover,.button.clear:focus{background-color:transparent}.button.clear.disabled,.button.clear.disabled:hover,.button.clear.disabled:focus,.button.clear[disabled],.button.clear[disabled]:hover,.button.clear[disabled]:focus{background-color:transparent}.button.clear:hover,.button.clear:focus{border-color:#0c3d5d;color:#0c3d5d}.button.clear:hover.disabled,.button.clear:hover[disabled],.button.clear:focus.disabled,.button.clear:focus[disabled]{border:1px solid #1779ba;color:#1779ba}.button.clear,.button.clear.disabled,.button.clear[disabled],.button.clear:hover,.button.clear:hover.disabled,.button.clear:hover[disabled],.button.clear:focus,.button.clear:focus.disabled,.button.clear:focus[disabled]{border-color:transparent}.button.clear.primary{border:1px solid #1779ba;color:#1779ba}.button.clear.primary:hover,.button.clear.primary:focus{border-color:#0c3d5d;color:#0c3d5d}.button.clear.primary:hover.disabled,.button.clear.primary:hover[disabled],.button.clear.primary:focus.disabled,.button.clear.primary:focus[disabled]{border:1px solid #1779ba;color:#1779ba}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary[disabled],.button.clear.primary:hover,.button.clear.primary:hover.disabled,.button.clear.primary:hover[disabled],.button.clear.primary:focus,.button.clear.primary:focus.disabled,.button.clear.primary:focus[disabled]{border-color:transparent}.button.clear.secondary{border:1px solid #767676;color:#767676}.button.clear.secondary:hover,.button.clear.secondary:focus{border-color:#3b3b3b;color:#3b3b3b}.button.clear.secondary:hover.disabled,.button.clear.secondary:hover[disabled],.button.clear.secondary:focus.disabled,.button.clear.secondary:focus[disabled]{border:1px solid #767676;color:#767676}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary[disabled],.button.clear.secondary:hover,.button.clear.secondary:hover.disabled,.button.clear.secondary:hover[disabled],.button.clear.secondary:focus,.button.clear.secondary:focus.disabled,.button.clear.secondary:focus[disabled]{border-color:transparent}.button.clear.success{border:1px solid #3adb76;color:#3adb76}.button.clear.success:hover,.button.clear.success:focus{border-color:#157539;color:#157539}.button.clear.success:hover.disabled,.button.clear.success:hover[disabled],.button.clear.success:focus.disabled,.button.clear.success:focus[disabled]{border:1px solid #3adb76;color:#3adb76}.button.clear.success,.button.clear.success.disabled,.button.clear.success[disabled],.button.clear.success:hover,.button.clear.success:hover.disabled,.button.clear.success:hover[disabled],.button.clear.success:focus,.button.clear.success:focus.disabled,.button.clear.success:focus[disabled]{border-color:transparent}.button.clear.warning{border:1px solid #ffae00;color:#ffae00}.button.clear.warning:hover,.button.clear.warning:focus{border-color:#805700;color:#805700}.button.clear.warning:hover.disabled,.button.clear.warning:hover[disabled],.button.clear.warning:focus.disabled,.button.clear.warning:focus[disabled]{border:1px solid #ffae00;color:#ffae00}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning[disabled],.button.clear.warning:hover,.button.clear.warning:hover.disabled,.button.clear.warning:hover[disabled],.button.clear.warning:focus,.button.clear.warning:focus.disabled,.button.clear.warning:focus[disabled]{border-color:transparent}.button.clear.alert{border:1px solid #cc4b37;color:#cc4b37}.button.clear.alert:hover,.button.clear.alert:focus{border-color:#67251a;color:#67251a}.button.clear.alert:hover.disabled,.button.clear.alert:hover[disabled],.button.clear.alert:focus.disabled,.button.clear.alert:focus[disabled]{border:1px solid #cc4b37;color:#cc4b37}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert[disabled],.button.clear.alert:hover,.button.clear.alert:hover.disabled,.button.clear.alert:hover[disabled],.button.clear.alert:focus,.button.clear.alert:focus.disabled,.button.clear.alert:focus[disabled]{border-color:transparent}.button.dropdown::after{display:block;width:0;height:0;border:inset .4em;content:'';border-bottom-width:0;border-top-style:solid;border-color:#fefefe transparent transparent;position:relative;top:0.4em;display:inline-block;float:right;margin-left:1em}.button.dropdown.hollow::after{border-top-color:#1779ba}.button.dropdown.hollow.primary::after{border-top-color:#1779ba}.button.dropdown.hollow.secondary::after{border-top-color:#767676}.button.dropdown.hollow.success::after{border-top-color:#3adb76}.button.dropdown.hollow.warning::after{border-top-color:#ffae00}.button.dropdown.hollow.alert::after{border-top-color:#cc4b37}.button.arrow-only::after{top:-0.1em;float:none;margin-left:0}a.button:hover,a.button:focus{text-decoration:none}.accordion{margin-left:0;background:#fefefe;list-style-type:none}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child{border-radius:0 0 0 0}.accordion-item:last-child>:last-child{border-radius:0 0 0 0}.accordion-title{position:relative;display:block;padding:1.25rem 1rem;border:1px solid #e6e6e6;border-bottom:0;font-size:.75rem;line-height:1;color:#1779ba}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0 0 0 0}.accordion-title:hover,.accordion-title:focus{background-color:#e6e6e6}.accordion-title::before{position:absolute;top:50%;right:1rem;margin-top:-0.5rem;content:'+'}.is-active>.accordion-title::before{content:'\2013'}.accordion-content{display:none;padding:1rem;border:1px solid #e6e6e6;border-bottom:0;background-color:#fefefe;color:#0a0a0a}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.accordion-menu li{width:100%}.accordion-menu a{padding:0.7rem 1rem}.accordion-menu .is-accordion-submenu a{padding:0.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-right:0;margin-left:1rem}.accordion-menu.align-right .nested.is-accordion-submenu{margin-right:1rem;margin-left:0}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;position:absolute;top:50%;margin-top:-3px;right:1rem}.accordion-menu.align-left .is-accordion-submenu-parent>a::after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a::after{right:auto;left:1rem}.accordion-menu .is-accordion-submenu-parent[aria-expanded='true']>a::after{transform:rotate(180deg);transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{position:absolute;top:0;right:0;cursor:pointer;width:40px;height:40px}.submenu-toggle::after{display:block;width:0;height:0;border:inset 6px;content:'';border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;top:0;bottom:0;margin:auto}.submenu-toggle[aria-expanded='true']::after{transform:scaleY(-1);transform-origin:50% 50%}.submenu-toggle-text{position:absolute !important;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;clip-path:inset(50%);border:0}.badge{display:inline-block;min-width:2.1em;padding:.3em;border-radius:50%;font-size:.6rem;text-align:center;background:#1779ba;color:#fefefe}.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{margin:0 0 1rem 0;list-style:none}.breadcrumbs::before,.breadcrumbs::after{display:table;content:' ';flex-basis:0;order:1}.breadcrumbs::after{clear:both}.breadcrumbs li{float:left;font-size:.688rem;color:#0a0a0a;cursor:default;text-transform:uppercase}.breadcrumbs li:not(:last-child)::after{position:relative;margin:0 .75rem;opacity:1;content:"/";color:#cacaca}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.button-group{margin-bottom:1rem;display:flex;flex-wrap:nowrap;align-items:stretch}.button-group::before,.button-group::after{display:table;content:' ';flex-basis:0;order:1}.button-group::after{clear:both}.button-group .button{margin:0;margin-right:1px;margin-bottom:1px;font-size:0.9rem;flex:0 0 auto}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{flex:1 1 0px}.button-group.primary .button{background-color:#1779ba;color:#fefefe}.button-group.primary .button:hover,.button-group.primary .button:focus{background-color:#126195;color:#fefefe}.button-group.secondary .button{background-color:#767676;color:#fefefe}.button-group.secondary .button:hover,.button-group.secondary .button:focus{background-color:#5e5e5e;color:#fefefe}.button-group.success .button{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:hover,.button-group.success .button:focus{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:hover,.button-group.warning .button:focus{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:hover,.button-group.alert .button:focus{background-color:#a53b2a;color:#fefefe}.button-group.stacked,.button-group.stacked-for-small,.button-group.stacked-for-medium{flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-small .button,.button-group.stacked-for-medium .button{flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-small .button:last-child,.button-group.stacked-for-medium .button:last-child{margin-bottom:0}@media print, screen and (min-width: 40em){.button-group.stacked-for-small .button{flex:1 1 0px;margin-bottom:0}}@media print, screen and (min-width: 64em){.button-group.stacked-for-medium .button{flex:1 1 0px;margin-bottom:0}}@media screen and (max-width: 39.938em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}.callout{position:relative;margin:0 0 1rem 0;padding:1rem;border:1px solid rgba(10,10,10,0.25);border-radius:0;background-color:#fff;color:#0a0a0a}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding-top:.5rem;padding-right:.5rem;padding-bottom:.5rem;padding-left:.5rem}.callout.large{padding-top:3rem;padding-right:3rem;padding-bottom:3rem;padding-left:3rem}.card{display:flex;flex-direction:column;flex-grow:1;margin-bottom:1rem;border:1px solid #e6e6e6;border-radius:0;background:#fefefe;box-shadow:none;overflow:hidden;color:#0a0a0a}.card>:last-child{margin-bottom:0}.card-divider{flex:0 1 auto;display:flex;padding:1rem;background:#e6e6e6}.card-divider>:last-child{margin-bottom:0}.card-section{flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.close-button{position:absolute;color:#8a8a8a;cursor:pointer}[data-whatinput='mouse'] .close-button{outline:0}.close-button:hover,.close-button:focus{color:#0a0a0a}.close-button.small{right:0.66rem;top:0.33em;font-size:1.5em;line-height:1}.close-button,.close-button.medium{right:1rem;top:0.5rem;font-size:2em;line-height:1}.menu{padding:0;margin:0;list-style:none;position:relative;display:flex;flex-wrap:wrap}[data-whatinput='mouse'] .menu li{outline:0}.menu a,.menu .button{line-height:1;text-decoration:none;display:block;padding:0.7rem 1rem}.menu input,.menu select,.menu a,.menu button{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{flex-wrap:wrap;flex-direction:row}.menu.vertical{flex-wrap:nowrap;flex-direction:column}.menu.expanded li{flex:1 1 0px}.menu.simple{align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print, screen and (min-width: 40em){.menu.medium-horizontal{flex-wrap:wrap;flex-direction:row}.menu.medium-vertical{flex-wrap:nowrap;flex-direction:column}.menu.medium-expanded li{flex:1 1 0px}.menu.medium-simple li{flex:1 1 0px}}@media print, screen and (min-width: 64em){.menu.large-horizontal{flex-wrap:wrap;flex-direction:row}.menu.large-vertical{flex-wrap:nowrap;flex-direction:column}.menu.large-expanded li{flex:1 1 0px}.menu.large-simple li{flex:1 1 0px}}.menu.nested{margin-right:0;margin-left:1rem}.menu.icons a{display:flex}.menu.icon-top a,.menu.icon-right a,.menu.icon-bottom a,.menu.icon-left a{display:flex}.menu.icon-left li a{flex-flow:row nowrap}.menu.icon-left li a img,.menu.icon-left li a i,.menu.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a{flex-flow:row nowrap}.menu.icon-right li a img,.menu.icon-right li a i,.menu.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a{flex-flow:column nowrap}.menu.icon-top li a img,.menu.icon-top li a i,.menu.icon-top li a svg{align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a{flex-flow:column nowrap}.menu.icon-bottom li a img,.menu.icon-bottom li a i,.menu.icon-bottom li a svg{align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .is-active>a{background:#1779ba;color:#fefefe}.menu .active>a{background:#1779ba;color:#fefefe}.menu.align-left{justify-content:flex-start}.menu.align-right li{display:flex;justify-content:flex-end}.menu.align-right li .submenu li{justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-right:1rem;margin-left:0}.menu.align-center li{display:flex;justify-content:center}.menu.align-center li .submenu li{justify-content:flex-start}.menu .menu-text{padding:0.7rem 1rem;font-weight:bold;line-height:1;color:inherit}.menu-centered>.menu{justify-content:center}.menu-centered>.menu li{display:flex;justify-content:center}.menu-centered>.menu li .submenu li{justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon::after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:''}.menu-icon:hover::after{background:#cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon.dark::after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:''}.menu-icon.dark:hover::after{background:#8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.is-drilldown{position:relative;overflow:hidden}.is-drilldown li{display:block}.is-drilldown.animate-height{transition:height 0.5s}.drilldown a{padding:0.7rem 1rem;background:#fefefe}.drilldown .is-drilldown-submenu{position:absolute;top:0;left:100%;z-index:-1;width:100%;background:#fefefe;transition:transform 0.15s linear}.drilldown .is-drilldown-submenu.is-active{z-index:1;display:block;transform:translateX(-100%)}.drilldown .is-drilldown-submenu.is-closing{transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:0.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-right:0;margin-left:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a::after{position:absolute;top:50%;margin-top:-6px;right:1rem;display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}.drilldown.align-left .is-drilldown-submenu-parent>a::after{left:auto;right:1rem;display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}.drilldown.align-right .is-drilldown-submenu-parent>a::after{right:auto;left:1rem;display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.drilldown .js-drilldown-back>a::before{display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent;border-left-width:0;display:inline-block;vertical-align:middle;margin-right:0.75rem;border-left-width:0}.dropdown-pane{position:absolute;z-index:10;width:300px;padding:1rem;visibility:hidden;display:none;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-size:1rem}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{visibility:visible;display:block}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.dropdown.menu>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}.dropdown.menu a{padding:0.7rem 1rem}[data-whatinput='mouse'] .dropdown.menu a{outline:0}.dropdown.menu .is-active>a{background:transparent;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-right:0;margin-left:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.vertical>li>a::after{right:14px}.dropdown.menu.vertical>li.opens-left>a::after{right:auto;left:5px;display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.vertical>li.opens-right>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}@media print, screen and (min-width: 40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.medium-vertical>li>a::after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a::after{right:auto;left:5px;display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.medium-vertical>li.opens-right>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}}@media print, screen and (min-width: 64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-bottom-width:0;border-top-style:solid;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.large-vertical>li>a::after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a::after{right:auto;left:5px;display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.dropdown.menu.large-vertical>li.opens-right>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{top:100%;right:0;left:auto}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a::after{position:absolute;top:50%;right:5px;left:auto;margin-top:-6px}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{top:100%;left:auto}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{right:100%;left:auto}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{right:auto;left:100%}.is-dropdown-submenu{position:absolute;top:0;left:100%;z-index:1;display:none;min-width:200px;border:1px solid #cacaca;background:#fefefe}.dropdown .is-dropdown-submenu a{padding:0.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a::after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a::after{right:auto;left:5px;display:block;width:0;height:0;border:inset 6px;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #1779ba transparent transparent}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a::after{display:block;width:0;height:0;border:inset 6px;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #1779ba}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.responsive-embed,.flex-video{position:relative;height:0;margin-bottom:1rem;padding-bottom:75%;overflow:hidden}.responsive-embed iframe,.responsive-embed object,.responsive-embed embed,.responsive-embed video,.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video{position:absolute;top:0;left:0;width:100%;height:100%}.responsive-embed.widescreen,.flex-video.widescreen{padding-bottom:56.25%}.label{display:inline-block;padding:0.333rem 0.5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#1779ba;color:#fefefe}.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.media-object{display:flex;margin-bottom:1rem;flex-wrap:nowrap}.media-object img{max-width:none}@media screen and (max-width: 39.938em){.media-object.stack-for-small{flex-wrap:wrap}}@media screen and (max-width: 39.938em){.media-object.stack-for-small .media-object-section{padding:0;padding-bottom:1rem;flex-basis:100%;max-width:100%}.media-object.stack-for-small .media-object-section img{width:100%}}.media-object-section{flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}.media-object-section.main-section{flex:1 1 0px}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{position:absolute;top:0;left:0;z-index:11;width:100%;height:100%;transition:opacity .5s ease,visibility .5s ease;background:rgba(254,254,254,0.25);opacity:0;visibility:hidden;overflow:hidden}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{position:relative;overflow:hidden}.off-canvas{position:fixed;z-index:12;transition:transform .5s ease;backface-visibility:hidden;background:#e6e6e6}[data-whatinput='mouse'] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{box-shadow:0 0 10px rgba(10,10,10,0.7)}.off-canvas.is-open{transform:translate(0, 0)}.off-canvas-absolute{position:absolute;z-index:12;transition:transform .5s ease;backface-visibility:hidden;background:#e6e6e6}[data-whatinput='mouse'] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{box-shadow:0 0 10px rgba(10,10,10,0.7)}.off-canvas-absolute.is-open{transform:translate(0, 0)}.position-left{top:0;left:0;height:100%;overflow-y:auto;width:250px;transform:translateX(-250px)}@media print, screen and (min-width: 40em){.position-left{width:250px;transform:translateX(-250px)}}.off-canvas-content .off-canvas.position-left{transform:translateX(-250px)}@media print, screen and (min-width: 40em){.off-canvas-content .off-canvas.position-left{transform:translateX(-250px)}}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{transform:translate(0, 0)}.off-canvas-content.is-open-left.has-transition-push{transform:translateX(250px)}@media print, screen and (min-width: 40em){.off-canvas-content.is-open-left.has-transition-push{transform:translateX(250px)}}.position-left.is-transition-push{box-shadow:inset -13px 0 20px -13px rgba(10,10,10,0.25)}.position-right{top:0;right:0;height:100%;overflow-y:auto;width:250px;transform:translateX(250px)}@media print, screen and (min-width: 40em){.position-right{width:250px;transform:translateX(250px)}}.off-canvas-content .off-canvas.position-right{transform:translateX(250px)}@media print, screen and (min-width: 40em){.off-canvas-content .off-canvas.position-right{transform:translateX(250px)}}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{transform:translate(0, 0)}.off-canvas-content.is-open-right.has-transition-push{transform:translateX(-250px)}@media print, screen and (min-width: 40em){.off-canvas-content.is-open-right.has-transition-push{transform:translateX(-250px)}}.position-right.is-transition-push{box-shadow:inset 13px 0 20px -13px rgba(10,10,10,0.25)}.position-top{top:0;left:0;width:100%;overflow-x:auto;height:250px;transform:translateY(-250px)}@media print, screen and (min-width: 40em){.position-top{height:250px;transform:translateY(-250px)}}.off-canvas-content .off-canvas.position-top{transform:translateY(-250px)}@media print, screen and (min-width: 40em){.off-canvas-content .off-canvas.position-top{transform:translateY(-250px)}}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{transform:translate(0, 0)}.off-canvas-content.is-open-top.has-transition-push{transform:translateY(250px)}@media print, screen and (min-width: 40em){.off-canvas-content.is-open-top.has-transition-push{transform:translateY(250px)}}.position-top.is-transition-push{box-shadow:inset 0 -13px 20px -13px rgba(10,10,10,0.25)}.position-bottom{bottom:0;left:0;width:100%;overflow-x:auto;height:250px;transform:translateY(250px)}@media print, screen and (min-width: 40em){.position-bottom{height:250px;transform:translateY(250px)}}.off-canvas-content .off-canvas.position-bottom{transform:translateY(250px)}@media print, screen and (min-width: 40em){.off-canvas-content .off-canvas.position-bottom{transform:translateY(250px)}}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{transform:translate(0, 0)}.off-canvas-content.is-open-bottom.has-transition-push{transform:translateY(-250px)}@media print, screen and (min-width: 40em){.off-canvas-content.is-open-bottom.has-transition-push{transform:translateY(-250px)}}.position-bottom.is-transition-push{box-shadow:inset 0 13px 20px -13px rgba(10,10,10,0.25)}.off-canvas-content{transform:none;transition:transform .5s ease;backface-visibility:hidden}.off-canvas-content.has-transition-push{transform:translate(0, 0)}.off-canvas-content .off-canvas.is-open{transform:translate(0, 0)}@media print, screen and (min-width: 40em){.position-left.reveal-for-medium{transform:none;z-index:12;transition:none;visibility:visible}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{transform:none}.off-canvas-content.has-reveal-left{margin-left:250px}.position-left.reveal-for-medium ~ .off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{transform:none;z-index:12;transition:none;visibility:visible}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{transform:none}.off-canvas-content.has-reveal-right{margin-right:250px}.position-right.reveal-for-medium ~ .off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{transform:none;z-index:12;transition:none;visibility:visible}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{transform:none}.off-canvas-content.has-reveal-top{margin-top:250px}.position-top.reveal-for-medium ~ .off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{transform:none;z-index:12;transition:none;visibility:visible}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{transform:none}.off-canvas-content.has-reveal-bottom{margin-bottom:250px}.position-bottom.reveal-for-medium ~ .off-canvas-content{margin-bottom:250px}}@media print, screen and (min-width: 64em){.position-left.reveal-for-large{transform:none;z-index:12;transition:none;visibility:visible}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{transform:none}.off-canvas-content.has-reveal-left{margin-left:250px}.position-left.reveal-for-large ~ .off-canvas-content{margin-left:250px}.position-right.reveal-for-large{transform:none;z-index:12;transition:none;visibility:visible}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{transform:none}.off-canvas-content.has-reveal-right{margin-right:250px}.position-right.reveal-for-large ~ .off-canvas-content{margin-right:250px}.position-top.reveal-for-large{transform:none;z-index:12;transition:none;visibility:visible}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{transform:none}.off-canvas-content.has-reveal-top{margin-top:250px}.position-top.reveal-for-large ~ .off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{transform:none;z-index:12;transition:none;visibility:visible}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{transform:none}.off-canvas-content.has-reveal-bottom{margin-bottom:250px}.position-bottom.reveal-for-large ~ .off-canvas-content{margin-bottom:250px}}@media print, screen and (min-width: 40em){.off-canvas.in-canvas-for-medium{visibility:visible;height:auto;position:static;background:inherit;width:inherit;overflow:inherit;transition:inherit}.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top,.off-canvas.in-canvas-for-medium.position-bottom{box-shadow:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print, screen and (min-width: 64em){.off-canvas.in-canvas-for-large{visibility:visible;height:auto;position:static;background:inherit;width:inherit;overflow:inherit;transition:inherit}.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top,.off-canvas.in-canvas-for-large.position-bottom{box-shadow:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}.orbit{position:relative}.orbit-container{position:relative;height:0;margin:0;list-style:none;overflow:hidden}.orbit-slide{width:100%}.orbit-slide.no-motionui.is-active{top:0;left:0}.orbit-figure{margin:0}.orbit-image{width:100%;max-width:100%;margin:0}.orbit-caption{position:absolute;bottom:0;width:100%;margin-bottom:0;padding:1rem;background-color:rgba(10,10,10,0.5);color:#fefefe}.orbit-previous,.orbit-next{position:absolute;top:50%;transform:translateY(-50%);z-index:10;padding:1rem;color:#fefefe}[data-whatinput='mouse'] .orbit-previous,[data-whatinput='mouse'] .orbit-next{outline:0}.orbit-previous:hover,.orbit-next:hover,.orbit-previous:active,.orbit-next:active,.orbit-previous:focus,.orbit-next:focus{background-color:rgba(10,10,10,0.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{position:relative;margin-top:.8rem;margin-bottom:.8rem;text-align:center}[data-whatinput='mouse'] .orbit-bullets{outline:0}.orbit-bullets button{width:1.2rem;height:1.2rem;margin:.1rem;border-radius:50%;background-color:#cacaca}.orbit-bullets button:hover{background-color:#8a8a8a}.orbit-bullets button.is-active{background-color:#8a8a8a}.pagination{margin-left:0;margin-bottom:1rem}.pagination::before,.pagination::after{display:table;content:' ';flex-basis:0;order:1}.pagination::after{clear:both}.pagination li{margin-right:.062rem;border-radius:0;font-size:.875rem;display:none}.pagination li:last-child,.pagination li:first-child{display:inline-block}@media print, screen and (min-width: 40em){.pagination li{display:inline-block}}.pagination a,.pagination button{display:block;padding:.188rem .625rem;border-radius:0;color:#0a0a0a}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{padding:.188rem .625rem;background:#1779ba;color:#fefefe;cursor:default}.pagination .disabled{padding:.188rem .625rem;color:#cacaca;cursor:not-allowed}.pagination .disabled:hover{background:transparent}.pagination .ellipsis::after{padding:.188rem .625rem;content:'\2026';color:#0a0a0a}.pagination-previous a::before,.pagination-previous.disabled::before{display:inline-block;margin-right:0.5rem;content:'\00ab'}.pagination-next a::after,.pagination-next.disabled::after{display:inline-block;margin-left:0.5rem;content:'\00bb'}.progress{height:1rem;margin-bottom:1rem;border-radius:0;background-color:#cacaca}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{position:relative;display:block;width:0%;height:100%;background-color:#1779ba}.progress-meter-text{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);position:absolute;margin:0;font-size:0.75rem;font-weight:bold;color:#fefefe;white-space:nowrap}.slider{position:relative;height:.5rem;margin-top:1.25rem;margin-bottom:2.25rem;background-color:#e6e6e6;cursor:pointer;user-select:none;touch-action:none}.slider-fill{position:absolute;top:0;left:0;display:inline-block;max-width:100%;height:.5rem;background-color:#cacaca;transition:all 0.2s ease-in-out}.slider-fill.is-dragging{transition:all 0s linear}.slider-handle{position:absolute;top:50%;transform:translateY(-50%);left:0;z-index:1;display:inline-block;width:1.4rem;height:1.4rem;border-radius:0;background-color:#1779ba;transition:all 0.2s ease-in-out;touch-action:manipulation}[data-whatinput='mouse'] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{transition:all 0s linear}.slider.disabled,.slider[disabled]{opacity:.25;cursor:not-allowed}.slider.vertical{display:inline-block;width:.5rem;height:12.5rem;margin:0 1.25rem;transform:scale(1, -1)}.slider.vertical .slider-fill{top:0;width:.5rem;max-height:100%}.slider.vertical .slider-handle{position:absolute;top:0;left:50%;width:1.4rem;height:1.4rem;transform:translateX(-50%)}.sticky-container{position:relative}.sticky{position:relative;z-index:0;transform:translate3d(0, 0, 0)}.sticky.is-stuck{position:fixed;z-index:5;width:100%}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{position:relative;right:auto;left:auto}.sticky.is-anchored.is-at-bottom{bottom:0}body.is-reveal-open{overflow:hidden}html.is-reveal-open,html.is-reveal-open body{min-height:100%;overflow:hidden;position:fixed;user-select:none}.reveal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1005;display:none;background-color:rgba(10,10,10,0.45);overflow-y:scroll}.reveal{z-index:1006;backface-visibility:hidden;display:none;padding:1rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;position:relative;top:100px;margin-right:auto;margin-left:auto;overflow-y:auto}[data-whatinput='mouse'] .reveal{outline:0}@media print, screen and (min-width: 40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print, screen and (min-width: 40em){.reveal{width:600px;max-width:62.5rem}}.reveal.collapse{padding:0}@media print, screen and (min-width: 40em){.reveal.tiny{width:30%;max-width:62.5rem}}@media print, screen and (min-width: 40em){.reveal.small{width:50%;max-width:62.5rem}}@media print, screen and (min-width: 40em){.reveal.large{width:90%;max-width:62.5rem}}.reveal.full{top:0;left:0;width:100%;max-width:none;height:100%;height:100vh;min-height:100vh;margin-left:0;border:0;border-radius:0}@media screen and (max-width: 39.938em){.reveal{top:0;left:0;width:100%;max-width:none;height:100%;height:100vh;min-height:100vh;margin-left:0;border:0;border-radius:0}}.reveal.without-overlay{position:fixed}.switch{height:2rem;position:relative;margin-bottom:1rem;outline:0;font-size:.875rem;font-weight:bold;color:#fefefe;user-select:none}.switch-input{position:absolute;margin-bottom:0;opacity:0}.switch-paddle{position:relative;display:block;width:4rem;height:2rem;border-radius:0;background:#cacaca;transition:all 0.25s ease-out;font-weight:inherit;color:inherit;cursor:pointer}input+.switch-paddle{margin:0}.switch-paddle::after{position:absolute;top:.25rem;left:.25rem;display:block;width:1.5rem;height:1.5rem;transform:translate3d(0, 0, 0);border-radius:0;background:#fefefe;transition:all 0.25s ease-out;content:''}input:checked ~ .switch-paddle{background:#1779ba}input:checked ~ .switch-paddle::after{left:2.25rem}[data-whatinput='mouse'] input:focus ~ .switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;transform:translateY(-50%)}.switch-active{left:8%;display:none}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{width:3rem;height:1.5rem;font-size:.625rem}.switch.tiny .switch-paddle::after{top:.25rem;left:.25rem;width:1rem;height:1rem}.switch.tiny input:checked ~ .switch-paddle::after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{width:3.5rem;height:1.75rem;font-size:.75rem}.switch.small .switch-paddle::after{top:.25rem;left:.25rem;width:1.25rem;height:1.25rem}.switch.small input:checked ~ .switch-paddle::after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{width:5rem;height:2.5rem;font-size:1rem}.switch.large .switch-paddle::after{top:.25rem;left:.25rem;width:2rem;height:2rem}.switch.large input:checked ~ .switch-paddle::after{left:2.75rem}table{border-collapse:collapse;width:100%;margin-bottom:1rem;border-radius:0}thead,tbody,tfoot{border:1px solid #f1f1f1;background-color:#fefefe}caption{padding:.5rem .625rem .625rem;font-weight:bold}thead{background:#f8f8f8;color:#0a0a0a}tfoot{background:#f1f1f1;color:#0a0a0a}thead tr,tfoot tr{background:transparent}thead th,thead td,tfoot th,tfoot td{padding:.5rem .625rem .625rem;font-weight:bold;text-align:left}tbody th,tbody td{padding:.5rem .625rem .625rem}tbody tr:nth-child(even){border-bottom:0;background-color:#f1f1f1}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{border-bottom:0;border-bottom:1px solid #f1f1f1;background-color:#fefefe}@media screen and (max-width: 63.938em){table.stack thead{display:none}table.stack tfoot{display:none}table.stack tr,table.stack th,table.stack td{display:block}table.stack td{border-top:0}}table.scroll{display:block;width:100%;overflow-x:auto}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(even):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.table-scroll table{width:auto}.tabs{margin:0;border:1px solid #e6e6e6;background:#fefefe;list-style-type:none}.tabs::before,.tabs::after{display:table;content:' ';flex-basis:0;order:1}.tabs::after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:transparent}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:hover,.tabs.primary>li>a:focus{background:#1673b1}.tabs-title{float:left}.tabs-title>a{display:block;padding:1.25rem 1.5rem;font-size:.75rem;line-height:1;color:#1779ba}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected='true']{background:#e6e6e6;color:#1779ba}.tabs-content{border:1px solid #e6e6e6;border-top:0;background:#fefefe;color:#0a0a0a;transition:all 0.5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{display:inline-block;max-width:100%;margin-bottom:1rem;border:solid 4px #fefefe;border-radius:0;box-shadow:0 0 0 1px rgba(10,10,10,0.2);line-height:0}a.thumbnail{transition:box-shadow 200ms ease-out}a.thumbnail:hover,a.thumbnail:focus{box-shadow:0 0 6px 1px rgba(23,121,186,0.5)}a.thumbnail image{box-shadow:none}.title-bar{padding:.5rem;background:#0a0a0a;color:#fefefe;display:flex;justify-content:flex-start;align-items:center}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;vertical-align:middle;font-weight:bold}.has-tip{position:relative;display:inline-block;border-bottom:dotted 1px #8a8a8a;font-weight:bold;cursor:help}.tooltip{position:absolute;top:calc(100% + .649rem);z-index:1200;max-width:10rem;padding:.75rem;border-radius:0;background-color:#0a0a0a;font-size:80%;color:#fefefe}.tooltip::before{position:absolute}.tooltip.bottom::before{display:block;width:0;height:0;border:inset .75rem;content:'';border-top-width:0;border-bottom-style:solid;border-color:transparent transparent #0a0a0a;bottom:100%}.tooltip.bottom.align-center::before{left:50%;transform:translateX(-50%)}.tooltip.top::before{display:block;width:0;height:0;border:inset .75rem;content:'';border-bottom-width:0;border-top-style:solid;border-color:#0a0a0a transparent transparent;top:100%;bottom:auto}.tooltip.top.align-center::before{left:50%;transform:translateX(-50%)}.tooltip.left::before{display:block;width:0;height:0;border:inset .75rem;content:'';border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #0a0a0a;left:100%}.tooltip.left.align-center::before{bottom:auto;top:50%;transform:translateY(-50%)}.tooltip.right::before{display:block;width:0;height:0;border:inset .75rem;content:'';border-left-width:0;border-right-style:solid;border-color:transparent #0a0a0a transparent transparent;right:100%;left:auto}.tooltip.right.align-center::before{bottom:auto;top:50%;transform:translateY(-50%)}.tooltip.align-top::before{bottom:auto;top:10%}.tooltip.align-bottom::before{bottom:10%;top:auto}.tooltip.align-left::before{left:10%;right:auto}.tooltip.align-right::before{left:auto;right:10%}.top-bar{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;padding:.5rem;flex-wrap:wrap}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{max-width:200px;margin-right:1rem}.top-bar .input-group-field{width:100%;margin-right:0}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{flex:0 0 100%;max-width:100%}@media print, screen and (min-width: 40em){.top-bar{flex-wrap:nowrap}.top-bar .top-bar-left{flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{flex:0 1 auto;margin-left:auto}}@media screen and (max-width: 63.938em){.top-bar.stacked-for-medium{flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{flex:0 0 100%;max-width:100%}}@media screen and (max-width: 74.938em){.top-bar.stacked-for-large{flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{flex:0 0 100%;max-width:100%}}.top-bar-title{flex:0 0 auto;margin:0.5rem 1rem 0.5rem 0}.top-bar-left,.top-bar-right{flex:0 0 auto}.hide{display:none !important}.invisible{visibility:hidden}@media screen and (max-width: 39.938em){.hide-for-small-only{display:none !important}}@media screen and (max-width: 0em), screen and (min-width: 40em){.show-for-small-only{display:none !important}}@media print, screen and (min-width: 40em){.hide-for-medium{display:none !important}}@media screen and (max-width: 39.938em){.show-for-medium{display:none !important}}@media screen and (min-width: 40em) and (max-width: 63.938em){.hide-for-medium-only{display:none !important}}@media screen and (max-width: 39.938em), screen and (min-width: 64em){.show-for-medium-only{display:none !important}}@media print, screen and (min-width: 64em){.hide-for-large{display:none !important}}@media screen and (max-width: 63.938em){.show-for-large{display:none !important}}@media screen and (min-width: 64em) and (max-width: 74.938em){.hide-for-large-only{display:none !important}}@media screen and (max-width: 63.938em), screen and (min-width: 75em){.show-for-large-only{display:none !important}}.show-for-sr,.show-on-focus{position:absolute !important;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;clip-path:inset(50%);border:0}.show-on-focus:active,.show-on-focus:focus{position:static !important;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;clip-path:none}.show-for-landscape,.hide-for-portrait{display:block !important}@media screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:block !important}}@media screen and (orientation: portrait){.show-for-landscape,.hide-for-portrait{display:none !important}}.hide-for-landscape,.show-for-portrait{display:none !important}@media screen and (orientation: landscape){.hide-for-landscape,.show-for-portrait{display:none !important}}@media screen and (orientation: portrait){.hide-for-landscape,.show-for-portrait{display:block !important}}.float-left{float:left !important}.float-right{float:right !important}.float-center{display:block;margin-right:auto;margin-left:auto}.clearfix::before,.clearfix::after{display:table;content:' ';flex-basis:0;order:1}.clearfix::after{clear:both}.align-right{justify-content:flex-end}.align-center{justify-content:center}.align-justify{justify-content:space-between}.align-spaced{justify-content:space-around}.align-right.vertical.menu>li>a{justify-content:flex-end}.align-center.vertical.menu>li>a{justify-content:center}.align-top{align-items:flex-start}.align-self-top{align-self:flex-start}.align-bottom{align-items:flex-end}.align-self-bottom{align-self:flex-end}.align-middle{align-items:center}.align-self-middle{align-self:center}.align-stretch{align-items:stretch}.align-self-stretch{align-self:stretch}.align-center-middle{justify-content:center;align-items:center;align-content:center}.small-order-1{order:1}.small-order-2{order:2}.small-order-3{order:3}.small-order-4{order:4}.small-order-5{order:5}.small-order-6{order:6}@media print, screen and (min-width: 40em){.medium-order-1{order:1}.medium-order-2{order:2}.medium-order-3{order:3}.medium-order-4{order:4}.medium-order-5{order:5}.medium-order-6{order:6}}@media print, screen and (min-width: 64em){.large-order-1{order:1}.large-order-2{order:2}.large-order-3{order:3}.large-order-4{order:4}.large-order-5{order:5}.large-order-6{order:6}}.flex-container{display:flex}.flex-child-auto{flex:1 1 auto}.flex-child-grow{flex:1 0 auto}.flex-child-shrink{flex:0 1 auto}.flex-dir-row{flex-direction:row}.flex-dir-row-reverse{flex-direction:row-reverse}.flex-dir-column{flex-direction:column}.flex-dir-column-reverse{flex-direction:column-reverse}@media print, screen and (min-width: 40em){.medium-flex-container{display:flex}.medium-flex-child-auto{flex:1 1 auto}.medium-flex-child-grow{flex:1 0 auto}.medium-flex-child-shrink{flex:0 1 auto}.medium-flex-dir-row{flex-direction:row}.medium-flex-dir-row-reverse{flex-direction:row-reverse}.medium-flex-dir-column{flex-direction:column}.medium-flex-dir-column-reverse{flex-direction:column-reverse}}@media print, screen and (min-width: 64em){.large-flex-container{display:flex}.large-flex-child-auto{flex:1 1 auto}.large-flex-child-grow{flex:1 0 auto}.large-flex-child-shrink{flex:0 1 auto}.large-flex-dir-row{flex-direction:row}.large-flex-dir-row-reverse{flex-direction:row-reverse}.large-flex-dir-column{flex-direction:column}.large-flex-dir-column-reverse{flex-direction:column-reverse}}.slide-in-down.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateY(-100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-down.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-left.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateX(-100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-left.mui-enter.mui-enter-active{transform:translateX(0)}.slide-in-up.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateY(100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-up.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-right.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateX(100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-right.mui-enter.mui-enter-active{transform:translateX(0)}.slide-out-down.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateY(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-down.mui-leave.mui-leave-active{transform:translateY(100%)}.slide-out-right.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateX(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-right.mui-leave.mui-leave-active{transform:translateX(100%)}.slide-out-up.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateY(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-up.mui-leave.mui-leave-active{transform:translateY(-100%)}.slide-out-left.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateX(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-left.mui-leave.mui-leave-active{transform:translateX(-100%)}.fade-in.mui-enter{transition-duration:500ms;transition-timing-function:linear;opacity:0;transition-property:opacity}.fade-in.mui-enter.mui-enter-active{opacity:1}.fade-out.mui-leave{transition-duration:500ms;transition-timing-function:linear;opacity:1;transition-property:opacity}.fade-out.mui-leave.mui-leave-active{opacity:0}.hinge-in-from-top.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:top;transition-property:transform, opacity;opacity:0}.hinge-in-from-top.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-right.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:right;transition-property:transform, opacity;opacity:0}.hinge-in-from-right.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-bottom.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(90deg);transform-origin:bottom;transition-property:transform, opacity;opacity:0}.hinge-in-from-bottom.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-left.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(90deg);transform-origin:left;transition-property:transform, opacity;opacity:0}.hinge-in-from-left.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-x.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:center;transition-property:transform, opacity;opacity:0}.hinge-in-from-middle-x.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-y.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:center;transition-property:transform, opacity;opacity:0}.hinge-in-from-middle-y.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-out-from-top.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:top;transition-property:transform, opacity;opacity:1}.hinge-out-from-top.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-right.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:right;transition-property:transform, opacity;opacity:1}.hinge-out-from-right.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.hinge-out-from-bottom.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:bottom;transition-property:transform, opacity;opacity:1}.hinge-out-from-bottom.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(90deg);opacity:0}.hinge-out-from-left.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:left;transition-property:transform, opacity;opacity:1}.hinge-out-from-left.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(90deg);opacity:0}.hinge-out-from-middle-x.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform, opacity;opacity:1}.hinge-out-from-middle-x.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-middle-y.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform, opacity;opacity:1}.hinge-out-from-middle-y.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.scale-in-up.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:scale(.5);transition-property:transform, opacity;opacity:0}.scale-in-up.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-in-down.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:scale(1.5);transition-property:transform, opacity;opacity:0}.scale-in-down.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-out-up.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:scale(1);transition-property:transform, opacity;opacity:1}.scale-out-up.mui-leave.mui-leave-active{transform:scale(1.5);opacity:0}.scale-out-down.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:scale(1);transition-property:transform, opacity;opacity:1}.scale-out-down.mui-leave.mui-leave-active{transform:scale(.5);opacity:0}.spin-in.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:rotate(-.75turn);transition-property:transform, opacity;opacity:0}.spin-in.mui-enter.mui-enter-active{transform:rotate(0);opacity:1}.spin-out.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:rotate(0);transition-property:transform, opacity;opacity:1}.spin-out.mui-leave.mui-leave-active{transform:rotate(.75turn);opacity:0}.spin-in-ccw.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:rotate(.75turn);transition-property:transform, opacity;opacity:0}.spin-in-ccw.mui-enter.mui-enter-active{transform:rotate(0);opacity:1}.spin-out-ccw.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:rotate(0);transition-property:transform, opacity;opacity:1}.spin-out-ccw.mui-leave.mui-leave-active{transform:rotate(-.75turn);opacity:0}.slow{transition-duration:750ms !important}.fast{transition-duration:250ms !important}.linear{transition-timing-function:linear !important}.ease{transition-timing-function:ease !important}.ease-in{transition-timing-function:ease-in !important}.ease-out{transition-timing-function:ease-out !important}.ease-in-out{transition-timing-function:ease-in-out !important}.bounce-in{transition-timing-function:cubic-bezier(0.485, 0.155, 0.24, 1.245) !important}.bounce-out{transition-timing-function:cubic-bezier(0.485, 0.155, 0.515, 0.845) !important}.bounce-in-out{transition-timing-function:cubic-bezier(0.76, -0.245, 0.24, 1.245) !important}.short-delay{transition-delay:300ms !important}.long-delay{transition-delay:700ms !important}.shake{animation-name:shake-7}@keyframes shake-7{0%,10%,20%,30%,40%,50%,60%,70%,80%,90%{transform:translateX(7%)}5%,15%,25%,35%,45%,55%,65%,75%,85%,95%{transform:translateX(-7%)}}.spin-cw{animation-name:spin-cw-1turn}@keyframes spin-cw-1turn{0%{transform:rotate(-1turn)}100%{transform:rotate(0)}}.spin-ccw{animation-name:spin-cw-1turn}@keyframes spin-cw-1turn{0%{transform:rotate(0)}100%{transform:rotate(1turn)}}.wiggle{animation-name:wiggle-7deg}@keyframes wiggle-7deg{40%,50%,60%{transform:rotate(7deg)}35%,45%,55%,65%{transform:rotate(-7deg)}0%,30%,70%,100%{transform:rotate(0)}}.shake,.spin-cw,.spin-ccw,.wiggle{animation-duration:500ms}.infinite{animation-iteration-count:infinite}.slow{animation-duration:750ms !important}.fast{animation-duration:250ms !important}.linear{animation-timing-function:linear !important}.ease{animation-timing-function:ease !important}.ease-in{animation-timing-function:ease-in !important}.ease-out{animation-timing-function:ease-out !important}.ease-in-out{animation-timing-function:ease-in-out !important}.bounce-in{animation-timing-function:cubic-bezier(0.485, 0.155, 0.24, 1.245) !important}.bounce-out{animation-timing-function:cubic-bezier(0.485, 0.155, 0.515, 0.845) !important}.bounce-in-out{animation-timing-function:cubic-bezier(0.76, -0.245, 0.24, 1.245) !important}.short-delay{animation-delay:300ms !important}.long-delay{animation-delay:700ms !important}.slide-in-down.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateY(-100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-down.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-left.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateX(-100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-left.mui-enter.mui-enter-active{transform:translateX(0)}.slide-in-up.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateY(100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-up.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-right.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:translateX(100%);transition-property:transform, opacity;backface-visibility:hidden}.slide-in-right.mui-enter.mui-enter-active{transform:translateX(0)}.slide-out-down.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateY(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-down.mui-leave.mui-leave-active{transform:translateY(100%)}.slide-out-right.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateX(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-right.mui-leave.mui-leave-active{transform:translateX(100%)}.slide-out-up.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateY(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-up.mui-leave.mui-leave-active{transform:translateY(-100%)}.slide-out-left.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:translateX(0);transition-property:transform, opacity;backface-visibility:hidden}.slide-out-left.mui-leave.mui-leave-active{transform:translateX(-100%)}.fade-in.mui-enter{transition-duration:500ms;transition-timing-function:linear;opacity:0;transition-property:opacity}.fade-in.mui-enter.mui-enter-active{opacity:1}.fade-out.mui-leave{transition-duration:500ms;transition-timing-function:linear;opacity:1;transition-property:opacity}.fade-out.mui-leave.mui-leave-active{opacity:0}.hinge-in-from-top.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:top;transition-property:transform, opacity;opacity:0}.hinge-in-from-top.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-right.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:right;transition-property:transform, opacity;opacity:0}.hinge-in-from-right.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-bottom.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(90deg);transform-origin:bottom;transition-property:transform, opacity;opacity:0}.hinge-in-from-bottom.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-left.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(90deg);transform-origin:left;transition-property:transform, opacity;opacity:0}.hinge-in-from-left.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-x.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:center;transition-property:transform, opacity;opacity:0}.hinge-in-from-middle-x.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-y.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:center;transition-property:transform, opacity;opacity:0}.hinge-in-from-middle-y.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-out-from-top.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:top;transition-property:transform, opacity;opacity:1}.hinge-out-from-top.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-right.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:right;transition-property:transform, opacity;opacity:1}.hinge-out-from-right.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.hinge-out-from-bottom.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:bottom;transition-property:transform, opacity;opacity:1}.hinge-out-from-bottom.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(90deg);opacity:0}.hinge-out-from-left.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:left;transition-property:transform, opacity;opacity:1}.hinge-out-from-left.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(90deg);opacity:0}.hinge-out-from-middle-x.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform, opacity;opacity:1}.hinge-out-from-middle-x.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-middle-y.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform, opacity;opacity:1}.hinge-out-from-middle-y.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.scale-in-up.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:scale(.5);transition-property:transform, opacity;opacity:0}.scale-in-up.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-in-down.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:scale(1.5);transition-property:transform, opacity;opacity:0}.scale-in-down.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-out-up.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:scale(1);transition-property:transform, opacity;opacity:1}.scale-out-up.mui-leave.mui-leave-active{transform:scale(1.5);opacity:0}.scale-out-down.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:scale(1);transition-property:transform, opacity;opacity:1}.scale-out-down.mui-leave.mui-leave-active{transform:scale(.5);opacity:0}.spin-in.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:rotate(-.75turn);transition-property:transform, opacity;opacity:0}.spin-in.mui-enter.mui-enter-active{transform:rotate(0);opacity:1}.spin-out.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:rotate(0);transition-property:transform, opacity;opacity:1}.spin-out.mui-leave.mui-leave-active{transform:rotate(.75turn);opacity:0}.spin-in-ccw.mui-enter{transition-duration:500ms;transition-timing-function:linear;transform:rotate(.75turn);transition-property:transform, opacity;opacity:0}.spin-in-ccw.mui-enter.mui-enter-active{transform:rotate(0);opacity:1}.spin-out-ccw.mui-leave{transition-duration:500ms;transition-timing-function:linear;transform:rotate(0);transition-property:transform, opacity;opacity:1}.spin-out-ccw.mui-leave.mui-leave-active{transform:rotate(-.75turn);opacity:0}.slow{transition-duration:750ms !important}.fast{transition-duration:250ms !important}.linear{transition-timing-function:linear !important}.ease{transition-timing-function:ease !important}.ease-in{transition-timing-function:ease-in !important}.ease-out{transition-timing-function:ease-out !important}.ease-in-out{transition-timing-function:ease-in-out !important}.bounce-in{transition-timing-function:cubic-bezier(0.485, 0.155, 0.24, 1.245) !important}.bounce-out{transition-timing-function:cubic-bezier(0.485, 0.155, 0.515, 0.845) !important}.bounce-in-out{transition-timing-function:cubic-bezier(0.76, -0.245, 0.24, 1.245) !important}.short-delay{transition-delay:300ms !important}.long-delay{transition-delay:700ms !important}.shake{animation-name:shake-7}@keyframes shake-7{0%,10%,20%,30%,40%,50%,60%,70%,80%,90%{transform:translateX(7%)}5%,15%,25%,35%,45%,55%,65%,75%,85%,95%{transform:translateX(-7%)}}.spin-cw{animation-name:spin-cw-1turn}@keyframes spin-cw-1turn{0%{transform:rotate(-1turn)}100%{transform:rotate(0)}}.spin-ccw{animation-name:spin-cw-1turn}@keyframes spin-cw-1turn{0%{transform:rotate(0)}100%{transform:rotate(1turn)}}.wiggle{animation-name:wiggle-7deg}@keyframes wiggle-7deg{40%,50%,60%{transform:rotate(7deg)}35%,45%,55%,65%{transform:rotate(-7deg)}0%,30%,70%,100%{transform:rotate(0)}}.shake,.spin-cw,.spin-ccw,.wiggle{animation-duration:500ms}.infinite{animation-iteration-count:infinite}.slow{animation-duration:750ms !important}.fast{animation-duration:250ms !important}.linear{animation-timing-function:linear !important}.ease{animation-timing-function:ease !important}.ease-in{animation-timing-function:ease-in !important}.ease-out{animation-timing-function:ease-out !important}.ease-in-out{animation-timing-function:ease-in-out !important}.bounce-in{animation-timing-function:cubic-bezier(0.485, 0.155, 0.24, 1.245) !important}.bounce-out{animation-timing-function:cubic-bezier(0.485, 0.155, 0.515, 0.845) !important}.bounce-in-out{animation-timing-function:cubic-bezier(0.76, -0.245, 0.24, 1.245) !important}.short-delay{animation-delay:300ms !important}.long-delay{animation-delay:700ms !important}#colorbox,#cboxOverlay,#cboxWrapper{position:absolute;top:0;left:0;z-index:9999;overflow:hidden;-webkit-transform:translate3d(0, 0, 0)}#cboxWrapper{max-width:none}#cboxOverlay{position:fixed;width:100%;height:100%}#cboxMiddleLeft,#cboxBottomLeft{clear:left}#cboxContent{position:relative}#cboxLoadedContent{overflow:auto;-webkit-overflow-scrolling:touch}#cboxTitle{margin:0}#cboxLoadingOverlay,#cboxLoadingGraphic{position:absolute;top:0;left:0;width:100%;height:100%}#cboxPrevious,#cboxNext,#cboxClose,#cboxSlideshow{cursor:pointer}.cboxPhoto{float:left;margin:auto;border:0;display:block;max-width:none;-ms-interpolation-mode:bicubic}.cboxIframe{width:100%;height:100%;display:block;border:0;padding:0;margin:0}#colorbox,#cboxContent,#cboxLoadedContent{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}#cboxOverlay{background:#000;opacity:0.9;filter:alpha(opacity=90)}#colorbox{outline:0}#cboxTopLeft{width:14px;height:14px;background:url(/images/colorbox/controls.png) no-repeat 0 0}#cboxTopCenter{height:14px;background:url(/images/colorbox/border.png) repeat-x top left}#cboxTopRight{width:14px;height:14px;background:url(/images/colorbox/controls.png) no-repeat -36px 0}#cboxBottomLeft{width:14px;height:43px;background:url(/images/colorbox/controls.png) no-repeat 0 -32px}#cboxBottomCenter{height:43px;background:url(/images/colorbox/border.png) repeat-x bottom left}#cboxBottomRight{width:14px;height:43px;background:url(/images/colorbox/controls.png) no-repeat -36px -32px}#cboxMiddleLeft{width:14px;background:url(/images/colorbox/controls.png) repeat-y -175px 0}#cboxMiddleRight{width:14px;background:url(/images/colorbox/controls.png) repeat-y -211px 0}#cboxContent{background:#fff;overflow:visible}.cboxIframe{background:#fff}#cboxError{padding:50px;border:1px solid #ccc}#cboxLoadedContent{margin-bottom:5px}#cboxLoadingOverlay{background:url(/images/colorbox/loading_background.png) no-repeat center center}#cboxLoadingGraphic{background:url(/images/colorbox/loading.gif) no-repeat center center}#cboxTitle{position:absolute;bottom:-25px;left:0;text-align:center;width:100%;font-weight:bold;color:#7C7C7C}#cboxCurrent{position:absolute;bottom:-25px;left:58px;font-weight:bold;color:#7C7C7C}#cboxPrevious,#cboxNext,#cboxSlideshow,#cboxClose{border:0;padding:0;margin:0;overflow:visible;position:absolute;bottom:-29px;background:url(/images/colorbox/controls.png) no-repeat 0px 0px;width:23px;height:23px;text-indent:-9999px}#cboxPrevious:active,#cboxNext:active,#cboxSlideshow:active,#cboxClose:active{outline:0}#cboxPrevious{left:0px;background-position:-51px -25px}#cboxPrevious:hover{background-position:-51px 0px}#cboxNext{left:27px;background-position:-75px -25px}#cboxNext:hover{background-position:-75px 0px}#cboxClose{right:0;background-position:-100px -25px}#cboxClose:hover{background-position:-100px 0px}.cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px;right:27px}.cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px}.cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px;right:27px}.cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px}html{font-family:"Lato",sans-serif;font-size:12pt}body{font-family:"Lato",sans-serif;font-size:12pt;background-color:#fff}.drilldown a{background-color:#fafafb}.top-bar{background-color:#fafafb;box-shadow:0 1px 0 rgba(12,13,14,0.1),0 1px 3px rgba(12,13,14,0.1),0 4px 20px rgba(12,13,14,0.035),0 1px 1px rgba(12,13,14,0.025)}.top-bar a.title{color:#333;font-weight:bold;font-size:110%}.top-bar ul{background-color:#fafafb}.top-bar a{color:#777}.top-bar a:hover{color:#777}a,a:hover{color:#326fb8}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:"Lato",sans-serif;color:#327cc5}code{background-color:transparent;border:0}pre{background-color:#fafafb;border:1px solid #6290c5;white-space:pre-wrap;padding:8px}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a::after{border-top-color:#326fb8}.top-spacer{margin-top:64px}@media print, screen and (min-width: 40em){.top-spacer{margin-top:32px}}p{margin-bottom:0.5rem}li p,.ulist ul li p,.arabic li p,dd p{margin-bottom:0.25em}dl dt{font-size:120%;margin-bottom:0}.nb-orbit{background:#000}.nb-orbit .orbit-container .orbit-slide{color:#fff}.ulist .menu ul{padding:0;margin:0;list-style:none;position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:row;flex-direction:row}section.hero{color:#fff;position:relative;padding:75px 0}section.hero .grid-container .cell h1,section.hero .grid-container .cell p{color:#eee}section.hero .grid-container .cell h1 a,section.hero .grid-container .cell p a{color:#fff}.hero.news,.orbit-wrapper{background:url("/images/hero-background.jpg") no-repeat;background-size:cover;background-position:center bottom}.toc{max-width:75%;border-top:1px solid #ddd;border-bottom:1px solid #ddd;margin:0 auto}.toc ul{margin:0;padding:8px;list-style-type:none}.toc ul li{display:inline-block;font-size:10pt;color:#327cc5}.toc ul li a{color:#021a72}@media print, screen and (min-width: 40em){.toc{border-top:0px;border-bottom:0px;border-left:1px solid #ddd;max-width:15em;margin:32px 0 2em 2em}.toc ul{margin-left:8px}.toc ul li{display:block;line-height:1.68em;margin-bottom:1em}}.valign-top{vertical-align:top}table tbody tr{border-bottom:1px solid #f1f1f1}table tbody tr:nth-child(2n){background-color:#fff;border-bottom:1px solid #f1f1f1}.main-content{padding:0}.main-content .sect1{padding:16px 32px}.main-content .aside{background-color:#eff0f1;font-size:90%}.main-content .aside p,.main-content .aside div{font-size:10pt}.thumbnail{border:0;box-shadow:none}@media print, screen and (min-width: 40em){.main-content .toc{float:right}}footer{min-height:256px;background-color:#333;color:#ddd;padding:64px 0;margin-top:64px}footer h1{font-size:120%;font-weight:bold;text-transform:uppercase;color:#ddd}footer ul{list-style-type:none;margin:0}footer ul li{margin-bottom:8px}footer a{color:#ddd}footer a:hover{color:#fff}.footer-disclaimer{background-color:#000}.footer-disclaimer-content{margin:0 auto;padding:64px 0;display:block;max-width:75%;font-size:10pt}.footer-disclaimer-content p{margin:8px 0 0 0;text-align:center;color:#ccc}.footer-disclaimer-content p a{color:#fff}.footer-disclaimer-content pre{color:#fff;font-size:10pt}.footer-disclaimer-content img{width:200px;max-width:100%}.sidebarblock.cards{text-align:center}.paragraph.card{text-align:left;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12);border-radius:4px;display:inline-block;vertical-align:top;max-width:16em;min-height:10em;background-color:#fafafb;margin:0.5em;padding:1em}.paragraph.card .title{font-size:130%;font-weight:bold;margin-bottom:0.5em}.openblock.feature{padding:1em 0;margin:0.5em 0;overflow:auto;padding:1em 0 0.5em 0}.openblock.feature .title{font-weight:bold;font-size:140%}.openblock.feature .content .paragraph p span.image{max-width:100%;padding:4px}@media print, screen and (min-width: 40em){.openblock.feature .content .paragraph p span.image{margin:0.5em 1em 0.5em 0;max-width:60%;border:1px solid #326fb8;float:left}.openblock.feature .content .paragraph p span.image.right{float:right;margin:0.5em 0 0.5em 1em}.openblock.feature:after{clear:both}}.videoblock .content{clear:both;float:none;height:0;margin:1em 0 1.5em 0;padding-bottom:56.25%;padding-top:25px;position:relative;width:100%}.videoblock .content iframe{height:100%;left:0;position:absolute;top:0;width:100%}
diff --git a/webskin/src/main/resources/images/apache-netbeans.svg b/webskin/src/main/resources/images/apache-netbeans.svg
deleted file mode 100644
index d296421..0000000
--- a/webskin/src/main/resources/images/apache-netbeans.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-<svg xmlns="http://www.w3.org/2000/svg" width="444px" height="512px" viewBox="0 0 444 512" version="1.1">
-  <title>Apache NetBeans Logo</title>
-  <description>Apache NetBeans Logo</description>
-  <g id="logo" stroke-width="0" fill="none" fill-rule="evenodd">
-    <path d="M222,0 L222,99 L86,178 L0,128 L222,0 Z" fill="#A1C535"/>
-    <path d="M444,128 L358,178 L222,99 L222,0 L444,128 L444,128 Z" fill="#ADD439"/>
-    <path d="M444,384 L358,334 L358,178 L444,128 L444,384 L444,384 Z" fill="#1B6AC6"/>
-    <path d="M222,512 L222,413 L358,334 L444,384 L222,512 L222,512 Z" fill="#2E90E8"/>
-    <path d="M0,384 L86,334 L222,413 L222,512 L0,384 L0,384 Z" fill="#EA205E"/>
-    <path d="M0,128 L86,178 L86,334 L0,384 L0,128 L0,128 Z" fill="#A5073E"/>
-    <path d="M86,178 L222,99 L358,178 L222,256 L86,178 Z" fill="#F1F6E2"/>
-    <path d="M222,256 L358,178 L358,334 L222,413 L222,256 Z" fill="#CEDBE6"/>
-    <path d="M86,178 L222,256 L222,413 L86,334 L86,178 Z" fill="#FFFFFF"/>
-  </g>
-</svg>
diff --git a/webskin/src/main/resources/images/apache-netbeansx1024.png b/webskin/src/main/resources/images/apache-netbeansx1024.png
deleted file mode 100644
index 98089b5..0000000
--- a/webskin/src/main/resources/images/apache-netbeansx1024.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/asf_logo_wide.svg b/webskin/src/main/resources/images/asf_logo_wide.svg
deleted file mode 100644
index 52a88c6..0000000
--- a/webskin/src/main/resources/images/asf_logo_wide.svg
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Apache_Logo_Horizontal" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 9835 1713.9" enable-background="new 0 0 9835 1713.9" xml:space="preserve">
-<path fill="#6D6E71" d="M1069.6,296.4v92.2h-11.8v-92.2h-33.7V285h79.4v11.4H1069.6z"/>
-<path fill="#6D6E71" d="M1234.8,388.5V343h-62.4v45.6h-11.8V285h11.8v46.8h62.4V285h11.8v103.6H1234.8z"/>
-<path fill="#6D6E71" d="M1329.2,296.4v34h52.2v11.4h-52.2v35.5h60.4v11.3h-72.2V285h70.3v11.4H1329.2z"/>
-<path fill="#D22128" d="M933.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H933.7z M1205.4,575.2  l-121.7,292.5h240L1205.4,575.2z"/>
-<path fill="#D22128" d="M1540.1,1098.5V506.9h245c101.7,0,175,94.2,175,185.8c0,96.7-68.3,187.5-170,187.5h-192.5v218.3H1540.1z   M1597.6,828.5h189.1c70,0,115-64.2,115-135.8c0-74.2-55-134.2-120-134.2h-184.1V828.5z"/>
-<path fill="#D22128" d="M1927.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H1927.7z M2199.3,575.2  l-121.7,292.5h240L2199.3,575.2z"/>
-<path fill="#D22128" d="M2750.1,503.6c105,0,181.6,53.3,218.3,129.2l-46.7,28.3c-37.5-78.3-110.8-105-175-105  c-141.7,0-219.1,126.7-219.1,245.8c0,130.8,95.8,249.1,221.6,249.1c66.7,0,145-33.3,182.5-110l48.3,25  c-38.3,88.3-143.3,137.5-234.1,137.5c-162.5,0-276.6-155-276.6-305C2469.3,656,2571.7,503.6,2750.1,503.6z"/>
-<path fill="#D22128" d="M3528,506.9v591.6h-58.3V821.9h-350.8v276.6h-57.5V506.9h57.5v263.3h350.8V506.9H3528z"/>
-<path fill="#D22128" d="M4059.1,1046.8v51.7h-397.5V506.9h390v51.7h-332.5v213.3h290V821h-290v225.8H4059.1z"/>
-<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4229.6655" y1="-4143.6401" x2="-3987.5886" y2="-3860.573" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0" style="stop-color:#F69923"/>
-	<stop offset="0.3123" style="stop-color:#F79A23"/>
-	<stop offset="0.8383" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_1_)" d="M729.5,8.1C702.6,24,657.9,68.9,604.6,134l49,92.5c34.4-49.2,69.3-93.4,104.5-131.2  c2.7-3,4.1-4.4,4.1-4.4c-1.4,1.5-2.7,3-4.1,4.4c-11.4,12.6-46,52.9-98.2,133.1c50.2-2.5,127.5-12.8,190.4-23.5  c18.7-105-18.4-153-18.4-153S784.8-24.6,729.5,8.1z"/>
-<path fill="none" d="M646.5,535.5c0.4-0.1,0.7-0.1,1.1-0.2l-7.1,0.8c-0.4,0.2-0.8,0.4-1.2,0.6C641.7,536.3,644.1,535.9,646.5,535.5z  "/>
-<path fill="none" d="M596.5,701.1c-4,0.9-8.1,1.6-12.3,2.2C588.4,702.7,592.5,702,596.5,701.1z"/>
-<path fill="none" d="M256.7,1072.7c0.5-1.4,1-2.8,1.6-4.1c10.8-28.5,21.5-56.1,32-83.1c11.9-30.2,23.6-59.5,35.2-87.9  c12.2-29.9,24.3-58.8,36.1-86.8c12.5-29.3,24.7-57.5,36.8-84.7c9.8-22.1,19.5-43.5,29-64.2c3.2-6.9,6.3-13.7,9.5-20.5  c6.2-13.4,12.4-26.6,18.5-39.4c5.6-11.9,11.2-23.5,16.8-34.9c1.8-3.8,3.7-7.6,5.5-11.3c0.3-0.6,0.6-1.2,0.9-1.8l-6,0.7l-4.8-9.4  c-0.5,0.9-0.9,1.8-1.4,2.7c-8.6,17.1-17.1,34.3-25.6,51.7c-4.9,10-9.7,20.1-14.6,30.3c-13.4,28.1-26.5,56.5-39.5,85  c-13.1,28.8-25.9,57.8-38.5,86.9c-12.4,28.5-24.5,57.1-36.3,85.5c-11.8,28.4-23.4,56.8-34.7,84.9c-11.8,29.4-23.3,58.5-34.4,87.3  c-2.5,6.5-5,13-7.5,19.4c-8.9,23.2-17.6,46.2-26.1,68.8l7.5,14.9l6.7-0.7c0.2-0.7,0.5-1.4,0.7-2  C235.2,1129.9,246,1100.9,256.7,1072.7z"/>
-<path fill="none" d="M581.2,703.8L581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8z"/>
-<path fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6  C558.6,785.9,561.8,785.3,564.9,784.6z"/>
-<path opacity="0.35" fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6  C558.6,785.9,561.8,785.3,564.9,784.6z"/>
-<path fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1c1-0.1,2.1-0.3,3.1-0.5  c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/>
-<path opacity="0.35" fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1  c1-0.1,2.1-0.3,3.1-0.5c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/>
-<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-6021.2769" y1="-4174.8843" x2="-4294.1865" y2="-4174.8843" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_2_)" d="M509.2,465.4c14.9-27.8,30-55,45.2-81.5c15.8-27.5,31.8-54.2,48-79.9c1-1.5,1.9-3.1,2.9-4.6  c16-25.3,32.1-49.6,48.4-72.9l-49-92.5c-3.7,4.5-7.4,9.1-11.1,13.7c-14.1,17.6-28.8,36.5-43.8,56.6c-17,22.6-34.4,46.8-52.1,72.2  c-16.3,23.4-32.9,48-49.5,73.4c-14.1,21.6-28.3,43.9-42.4,66.7c-0.5,0.8-1,1.7-1.6,2.6l63.7,125.9  C481.4,518.1,495.2,491.5,509.2,465.4z"/>
-<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-5812.7939" y1="-4001.6594" x2="-4783.6157" y2="-4001.6594" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0" style="stop-color:#282662"/>
-	<stop offset="9.548390e-02" style="stop-color:#662E8D"/>
-	<stop offset="0.7882" style="stop-color:#9F2064"/>
-	<stop offset="0.9487" style="stop-color:#CD2032"/>
-</linearGradient>
-<path fill="url(#SVGID_3_)" d="M218.8,1174.8c-8.4,23.2-16.9,46.8-25.4,70.9c-0.1,0.4-0.2,0.7-0.4,1.1c-1.2,3.4-2.4,6.8-3.6,10.2  c-5.7,16.3-10.7,30.9-22.1,64.2c18.8,8.6,33.9,31.1,48.1,56.7c-1.5-26.5-12.5-51.4-33.3-70.7c92.6,4.2,172.4-19.2,213.6-86.9  c3.7-6,7.1-12.4,10.1-19.1c-18.8,23.8-42,33.8-85.7,31.4c-0.1,0-0.2,0.1-0.3,0.1c0.1,0,0.2-0.1,0.3-0.1  c64.4-28.8,96.7-56.5,125.3-102.3c6.8-10.9,13.3-22.7,20.1-35.9c-56.3,57.8-121.6,74.3-190.3,61.8l-51.6,5.7  C222,1166.1,220.4,1170.4,218.8,1174.8z"/>
-<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4190.9775" x2="-4197.1841" y2="-4190.9775" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_4_)" d="M242.9,1059.3c11.1-28.8,22.6-57.9,34.4-87.3c11.3-28.1,22.9-56.5,34.7-84.9  c11.8-28.5,24-57,36.3-85.5c12.6-29,25.4-58,38.5-86.9c12.9-28.5,26.1-56.9,39.5-85c4.8-10.1,9.7-20.2,14.6-30.3  c8.4-17.4,17-34.6,25.6-51.7c0.5-0.9,0.9-1.8,1.4-2.7l-63.7-125.9c-1,1.7-2.1,3.4-3.1,5.1c-14.9,24.3-29.6,49.1-44.1,74.4  c-14.7,25.6-29.1,51.7-43.1,78.1c-11.9,22.3-23.5,44.8-34.7,67.5c-2.3,4.6-4.5,9.2-6.7,13.7c-13.9,28.6-26.4,56.2-37.8,82.8  c-12.9,30.1-24.2,58.8-34.1,86.1c-6.5,17.9-12.5,35.2-17.9,51.9c-4.5,14.2-8.7,28.4-12.7,42.6c-9.5,33.4-17.7,66.7-24.5,99.8  l64,126.4c8.5-22.6,17.1-45.6,26.1-68.8C237.9,1072.3,240.4,1065.8,242.9,1059.3z"/>
-<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-5798.3159" y1="-4167.6108" x2="-4890.6782" y2="-4167.6108" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0" style="stop-color:#282662"/>
-	<stop offset="9.548390e-02" style="stop-color:#662E8D"/>
-	<stop offset="0.7882" style="stop-color:#9F2064"/>
-	<stop offset="0.9487" style="stop-color:#CD2032"/>
-</linearGradient>
-<path fill="url(#SVGID_5_)" d="M144.4,1025.6c-8,40.5-13.8,80.8-16.6,120.8c-0.1,1.4-0.2,2.8-0.3,4.2c-20-32-73.5-63.3-73.4-63  c38.3,55.5,67.4,110.7,71.7,164.8c-20.5,4.2-48.6-1.9-81.1-13.8c33.9,31.1,59.3,39.7,69.2,42c-31.1,1.9-63.5,23.3-96.1,47.9  c47.7-19.5,86.3-27.2,113.9-20.9c-43.8,124-87.7,260.9-131.6,406.2c13.5-4,21.5-13,26-25.3c7.8-26.3,59.8-199,141.2-425.9  c2.3-6.5,4.6-12.9,7-19.5c0.7-1.8,1.3-3.6,2-5.4c8.6-23.8,17.5-48.1,26.7-72.9c2.1-5.6,4.2-11.3,6.3-17c0-0.1,0.1-0.2,0.1-0.3  l-64-126.4C145,1022.6,144.7,1024.1,144.4,1025.6z"/>
-<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4012.23" x2="-4197.1841" y2="-4012.23" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_6_)" d="M477.7,555.7c-1.8,3.7-3.7,7.5-5.5,11.3c-5.5,11.4-11.1,23-16.8,34.9c-6.1,12.8-12.3,26-18.5,39.4  c-3.1,6.8-6.3,13.6-9.5,20.5c-9.5,20.7-19.2,42.1-29,64.2c-12.1,27.2-24.3,55.4-36.8,84.7c-11.9,27.9-23.9,56.8-36.1,86.8  c-11.6,28.4-23.3,57.7-35.2,87.9c-10.6,27-21.3,54.6-32,83.1c-0.5,1.4-1,2.8-1.6,4.1c-10.7,28.3-21.5,57.3-32.4,87  c-0.2,0.7-0.5,1.4-0.7,2l51.6-5.7c-1-0.2-2-0.3-3.1-0.5c61.6-7.7,143.6-53.7,196.5-110.6c24.4-26.2,46.5-57.1,67-93.3  c15.2-26.9,29.6-56.8,43.2-89.8c11.9-28.9,23.3-60.1,34.4-94c-14.2,7.5-30.4,12.9-48.3,16.7c-3.1,0.7-6.3,1.3-9.6,1.9  c-3.2,0.6-6.5,1.1-9.9,1.6l0,0l0,0c0,0,0.1,0,0.1-0.1c57.5-22.1,93.7-64.8,120.1-117.1c-15.1,10.3-39.7,23.8-69.2,30.3  c-4,0.9-8.1,1.6-12.3,2.2c-1,0.1-2.1,0.3-3.1,0.5l0,0l0,0c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0l0,0c19.9-8.3,36.8-17.7,51.4-28.7  c3.1-2.4,6.2-4.8,9.1-7.3c4.5-3.8,8.7-7.9,12.7-12.2c2.6-2.7,5.1-5.5,7.5-8.4c5.7-6.8,11.1-14.2,16.1-22.1c1.5-2.4,3-4.9,4.5-7.5  c1.9-3.7,3.7-7.3,5.5-10.8c8-16.1,14.5-30.5,19.6-43.2c2.6-6.3,4.8-12.2,6.7-17.6c0.8-2.2,1.5-4.3,2.2-6.3c2-6.1,3.7-11.5,5-16.2  c2-7.1,3.1-12.7,3.8-16.8l0,0l0,0c-1.9,1.5-4.2,3.1-6.7,4.6c-17.3,10.4-47.1,19.8-71.1,24.2l47.3-5.2l-47.3,5.2  c-0.4,0.1-0.7,0.1-1.1,0.2c-2.4,0.4-4.8,0.8-7.2,1.2c0.4-0.2,0.8-0.4,1.2-0.6l-161.9,17.7C478.3,554.5,478,555.1,477.7,555.7z"/>
-<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-6031.4116" y1="-4021.106" x2="-4304.3213" y2="-4021.106" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_7_)" d="M660,228.4c-14.4,22.1-30.1,47.2-47.1,75.6c-0.9,1.5-1.8,3-2.7,4.5c-14.6,24.6-30.1,51.6-46.4,81.2  c-14.1,25.5-28.8,52.9-44,82.4c-13.3,25.7-27,52.9-41.1,81.7l161.9-17.7c47.2-21.7,68.3-41.3,88.7-69.7c5.4-7.8,10.9-16,16.3-24.5  c16.6-26,32.9-54.6,47.5-83c14.1-27.4,26.5-54.7,36-79.2c6.1-15.6,10.9-30.1,14.3-42.8c2.9-11.2,5.3-21.9,7.1-32.1  C787.5,215.6,710.2,225.9,660,228.4z"/>
-<path fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
-<path opacity="0.35" fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
-<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3959.0669" x2="-4197.1841" y2="-3959.0669" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_8_)" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/>
-<path fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
-<path opacity="0.35" fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
-<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3965.1499" x2="-4197.1841" y2="-3965.1499" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_9_)" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/>
-<path fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8  C581.3,703.8,581.3,703.8,581.3,703.8z"/>
-<path opacity="0.35" fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8  C581.3,703.8,581.3,703.8,581.3,703.8z"/>
-<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-4954.02" y1="-3966.3701" x2="-4572.2764" y2="-3966.3701" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)">
-	<stop offset="0.3233" style="stop-color:#9E2064"/>
-	<stop offset="0.6302" style="stop-color:#C92037"/>
-	<stop offset="0.7514" style="stop-color:#CD2335"/>
-	<stop offset="1" style="stop-color:#E97826"/>
-</linearGradient>
-<path fill="url(#SVGID_10_)" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8  C581.3,703.8,581.3,703.8,581.3,703.8z"/>
-<path fill="#6D6E71" d="M4552.4,508.2c12,3.6,22.6,8.4,31.5,14.5l-10.5,23c-9.2-6.1-19-10.6-29.4-13.6c-10.4-3-20.3-4.5-29.7-4.5  c-13.8,0-24.9,2.5-33.2,7.5c-8.3,5-12.4,12-12.4,21.1c0,7.8,2.3,14.2,6.9,19.3c4.6,5.1,10.3,9,17.3,11.9c6.9,2.8,16.4,6.1,28.5,9.8  c14.6,4.7,26.4,9.1,35.3,13.1c8.9,4.1,16.5,10.1,22.9,18.1c6.3,8,9.5,18.5,9.5,31.5c0,11.9-3.2,22.2-9.6,31.1  c-6.4,8.9-15.5,15.7-27.3,20.6c-11.8,4.9-25.3,7.3-40.6,7.3c-15.3,0-30.2-3-44.7-8.9c-14.4-5.9-26.8-13.9-37.2-23.8l10.9-22  c9.8,9.6,21,17,33.8,22.3c12.8,5.3,25.3,7.9,37.4,7.9c15.5,0,27.8-3,36.8-9c9-6,13.4-14.1,13.4-24.3c0-8-2.3-14.5-7-19.7  c-4.7-5.2-10.5-9.2-17.4-12.1c-6.9-2.9-16.4-6.1-28.5-9.7c-14.4-4.3-26.2-8.4-35.2-12.4c-9-4-16.6-9.9-22.9-17.8  c-6.2-7.9-9.3-18.2-9.3-31.1c0-11.1,3.1-20.8,9.2-29.1c6.1-8.4,14.8-14.8,26.1-19.4c11.3-4.6,24.2-6.9,38.9-6.9  C4528.2,502.8,4540.3,504.6,4552.4,508.2z"/>
-<path fill="#6D6E71" d="M4870.3,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5  c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3  c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3  C4834.4,503.1,4853.2,507.9,4870.3,517.6z M4770.5,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7  c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7  c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4  C4798.4,526.4,4783.8,530.2,4770.5,537.8z"/>
-<path fill="#6D6E71" d="M5080.3,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H5080.3z"/>
-<path fill="#6D6E71" d="M5390.7,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H5390.7z"/>
-<path fill="#6D6E71" d="M5777.5,718l-57.8-180.5L5661.1,718h-25l-71.7-214.3h26.3l58.9,185.9l58.1-185.6l24.5-0.3l58.7,185.9  l58.1-185.9h25.4L5802.6,718H5777.5z"/>
-<path fill="#6D6E71" d="M5996.7,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H5996.7z M6054.9,531.7  l-47.7,108.6h96.1L6054.9,531.7z"/>
-<path fill="#6D6E71" d="M6377,649.7c-6.1,0.4-10.9,0.6-14.3,0.6h-56.9V718h-24.5V503.7h81.4c26.7,0,47.4,6.3,62.2,18.8  c14.8,12.6,22.2,30.3,22.2,53.2c0,17.5-4.1,32.2-12.4,44c-8.3,11.8-20.1,20.3-35.6,25.5l50.1,72.8h-27.8L6377,649.7z M6407.7,614  c10.5-8.6,15.8-21.1,15.8-37.7c0-16.1-5.3-28.3-15.8-36.6c-10.5-8.3-25.5-12.4-45.1-12.4h-56.9v99.5h56.9  C6382.2,626.9,6397.2,622.6,6407.7,614z"/>
-<path fill="#6D6E71" d="M6608.2,527.3v70.4h108v23.6h-108v73.4h124.9V718h-149.4V503.7H6729v23.6H6608.2z"/>
-<path fill="#6D6E71" d="M7074.8,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H7074.8z"/>
-<path fill="#6D6E71" d="M7457.7,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5  c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3  c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3  C7421.8,503.1,7440.5,507.9,7457.7,517.6z M7357.9,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7  c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7  c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4  C7385.7,526.4,7371.2,530.2,7357.9,537.8z"/>
-<path fill="#6D6E71" d="M7794.8,695.5c-15.9,15.8-37.9,23.7-65.9,23.7c-28.2,0-50.3-7.9-66.3-23.7c-16-15.8-24-37.7-24-65.7V503.7  h24.5v126.1c0,20.6,5.9,36.7,17.6,48.3c11.8,11.6,27.8,17.4,48.1,17.4c20.4,0,36.4-5.7,48-17.3c11.6-11.5,17.3-27.7,17.3-48.5V503.7  h24.5v126.1C7818.7,657.8,7810.7,679.7,7794.8,695.5z"/>
-<path fill="#6D6E71" d="M8115.1,718l-128.5-172v172h-24.5V503.7h25.4L8116,676V503.7h24.2V718H8115.1z"/>
-<path fill="#6D6E71" d="M8429.3,517.9c16.7,9.4,29.9,22.3,39.6,38.6c9.7,16.3,14.6,34.4,14.6,54.5s-4.9,38.2-14.6,54.5  c-9.7,16.3-23,29.2-40,38.6c-16.9,9.4-35.8,14-56.5,14h-85.8V503.7h86.7C8394,503.7,8412.6,508.4,8429.3,517.9z M8311.2,694.7h62.5  c15.7,0,30.1-3.6,43-10.8c12.9-7.2,23.2-17.2,30.7-30c7.5-12.7,11.3-27,11.3-42.7c0-15.7-3.8-30-11.5-42.7  c-7.7-12.7-18-22.7-31.1-30.1c-13.1-7.4-27.5-11.1-43.3-11.1h-61.6V694.7z"/>
-<path fill="#6D6E71" d="M8622.8,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H8622.8z M8681,531.7l-47.7,108.6  h96.1L8681,531.7z"/>
-<path fill="#6D6E71" d="M8950.8,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H8950.8z"/>
-<path fill="#6D6E71" d="M9138.9,718V503.7h24.5V718H9138.9z"/>
-<path fill="#6D6E71" d="M9462.2,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5  c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3  c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3  C9426.4,503.1,9445.1,507.9,9462.2,517.6z M9362.4,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7  c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7  c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4  C9390.3,526.4,9375.8,530.2,9362.4,537.8z"/>
-<path fill="#6D6E71" d="M9800.8,718l-128.5-172v172h-24.5V503.7h25.4L9801.7,676V503.7h24.2V718H9800.8z"/>
-<path fill="#6D6E71" d="M4204.9,500.9c9,9,13.5,19.9,13.5,32.6c0,12.7-4.5,23.6-13.5,32.7c-9,9.1-20,13.7-32.8,13.7  c-12.9,0-23.8-4.5-32.7-13.5c-8.9-9-13.4-19.9-13.4-32.6c0-12.7,4.5-23.6,13.5-32.7c9-9.1,19.9-13.7,32.7-13.7  C4185,487.4,4195.9,491.9,4204.9,500.9z M4201,562.4c7.9-8,11.8-17.6,11.8-28.8c0-11.2-3.9-20.7-11.7-28.6  c-7.8-7.9-17.4-11.9-28.7-11.9c-11.3,0-20.9,4-28.8,11.9c-7.8,8-11.8,17.6-11.8,28.8c0,11.2,3.9,20.8,11.6,28.7  c7.8,7.9,17.3,11.9,28.6,11.9S4193.1,570.4,4201,562.4z M4194.5,524.7c0,8.3-3.6,13.5-10.9,15.6l13.3,18h-10.7l-12-16.7h-11v16.7  h-8.7v-50h18.8c7.6,0,13,1.3,16.3,3.9C4192.9,514.8,4194.5,519,4194.5,524.7z M4183.4,531.7c1.7-1.4,2.6-3.8,2.6-7.1  c0-3.3-0.9-5.6-2.7-6.8c-1.8-1.3-4.9-1.9-9.5-1.9h-10.6v18h10.4C4178.4,533.9,4181.6,533.2,4183.4,531.7z"/>
-<path fill="#6D6E71" d="M4540.6,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4  c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959  C4483.1,932.2,4506.2,918.6,4540.6,918.2z"/>
-<path fill="#6D6E71" d="M4823.7,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7  c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7  C4804.6,1072.7,4814,1069.6,4823.7,1063.6z"/>
-<path fill="#6D6E71" d="M5027.8,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7  c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7  C5008.7,1072.7,5018.1,1069.6,5027.8,1063.6z"/>
-<path fill="#6D6E71" d="M5244.1,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5  c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C5189.5,931.3,5212.4,918.2,5244.1,918.2z   M5239.4,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7  c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C5205.4,1067.8,5220.7,1074,5239.4,1074z"/>
-<path fill="#6D6E71" d="M5449.9,964.4c4.5,0,8.3,1.7,11.5,5.1c3.2,3.4,4.7,7.5,4.7,12.5s-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1  c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5s1.6-9.1,4.7-12.5C5441.2,966.1,5445.2,964.4,5449.9,964.4z M5449.9,1064.6  c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1  c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5C5441.2,1066.3,5445.2,1064.6,5449.9,1064.6z"/>
-<path fill="#6D6E71" d="M5574.1,1138.1h-22.9l105.3-317.8h23.3L5574.1,1138.1z"/>
-<path fill="#6D6E71" d="M5753.6,1138.1h-22.9l105.3-317.8h23.3L5753.6,1138.1z"/>
-<path fill="#6D6E71" d="M6140.5,1097h-27.3l-52.3-144.4l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5  l52-150.5h27.3L6140.5,1097z"/>
-<path fill="#6D6E71" d="M6504.6,1097h-27.3L6425,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5  l52-150.5h27.3L6504.6,1097z"/>
-<path fill="#6D6E71" d="M6868.6,1097h-27.3L6789,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5  l52-150.5h27.3L6868.6,1097z"/>
-<path fill="#6D6E71" d="M7034.6,1064.6c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5  c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5  C7026,1066.3,7029.9,1064.6,7034.6,1064.6z"/>
-<path fill="#6D6E71" d="M7283,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39  c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8  c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2s23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2  c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7283z M7222.9,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3  h-55.3c-30.1,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7200.6,1072.5,7210.5,1075.4,7222.9,1075.4z"/>
-<path fill="#6D6E71" d="M7536.3,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5  c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C7481.8,931.3,7504.6,918.2,7536.3,918.2z   M7531.6,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7  c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C7497.6,1067.8,7512.9,1074,7531.6,1074z"/>
-<path fill="#6D6E71" d="M7850.8,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39  c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8  c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2c10.7-3.8,23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2  c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7850.8z M7790.7,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3  h-55.3c-30.2,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7768.5,1072.5,7778.4,1075.4,7790.7,1075.4z"/>
-<path fill="#6D6E71" d="M8077.8,918.5c28.6-0.2,51.4,8.5,68.5,26.3l-14.5,18.6c-14.4-13.7-32.1-20.6-53-20.6  c-18.4,0-33.6,6.1-45.4,18.2c-11.8,12.1-17.7,27.9-17.7,47.2s5.9,35.2,17.7,47.4c11.8,12.3,26.9,18.4,45.4,18.4  c23.8,0,42.2-7.6,55-22.9l15.2,16.2c-16.9,20.5-40.6,30.7-71.2,30.7c-25.9,0-47-8.3-63.4-25c-16.4-16.6-24.6-38.2-24.6-64.8  c0-26.3,8.3-47.9,24.8-64.6C8031.1,926.9,8052.2,918.5,8077.8,918.5z"/>
-<path fill="#6D6E71" d="M8366.7,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4  c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959  C8309.2,932.2,8332.2,918.6,8366.7,918.2z"/>
-<path fill="#6D6E71" d="M8635.6,918.5c28.1-0.2,49.3,8.7,63.6,26.6c14.3,18,20.8,42.4,19.4,73.2h-145.1c2.2,17.3,9.2,31.1,20.9,41.3  c11.7,10.2,26.2,15.4,43.5,15.4c22.5,0,40.8-7.4,55-22.3l14.5,15.5c-17.8,19.8-41.6,29.7-71.5,29.7c-26.1,0-47.4-8.3-63.8-25  c-16.4-16.6-24.6-38.2-24.6-64.8s8.2-48.1,24.6-64.8C8588.5,926.8,8609.7,918.5,8635.6,918.5z M8573.5,996.8H8695  c-0.9-17.1-6.7-30.7-17.4-40.7c-10.7-10-24.7-15-42-15c-16.9,0-30.9,5.1-42.2,15.2C8582.1,966.4,8575.5,979.9,8573.5,996.8z"/>
-<path fill="#6D6E71" d="M8838,1064.6c4.5,0,8.3,1.7,11.5,5c3.1,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5  c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5  C8829.3,1066.3,8833.3,1064.6,8838,1064.6z"/>
-<path fill="#6D6E71" d="M8983.4,943.5c16.9-16.6,38.5-25,64.8-25c26.3,0,47.9,8.3,64.8,25c16.9,16.6,25.3,38.1,25.3,64.5  c0,26.5-8.5,48.2-25.3,64.9c-16.9,16.8-38.5,25.1-64.8,25.1c-26.3,0-47.9-8.4-64.8-25.1c-16.9-16.8-25.3-38.4-25.3-64.9  C8958.1,981.6,8966.5,960.1,8983.4,943.5z M9094.1,960.8c-11.9-12.3-27.2-18.4-45.9-18.4c-18.7,0-34,6.1-45.9,18.4  c-11.9,12.3-17.9,28.1-17.9,47.4c0,19.6,6,35.5,17.9,47.7c11.9,12.3,27.2,18.4,45.9,18.4c18.7,0,34-6.1,45.9-18.4  c11.9-12.3,17.9-28.2,17.9-47.7C9111.9,988.9,9106,973.1,9094.1,960.8z"/>
-<path fill="#6D6E71" d="M9283.3,919.2v39.5c12.2-26.5,33.4-40,63.8-40.5v26.7c-18.4-0.2-33.3,4.9-44.5,15.3  c-11.3,10.5-17.6,24.6-19.2,42.3v94.5H9257V919.2H9283.3z"/>
-<path fill="#6D6E71" d="M9610,919.2v159.2c0,25.9-8.2,46.5-24.5,61.7c-16.3,15.3-38,22.9-64.9,22.9c-26.3-0.2-50.6-8.8-72.9-25.7  l12.1-20.2c17.8,14.8,37.7,22.4,59.7,22.6c19.4,0,34.9-5.5,46.6-16.5c11.7-11,17.5-25.7,17.5-44.2v-27c-13,24.7-34.9,37.1-65.4,37.1  c-23.9,0-43.3-8-58.4-24c-15.1-16-22.6-36.7-22.6-62.1c0-24.7,7.4-45,22.3-60.9c14.8-15.9,34.2-23.9,58-24.1  c30.6,0,52.6,12.4,66.1,37.1v-36.1H9610z M9479.2,1049.2c11.4,11.8,25.9,17.7,43.7,17.7s32.3-5.9,43.7-17.7c11.3-11.8,17-26.8,17-45  c0-18.4-5.7-33.6-17-45.4c-11.4-11.8-25.9-17.7-43.7-17.7s-32.3,5.9-43.7,17.7c-11.3,11.8-17.1,26.9-17.4,45.4  C9462.1,1022.4,9467.9,1037.4,9479.2,1049.2z"/>
-<path fill="#6D6E71" d="M9729.4,1138.1h-22.9l105.3-317.8h23.3L9729.4,1138.1z"/>
-</svg>
\ No newline at end of file
diff --git a/webskin/src/main/resources/images/hero-background-2.jpg b/webskin/src/main/resources/images/hero-background-2.jpg
deleted file mode 100644
index 3e41c7c..0000000
--- a/webskin/src/main/resources/images/hero-background-2.jpg
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/hero-background.jpg b/webskin/src/main/resources/images/hero-background.jpg
deleted file mode 100644
index c59ab05..0000000
--- a/webskin/src/main/resources/images/hero-background.jpg
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/incubator_feather_egg_logo_bw_crop.png b/webskin/src/main/resources/images/incubator_feather_egg_logo_bw_crop.png
deleted file mode 100644
index 377e4e3..0000000
--- a/webskin/src/main/resources/images/incubator_feather_egg_logo_bw_crop.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/incubator_feather_egg_logo_sm.png b/webskin/src/main/resources/images/incubator_feather_egg_logo_sm.png
deleted file mode 100644
index 759252f..0000000
--- a/webskin/src/main/resources/images/incubator_feather_egg_logo_sm.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/nblogo32x32.png b/webskin/src/main/resources/images/nblogo32x32.png
deleted file mode 100644
index 75e21aa..0000000
--- a/webskin/src/main/resources/images/nblogo32x32.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/nblogo48x48.png b/webskin/src/main/resources/images/nblogo48x48.png
deleted file mode 100644
index 62340a6..0000000
--- a/webskin/src/main/resources/images/nblogo48x48.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/nblogo64x64.png b/webskin/src/main/resources/images/nblogo64x64.png
deleted file mode 100644
index 29ca14b..0000000
--- a/webskin/src/main/resources/images/nblogo64x64.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/nblogo96x96.png b/webskin/src/main/resources/images/nblogo96x96.png
deleted file mode 100644
index 2fd05d1..0000000
--- a/webskin/src/main/resources/images/nblogo96x96.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/touch-icon-ipad-retina.png b/webskin/src/main/resources/images/touch-icon-ipad-retina.png
deleted file mode 100644
index 48848c9..0000000
--- a/webskin/src/main/resources/images/touch-icon-ipad-retina.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/touch-icon-ipad.png b/webskin/src/main/resources/images/touch-icon-ipad.png
deleted file mode 100644
index 531975f..0000000
--- a/webskin/src/main/resources/images/touch-icon-ipad.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/images/touch-icon-iphone-retina.png b/webskin/src/main/resources/images/touch-icon-iphone-retina.png
deleted file mode 100644
index 2dec5b8..0000000
--- a/webskin/src/main/resources/images/touch-icon-iphone-retina.png
+++ /dev/null
Binary files differ
diff --git a/webskin/src/main/resources/js/netbeans.js b/webskin/src/main/resources/js/netbeans.js
deleted file mode 100644
index e665bb3..0000000
--- a/webskin/src/main/resources/js/netbeans.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*
- * Seeks for all <a class='image'> inside <div class='openblock feature'> and adds colorbox to them.
- */
-$(document).ready(function() {
-    $('.openblock.feature a.image').each(function (index) {
-        'use strict'
-        var title = $(this).children('img').attr('title');
-        $(this).colorbox({opacity: 0.7, title : title, scalePhotos: true, maxWidth: "98%", maxHeight: "98%" });
-    });
-});
diff --git a/webskin/src/main/resources/js/vendor/foundation.min.js b/webskin/src/main/resources/js/vendor/foundation.min.js
deleted file mode 100644
index b418932..0000000
--- a/webskin/src/main/resources/js/vendor/foundation.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-!function(t){function e(n){if(i[n])return i[n].exports;var s=i[n]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,e),s.l=!0,s.exports}var i={};return e.m=t,e.c=i,e.i=function(t){return t},e.d=function(t,i,n){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=35)}([function(t,e){t.exports=jQuery},function(t,e,i){"use strict";function n(){return"rtl"===r()("html").attr("dir")}function s(t,e){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(e?"-"+e:"")}function o(t){var e,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},n=document.createElement("div");for(var s in i)"undefined"!=typeof n.style[s]&&(e=i[s]);return e?e:(e=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}i.d(e,"c",function(){return n}),i.d(e,"a",function(){return s}),i.d(e,"b",function(){return o});var a=i(0),r=i.n(a)},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function o(t){return s("undefined"!=typeof t.constructor.name?t.constructor.name:t.className)}i.d(e,"a",function(){return u});var a=i(0),r=(i.n(a),i(1)),l=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),u=function(){function t(e,s){n(this,t),this._setup(e,s);var a=o(this);this.uuid=i.i(r.a)(6,a),this.$element.attr("data-"+a)||this.$element.attr("data-"+a,this.uuid),this.$element.data("zfPlugin")||this.$element.data("zfPlugin",this),this.$element.trigger("init.zf."+a)}return l(t,[{key:"destroy",value:function(){this._destroy();var t=o(this);this.$element.removeAttr("data-"+t).removeData("zfPlugin").trigger("destroyed.zf."+t);for(var e in this)this[e]=null}}]),t}()},function(t,e,i){"use strict";function n(t){var e={};return"string"!=typeof t?e:(t=t.trim().slice(1,-1))?e=t.split("&").reduce(function(t,e){var i=e.replace(/\+/g," ").split("="),n=i[0],s=i[1];return n=decodeURIComponent(n),s=void 0===s?null:decodeURIComponent(s),t.hasOwnProperty(n)?Array.isArray(t[n])?t[n].push(s):t[n]=[t[n],s]:t[n]=s,t},{}):e}i.d(e,"a",function(){return r});var s=i(0),o=i.n(s),a=window.matchMedia||function(){var t=window.styleMedia||window.media;if(!t){var e=document.createElement("style"),i=document.getElementsByTagName("script")[0],n=null;e.type="text/css",e.id="matchmediajs-test",i&&i.parentNode&&i.parentNode.insertBefore(e,i),n="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle,t={matchMedium:function(t){var i="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=i:e.textContent=i,"1px"===n.width}}}return function(e){return{matches:t.matchMedium(e||"all"),media:e||"all"}}}(),r={queries:[],current:"",_init:function(){var t=this,e=o()("meta.foundation-mq");e.length||o()('<meta class="foundation-mq">').appendTo(document.head);var i,s=o()(".foundation-mq").css("font-family");i=n(s);for(var a in i)i.hasOwnProperty(a)&&t.queries.push({name:a,value:"only screen and (min-width: "+i[a]+")"});this.current=this._getCurrentSize(),this._watcher()},atLeast:function(t){var e=this.get(t);return!!e&&a(e).matches},is:function(t){return t=t.trim().split(" "),t.length>1&&"only"===t[1]?t[0]===this._getCurrentSize():this.atLeast(t[0])},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var i=this.queries[e];if(t===i.name)return i.value}return null},_getCurrentSize:function(){for(var t,e=0;e<this.queries.length;e++){var i=this.queries[e];a(i.value).matches&&(t=i)}return"object"==typeof t?t.name:t},_watcher:function(){var t=this;o()(window).off("resize.zf.mediaquery").on("resize.zf.mediaquery",function(){var e=t._getCurrentSize(),i=t.current;e!==i&&(t.current=e,o()(window).trigger("changed.zf.mediaquery",[e,i]))})}}},function(t,e,i){"use strict";function n(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(function(){return!(!r()(this).is(":visible")||r()(this).attr("tabindex")<0)})}function s(t){var e=u[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_"+e),t.ctrlKey&&(e="CTRL_"+e),t.altKey&&(e="ALT_"+e),e=e.replace(/_$/,"")}function o(t){var e={};for(var i in t)e[t[i]]=t[i];return e}i.d(e,"a",function(){return h});var a=i(0),r=i.n(a),l=i(1),u={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},c={},h={keys:o(u),parseKey:s,handleKey:function(t,e,n){var s,o,a,u=c[e],h=this.parseKey(t);if(!u)return console.warn("Component not defined!");if(s="undefined"==typeof u.ltr?u:i.i(l.c)()?r.a.extend({},u.ltr,u.rtl):r.a.extend({},u.rtl,u.ltr),o=s[h],a=n[o],a&&"function"==typeof a){var d=a.apply();(n.handled||"function"==typeof n.handled)&&n.handled(d)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:n,register:function(t,e){c[t]=e},trapFocus:function(t){var e=n(t),i=e.eq(0),o=e.eq(-1);t.on("keydown.zf.trapfocus",function(t){t.target===o[0]&&"TAB"===s(t)?(t.preventDefault(),i.focus()):t.target===i[0]&&"SHIFT_TAB"===s(t)&&(t.preventDefault(),o.focus())})},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},function(t,e,i){"use strict";function n(t,e,i){var n=void 0,s=Array.prototype.slice.call(arguments,3);o()(window).off(e).on(e,function(e){n&&clearTimeout(n),n=setTimeout(function(){i.apply(null,s)},t||10)})}i.d(e,"a",function(){return u});var s=i(0),o=i.n(s),a=i(6),r=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e<t.length;e++)if(t[e]+"MutationObserver"in window)return window[t[e]+"MutationObserver"];return!1}(),l=function(t,e){t.data(e).split(" ").forEach(function(i){o()("#"+i)["close"===e?"trigger":"triggerHandler"](e+".zf.trigger",[t])})},u={Listeners:{Basic:{},Global:{}},Initializers:{}};u.Listeners.Basic={openListener:function(){l(o()(this),"open")},closeListener:function(){var t=o()(this).data("close");t?l(o()(this),"close"):o()(this).trigger("close.zf.trigger")},toggleListener:function(){var t=o()(this).data("toggle");t?l(o()(this),"toggle"):o()(this).trigger("toggle.zf.trigger")},closeableListener:function(t){t.stopPropagation();var e=o()(this).data("closable");""!==e?a.a.animateOut(o()(this),e,function(){o()(this).trigger("closed.zf")}):o()(this).fadeOut().trigger("closed.zf")},toggleFocusListener:function(){var t=o()(this).data("toggle-focus");o()("#"+t).triggerHandler("toggle.zf.trigger",[o()(this)])}},u.Initializers.addOpenListener=function(t){t.off("click.zf.trigger",u.Listeners.Basic.openListener),t.on("click.zf.trigger","[data-open]",u.Listeners.Basic.openListener)},u.Initializers.addCloseListener=function(t){t.off("click.zf.trigger",u.Listeners.Basic.closeListener),t.on("click.zf.trigger","[data-close]",u.Listeners.Basic.closeListener)},u.Initializers.addToggleListener=function(t){t.off("click.zf.trigger",u.Listeners.Basic.toggleListener),t.on("click.zf.trigger","[data-toggle]",u.Listeners.Basic.toggleListener)},u.Initializers.addCloseableListener=function(t){t.off("close.zf.trigger",u.Listeners.Basic.closeableListener),t.on("close.zf.trigger","[data-closeable], [data-closable]",u.Listeners.Basic.closeableListener)},u.Initializers.addToggleFocusListener=function(t){t.off("focus.zf.trigger blur.zf.trigger",u.Listeners.Basic.toggleFocusListener),t.on("focus.zf.trigger blur.zf.trigger","[data-toggle-focus]",u.Listeners.Basic.toggleFocusListener)},u.Listeners.Global={resizeListener:function(t){r||t.each(function(){o()(this).triggerHandler("resizeme.zf.trigger")}),t.attr("data-events","resize")},scrollListener:function(t){r||t.each(function(){o()(this).triggerHandler("scrollme.zf.trigger")}),t.attr("data-events","scroll")},closeMeListener:function(t,e){var i=t.namespace.split(".")[0],n=o()("[data-"+i+"]").not('[data-yeti-box="'+e+'"]');n.each(function(){var t=o()(this);t.triggerHandler("close.zf.trigger",[t])})}},u.Initializers.addClosemeListener=function(t){var e=o()("[data-yeti-box]"),i=["dropdown","tooltip","reveal"];if(t&&("string"==typeof t?i.push(t):"object"==typeof t&&"string"==typeof t[0]?i.concat(t):console.error("Plugin names must be strings")),e.length){var n=i.map(function(t){return"closeme.zf."+t}).join(" ");o()(window).off(n).on(n,u.Listeners.Global.closeMeListener)}},u.Initializers.addResizeListener=function(t){var e=o()("[data-resize]");e.length&&n(t,"resize.zf.trigger",u.Listeners.Global.resizeListener,e)},u.Initializers.addScrollListener=function(t){var e=o()("[data-scroll]");e.length&&n(t,"scroll.zf.trigger",u.Listeners.Global.scrollListener,e)},u.Initializers.addMutationEventsListener=function(t){if(!r)return!1;var e=t.find("[data-resize], [data-scroll], [data-mutate]"),i=function(t){var e=o()(t[0].target);switch(t[0].type){case"attributes":"scroll"===e.attr("data-events")&&"data-events"===t[0].attributeName&&e.triggerHandler("scrollme.zf.trigger",[e,window.pageYOffset]),"resize"===e.attr("data-events")&&"data-events"===t[0].attributeName&&e.triggerHandler("resizeme.zf.trigger",[e]),"style"===t[0].attributeName&&(e.closest("[data-mutate]").attr("data-events","mutate"),e.closest("[data-mutate]").triggerHandler("mutateme.zf.trigger",[e.closest("[data-mutate]")]));break;case"childList":e.closest("[data-mutate]").attr("data-events","mutate"),e.closest("[data-mutate]").triggerHandler("mutateme.zf.trigger",[e.closest("[data-mutate]")]);break;default:return!1}};if(e.length)for(var n=0;n<=e.length-1;n++){var s=new r(i);s.observe(e[n],{attributes:!0,childList:!0,characterData:!1,subtree:!0,attributeFilter:["data-events","style"]})}},u.Initializers.addSimpleListeners=function(){var t=o()(document);u.Initializers.addOpenListener(t),u.Initializers.addCloseListener(t),u.Initializers.addToggleListener(t),u.Initializers.addCloseableListener(t),u.Initializers.addToggleFocusListener(t)},u.Initializers.addGlobalListeners=function(){var t=o()(document);u.Initializers.addMutationEventsListener(t),u.Initializers.addResizeListener(),u.Initializers.addScrollListener(),u.Initializers.addClosemeListener()},u.init=function(t,e){if("undefined"==typeof t.triggersInitialized){t(document);"complete"===document.readyState?(u.Initializers.addSimpleListeners(),u.Initializers.addGlobalListeners()):t(window).on("load",function(){u.Initializers.addSimpleListeners(),u.Initializers.addGlobalListeners()}),t.triggersInitialized=!0}e&&(e.Triggers=u,e.IHearYou=u.Initializers.addGlobalListeners)}},function(t,e,i){"use strict";function n(t,e,i){function n(r){a||(a=r),o=r-a,i.apply(e),o<t?s=window.requestAnimationFrame(n,e):(window.cancelAnimationFrame(s),e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e]))}var s,o,a=null;return 0===t?(i.apply(e),void e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e])):void(s=window.requestAnimationFrame(n))}function s(t,e,n,s){function o(){t||e.hide(),c(),s&&s.apply(e)}function c(){e[0].style.transitionDuration=0,e.removeClass(h+" "+d+" "+n)}if(e=a()(e).eq(0),e.length){var h=t?l[0]:l[1],d=t?u[0]:u[1];c(),e.addClass(n).css("transition","none"),requestAnimationFrame(function(){e.addClass(h),t&&e.show()}),requestAnimationFrame(function(){e[0].offsetWidth,e.css("transition","").addClass(d)}),e.one(i.i(r.b)(e),o)}}i.d(e,"b",function(){return n}),i.d(e,"a",function(){return c});var o=i(0),a=i.n(o),r=i(1),l=["mui-enter","mui-leave"],u=["mui-enter-active","mui-leave-active"],c={animateIn:function(t,e,i){s(!0,t,e,i)},animateOut:function(t,e,i){s(!1,t,e,i)}}},function(t,e,i){"use strict";function n(t,e,i,n,o){return 0===s(t,e,i,n,o)}function s(t,e,i,n,s){var a,r,l,u,c=o(t);if(e){var h=o(e);r=h.height+h.offset.top-(c.offset.top+c.height),a=c.offset.top-h.offset.top,l=c.offset.left-h.offset.left,u=h.width+h.offset.left-(c.offset.left+c.width)}else r=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),a=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return r=s?0:Math.min(r,0),a=Math.min(a,0),l=Math.min(l,0),u=Math.min(u,0),i?l+u:n?a+r:Math.sqrt(a*a+r*r+l*l+u*u)}function o(t){if(t=t.length?t[0]:t,t===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),i=t.parentNode.getBoundingClientRect(),n=document.body.getBoundingClientRect(),s=window.pageYOffset,o=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+s,left:e.left+o},parentDims:{width:i.width,height:i.height,offset:{top:i.top+s,left:i.left+o}},windowDims:{width:n.width,height:n.height,offset:{top:s,left:o}}}}function a(t,e,n,s,o,a){switch(console.log("NOTE: GetOffsets is deprecated in favor of GetExplicitOffsets and will be removed in 6.5"),n){case"top":return i.i(l.c)()?r(t,e,"top","left",s,o,a):r(t,e,"top","right",s,o,a);case"bottom":return i.i(l.c)()?r(t,e,"bottom","left",s,o,a):r(t,e,"bottom","right",s,o,a);case"center top":return r(t,e,"top","center",s,o,a);case"center bottom":return r(t,e,"bottom","center",s,o,a);case"center left":return r(t,e,"left","center",s,o,a);case"center right":return r(t,e,"right","center",s,o,a);case"left bottom":return r(t,e,"bottom","left",s,o,a);case"right bottom":return r(t,e,"bottom","right",s,o,a);case"center":return{left:$eleDims.windowDims.offset.left+$eleDims.windowDims.width/2-$eleDims.width/2+o,top:$eleDims.windowDims.offset.top+$eleDims.windowDims.height/2-($eleDims.height/2+s)};case"reveal":return{left:($eleDims.windowDims.width-$eleDims.width)/2+o,top:$eleDims.windowDims.offset.top+s};case"reveal full":return{left:$eleDims.windowDims.offset.left,top:$eleDims.windowDims.offset.top};default:return{left:i.i(l.c)()?$anchorDims.offset.left-$eleDims.width+$anchorDims.width-o:$anchorDims.offset.left+o,top:$anchorDims.offset.top+$anchorDims.height+s}}}function r(t,e,i,n,s,a,r){var l,u,c=o(t),h=e?o(e):null;switch(i){case"top":l=h.offset.top-(c.height+s);break;case"bottom":l=h.offset.top+h.height+s;break;case"left":u=h.offset.left-(c.width+a);break;case"right":u=h.offset.left+h.width+a}switch(i){case"top":case"bottom":switch(n){case"left":u=h.offset.left+a;break;case"right":u=h.offset.left-c.width+h.width-a;break;case"center":u=r?a:h.offset.left+h.width/2-c.width/2+a}break;case"right":case"left":switch(n){case"bottom":l=h.offset.top-s+h.height-c.height;break;case"top":l=h.offset.top+s;break;case"center":l=h.offset.top+s+h.height/2-c.height/2}}return{top:l,left:u}}i.d(e,"a",function(){return u});var l=i(1),u={ImNotTouchingYou:n,OverlapArea:s,GetDimensions:o,GetOffsets:a,GetExplicitOffsets:r}},function(t,e,i){"use strict";function n(t,e){function i(){n--,0===n&&e()}var n=t.length;0===n&&e(),t.each(function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,function t(n){o()(this).off(e,t),i()}),t.src=o()(this).attr("src")}})}i.d(e,"a",function(){return n});var s=i(0),o=i.n(s)},function(t,e,i){"use strict";i.d(e,"a",function(){return o});var n=i(0),s=i.n(n),o={Feather:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar");var i=t.find("li").attr({role:"menuitem"}),n="is-"+e+"-submenu",o=n+"-item",a="is-"+e+"-submenu-parent",r="accordion"!==e;i.each(function(){var t=s()(this),i=t.children("ul");i.length&&(t.addClass(a),i.addClass("submenu "+n).attr({"data-submenu":""}),r&&(t.attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),i.addClass("submenu "+n).attr({"data-submenu":"",role:"menu"}),"drilldown"===e&&i.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item "+o)})},Burn:function(t,e){var i="is-"+e+"-submenu",n=i+"-item",s="is-"+e+"-submenu-parent";t.find(">li, .menu, .menu > li").removeClass(i+" "+n+" "+s+" is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(4),u=i(1),c=i(2),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Accordion",this._init(),l.a.register("Accordion",{ENTER:"toggle",SPACE:"toggle",ARROW_DOWN:"next",ARROW_UP:"previous"})}},{key:"_init",value:function(){var t=this;this.$element.attr("role","tablist"),this.$tabs=this.$element.children("[data-accordion-item]"),this.$tabs.each(function(t,e){var n=r()(e),s=n.children("[data-tab-content]"),o=s[0].id||i.i(u.a)(6,"accordion"),a=e.id||o+"-label";n.find("a:first").attr({"aria-controls":o,role:"tab",id:a,"aria-expanded":!1,"aria-selected":!1}),s.attr({role:"tabpanel","aria-labelledby":a,"aria-hidden":!0,id:o})});var e=this.$element.find(".is-active").children("[data-tab-content]");this.firstTimeInit=!0,e.length&&(this.down(e,this.firstTimeInit),this.firstTimeInit=!1),this._checkDeepLink=function(){var e=window.location.hash;if(e.length){var i=t.$element.find('[href$="'+e+'"]'),n=r()(e);if(i.length&&n){if(i.parent("[data-accordion-item]").hasClass("is-active")||(t.down(n,t.firstTimeInit),t.firstTimeInit=!1),t.options.deepLinkSmudge){var s=t;r()(window).load(function(){var t=s.$element.offset();r()("html, body").animate({scrollTop:t.top},s.options.deepLinkSmudgeDelay)})}t.$element.trigger("deeplink.zf.accordion",[i,n])}}},this.options.deepLink&&this._checkDeepLink(),this._events()}},{key:"_events",value:function(){var t=this;this.$tabs.each(function(){var e=r()(this),i=e.children("[data-tab-content]");i.length&&e.children("a").off("click.zf.accordion keydown.zf.accordion").on("click.zf.accordion",function(e){e.preventDefault(),t.toggle(i)}).on("keydown.zf.accordion",function(n){l.a.handleKey(n,"Accordion",{toggle:function(){t.toggle(i)},next:function(){var i=e.next().find("a").focus();t.options.multiExpand||i.trigger("click.zf.accordion")},previous:function(){var i=e.prev().find("a").focus();t.options.multiExpand||i.trigger("click.zf.accordion")},handled:function(){n.preventDefault(),n.stopPropagation()}})})}),this.options.deepLink&&r()(window).on("popstate",this._checkDeepLink)}},{key:"toggle",value:function(t){if(t.closest("[data-accordion]").is("[disabled]"))return void console.info("Cannot toggle an accordion that is disabled.");if(t.parent().hasClass("is-active")?this.up(t):this.down(t),this.options.deepLink){var e=t.prev("a").attr("href");this.options.updateHistory?history.pushState({},"",e):history.replaceState({},"",e)}}},{key:"down",value:function(t,e){var i=this;if(t.closest("[data-accordion]").is("[disabled]")&&!e)return void console.info("Cannot call down on an accordion that is disabled.");if(t.attr("aria-hidden",!1).parent("[data-tab-content]").addBack().parent().addClass("is-active"),!this.options.multiExpand&&!e){var n=this.$element.children(".is-active").children("[data-tab-content]");n.length&&this.up(n.not(t))}t.slideDown(this.options.slideSpeed,function(){i.$element.trigger("down.zf.accordion",[t])}),r()("#"+t.attr("aria-labelledby")).attr({"aria-expanded":!0,"aria-selected":!0})}},{key:"up",value:function(t){if(t.closest("[data-accordion]").is("[disabled]"))return void console.info("Cannot call up on an accordion that is disabled.");var e=t.parent().siblings(),i=this;(this.options.allowAllClosed||e.hasClass("is-active"))&&t.parent().hasClass("is-active")&&(t.slideUp(i.options.slideSpeed,function(){i.$element.trigger("up.zf.accordion",[t])}),t.attr("aria-hidden",!0).parent().removeClass("is-active"),r()("#"+t.attr("aria-labelledby")).attr({"aria-expanded":!1,"aria-selected":!1}))}},{key:"_destroy",value:function(){this.$element.find("[data-tab-content]").stop(!0).slideUp(0).css("display",""),this.$element.find("a").off(".zf.accordion"),this.options.deepLink&&r()(window).off("popstate",this._checkDeepLink)}}]),e}(c.a);d.defaults={slideSpeed:250,multiExpand:!1,allowAllClosed:!1,deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,updateHistory:!1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return f});var a=i(0),r=i.n(a),l=i(4),u=i(9),c=i(1),h=i(2),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),f=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),d(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="AccordionMenu",this._init(),l.a.register("AccordionMenu",{ENTER:"toggle",SPACE:"toggle",ARROW_RIGHT:"open",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"close",ESCAPE:"closeAll"})}},{key:"_init",value:function(){u.a.Feather(this.$element,"accordion");var t=this;this.$element.find("[data-submenu]").not(".is-active").slideUp(0),this.$element.attr({role:"tree","aria-multiselectable":this.options.multiOpen}),this.$menuLinks=this.$element.find(".is-accordion-submenu-parent"),this.$menuLinks.each(function(){var e=this.id||i.i(c.a)(6,"acc-menu-link"),n=r()(this),s=n.children("[data-submenu]"),o=s[0].id||i.i(c.a)(6,"acc-menu"),a=s.hasClass("is-active");t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('<button id="'+e+'" class="submenu-toggle" aria-controls="'+o+'" aria-expanded="'+a+'" title="'+t.options.submenuToggleText+'"><span class="submenu-toggle-text">'+t.options.submenuToggleText+"</span></button>")):n.attr({"aria-controls":o,"aria-expanded":a,id:e}),s.attr({"aria-labelledby":e,"aria-hidden":!a,role:"group",id:o})}),this.$element.find("li").attr({role:"treeitem"});var e=this.$element.find(".is-active");if(e.length){var t=this;e.each(function(){t.down(r()(this))})}this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each(function(){var e=r()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?r()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",function(i){t.toggle(e)}):r()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",function(i){i.preventDefault(),t.toggle(e)}))}).on("keydown.zf.accordionmenu",function(e){var i,n,s=r()(this),o=s.parent("ul").children("li"),a=s.children("[data-submenu]");o.each(function(t){if(r()(this).is(s))return i=o.eq(Math.max(0,t-1)).find("a").first(),n=o.eq(Math.min(t+1,o.length-1)).find("a").first(),r()(this).children("[data-submenu]:visible").length&&(n=s.find("li:first-child").find("a").first()),r()(this).is(":first-child")?i=s.parents("li").first().find("a").first():i.parents("li").first().children("[data-submenu]:visible").length&&(i=i.parents("li").find("li:last-child").find("a").first()),void(r()(this).is(":last-child")&&(n=s.parents("li").first().next("li").find("a").first()))}),l.a.handleKey(e,"AccordionMenu",{open:function(){a.is(":hidden")&&(t.down(a),a.find("li").first().find("a").first().focus())},close:function(){a.length&&!a.is(":hidden")?t.up(a):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return i.focus(),!0},down:function(){return n.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault(),e.stopImmediatePropagation()}})})}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;this.options.multiOpen||this.up(this.$element.find(".is-active").not(t.parentsUntil(this.$element).add(t))),t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(e.options.slideSpeed,function(){e.$element.trigger("down.zf.accordionMenu",[t])})}},{key:"up",value:function(t){var e=this;t.slideUp(e.options.slideSpeed,function(){e.$element.trigger("up.zf.accordionMenu",[t])});var i=t.find("[data-submenu]").slideUp(0).addBack().attr("aria-hidden",!0);this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1)}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),u.a.Burn(this.$element,"accordion")}}]),e}(h.a);f.defaults={slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return p});var a=i(0),r=i.n(a),l=i(4),u=i(9),c=i(1),h=i(7),d=i(2),f=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),f(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Drilldown",this._init(),l.a.register("Drilldown",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close",TAB:"down",SHIFT_TAB:"up"})}},{key:"_init",value:function(){u.a.Feather(this.$element,"drilldown"),this.options.autoApplyClass&&this.$element.addClass("drilldown"),this.$element.attr({role:"tree","aria-multiselectable":!1}),this.$submenuAnchors=this.$element.find("li.is-drilldown-submenu-parent").children("a"),this.$submenus=this.$submenuAnchors.parent("li").children("[data-submenu]").attr("role","group"),this.$menuItems=this.$element.find("li").not(".js-drilldown-back").attr("role","treeitem").find("a"),this.$element.attr("data-mutate",this.$element.attr("data-drilldown")||i.i(c.a)(6,"drilldown")),this._prepareMenu(),this._registerEvents(),this._keyboardEvents()}},{key:"_prepareMenu",value:function(){var t=this;this.$submenuAnchors.each(function(){var e=r()(this),i=e.parent();t.options.parentLink&&e.clone().prependTo(i.children("[data-submenu]")).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menuitem"></li>'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)}),this.$submenus.each(function(){var e=r()(this),i=e.find(".js-drilldown-back");if(!i.length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)}),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=r()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",function(i){if(r()(i.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&(i.stopImmediatePropagation(),i.preventDefault()),e._show(t.parent("li")),e.options.closeOnClick){var n=r()("body");n.off(".zf.drilldown").on("click.zf.drilldown",function(t){t.target===e.$element[0]||r.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),n.off(".zf.drilldown"))})}})}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!=t.options.scrollTopElement?r()(t.options.scrollTopElement):t.$element,i=parseInt(e.offset().top+t.options.scrollTopOffset,10);r()("html, body").stop(!0).animate({scrollTop:i},t.options.animationDuration,t.options.animationEasing,function(){this===r()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")})}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",function(e){var n,s,o=r()(this),a=o.parent("li").parent("ul").children("li").children("a");a.each(function(t){if(r()(this).is(o))return n=a.eq(Math.max(0,t-1)),void(s=a.eq(Math.min(t+1,a.length-1)))}),l.a.handleKey(e,"Drilldown",{next:function(){if(o.is(t.$submenuAnchors))return t._show(o.parent("li")),o.parent("li").one(i.i(c.b)(o),function(){
-o.parent("li").find("ul li a").filter(t.$menuItems).first().focus()}),!0},previous:function(){return t._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(i.i(c.b)(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),!0},up:function(){return n.focus(),!o.is(t.$element.find("> li:first-child > a"))},down:function(){return s.focus(),!o.is(t.$element.find("> li:last-child > a"))},close:function(){o.is(t.$element.find("> li > a"))||(t._hide(o.parent().parent()),o.parent().parent().siblings("a").focus())},open:function(){return o.is(t.$menuItems)?o.is(t.$submenuAnchors)?(t._show(o.parent("li")),o.parent("li").one(i.i(c.b)(o),function(){o.parent("li").find("ul li a").filter(t.$menuItems).first().focus()}),!0):void 0:(t._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(i.i(c.b)(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),!0)},handled:function(t){t&&e.preventDefault(),e.stopImmediatePropagation()}})})}},{key:"_hideAll",value:function(){var t=this.$element.find(".is-drilldown-submenu.is-active").addClass("is-closing");this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.one(i.i(c.b)(t),function(e){t.removeClass("is-active is-closing")}),this.$element.trigger("closed.zf.drilldown")}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",function(i){i.stopImmediatePropagation(),e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length&&e._show(n)})}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",function(e){setTimeout(function(){t._hideAll()},0)})}},{key:"_show",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.children("[data-submenu]").data("calcHeight")}),t.attr("aria-expanded",!0),t.children("[data-submenu]").addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")});t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0).addClass("is-closing"),t.addClass("is-closing").one(i.i(c.b)(t),function(){t.removeClass("is-active is-closing"),t.blur().addClass("invisible")}),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},i=this;return this.$submenus.add(this.$element).each(function(){var n=(r()(this).children("li").length,h.a.GetDimensions(this).height);t=n>t?n:t,i.options.autoHeight&&(r()(this).data("calcHeight",n),r()(this).hasClass("is-drilldown-submenu")||(e.height=n))}),this.options.autoHeight||(e["min-height"]=t+"px"),e["max-width"]=this.$element[0].getBoundingClientRect().width+"px",e}},{key:"_destroy",value:function(){this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),u.a.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each(function(){r()(this).off(".zf.drilldown")}),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each(function(){var t=r()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")})}}]),e}(d.a);p.defaults={autoApplyClass:!0,backButton:'<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',backButtonPosition:"top",wrapper:"<div></div>",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return p});var a=i(0),r=i.n(a),l=i(4),u=i(9),c=i(7),h=i(1),d=i(2),f=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),f(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="DropdownMenu",this._init(),l.a.register("DropdownMenu",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close"})}},{key:"_init",value:function(){u.a.Feather(this.$element,"dropdown");var t=this.$element.find("li.is-dropdown-submenu-parent");this.$element.children(".is-dropdown-submenu-parent").children(".is-dropdown-submenu").addClass("first-sub"),this.$menuItems=this.$element.find('[role="menuitem"]'),this.$tabs=this.$element.children('[role="menuitem"]'),this.$tabs.find("ul.is-dropdown-submenu").addClass(this.options.verticalClass),"auto"===this.options.alignment?this.$element.hasClass(this.options.rightClass)||i.i(h.c)()||this.$element.parents(".top-bar-right").is("*")?(this.options.alignment="right",t.addClass("opens-left")):(this.options.alignment="left",t.addClass("opens-right")):"right"===this.options.alignment?t.addClass("opens-left"):t.addClass("opens-right"),this.changed=!1,this._events()}},{key:"_isVertical",value:function(){return"block"===this.$tabs.css("display")||"column"===this.$element.css("flex-direction")}},{key:"_isRtl",value:function(){return this.$element.hasClass("align-right")||i.i(h.c)()&&!this.$element.hasClass("align-left")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||"undefined"!=typeof window.ontouchstart,i="is-dropdown-submenu-parent",n=function(n){var s=r()(n.target).parentsUntil("ul","."+i),o=s.hasClass(i),a="true"===s.attr("data-is-click"),l=s.children(".is-dropdown-submenu");if(o)if(a){if(!t.options.closeOnClick||!t.options.clickOpen&&!e||t.options.forceFollow&&e)return;n.stopImmediatePropagation(),n.preventDefault(),t._hide(s)}else n.preventDefault(),n.stopImmediatePropagation(),t._show(l),s.add(s.parentsUntil(t.$element,"."+i)).attr("data-is-click",!0)};(this.options.clickOpen||e)&&this.$menuItems.on("click.zf.dropdownmenu touchstart.zf.dropdownmenu",n),t.options.closeOnClickInside&&this.$menuItems.on("click.zf.dropdownmenu",function(e){var n=r()(this),s=n.hasClass(i);s||t._hide()}),this.options.disableHover||this.$menuItems.on("mouseenter.zf.dropdownmenu",function(e){var n=r()(this),s=n.hasClass(i);s&&(clearTimeout(n.data("_delay")),n.data("_delay",setTimeout(function(){t._show(n.children(".is-dropdown-submenu"))},t.options.hoverDelay)))}).on("mouseleave.zf.dropdownmenu",function(e){var n=r()(this),s=n.hasClass(i);if(s&&t.options.autoclose){if("true"===n.attr("data-is-click")&&t.options.clickOpen)return!1;clearTimeout(n.data("_delay")),n.data("_delay",setTimeout(function(){t._hide(n)},t.options.closingTime))}}),this.$menuItems.on("keydown.zf.dropdownmenu",function(e){var i,n,s=r()(e.target).parentsUntil("ul",'[role="menuitem"]'),o=t.$tabs.index(s)>-1,a=o?t.$tabs:s.siblings("li").add(s);a.each(function(t){if(r()(this).is(s))return i=a.eq(t-1),void(n=a.eq(t+1))});var u=function(){n.children("a:first").focus(),e.preventDefault()},c=function(){i.children("a:first").focus(),e.preventDefault()},h=function(){var i=s.children("ul.is-dropdown-submenu");i.length&&(t._show(i),s.find("li > a:first").focus(),e.preventDefault())},d=function(){var i=s.parent("ul").parent("li");i.children("a:first").focus(),t._hide(i),e.preventDefault()},f={open:h,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()},handled:function(){e.stopImmediatePropagation()}};o?t._isVertical()?t._isRtl()?r.a.extend(f,{down:u,up:c,next:d,previous:h}):r.a.extend(f,{down:u,up:c,next:h,previous:d}):t._isRtl()?r.a.extend(f,{next:c,previous:u,down:h,up:d}):r.a.extend(f,{next:u,previous:c,down:h,up:d}):t._isRtl()?r.a.extend(f,{next:d,previous:h,down:u,up:c}):r.a.extend(f,{next:h,previous:d,down:u,up:c}),l.a.handleKey(e,"DropdownMenu",f)})}},{key:"_addBodyHandler",value:function(){var t=r()(document.body),e=this;t.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",function(i){var n=e.$element.find(i.target);n.length||(e._hide(),t.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))})}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter(function(e,i){return r()(i).find(t).length>0})),i=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(i,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var n=c.a.ImNotTouchingYou(t,null,!0);if(!n){var s="left"===this.options.alignment?"-right":"-left",o=t.parent(".is-dropdown-submenu-parent");o.removeClass("opens"+s).addClass("opens-"+this.options.alignment),n=c.a.ImNotTouchingYou(t,null,!0),n||o.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[t])}},{key:"_hide",value:function(t,e){var i;i=t&&t.length?t:void 0!==e?this.$tabs.not(function(t,i){return t===e}):this.$element;var n=i.hasClass("is-active")||i.find(".is-active").length>0;if(n){if(i.find("li.is-active").add(i).attr({"data-is-click":!1}).removeClass("is-active"),i.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||i.find("opens-inner").length){var s="left"===this.options.alignment?"right":"left";i.find("li.is-dropdown-submenu-parent").add(i).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+s),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[i])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),r()(document.body).off(".zf.dropdownmenu"),u.a.Burn(this.$element,"dropdown")}}]),e}(d.a);p.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return h});var a=i(0),r=i.n(a),l=i(1),u=i(2),c=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),h=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),c(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||i.i(l.a)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){var t=this,i=function(i){if(!r()(this).is('a[href^="#"]'))return!1;var n=this.getAttribute("href");t._inTransition=!0,e.scrollToLoc(n,t.options,function(){t._inTransition=!1}),i.preventDefault()};this.$element.on("click.zf.smoothScroll",i),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',i)}}],[{key:"scrollToLoc",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.defaults,n=arguments[2];if(!r()(t).length)return!1;var s=Math.round(r()(t).offset().top-i.threshold/2-i.offset);r()("html, body").stop(!0).animate({scrollTop:s},i.animationDuration,i.animationEasing,function(){n&&"function"==typeof n&&n()})}}]),e}(u.a);h.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(4),u=i(8),c=i(2),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Tabs",this._init(),l.a.register("Tabs",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"previous",ARROW_DOWN:"next",ARROW_LEFT:"previous"})}},{key:"_init",value:function(){var t=this,e=this;if(this.$element.attr({role:"tablist"}),this.$tabTitles=this.$element.find("."+this.options.linkClass),this.$tabContent=r()('[data-tabs-content="'+this.$element[0].id+'"]'),this.$tabTitles.each(function(){var t=r()(this),i=t.find("a"),n=t.hasClass(""+e.options.linkActiveClass),s=i.attr("data-tabs-target")||i[0].hash.slice(1),o=i[0].id?i[0].id:s+"-label",a=r()("#"+s);t.attr({role:"presentation"}),i.attr({role:"tab","aria-controls":s,"aria-selected":n,id:o,tabindex:n?"0":"-1"}),a.attr({role:"tabpanel","aria-labelledby":o}),n||a.attr("aria-hidden","true"),n&&e.options.autoFocus&&r()(window).load(function(){r()("html, body").animate({scrollTop:t.offset().top},e.options.deepLinkSmudgeDelay,function(){i.focus()})})}),this.options.matchHeight){var n=this.$tabContent.find("img");n.length?i.i(u.a)(n,this._setHeight.bind(this)):this._setHeight()}this._checkDeepLink=function(){var e=window.location.hash;if(e.length){var i=t.$element.find('[href$="'+e+'"]');if(i.length){if(t.selectTab(r()(e),!0),t.options.deepLinkSmudge){var n=t.$element.offset();r()("html, body").animate({scrollTop:n.top},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[i,r()(e)])}}},this.options.deepLink&&this._checkDeepLink(),this._events()}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),r()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&r()(window).on("popstate",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs","."+this.options.linkClass,function(e){e.preventDefault(),e.stopPropagation(),t._handleTabChange(r()(this))})}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",function(e){if(9!==e.which){var i,n,s=r()(this),o=s.parent("ul").children("li");o.each(function(e){if(r()(this).is(s))return void(t.options.wrapOnKeys?(i=0===e?o.last():o.eq(e-1),n=e===o.length-1?o.first():o.eq(e+1)):(i=o.eq(Math.max(0,e-1)),n=o.eq(Math.min(e+1,o.length-1))))}),l.a.handleKey(e,"Tabs",{open:function(){s.find('[role="tab"]').focus(),t._handleTabChange(s)},previous:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},next:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},handled:function(){e.stopPropagation(),e.preventDefault()}})}})}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass(""+this.options.linkActiveClass))return void(this.options.activeCollapse&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t])));var i=this.$element.find("."+this.options.linkClass+"."+this.options.linkActiveClass),n=t.find('[role="tab"]'),s=n.attr("data-tabs-target")||n[0].hash.slice(1),o=this.$tabContent.find("#"+s);if(this._collapseTab(i),this._openTab(t),this.options.deepLink&&!e){var a=t.find("a").attr("href");this.options.updateHistory?history.pushState({},"",a):history.replaceState({},"",a)}this.$element.trigger("change.zf.tabs",[t,o]),o.find("[data-mutate]").trigger("mutateme.zf.trigger")}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),i=e.attr("data-tabs-target")||e[0].hash.slice(1),n=this.$tabContent.find("#"+i);t.addClass(""+this.options.linkActiveClass),e.attr({"aria-selected":"true",tabindex:"0"}),n.addClass(""+this.options.panelActiveClass).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass(""+this.options.linkActiveClass).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});r()("#"+e.attr("aria-controls")).removeClass(""+this.options.panelActiveClass).attr({"aria-hidden":"true"})}},{key:"selectTab",value:function(t,e){var i;i="object"==typeof t?t[0].id:t,i.indexOf("#")<0&&(i="#"+i);var n=this.$tabTitles.find('[href$="'+i+'"]').parent("."+this.options.linkClass);this._handleTabChange(n,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent.find("."+this.options.panelClass).css("height","").each(function(){var i=r()(this),n=i.hasClass(""+e.options.panelActiveClass);n||i.css({visibility:"hidden",display:"block"});var s=this.getBoundingClientRect().height;n||i.css({visibility:"",display:""}),t=s>t?s:t}).css("height",t+"px")}},{key:"_destroy",value:function(){this.$element.find("."+this.options.linkClass).off(".zf.tabs").hide().end().find("."+this.options.panelClass).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&r()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&r()(window).off("popstate",this._checkDeepLink)}}]),e}(c.a);d.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t,e){var i=e.indexOf(t);return i===e.length-1?e[0]:e[i+1]}i.d(e,"a",function(){return m});var r=i(7),l=i(2),u=i(1),c=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),h=["left","right","top","bottom"],d=["top","bottom","center"],f=["left","right","center"],p={left:d,right:d,top:f,bottom:f},m=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),c(e,[{key:"_init",value:function(){this.triedPositions={},this.position="auto"===this.options.position?this._getDefaultPosition():this.options.position,this.alignment="auto"===this.options.alignment?this._getDefaultAlignment():this.options.alignment}},{key:"_getDefaultPosition",value:function(){return"bottom"}},{key:"_getDefaultAlignment",value:function(){switch(this.position){case"bottom":case"top":return i.i(u.c)()?"right":"left";case"left":case"right":return"bottom"}}},{key:"_reposition",value:function(){this._alignmentsExhausted(this.position)?(this.position=a(this.position,h),this.alignment=p[this.position][0]):this._realign()}},{key:"_realign",value:function(){this._addTriedPosition(this.position,this.alignment),this.alignment=a(this.alignment,p[this.position])}},{key:"_addTriedPosition",value:function(t,e){this.triedPositions[t]=this.triedPositions[t]||[],this.triedPositions[t].push(e)}},{key:"_positionsExhausted",value:function(){for(var t=!0,e=0;e<h.length;e++)t=t&&this._alignmentsExhausted(h[e]);return t}},{key:"_alignmentsExhausted",value:function(t){return this.triedPositions[t]&&this.triedPositions[t].length==p[t].length}},{key:"_getVOffset",value:function(){return this.options.vOffset}},{key:"_getHOffset",value:function(){return this.options.hOffset}},{key:"_setPosition",value:function(t,e,i){if("false"===t.attr("aria-expanded"))return!1;r.a.GetDimensions(e),r.a.GetDimensions(t);if(e.offset(r.a.GetExplicitOffsets(e,t,this.position,this.alignment,this._getVOffset(),this._getHOffset())),!this.options.allowOverlap){for(var n=1e8,s={position:this.position,alignment:this.alignment};!this._positionsExhausted();){var o=r.a.OverlapArea(e,i,!1,!1,this.options.allowBottomOverlap);if(0===o)return;o<n&&(n=o,s={position:this.position,alignment:this.alignment}),this._reposition(),e.offset(r.a.GetExplicitOffsets(e,t,this.position,this.alignment,this._getVOffset(),this._getHOffset()))}this.position=s.position,this.alignment=s.alignment,e.offset(r.a.GetExplicitOffsets(e,t,this.position,this.alignment,this._getVOffset(),this._getHOffset()))}}}]),e}(l.a);m.defaults={position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!0,vOffset:0,hOffset:0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(){this.removeEventListener("touchmove",o),this.removeEventListener("touchend",s),g=!1}function o(t){if(f.a.spotSwipe.preventDefault&&t.preventDefault(),g){var e,i=t.touches[0].pageX,n=(t.touches[0].pageY,l-i);h=(new Date).getTime()-c,Math.abs(n)>=f.a.spotSwipe.moveThreshold&&h<=f.a.spotSwipe.timeThreshold&&(e=n>0?"left":"right"),e&&(t.preventDefault(),s.call(this),f()(this).trigger("swipe",e).trigger("swipe"+e))}}function a(t){1==t.touches.length&&(l=t.touches[0].pageX,u=t.touches[0].pageY,g=!0,c=(new Date).getTime(),this.addEventListener("touchmove",o,!1),this.addEventListener("touchend",s,!1))}function r(){this.addEventListener&&this.addEventListener("touchstart",a,!1)}i.d(e,"a",function(){return m});var l,u,c,h,d=i(0),f=i.n(d),p=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),m={},g=!1,v=function(){function t(e){n(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this.$=e,this._init()}return p(t,[{key:"_init",value:function(){var t=this.$;t.event.special.swipe={setup:r},t.each(["left","up","down","right"],function(){t.event.special["swipe"+this]={setup:function(){t(this).on("swipe",t.noop)}}})}}]),t}();m.setupSpotSwipe=function(t){t.spotSwipe=new v(t)},m.setupTouchHandler=function(t){t.fn.addTouch=function(){this.each(function(i,n){t(n).bind("touchstart touchmove touchend touchcancel",function(){e(event)})});var e=function(t){var e,i=t.changedTouches,n=i[0],s={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},o=s[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(o,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent"),e.initMouseEvent(o,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null)),n.target.dispatchEvent(e)}}},m.init=function(t){"undefined"==typeof t.spotSwipe&&(m.setupSpotSwipe(t),m.setupTouchHandler(t))}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return c});var a=i(0),r=i.n(a),l=i(2),u=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),c=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),u(e,[{key:"_setup",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=r.a.extend(!0,{},e.defaults,this.$element.data(),i),this.className="Abide",this._init()}},{key:"_init",value:function(){this.$inputs=this.$element.find("input, textarea, select"),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",function(){t.resetForm()}).on("submit.zf.abide",function(){return t.validateForm()}),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",function(e){t.validateInput(r()(e.target))}),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",function(e){t.validateInput(r()(e.target))}),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",function(e){t.validateInput(r()(e.target))})}},{key:"_reflow",value:function(){this._init()}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var i=t.find("option:selected");i.length&&i.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t){var e=t[0].id,i=t.siblings(this.options.formErrorSelector);return i.length||(i=t.parent().find(this.options.formErrorSelector)),i=i.add(this.$element.find('[data-form-error-for="'+e+'"]'))}},{key:"findLabel",value:function(t){var e=t[0].id,i=this.$element.find('label[for="'+e+'"]');return i.length?i:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,i=t.map(function(t,i){var n=i.id,s=e.$element.find('label[for="'+n+'"]');return s.length||(s=r()(i).closest("label")),s[0]});return r()(i)}},{key:"addErrorClasses",value:function(t){var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr("data-invalid","")}},{key:"removeRadioErrorClasses",value:function(t){var e=this.$element.find(':radio[name="'+t+'"]'),i=this.findRadioLabels(e),n=this.findFormError(e);i.length&&i.removeClass(this.options.labelErrorClass),n.length&&n.removeClass(this.options.formErrorClass),e.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"removeErrorClasses",value:function(t){if("radio"==t[0].type)return this.removeRadioErrorClasses(t.attr("name"));var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.removeClass(this.options.labelErrorClass),i.length&&i.removeClass(this.options.formErrorClass),t.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"validateInput",value:function(t){var e=this,i=this.requiredCheck(t),n=!1,s=!0,o=t.attr("data-validator"),a=!0;if(t.is("[data-abide-ignore]")||t.is('[type="hidden"]')||t.is("[disabled]"))return!0;switch(t[0].type){case"radio":n=this.validateRadio(t.attr("name"));break;case"checkbox":n=i;break;case"select":case"select-one":case"select-multiple":n=i;break;default:n=this.validateText(t)}o&&(s=this.matchValidation(t,o,t.attr("required"))),t.attr("data-equalto")&&(a=this.options.validators.equalTo(t));var l=[i,n,s,a].indexOf(!1)===-1,u=(l?"valid":"invalid")+".zf.abide";if(l){var c=this.$element.find('[data-equalto="'+t.attr("id")+'"]');c.length&&!function(){var t=e;c.each(function(){r()(this).val()&&t.validateInput(r()(this))})}()}return this[l?"removeErrorClasses":"addErrorClasses"](t),t.trigger(u,[t]),l}},{key:"validateForm",value:function(){var t=[],e=this;this.$inputs.each(function(){t.push(e.validateInput(r()(this)))});var i=t.indexOf(!1)===-1;return this.$element.find("[data-abide-error]").css("display",i?"none":"block"),this.$element.trigger((i?"formvalid":"forminvalid")+".zf.abide",[this.$element]),i}},{key:"validateText",value:function(t,e){e=e||t.attr("pattern")||t.attr("type");var i=t.val(),n=!1;return i.length?n=this.options.patterns.hasOwnProperty(e)?this.options.patterns[e].test(i):e===t.attr("type")||new RegExp(e).test(i):t.prop("required")||(n=!0),n}},{key:"validateRadio",value:function(t){var e=this.$element.find(':radio[name="'+t+'"]'),i=!1,n=!1;return e.each(function(t,e){r()(e).attr("required")&&(n=!0)}),n||(i=!0),i||e.each(function(t,e){r()(e).prop("checked")&&(i=!0)}),i}},{key:"matchValidation",value:function(t,e,i){var n=this;i=!!i;var s=e.split(" ").map(function(e){return n.options.validators[e](t,i,t.parent())});return s.indexOf(!1)===-1}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;r()("."+e.labelErrorClass,t).not("small").removeClass(e.labelErrorClass),r()("."+e.inputErrorClass,t).not("small").removeClass(e.inputErrorClass),r()(e.formErrorSelector+"."+e.formErrorClass).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),r()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").removeAttr("data-invalid"),r()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).removeAttr("data-invalid"),r()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).removeAttr("data-invalid"),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each(function(){t.removeErrorClasses(r()(this))})}}]),e}(l.a);c.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",
-liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return c.defaults.patterns.domain.test(t)||c.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t,e,i){return r()("#"+t.attr("data-equalto")).val()===t.val()}}}},function(t,e,i){"use strict";function n(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/,i=e.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function s(t){return"true"===t||"false"!==t&&(isNaN(1*t)?t:parseFloat(t))}function o(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}i.d(e,"a",function(){return h});var a=i(0),r=i.n(a),l=i(1),u=i(3),c="6.4.2",h={version:c,_plugins:{},_uuids:[],plugin:function(t,e){var i=e||n(t),s=o(i);this._plugins[s]=this[i]=t},registerPlugin:function(t,e){var s=e?o(e):n(t.constructor).toLowerCase();t.uuid=i.i(l.a)(6,s),t.$element.attr("data-"+s)||t.$element.attr("data-"+s,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+s),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=o(n(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+e).removeData("zfPlugin").trigger("destroyed.zf."+e);for(var i in t)t[i]=null},reInit:function(t){var e=t instanceof r.a;try{if(e)t.each(function(){r()(this).data("zfPlugin")._init()});else{var i=typeof t,n=this,s={object:function(t){t.forEach(function(t){t=o(t),r()("[data-"+t+"]").foundation("_init")})},string:function(){t=o(t),r()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(n._plugins))}};s[i](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){"undefined"==typeof e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var i=this;r.a.each(e,function(e,n){var o=i._plugins[n],a=r()(t).find("[data-"+n+"]").addBack("[data-"+n+"]");a.each(function(){var t=r()(this),e={};if(t.data("zfPlugin"))return void console.warn("Tried to initialize "+n+" on an element that already has a Foundation plugin.");if(t.attr("data-options")){t.attr("data-options").split(";").forEach(function(t,i){var n=t.split(":").map(function(t){return t.trim()});n[0]&&(e[n[0]]=s(n[1]))})}try{t.data("zfPlugin",new o(r()(this),e))}catch(t){console.error(t)}finally{return}})})},getFnName:n,addToJquery:function(t){var e=function(e){var i=typeof e,s=t(".no-js");if(s.length&&s.removeClass("no-js"),"undefined"===i)u.a._init(),h.reflow(this);else{if("string"!==i)throw new TypeError("We're sorry, "+i+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var o=Array.prototype.slice.call(arguments,1),a=this.data("zfPlugin");if(void 0===a||void 0===a[e])throw new ReferenceError("We're sorry, '"+e+"' is not an available method for "+(a?n(a):"this element")+".");1===this.length?a[e].apply(a,o):this.each(function(i,n){a[e].apply(t(n).data("zfPlugin"),o)})}return this};return t.fn.foundation=e,t}};h.util={throttle:function(t,e){var i=null;return function(){var n=this,s=arguments;null===i&&(i=setTimeout(function(){t.apply(n,s),i=null},e))}}},window.Foundation=h,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e<t.length&&!window.requestAnimationFrame;++e){var i=t[e];window.requestAnimationFrame=window[i+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i+"CancelAnimationFrame"]||window[i+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var n=0;window.requestAnimationFrame=function(t){var e=Date.now(),i=Math.max(n+16,e);return setTimeout(function(){t(n=i)},i-e)},window.cancelAnimationFrame=clearTimeout}window.performance&&window.performance.now||(window.performance={start:Date.now(),now:function(){return Date.now()-this.start}})}(),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n?this:t,e.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(n.prototype=this.prototype),s.prototype=new n,s})},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return p});var a=i(0),r=i.n(a),l=i(4),u=i(1),c=i(16),h=i(5),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),f=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;if(void 0!==a)return a.call(n)},p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),d(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Dropdown",h.a.init(r.a),this._init(),l.a.register("Dropdown",{ENTER:"open",SPACE:"open",ESCAPE:"close"})}},{key:"_init",value:function(){var t=this.$element.attr("id");this.$anchors=r()('[data-toggle="'+t+'"]').length?r()('[data-toggle="'+t+'"]'):r()('[data-open="'+t+'"]'),this.$anchors.attr({"aria-controls":t,"data-is-focus":!1,"data-yeti-box":t,"aria-haspopup":!0,"aria-expanded":!1}),this._setCurrentAnchor(this.$anchors.first()),this.options.parentClass?this.$parent=this.$element.parents("."+this.options.parentClass):this.$parent=null,this.$element.attr({"aria-hidden":"true","data-yeti-box":t,"data-resize":t,"aria-labelledby":this.$currentAnchor.id||i.i(u.a)(6,"dd-anchor")}),f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_init",this).call(this),this._events()}},{key:"_getDefaultPosition",value:function(){var t=this.$element[0].className.match(/(top|left|right|bottom)/g);return t?t[0]:"bottom"}},{key:"_getDefaultAlignment",value:function(){var t=/float-(\S+)/.exec(this.$currentAnchor.className);return t?t[1]:f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_getDefaultAlignment",this).call(this)}},{key:"_setPosition",value:function(){f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_setPosition",this).call(this,this.$currentAnchor,this.$element,this.$parent)}},{key:"_setCurrentAnchor",value:function(t){this.$currentAnchor=r()(t)}},{key:"_events",value:function(){var t=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.$anchors.off("click.zf.trigger").on("click.zf.trigger",function(){t._setCurrentAnchor(this)}),this.options.hover&&(this.$anchors.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){t._setCurrentAnchor(this);var e=r()("body").data();"undefined"!=typeof e.whatinput&&"mouse"!==e.whatinput||(clearTimeout(t.timeout),t.timeout=setTimeout(function(){t.open(),t.$anchors.data("hover",!0)},t.options.hoverDelay))}).on("mouseleave.zf.dropdown",function(){clearTimeout(t.timeout),t.timeout=setTimeout(function(){t.close(),t.$anchors.data("hover",!1)},t.options.hoverDelay)}),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(t.timeout)}).on("mouseleave.zf.dropdown",function(){clearTimeout(t.timeout),t.timeout=setTimeout(function(){t.close(),t.$anchors.data("hover",!1)},t.options.hoverDelay)})),this.$anchors.add(this.$element).on("keydown.zf.dropdown",function(e){var i=r()(this);l.a.findFocusable(t.$element);l.a.handleKey(e,"Dropdown",{open:function(){i.is(t.$anchors)&&(t.open(),t.$element.attr("tabindex",-1).focus(),e.preventDefault())},close:function(){t.close(),t.$anchors.focus()}})})}},{key:"_addBodyHandler",value:function(){var t=r()(document.body).not(this.$element),e=this;t.off("click.zf.dropdown").on("click.zf.dropdown",function(i){e.$anchors.is(i.target)||e.$anchors.find(i.target).length||e.$element.find(i.target).length||(e.close(),t.off("click.zf.dropdown"))})}},{key:"open",value:function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchors.addClass("hover").attr({"aria-expanded":!0}),this.$element.addClass("is-opening"),this._setPosition(),this.$element.removeClass("is-opening").addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var t=l.a.findFocusable(this.$element);t.length&&t.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.options.trapFocus&&l.a.trapFocus(this.$element),this.$element.trigger("show.zf.dropdown",[this.$element])}},{key:"close",value:function(){return!!this.$element.hasClass("is-open")&&(this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchors.removeClass("hover").attr("aria-expanded",!1),this.$element.trigger("hide.zf.dropdown",[this.$element]),void(this.options.trapFocus&&l.a.releaseFocus(this.$element)))}},{key:"toggle",value:function(){if(this.$element.hasClass("is-open")){if(this.$anchors.data("hover"))return;this.close()}else this.open()}},{key:"_destroy",value:function(){this.$element.off(".zf.trigger").hide(),this.$anchors.off(".zf.dropdown"),r()(document.body).off("click.zf.dropdown")}}]),e}(c.a);p.defaults={parentClass:null,hoverDelay:250,hover:!1,hoverPane:!1,vOffset:0,hOffset:0,positionClass:"",position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!0,trapFocus:!1,autoFocus:!1,closeOnClick:!1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return f});var a=i(0),r=i.n(a),l=i(3),u=i(8),c=i(1),h=i(2),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),f=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),d(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Equalizer",this._init()}},{key:"_init",value:function(){var t=this.$element.attr("data-equalizer")||"",e=this.$element.find('[data-equalizer-watch="'+t+'"]');l.a._init(),this.$watched=e.length?e:this.$element.find("[data-equalizer-watch]"),this.$element.attr("data-resize",t||i.i(c.a)(6,"eq")),this.$element.attr("data-mutate",t||i.i(c.a)(6,"eq")),this.hasNested=this.$element.find("[data-equalizer]").length>0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,s=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),r()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&n===!1||void 0===n)&&(s.length?i.i(u.a)(s,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(t){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!l.a.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){return!this.options.equalizeOnStack&&this._isStacked()?(this.$watched.css("height","auto"),!1):void(this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this)))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],i=0,n=this.$watched.length;i<n;i++)this.$watched[i].style.height="auto",e.push(this.$watched[i].offsetHeight);t(e)}},{key:"getHeightsByRow",value:function(t){var e=this.$watched.length?this.$watched.first().offset().top:0,i=[],n=0;i[n]=[];for(var s=0,o=this.$watched.length;s<o;s++){this.$watched[s].style.height="auto";var a=r()(this.$watched[s]).offset().top;a!=e&&(n++,i[n]=[],e=a),i[n].push([this.$watched[s],this.$watched[s].offsetHeight])}for(var l=0,u=i.length;l<u;l++){var c=r()(i[l]).map(function(){return this[1]}).get(),h=Math.max.apply(null,c);i[l].push(h)}t(i)}},{key:"applyHeight",value:function(t){var e=Math.max.apply(null,t);this.$element.trigger("preequalized.zf.equalizer"),this.$watched.css("height",e),this.$element.trigger("postequalized.zf.equalizer")}},{key:"applyHeightByRow",value:function(t){this.$element.trigger("preequalized.zf.equalizer");for(var e=0,i=t.length;e<i;e++){var n=t[e].length,s=t[e][n-1];if(n<=2)r()(t[e][0][0]).css({height:"auto"});else{this.$element.trigger("preequalizedrow.zf.equalizer");for(var o=0,a=n-1;o<a;o++)r()(t[e][o][0]).css({height:s});this.$element.trigger("postequalizedrow.zf.equalizer")}}this.$element.trigger("postequalized.zf.equalizer")}},{key:"_destroy",value:function(){this._pauseEvents(),this.$watched.css("height","auto")}}]),e}(h.a);f.defaults={equalizeOnStack:!1,equalizeByRow:!1,equalizeOn:""}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(3),u=i(2),c=i(1),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,i),this.rules=[],this.currentPath="",this.className="Interchange",this._init(),this._events()}},{key:"_init",value:function(){l.a._init();var t=this.$element[0].id||i.i(c.a)(6,"interchange");this.$element.attr({"data-resize":t,id:t}),this._addBreakpoints(),this._generateRules(),this._reflow()}},{key:"_events",value:function(){var t=this;this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",function(){return t._reflow()})}},{key:"_reflow",value:function(){var t;for(var e in this.rules)if(this.rules.hasOwnProperty(e)){var i=this.rules[e];window.matchMedia(i.query).matches&&(t=i)}t&&this.replace(t.path)}},{key:"_addBreakpoints",value:function(){for(var t in l.a.queries)if(l.a.queries.hasOwnProperty(t)){var i=l.a.queries[t];e.SPECIAL_QUERIES[i.name]=i.value}}},{key:"_generateRules",value:function(t){var i,n=[];i=this.options.rules?this.options.rules:this.$element.data("interchange"),i="string"==typeof i?i.match(/\[.*?\]/g):i;for(var s in i)if(i.hasOwnProperty(s)){var o=i[s].slice(1,-1).split(", "),a=o.slice(0,-1).join(""),r=o[o.length-1];e.SPECIAL_QUERIES[r]&&(r=e.SPECIAL_QUERIES[r]),n.push({path:a,query:r})}this.rules=n}},{key:"replace",value:function(t){if(this.currentPath!==t){var e=this,i="replaced.zf.interchange";"IMG"===this.$element[0].nodeName?this.$element.attr("src",t).on("load",function(){e.currentPath=t}).trigger(i):t.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)?(t=t.replace(/\(/g,"%28").replace(/\)/g,"%29"),this.$element.css({"background-image":"url("+t+")"}).trigger(i)):r.a.get(t,function(n){e.$element.html(n).trigger(i),r()(n).foundation(),e.currentPath=t})}}},{key:"_destroy",value:function(){this.$element.off("resizeme.zf.trigger")}}]),e}(u.a);d.defaults={rules:null},d.SPECIAL_QUERIES={landscape:"screen and (orientation: landscape)",portrait:"screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(1),u=i(2),c=i(14),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Magellan",this._init(),this.calcPoints()}},{key:"_init",value:function(){var t=this.$element[0].id||i.i(l.a)(6,"magellan");this.$targets=r()("[data-magellan-target]"),this.$links=this.$element.find("a"),this.$element.attr({"data-resize":t,"data-scroll":t,id:t}),this.$active=r()(),this.scrollPos=parseInt(window.pageYOffset,10),this._events()}},{key:"calcPoints",value:function(){var t=this,e=document.body,i=document.documentElement;this.points=[],this.winHeight=Math.round(Math.max(window.innerHeight,i.clientHeight)),this.docHeight=Math.round(Math.max(e.scrollHeight,e.offsetHeight,i.clientHeight,i.scrollHeight,i.offsetHeight)),this.$targets.each(function(){var e=r()(this),i=Math.round(e.offset().top-t.options.threshold);e.targetPoint=i,t.points.push(i)})}},{key:"_events",value:function(){var t=this;r()("html, body"),{duration:t.options.animationDuration,easing:t.options.animationEasing};r()(window).one("load",function(){t.options.deepLinking&&location.hash&&t.scrollToLoc(location.hash),t.calcPoints(),t._updateActive()}),this.$element.on({"resizeme.zf.trigger":this.reflow.bind(this),"scrollme.zf.trigger":this._updateActive.bind(this)}).on("click.zf.magellan",'a[href^="#"]',function(e){e.preventDefault();var i=this.getAttribute("href");t.scrollToLoc(i)}),this._deepLinkScroll=function(e){t.options.deepLinking&&t.scrollToLoc(window.location.hash)},r()(window).on("popstate",this._deepLinkScroll)}},{key:"scrollToLoc",value:function(t){this._inTransition=!0;var e=this,i={animationEasing:this.options.animationEasing,animationDuration:this.options.animationDuration,threshold:this.options.threshold,offset:this.options.offset};c.a.scrollToLoc(t,i,function(){e._inTransition=!1,e._updateActive()})}},{key:"reflow",value:function(){this.calcPoints(),this._updateActive()}},{key:"_updateActive",value:function(){if(!this._inTransition){var t,e=parseInt(window.pageYOffset,10);if(e+this.winHeight===this.docHeight)t=this.points.length-1;else if(e<this.points[0])t=void 0;else{var i=this.scrollPos<e,n=this,s=this.points.filter(function(t,s){return i?t-n.options.offset<=e:t-n.options.offset-n.options.threshold<=e});t=s.length?s.length-1:0}if(this.$active.removeClass(this.options.activeClass),this.$active=this.$links.filter('[href="#'+this.$targets.eq(t).data("magellan-target")+'"]').addClass(this.options.activeClass),this.options.deepLinking){var o="";void 0!=t&&(o=this.$active[0].getAttribute("href")),o!==window.location.hash&&(window.history.pushState?window.history.pushState(null,null,o):window.location.hash=o)}this.scrollPos=e,this.$element.trigger("update.zf.magellan",[this.$active])}}},{key:"_destroy",value:function(){if(this.$element.off(".zf.trigger .zf.magellan").find("."+this.options.activeClass).removeClass(this.options.activeClass),this.options.deepLinking){var t=this.$active[0].getAttribute("href");window.location.hash.replace(t,"")}r()(window).off("popstate",this._deepLinkScroll)}}]),e}(u.a);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,activeClass:"is-active",deepLinking:!1,offset:0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return p});var a=i(0),r=i.n(a),l=i(4),u=i(3),c=i(1),h=i(2),d=i(5),f=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),f(e,[{key:"_setup",value:function(t,i){var n=this;this.className="OffCanvas",this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.contentClasses={base:[],reveal:[]},this.$lastTrigger=r()(),this.$triggers=r()(),this.position="left",this.$content=r()(),this.nested=!!this.options.nested,r()(["push","overlap"]).each(function(t,e){n.contentClasses.base.push("has-transition-"+e)}),r()(["left","right","top","bottom"]).each(function(t,e){n.contentClasses.base.push("has-position-"+e),n.contentClasses.reveal.push("has-reveal-"+e)}),d.a.init(r.a),u.a._init(),this._init(),this._events(),l.a.register("OffCanvas",{ESCAPE:"close"})}},{key:"_init",value:function(){var t=this.$element.attr("id");if(this.$element.attr("aria-hidden","true"),this.options.contentId?this.$content=r()("#"+this.options.contentId):this.$element.siblings("[data-off-canvas-content]").length?this.$content=this.$element.siblings("[data-off-canvas-content]").first():this.$content=this.$element.closest("[data-off-canvas-content]").first(),this.options.contentId?this.options.contentId&&null===this.options.nested&&console.warn("Remember to use the nested option if using the content ID option!"):this.nested=0===this.$element.siblings("[data-off-canvas-content]").length,this.nested===!0&&(this.options.transition="overlap",this.$element.removeClass("is-transition-push")),this.$element.addClass("is-transition-"+this.options.transition+" is-closed"),this.$triggers=r()(document).find('[data-open="'+t+'"], [data-close="'+t+'"], [data-toggle="'+t+'"]').attr("aria-expanded","false").attr("aria-controls",t),this.position=this.$element.is(".position-left, .position-top, .position-right, .position-bottom")?this.$element.attr("class").match(/position\-(left|top|right|bottom)/)[1]:this.position,this.options.contentOverlay===!0){var e=document.createElement("div"),i="fixed"===r()(this.$element).css("position")?"is-overlay-fixed":"is-overlay-absolute";e.setAttribute("class","js-off-canvas-overlay "+i),this.$overlay=r()(e),"is-overlay-fixed"===i?r()(this.$overlay).insertAfter(this.$element):this.$content.append(this.$overlay)}this.options.isRevealed=this.options.isRevealed||new RegExp(this.options.revealClass,"g").test(this.$element[0].className),this.options.isRevealed===!0&&(this.options.revealOn=this.options.revealOn||this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split("-")[2],this._setMQChecker()),this.options.transitionTime&&this.$element.css("transition-duration",this.options.transitionTime),this._removeContentClasses()}},{key:"_events",value:function(){if(this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick===!0){var t=this.options.contentOverlay?this.$overlay:this.$content;t.on({"click.zf.offcanvas":this.close.bind(this)})}}},{key:"_setMQChecker",value:function(){var t=this;r()(window).on("changed.zf.mediaquery",function(){u.a.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}).one("load.zf.offcanvas",function(){u.a.atLeast(t.options.revealOn)&&t.reveal(!0)})}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):t===!1&&this.$content.removeClass("has-reveal-"+this.position)}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-"+this.options.transition+" has-position-"+this.position):t===!0&&this.$content.addClass("has-reveal-"+this.position)}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(t){return!1}},{key:"_recordScrollable",value:function(t){var e=this;e.scrollHeight!==e.clientHeight&&(0===e.scrollTop&&(e.scrollTop=1),e.scrollTop===e.scrollHeight-e.clientHeight&&(e.scrollTop=e.scrollHeight-e.clientHeight-1)),e.allowUp=e.scrollTop>0,e.allowDown=e.scrollTop<e.scrollHeight-e.clientHeight,e.lastY=t.originalEvent.pageY}},{key:"_stopScrollPropagation",value:function(t){var e=this,i=t.pageY<e.lastY,n=!i;e.lastY=t.pageY,i&&e.allowUp||n&&e.allowDown?t.stopPropagation():t.preventDefault()}},{key:"open",value:function(t,e){if(!this.$element.hasClass("is-open")&&!this.isRevealed){var n=this;e&&(this.$lastTrigger=e),"top"===this.options.forceTo?window.scrollTo(0,0):"bottom"===this.options.forceTo&&window.scrollTo(0,document.body.scrollHeight),this.options.transitionTime&&"overlap"!==this.options.transition?this.$element.siblings("[data-off-canvas-content]").css("transition-duration",this.options.transitionTime):this.$element.siblings("[data-off-canvas-content]").css("transition-duration",""),this.$element.addClass("is-open").removeClass("is-closed"),this.$triggers.attr("aria-expanded","true"),this.$element.attr("aria-hidden","false").trigger("opened.zf.offcanvas"),this.$content.addClass("is-open-"+this.position),this.options.contentScroll===!1&&(r()("body").addClass("is-off-canvas-open").on("touchmove",this._stopScrolling),this.$element.on("touchstart",this._recordScrollable),this.$element.on("touchmove",this._stopScrollPropagation)),this.options.contentOverlay===!0&&this.$overlay.addClass("is-visible"),this.options.closeOnClick===!0&&this.options.contentOverlay===!0&&this.$overlay.addClass("is-closable"),this.options.autoFocus===!0&&this.$element.one(i.i(c.b)(this.$element),function(){
-if(n.$element.hasClass("is-open")){var t=n.$element.find("[data-autofocus]");t.length?t.eq(0).focus():n.$element.find("a, button").eq(0).focus()}}),this.options.trapFocus===!0&&(this.$content.attr("tabindex","-1"),l.a.trapFocus(this.$element)),this._addContentClasses()}}},{key:"close",value:function(t){if(this.$element.hasClass("is-open")&&!this.isRevealed){var e=this;this.$element.removeClass("is-open"),this.$element.attr("aria-hidden","true").trigger("closed.zf.offcanvas"),this.$content.removeClass("is-open-left is-open-top is-open-right is-open-bottom"),this.options.contentScroll===!1&&(r()("body").removeClass("is-off-canvas-open").off("touchmove",this._stopScrolling),this.$element.off("touchstart",this._recordScrollable),this.$element.off("touchmove",this._stopScrollPropagation)),this.options.contentOverlay===!0&&this.$overlay.removeClass("is-visible"),this.options.closeOnClick===!0&&this.options.contentOverlay===!0&&this.$overlay.removeClass("is-closable"),this.$triggers.attr("aria-expanded","false"),this.options.trapFocus===!0&&(this.$content.removeAttr("tabindex"),l.a.releaseFocus(this.$element)),this.$element.one(i.i(c.b)(this.$element),function(t){e.$element.addClass("is-closed"),e._removeContentClasses()})}}},{key:"toggle",value:function(t,e){this.$element.hasClass("is-open")?this.close(t,e):this.open(t,e)}},{key:"_handleKeyboard",value:function(t){var e=this;l.a.handleKey(t,"OffCanvas",{close:function(){return e.close(),e.$lastTrigger.focus(),!0},handled:function(){t.stopPropagation(),t.preventDefault()}})}},{key:"_destroy",value:function(){this.close(),this.$element.off(".zf.trigger .zf.offcanvas"),this.$overlay.off(".zf.offcanvas")}}]),e}(h.a);p.defaults={closeOnClick:!0,contentOverlay:!0,contentId:null,nested:null,contentScroll:!0,transitionTime:null,transition:"push",forceTo:null,isRevealed:!1,revealOn:null,autoFocus:!0,revealClass:"reveal-for-",trapFocus:!1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return g});var a=i(0),r=i.n(a),l=i(4),u=i(6),c=i(34),h=i(8),d=i(1),f=i(2),p=i(17),m=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),g=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),m(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Orbit",p.a.init(r.a),this._init(),l.a.register("Orbit",{ltr:{ARROW_RIGHT:"next",ARROW_LEFT:"previous"},rtl:{ARROW_LEFT:"next",ARROW_RIGHT:"previous"}})}},{key:"_init",value:function(){this._reset(),this.$wrapper=this.$element.find("."+this.options.containerClass),this.$slides=this.$element.find("."+this.options.slideClass);var t=this.$element.find("img"),e=this.$slides.filter(".is-active"),n=this.$element[0].id||i.i(d.a)(6,"orbit");this.$element.attr({"data-resize":n,id:n}),e.length||this.$slides.eq(0).addClass("is-active"),this.options.useMUI||this.$slides.addClass("no-motionui"),t.length?i.i(h.a)(t,this._prepareForOrbit.bind(this)):this._prepareForOrbit(),this.options.bullets&&this._loadBullets(),this._events(),this.options.autoPlay&&this.$slides.length>1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find("."+this.options.boxOfBullets).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new c.a(this.$element,{duration:this.options.timerDelay,infinite:!1},function(){t.changeSlide(!0)}),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,i=0,n=0,s=this;this.$slides.each(function(){e=this.getBoundingClientRect().height,r()(this).attr("data-slide",n),/mui/g.test(r()(this)[0].className)||s.$slides.filter(".is-active")[0]===s.$slides.eq(n)[0]||r()(this).css({position:"relative",display:"none"}),i=e>i?e:i,n++}),n===this.$slides.length&&(this.$wrapper.css({height:i}),t&&t(i))}},{key:"_setSlideHeight",value:function(t){this.$slides.each(function(){r()(this).css("max-height",t)})}},{key:"_events",value:function(){var t=this;if(this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1){if(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",function(e){e.preventDefault(),t.changeSlide(!0)}).on("swiperight.zf.orbit",function(e){e.preventDefault(),t.changeSlide(!1)}),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()}),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",function(){t.timer.pause()}).on("mouseleave.zf.orbit",function(){t.$element.data("clickedOn")||t.timer.start()})),this.options.navButtons){var e=this.$element.find("."+this.options.nextClass+", ."+this.options.prevClass);e.attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",function(e){e.preventDefault(),t.changeSlide(r()(this).hasClass(t.options.nextClass))})}this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",function(){if(/is-active/g.test(this.className))return!1;var e=r()(this).data("slide"),i=e>t.$slides.filter(".is-active").data("slide"),n=t.$slides.eq(e);t.changeSlide(i,n,e)}),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",function(e){l.a.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){r()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})}}},{key:"_reset",value:function(){"undefined"!=typeof this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each(function(t){r()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()}),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,i){if(this.$slides){var n=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(n[0].className))return!1;var s,o=this.$slides.first(),a=this.$slides.last(),r=t?"Right":"Left",l=t?"Left":"Right",c=this;s=e?e:t?this.options.infiniteWrap?n.next("."+this.options.slideClass).length?n.next("."+this.options.slideClass):o:n.next("."+this.options.slideClass):this.options.infiniteWrap?n.prev("."+this.options.slideClass).length?n.prev("."+this.options.slideClass):a:n.prev("."+this.options.slideClass),s.length&&(this.$element.trigger("beforeslidechange.zf.orbit",[n,s]),this.options.bullets&&(i=i||this.$slides.index(s),this._updateBullets(i)),this.options.useMUI&&!this.$element.is(":hidden")?(u.a.animateIn(s.addClass("is-active").css({position:"absolute",top:0}),this.options["animInFrom"+r],function(){s.css({position:"relative",display:"block"}).attr("aria-live","polite")}),u.a.animateOut(n.removeClass("is-active"),this.options["animOutTo"+l],function(){n.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()})):(n.removeClass("is-active is-in").removeAttr("aria-live").hide(),s.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[s]))}}},{key:"_updateBullets",value:function(t){var e=this.$element.find("."+this.options.boxOfBullets).find(".is-active").removeClass("is-active").blur(),i=e.find("span:last").detach();this.$bullets.eq(t).addClass("is-active").append(i)}},{key:"_destroy",value:function(){this.$element.off(".zf.orbit").find("*").off(".zf.orbit").end().hide()}}]),e}(f.a);g.defaults={bullets:!0,navButtons:!0,animInFromRight:"slide-in-right",animOutToRight:"slide-out-right",animInFromLeft:"slide-in-left",animOutToLeft:"slide-out-left",autoPlay:!0,timerDelay:5e3,infiniteWrap:!0,swipe:!0,pauseOnHover:!0,accessible:!0,containerClass:"orbit-container",slideClass:"orbit-slide",boxOfBullets:"orbit-bullets",nextClass:"orbit-next",prevClass:"orbit-previous",useMUI:!0}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return m});var a=i(0),r=i.n(a),l=i(3),u=i(1),c=i(2),h=i(10),d=i(15),f=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),p={tabs:{cssClass:"tabs",plugin:d.a},accordion:{cssClass:"accordion",plugin:h.a}},m=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),f(e,[{key:"_setup",value:function(t,e){this.$element=r()(t),this.options=r.a.extend({},this.$element.data(),e),this.rules=this.$element.data("responsive-accordion-tabs"),this.currentMq=null,this.currentPlugin=null,this.className="ResponsiveAccordionTabs",this.$element.attr("id")||this.$element.attr("id",i.i(u.a)(6,"responsiveaccordiontabs")),this._init(),this._events()}},{key:"_init",value:function(){if(l.a._init(),"string"==typeof this.rules){for(var t={},e=this.rules.split(" "),i=0;i<e.length;i++){var n=e[i].split("-"),s=n.length>1?n[0]:"small",o=n.length>1?n[1]:n[0];null!==p[o]&&(t[s]=p[o])}this.rules=t}this._getAllOptions(),r.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;t.allOptions={};for(var e in p)if(p.hasOwnProperty(e)){var i=p[e];try{var n=r()("<ul></ul>"),s=new i.plugin(n,t.options);for(var o in s.options)if(s.options.hasOwnProperty(o)&&"zfPlugin"!==o){var a=s.options[o];t.allOptions[o]=a}s.destroy()}catch(t){}}}},{key:"_events",value:function(){var t=this;r()(window).on("changed.zf.mediaquery",function(){t._checkMediaQueries()})}},{key:"_checkMediaQueries",value:function(){var t,e=this;r.a.each(this.rules,function(e){l.a.atLeast(e)&&(t=e)}),t&&(this.currentPlugin instanceof this.rules[t].plugin||(r.a.each(p,function(t,i){e.$element.removeClass(i.cssClass)}),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentPlugin=new this.rules[t].plugin(this.$element,{}),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",s=r()("[data-tabs-content="+this.$element.attr("id")+"]");if(s.length&&(n="tabs"),n!==t){var o=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+o+",[data-accordion-item]").removeClass(o).removeClass("accordion-item").removeAttr("data-accordion-item"),c=l.children("a").removeClass("accordion-title");if("tabs"===n?(s=s.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby"),s.children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected")):s=l.children("[data-tab-content]").removeClass("accordion-content"),s.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)s.each(function(t,i){r()(i).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),r()("[data-tabs-content="+e.$element.attr("id")+"]").after('<div id="tabs-placeholder-'+e.$element.attr("id")+'"></div>').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),c.addClass("accordion-title")});else if("tabs"===t){var h=r()("[data-tabs-content="+e.$element.attr("id")+"]"),d=r()("#tabs-placeholder-"+e.$element.attr("id"));d.length?(h=r()('<div class="tabs-content"></div>').insertAfter(d).attr("data-tabs-content",e.$element.attr("id")),d.remove()):h=r()('<div class="tabs-content"></div>').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),s.each(function(t,e){var n=r()(e).appendTo(h).addClass(a),s=c.get(t).hash.slice(1),o=r()(e).attr("id")||i.i(u.a)(6,"accordion");s!==o&&(""!==s?r()(e).attr("id",s):(s=o,r()(e).attr("id",s),r()(c.get(t)).attr("href",r()(c.get(t)).attr("href").replace("#","")+"#"+s)));var d=r()(l.get(t)).hasClass("is-active");d&&n.addClass("is-active")}),l.addClass(o)}}}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),r()(window).off(".zf.ResponsiveAccordionTabs")}}]),e}(c.a);m.defaults={}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return g});var a=i(0),r=i.n(a),l=i(3),u=i(1),c=i(2),h=i(13),d=i(12),f=i(11),p=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),m={dropdown:{cssClass:"dropdown",plugin:h.a},drilldown:{cssClass:"drilldown",plugin:d.a},accordion:{cssClass:"accordion-menu",plugin:f.a}},g=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),p(e,[{key:"_setup",value:function(t,e){this.$element=r()(t),this.rules=this.$element.data("responsive-menu"),this.currentMq=null,this.currentPlugin=null,this.className="ResponsiveMenu",this._init(),this._events()}},{key:"_init",value:function(){if(l.a._init(),"string"==typeof this.rules){for(var t={},e=this.rules.split(" "),n=0;n<e.length;n++){var s=e[n].split("-"),o=s.length>1?s[0]:"small",a=s.length>1?s[1]:s[0];null!==m[a]&&(t[o]=m[a])}this.rules=t}r.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||i.i(u.a)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;r()(window).on("changed.zf.mediaquery",function(){t._checkMediaQueries()})}},{key:"_checkMediaQueries",value:function(){var t,e=this;r.a.each(this.rules,function(e){l.a.atLeast(e)&&(t=e)}),t&&(this.currentPlugin instanceof this.rules[t].plugin||(r.a.each(m,function(t,i){e.$element.removeClass(i.cssClass)}),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),r()(window).off(".zf.ResponsiveMenu")}}]),e}(c.a);g.defaults={}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(3),u=i(6),c=i(2),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=r()(t),this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="ResponsiveToggle",this._init(),this._events()}},{key:"_init",value:function(){l.a._init();var t=this.$element.data("responsive-toggle");if(t||console.error("Your tab bar needs an ID of a Menu as the value of data-tab-bar."),this.$targetMenu=r()("#"+t),this.$toggler=this.$element.find("[data-toggle]").filter(function(){var e=r()(this).data("toggle");return e===t||""===e}),this.options=r.a.extend({},this.options,this.$targetMenu.data()),this.options.animate){var e=this.options.animate.split(" ");this.animationIn=e[0],this.animationOut=e[1]||null}this._update()}},{key:"_events",value:function(){this._updateMqHandler=this._update.bind(this),r()(window).on("changed.zf.mediaquery",this._updateMqHandler),this.$toggler.on("click.zf.responsiveToggle",this.toggleMenu.bind(this))}},{key:"_update",value:function(){l.a.atLeast(this.options.hideFor)?(this.$element.hide(),this.$targetMenu.show()):(this.$element.show(),this.$targetMenu.hide())}},{key:"toggleMenu",value:function(){var t=this;l.a.atLeast(this.options.hideFor)||(this.options.animate?this.$targetMenu.is(":hidden")?u.a.animateIn(this.$targetMenu,this.animationIn,function(){t.$element.trigger("toggled.zf.responsiveToggle"),t.$targetMenu.find("[data-mutate]").triggerHandler("mutateme.zf.trigger")}):u.a.animateOut(this.$targetMenu,this.animationOut,function(){t.$element.trigger("toggled.zf.responsiveToggle")}):(this.$targetMenu.toggle(0),this.$targetMenu.find("[data-mutate]").trigger("mutateme.zf.trigger"),this.$element.trigger("toggled.zf.responsiveToggle")))}},{key:"_destroy",value:function(){this.$element.off(".zf.responsiveToggle"),this.$toggler.off(".zf.responsiveToggle"),r()(window).off("changed.zf.mediaquery",this._updateMqHandler)}}]),e}(c.a);d.defaults={hideFor:"medium",animate:!1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(){return/iP(ad|hone|od).*OS/.test(window.navigator.userAgent)}function r(){return/Android/.test(window.navigator.userAgent)}function l(){return a()||r()}i.d(e,"a",function(){return v});var u=i(0),c=i.n(u),h=i(4),d=i(3),f=i(6),p=i(2),m=i(5),g=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),v=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),g(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=c.a.extend({},e.defaults,this.$element.data(),i),this.className="Reveal",this._init(),m.a.init(c.a),h.a.register("Reveal",{ESCAPE:"close"})}},{key:"_init",value:function(){d.a._init(),this.id=this.$element.attr("id"),this.isActive=!1,this.cached={mq:d.a.current},this.isMobile=l(),this.$anchor=c()('[data-open="'+this.id+'"]').length?c()('[data-open="'+this.id+'"]'):c()('[data-toggle="'+this.id+'"]'),this.$anchor.attr({"aria-controls":this.id,"aria-haspopup":!0,tabindex:0}),(this.options.fullScreen||this.$element.hasClass("full"))&&(this.options.fullScreen=!0,this.options.overlay=!1),this.options.overlay&&!this.$overlay&&(this.$overlay=this._makeOverlay(this.id)),this.$element.attr({role:"dialog","aria-hidden":!0,"data-yeti-box":this.id,"data-resize":this.id}),this.$overlay?this.$element.detach().appendTo(this.$overlay):(this.$element.detach().appendTo(c()(this.options.appendTo)),this.$element.addClass("without-overlay")),this._events(),this.options.deepLink&&window.location.hash==="#"+this.id&&c()(window).one("load.zf.reveal",this.open.bind(this))}},{key:"_makeOverlay",value:function(){var t="";return this.options.additionalOverlayClasses&&(t=" "+this.options.additionalOverlayClasses),c()("<div></div>").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e,i=this.$element.outerWidth(),n=c()(window).width(),s=this.$element.outerHeight(),o=c()(window).height();t="auto"===this.options.hOffset?parseInt((n-i)/2,10):parseInt(this.options.hOffset,10),e="auto"===this.options.vOffset?s>o?parseInt(Math.min(100,o/10),10):parseInt((o-s)/4,10):parseInt(this.options.vOffset,10),this.$element.css({top:e+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(i,n){if(i.target===e.$element[0]||c()(i.target).parents("[data-closable]")[0]===n)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",function(t){t.target!==e.$element[0]&&!c.a.contains(e.$element[0],t.target)&&c.a.contains(document,t.target)&&e.close()}),this.options.deepLink&&c()(window).on("popstate.zf.reveal:"+this.id,this._handleState.bind(this))}},{key:"_handleState",value:function(t){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"open",value:function(){function t(){n.isMobile?(n.originalScrollPos||(n.originalScrollPos=window.pageYOffset),c()("html, body").addClass("is-reveal-open")):c()("body").addClass("is-reveal-open")}var e=this;if(this.options.deepLink){var i="#"+this.id;window.history.pushState?this.options.updateHistory?window.history.pushState({},"",i):window.history.replaceState({},"",i):window.location.hash=i}this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id);var n=this;this.options.animationIn?!function(){var i=function(){n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),t(),h.a.trapFocus(n.$element)};e.options.overlay&&f.a.animateIn(e.$overlay,"fade-in"),f.a.animateIn(e.$element,e.options.animationIn,function(){e.$element&&(e.focusableElements=h.a.findFocusable(e.$element),i())})}():(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),h.a.trapFocus(this.$element),t(),this._extraHandlers(),this.$element.trigger("open.zf.reveal")}},{key:"_extraHandlers",value:function(){var t=this;this.$element&&(this.focusableElements=h.a.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||c()("body").on("click.zf.reveal",function(e){e.target!==t.$element[0]&&!c.a.contains(t.$element[0],e.target)&&c.a.contains(document,e.target)&&t.close()}),this.options.closeOnEsc&&c()(window).on("keydown.zf.reveal",function(e){h.a.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})}))}},{key:"close",value:function(){function t(){e.isMobile?(0===c()(".reveal:visible").length&&c()("html, body").removeClass("is-reveal-open"),e.originalScrollPos&&(c()("body").scrollTop(e.originalScrollPos),e.originalScrollPos=null)):0===c()(".reveal:visible").length&&c()("body").removeClass("is-reveal-open"),h.a.releaseFocus(e.$element),e.$element.attr("aria-hidden",!0),e.$element.trigger("closed.zf.reveal")}if(!this.isActive||!this.$element.is(":visible"))return!1;var e=this;this.options.animationOut?(this.options.overlay&&f.a.animateOut(this.$overlay,"fade-out"),f.a.animateOut(this.$element,this.options.animationOut,t)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,t):t()),this.options.closeOnEsc&&c()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&c()("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,e.options.deepLink&&(window.history.replaceState?window.history.replaceState("",document.title,window.location.href.replace("#"+this.id,"")):window.location.hash=""),this.$anchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(c()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),c()(window).off(".zf.reveal:"+this.id)}}]),e}(p.a);v.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t,e){return t/e}function r(t,e,i,n){return Math.abs(t.position()[e]+t[n]()/2-i)}function l(t,e){return Math.log(e)/Math.log(t)}i.d(e,"a",function(){return b});var u=i(0),c=i.n(u),h=i(4),d=i(6),f=i(1),p=i(2),m=i(17),g=i(5),v=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),b=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),v(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=c.a.extend({},e.defaults,this.$element.data(),i),this.className="Slider",m.a.init(c.a),g.a.init(c.a),this._init(),h.a.register("Slider",{ltr:{ARROW_RIGHT:"increase",ARROW_UP:"increase",ARROW_DOWN:"decrease",ARROW_LEFT:"decrease",SHIFT_ARROW_RIGHT:"increase_fast",SHIFT_ARROW_UP:"increase_fast",SHIFT_ARROW_DOWN:"decrease_fast",SHIFT_ARROW_LEFT:"decrease_fast",HOME:"min",END:"max"},rtl:{ARROW_LEFT:"increase",ARROW_RIGHT:"decrease",SHIFT_ARROW_LEFT:"increase_fast",SHIFT_ARROW_RIGHT:"decrease_fast"}})}},{key:"_init",value:function(){this.inputs=this.$element.find("input"),this.handles=this.$element.find("[data-slider-handle]"),this.$handle=this.handles.eq(0),this.$input=this.inputs.length?this.inputs.eq(0):c()("#"+this.$handle.attr("aria-controls")),this.$fill=this.$element.find("[data-slider-fill]").css(this.options.vertical?"height":"width",0);var t=!1;(this.options.disabled||this.$element.hasClass(this.options.disabledClass))&&(this.options.disabled=!0,this.$element.addClass(this.options.disabledClass)),this.inputs.length||(this.inputs=c()().add(this.$input),this.options.binding=!0),this._setInitAttr(0),this.handles[1]&&(this.options.doubleSided=!0,this.$handle2=this.handles.eq(1),this.$input2=this.inputs.length>1?this.inputs.eq(1):c()("#"+this.$handle2.attr("aria-controls")),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),t=!0,this._setInitAttr(1)),this.setHandles(),this._events()}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),!0,function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val(),!0)}):this._setHandlePos(this.$handle,this.inputs.eq(0).val(),!0)}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=a(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}var e=(this.options.end-this.options.start)*t+this.options.start;return e}},{key:"_logTransform",value:function(t){return l(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n,s){if(!this.$element.hasClass(this.options.disabledClass)){e=parseFloat(e),e<this.options.start?e=this.options.start:e>this.options.end&&(e=this.options.end);var o=this.options.doubleSided;if(this.options.vertical&&!n&&(e=this.options.end-e),o)if(0===this.handles.index(t)){var r=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=r?r-this.options.step:e}else{var l=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=l?l+this.options.step:e}var u=this,c=this.options.vertical,h=c?"height":"width",f=c?"top":"left",p=t[0].getBoundingClientRect()[h],m=this.$element[0].getBoundingClientRect()[h],g=this._pctOfBar(e),v=(m-p)*g,b=(100*a(v,m)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var y={};if(this._setValues(t,e),o){var w,_=0===this.handles.index(t),$=~~(100*a(p,m));if(_)y[f]=b+"%",w=parseFloat(this.$handle2[0].style[f])-b+$,s&&"function"==typeof s&&s();else{var k=parseFloat(this.$handle[0].style[f]);w=b-(isNaN(k)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):k)+$}y["min-"+h]=w+"%"}this.$element.one("finished.zf.animate",function(){u.$element.trigger("moved.zf.slider",[t])});var C=this.$element.data("dragging")?1e3/60:this.options.moveTime;i.i(d.b)(C,t,function(){isNaN(b)?t.css(f,100*g+"%"):t.css(f,b+"%"),u.options.doubleSided?u.$fill.css(y):u.$fill.css(h,100*g+"%");
-}),clearTimeout(u.timeout),u.timeout=setTimeout(function(){u.$element.trigger("changed.zf.slider",[t])},u.options.changedDelay)}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||i.i(f.a)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var i=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(i).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var s,o;if(n)s=this._adjustValue(null,n),o=!0;else{t.preventDefault();var l=this,u=this.options.vertical,h=u?"height":"width",d=u?"top":"left",p=u?t.pageY:t.pageX,m=(this.$handle[0].getBoundingClientRect()[h]/2,this.$element[0].getBoundingClientRect()[h]),g=u?c()(window).scrollTop():c()(window).scrollLeft(),v=this.$element.offset()[d];t.clientY===t.pageY&&(p+=g);var b,y=p-v;b=y<0?0:y>m?m:y;var w=a(b,m);if(s=this._value(w),i.i(f.c)()&&!this.options.vertical&&(s=this.options.end-s),s=l._adjustValue(null,s),o=!1,!e){var _=r(this.$handle,d,b,h),$=r(this.$handle2,d,b,h);e=_<=$?this.$handle:this.$handle2}}this._setHandlePos(e,s,o)}},{key:"_adjustValue",value:function(t,e){var i,n,s,o,a=this.options.step,r=parseFloat(a/2);return i=t?parseFloat(t.attr("aria-valuenow")):e,n=i%a,s=i-n,o=s+a,0===n?i:i=i>=s+r?o:s}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,i=this;if(this.inputs.off("change.zf.slider").on("change.zf.slider",function(t){var e=i.inputs.index(c()(this));i._handleEvent(t,i.handles.eq(e),c()(this).val())}),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",function(t){return!i.$element.data("dragging")&&void(c()(t.target).is("[data-slider-handle]")||(i.options.doubleSided?i._handleEvent(t):i._handleEvent(t,i.$handle)))}),this.options.draggable){this.handles.addTouch();var n=c()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",function(s){t.addClass("is-dragging"),i.$fill.addClass("is-dragging"),i.$element.data("dragging",!0),e=c()(s.currentTarget),n.on("mousemove.zf.slider",function(t){t.preventDefault(),i._handleEvent(t,e)}).on("mouseup.zf.slider",function(s){i._handleEvent(s,e),t.removeClass("is-dragging"),i.$fill.removeClass("is-dragging"),i.$element.data("dragging",!1),n.off("mousemove.zf.slider mouseup.zf.slider")})}).on("selectstart.zf.slider touchmove.zf.slider",function(t){t.preventDefault()})}t.off("keydown.zf.slider").on("keydown.zf.slider",function(t){var e,n=c()(this),s=i.options.doubleSided?i.handles.index(n):0,o=parseFloat(i.inputs.eq(s).val());h.a.handleKey(t,"Slider",{decrease:function(){e=o-i.options.step},increase:function(){e=o+i.options.step},decrease_fast:function(){e=o-10*i.options.step},increase_fast:function(){e=o+10*i.options.step},min:function(){e=i.options.start},max:function(){e=i.options.end},handled:function(){t.preventDefault(),i._setHandlePos(n,e,!0)}})})}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}]),e}(p.a);b.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}i.d(e,"a",function(){return p});var r=i(0),l=i.n(r),u=i(1),c=i(3),h=i(2),d=i(5),f=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),f(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=l.a.extend({},e.defaults,this.$element.data(),i),this.className="Sticky",d.a.init(l.a),this._init()}},{key:"_init",value:function(){c.a._init();var t=this.$element.parent("[data-sticky-container]"),e=this.$element[0].id||i.i(u.a)(6,"sticky"),n=this;t.length?this.$container=t:(this.wasWrapped=!0,this.$element.wrap(this.options.container),this.$container=this.$element.parent()),this.$container.addClass(this.options.containerClass),this.$element.addClass(this.options.stickyClass).attr({"data-resize":e,"data-mutate":e}),""!==this.options.anchor&&l()("#"+n.options.anchor).attr({"data-mutate":e}),this.scrollCount=this.options.checkEvery,this.isStuck=!1,l()(window).one("load.zf.sticky",function(){n.containerHeight="none"==n.$element.css("display")?0:n.$element[0].getBoundingClientRect().height,n.$container.css("height",n.containerHeight),n.elemHeight=n.containerHeight,""!==n.options.anchor?n.$anchor=l()("#"+n.options.anchor):n._parsePoints(),n._setSizes(function(){var t=window.pageYOffset;n._calc(!1,t),n.isStuck||n._removeSticky(!(t>=n.topPoint))}),n._events(e.split("-").reverse().join("-"))})}},{key:"_parsePoints",value:function(){for(var t=""==this.options.topAnchor?1:this.options.topAnchor,e=""==this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor,i=[t,e],n={},s=0,o=i.length;s<o&&i[s];s++){var a;if("number"==typeof i[s])a=i[s];else{var r=i[s].split(":"),u=l()("#"+r[0]);a=u.offset().top,r[1]&&"bottom"===r[1].toLowerCase()&&(a+=u[0].getBoundingClientRect().height)}n[s]=a}this.points=n}},{key:"_events",value:function(t){var e=this,i=this.scrollListener="scroll.zf."+t;this.isOn||(this.canStick&&(this.isOn=!0,l()(window).off(i).on(i,function(t){0===e.scrollCount?(e.scrollCount=e.options.checkEvery,e._setSizes(function(){e._calc(!1,window.pageYOffset)})):(e.scrollCount--,e._calc(!1,window.pageYOffset))})),this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",function(i,n){e._eventsHandler(t)}),this.$element.on("mutateme.zf.trigger",function(i,n){e._eventsHandler(t)}),this.$anchor&&this.$anchor.on("mutateme.zf.trigger",function(i,n){e._eventsHandler(t)}))}},{key:"_eventsHandler",value:function(t){var e=this,i=this.scrollListener="scroll.zf."+t;e._setSizes(function(){e._calc(!1),e.canStick?e.isOn||e._events(t):e.isOn&&e._pauseListeners(i)})}},{key:"_pauseListeners",value:function(t){this.isOn=!1,l()(window).off(t),this.$element.trigger("pause.zf.sticky")}},{key:"_calc",value:function(t,e){return t&&this._setSizes(),this.canStick?(e||(e=window.pageYOffset),void(e>=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0))):(this.isStuck&&this._removeSticky(!0),!1)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,i="top"===e?"marginTop":"marginBottom",n="top"===e?"bottom":"top",s={};s[i]=this.options[i]+"em",s[e]=0,s[n]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-"+n).addClass("is-stuck is-at-"+e).css(s).trigger("sticky.zf.stuckto:"+e),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",function(){t._setSizes()})}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,i="top"===e,n={},s=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,o=i?"marginTop":"marginBottom",a=t?"top":"bottom";n[o]=0,n.bottom="auto",t?n.top=0:n.top=s,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-"+e).addClass("is-anchored is-at-"+a).css(n).trigger("sticky.zf.unstuckfrom:"+a)}},{key:"_setSizes",value:function(t){this.canStick=c.a.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,i=window.getComputedStyle(this.$container[0]),n=parseInt(i["padding-left"],10),s=parseInt(i["padding-right"],10);this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":e-n-s+"px"});var o=this.$element[0].getBoundingClientRect().height||this.containerHeight;if("none"==this.$element.css("display")&&(o=0),this.containerHeight=o,this.$container.css({height:o}),this.elemHeight=o,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var a=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",a)}this._setBreakPoints(o,function(){t&&"function"==typeof t&&t()})}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var i=a(this.options.marginTop),n=a(this.options.marginBottom),s=this.points?this.points[0]:this.$anchor.offset().top,o=this.points?this.points[1]:s+this.anchorHeight,r=window.innerHeight;"top"===this.options.stickTo?(s-=i,o-=t+i):"bottom"===this.options.stickTo&&(s-=r-(t+n),o-=r-n),this.topPoint=s,this.bottomPoint=o,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),l()(window).off(this.scrollListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}]),e}(h.a);p.defaults={container:"<div data-sticky-container></div>",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",checkEvery:-1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return d});var a=i(0),r=i.n(a),l=i(6),u=i(2),c=i(5),h=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),d=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),h(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,t.data(),i),this.className="",this.className="Toggler",c.a.init(r.a),this._init(),this._events()}},{key:"_init",value:function(){var t;this.options.animate?(t=this.options.animate.split(" "),this.animationIn=t[0],this.animationOut=t[1]||null):(t=this.$element.data("toggler"),this.className="."===t[0]?t.slice(1):t);var e=this.$element[0].id;r()('[data-open="'+e+'"], [data-close="'+e+'"], [data-toggle="'+e+'"]').attr("aria-controls",e),this.$element.attr("aria-expanded",!this.$element.is(":hidden"))}},{key:"_events",value:function(){this.$element.off("toggle.zf.trigger").on("toggle.zf.trigger",this.toggle.bind(this))}},{key:"toggle",value:function(){this[this.options.animate?"_toggleAnimate":"_toggleClass"]()}},{key:"_toggleClass",value:function(){this.$element.toggleClass(this.className);var t=this.$element.hasClass(this.className);t?this.$element.trigger("on.zf.toggler"):this.$element.trigger("off.zf.toggler"),this._updateARIA(t),this.$element.find("[data-mutate]").trigger("mutateme.zf.trigger")}},{key:"_toggleAnimate",value:function(){var t=this;this.$element.is(":hidden")?l.a.animateIn(this.$element,this.animationIn,function(){t._updateARIA(!0),this.trigger("on.zf.toggler"),this.find("[data-mutate]").trigger("mutateme.zf.trigger")}):l.a.animateOut(this.$element,this.animationOut,function(){t._updateARIA(!1),this.trigger("off.zf.toggler"),this.find("[data-mutate]").trigger("mutateme.zf.trigger")})}},{key:"_updateARIA",value:function(t){this.$element.attr("aria-expanded",!!t)}},{key:"_destroy",value:function(){this.$element.off(".zf.toggler")}}]),e}(u.a);d.defaults={animate:!1}},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}i.d(e,"a",function(){return p});var a=i(0),r=i.n(a),l=i(1),u=i(3),c=i(5),h=i(16),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),f=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;if(void 0!==a)return a.call(n)},p=function(t){function e(){return n(this,e),s(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),d(e,[{key:"_setup",value:function(t,i){this.$element=t,this.options=r.a.extend({},e.defaults,this.$element.data(),i),this.className="Tooltip",this.isActive=!1,this.isClick=!1,c.a.init(r.a),this._init()}},{key:"_init",value:function(){u.a._init();var t=this.$element.attr("aria-describedby")||i.i(l.a)(6,"tooltip");this.options.tipText=this.options.tipText||this.$element.attr("title"),this.template=this.options.template?r()(this.options.template):this._buildTemplate(t),this.options.allowHtml?this.template.appendTo(document.body).html(this.options.tipText).hide():this.template.appendTo(document.body).text(this.options.tipText).hide(),this.$element.attr({title:"","aria-describedby":t,"data-yeti-box":t,"data-toggle":t,"data-resize":t}).addClass(this.options.triggerClass),f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_init",this).call(this),this._events()}},{key:"_getDefaultPosition",value:function(){var t=this.$element[0].className.match(/\b(top|left|right|bottom)\b/g);return t?t[0]:"top"}},{key:"_getDefaultAlignment",value:function(){return"center"}},{key:"_getHOffset",value:function(){return"left"===this.position||"right"===this.position?this.options.hOffset+this.options.tooltipWidth:this.options.hOffset}},{key:"_getVOffset",value:function(){return"top"===this.position||"bottom"===this.position?this.options.vOffset+this.options.tooltipHeight:this.options.vOffset}},{key:"_buildTemplate",value:function(t){var e=(this.options.tooltipClass+" "+this.options.positionClass+" "+this.options.templateClasses).trim(),i=r()("<div></div>").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t});return i}},{key:"_setPosition",value:function(){f(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!u.a.is(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1}),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||t.isClick&&!t.options.clickOpen)&&t.hide()}),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}):this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick=!0}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?(t.options.clickOpen||(e=!1),!1):void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass("has-tip top right left").removeAttr("aria-describedby aria-haspopup data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}]),e}(h.a);p.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},function(t,e,i){"use strict";function n(t,e,i){var n,s,o=this,a=e.duration,r=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(s),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(s),l=l<=0?a:l,t.data("paused",!1),n=Date.now(),s=setTimeout(function(){e.infinite&&o.restart(),i&&"function"==typeof i&&i()},l),t.trigger("timerstart.zf."+r)},this.pause=function(){this.isPaused=!0,clearTimeout(s),t.data("paused",!0);var e=Date.now();l-=e-n,t.trigger("timerpaused.zf."+r)}}i.d(e,"a",function(){return n});var s=i(0);i.n(s)},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=i.n(n),o=i(19),a=i(3),r=i(5),l=i(30),u=i(12),c=i(11),h=i(13),d=i(23),f=i(27),p=i(10),m=i(20),g=i(24),v=i(15),b=i(29),y=i(26),w=i(33),_=i(25),$=i(31),k=i(22),C=i(28),z=i(32),O=i(18),T=i(21),E=i(14);o.a.addToJquery(s.a),o.a.MediaQuery=a.a,r.a.init(s.a,o.a),o.a.plugin(l.a,"Slider"),o.a.plugin(u.a,"Drilldown"),o.a.plugin(c.a,"AccordionMenu"),o.a.plugin(h.a,"DropdownMenu"),o.a.plugin(d.a,"Magellan"),o.a.plugin(f.a,"ResponsiveMenu"),o.a.plugin(p.a,"Accordion"),o.a.plugin(m.a,"Dropdown"),o.a.plugin(g.a,"OffCanvas"),o.a.plugin(v.a,"Tabs"),o.a.plugin(b.a,"Reveal"),o.a.plugin(y.a,"ResponsiveAccordionTabs"),o.a.plugin(w.a,"Tooltip"),o.a.plugin(_.a,"Orbit"),o.a.plugin($.a,"Sticky"),o.a.plugin(k.a,"Interchange"),o.a.plugin(C.a,"ResponsiveToggle"),o.a.plugin(z.a,"Toggler"),o.a.plugin(O.a,"Abide"),o.a.plugin(T.a,"Equalizer"),o.a.plugin(E.a,"SmoothScroll")}]);
diff --git a/webskin/src/main/resources/js/vendor/jquery-3.2.1.min.js b/webskin/src/main/resources/js/vendor/jquery-3.2.1.min.js
deleted file mode 100644
index 644d35e..0000000
--- a/webskin/src/main/resources/js/vendor/jquery-3.2.1.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
-a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
-null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
diff --git a/webskin/src/main/resources/js/vendor/jquery.colorbox-min.js b/webskin/src/main/resources/js/vendor/jquery.colorbox-min.js
deleted file mode 100644
index b5109a2..0000000
--- a/webskin/src/main/resources/js/vendor/jquery.colorbox-min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-	Colorbox 1.6.4
-	license: MIT
-	http://www.jacklmoore.com/colorbox
-*/
-(function(t,e,i){function n(i,n,o){var r=e.createElement(i);return n&&(r.id=Z+n),o&&(r.style.cssText=o),t(r)}function o(){return i.innerHeight?i.innerHeight:t(i).height()}function r(e,i){i!==Object(i)&&(i={}),this.cache={},this.el=e,this.value=function(e){var n;return void 0===this.cache[e]&&(n=t(this.el).attr("data-cbox-"+e),void 0!==n?this.cache[e]=n:void 0!==i[e]?this.cache[e]=i[e]:void 0!==X[e]&&(this.cache[e]=X[e])),this.cache[e]},this.get=function(e){var i=this.value(e);return t.isFunction(i)?i.call(this.el,this):i}}function h(t){var e=W.length,i=(A+t)%e;return 0>i?e+i:i}function a(t,e){return Math.round((/%/.test(t)?("x"===e?E.width():o())/100:1)*parseInt(t,10))}function s(t,e){return t.get("photo")||t.get("photoRegex").test(e)}function l(t,e){return t.get("retinaUrl")&&i.devicePixelRatio>1?e.replace(t.get("photoRegex"),t.get("retinaSuffix")):e}function d(t){"contains"in x[0]&&!x[0].contains(t.target)&&t.target!==v[0]&&(t.stopPropagation(),x.focus())}function c(t){c.str!==t&&(x.add(v).removeClass(c.str).addClass(t),c.str=t)}function g(e){A=0,e&&e!==!1&&"nofollow"!==e?(W=t("."+te).filter(function(){var i=t.data(this,Y),n=new r(this,i);return n.get("rel")===e}),A=W.index(_.el),-1===A&&(W=W.add(_.el),A=W.length-1)):W=t(_.el)}function u(i){t(e).trigger(i),ae.triggerHandler(i)}function f(i){var o;if(!G){if(o=t(i).data(Y),_=new r(i,o),g(_.get("rel")),!U){U=$=!0,c(_.get("className")),x.css({visibility:"hidden",display:"block",opacity:""}),I=n(se,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),b.css({width:"",height:""}).append(I),j=T.height()+k.height()+b.outerHeight(!0)-b.height(),D=C.width()+H.width()+b.outerWidth(!0)-b.width(),N=I.outerHeight(!0),z=I.outerWidth(!0);var h=a(_.get("initialWidth"),"x"),s=a(_.get("initialHeight"),"y"),l=_.get("maxWidth"),f=_.get("maxHeight");_.w=Math.max((l!==!1?Math.min(h,a(l,"x")):h)-z-D,0),_.h=Math.max((f!==!1?Math.min(s,a(f,"y")):s)-N-j,0),I.css({width:"",height:_.h}),J.position(),u(ee),_.get("onOpen"),O.add(F).hide(),x.focus(),_.get("trapFocus")&&e.addEventListener&&(e.addEventListener("focus",d,!0),ae.one(re,function(){e.removeEventListener("focus",d,!0)})),_.get("returnFocus")&&ae.one(re,function(){t(_.el).focus()})}var p=parseFloat(_.get("opacity"));v.css({opacity:p===p?p:"",cursor:_.get("overlayClose")?"pointer":"",visibility:"visible"}).show(),_.get("closeButton")?B.html(_.get("close")).appendTo(b):B.appendTo("<div/>"),w()}}function p(){x||(V=!1,E=t(i),x=n(se).attr({id:Y,"class":t.support.opacity===!1?Z+"IE":"",role:"dialog",tabindex:"-1"}).hide(),v=n(se,"Overlay").hide(),L=t([n(se,"LoadingOverlay")[0],n(se,"LoadingGraphic")[0]]),y=n(se,"Wrapper"),b=n(se,"Content").append(F=n(se,"Title"),R=n(se,"Current"),P=t('<button type="button"/>').attr({id:Z+"Previous"}),K=t('<button type="button"/>').attr({id:Z+"Next"}),S=t('<button type="button"/>').attr({id:Z+"Slideshow"}),L),B=t('<button type="button"/>').attr({id:Z+"Close"}),y.append(n(se).append(n(se,"TopLeft"),T=n(se,"TopCenter"),n(se,"TopRight")),n(se,!1,"clear:left").append(C=n(se,"MiddleLeft"),b,H=n(se,"MiddleRight")),n(se,!1,"clear:left").append(n(se,"BottomLeft"),k=n(se,"BottomCenter"),n(se,"BottomRight"))).find("div div").css({"float":"left"}),M=n(se,!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),O=K.add(P).add(R).add(S)),e.body&&!x.parent().length&&t(e.body).append(v,x.append(y,M))}function m(){function i(t){t.which>1||t.shiftKey||t.altKey||t.metaKey||t.ctrlKey||(t.preventDefault(),f(this))}return x?(V||(V=!0,K.click(function(){J.next()}),P.click(function(){J.prev()}),B.click(function(){J.close()}),v.click(function(){_.get("overlayClose")&&J.close()}),t(e).bind("keydown."+Z,function(t){var e=t.keyCode;U&&_.get("escKey")&&27===e&&(t.preventDefault(),J.close()),U&&_.get("arrowKey")&&W[1]&&!t.altKey&&(37===e?(t.preventDefault(),P.click()):39===e&&(t.preventDefault(),K.click()))}),t.isFunction(t.fn.on)?t(e).on("click."+Z,"."+te,i):t("."+te).live("click."+Z,i)),!0):!1}function w(){var e,o,r,h=J.prep,d=++le;if($=!0,q=!1,u(he),u(ie),_.get("onLoad"),_.h=_.get("height")?a(_.get("height"),"y")-N-j:_.get("innerHeight")&&a(_.get("innerHeight"),"y"),_.w=_.get("width")?a(_.get("width"),"x")-z-D:_.get("innerWidth")&&a(_.get("innerWidth"),"x"),_.mw=_.w,_.mh=_.h,_.get("maxWidth")&&(_.mw=a(_.get("maxWidth"),"x")-z-D,_.mw=_.w&&_.w<_.mw?_.w:_.mw),_.get("maxHeight")&&(_.mh=a(_.get("maxHeight"),"y")-N-j,_.mh=_.h&&_.h<_.mh?_.h:_.mh),e=_.get("href"),Q=setTimeout(function(){L.show()},100),_.get("inline")){var c=t(e).eq(0);r=t("<div>").hide().insertBefore(c),ae.one(he,function(){r.replaceWith(c)}),h(c)}else _.get("iframe")?h(" "):_.get("html")?h(_.get("html")):s(_,e)?(e=l(_,e),q=_.get("createImg"),t(q).addClass(Z+"Photo").bind("error."+Z,function(){h(n(se,"Error").html(_.get("imgError")))}).one("load",function(){d===le&&setTimeout(function(){var e;_.get("retinaImage")&&i.devicePixelRatio>1&&(q.height=q.height/i.devicePixelRatio,q.width=q.width/i.devicePixelRatio),_.get("scalePhotos")&&(o=function(){q.height-=q.height*e,q.width-=q.width*e},_.mw&&q.width>_.mw&&(e=(q.width-_.mw)/q.width,o()),_.mh&&q.height>_.mh&&(e=(q.height-_.mh)/q.height,o())),_.h&&(q.style.marginTop=Math.max(_.mh-q.height,0)/2+"px"),W[1]&&(_.get("loop")||W[A+1])&&(q.style.cursor="pointer",t(q).bind("click."+Z,function(){J.next()})),q.style.width=q.width+"px",q.style.height=q.height+"px",h(q)},1)}),q.src=e):e&&M.load(e,_.get("data"),function(e,i){d===le&&h("error"===i?n(se,"Error").html(_.get("xhrError")):t(this).contents())})}var v,x,y,b,T,C,H,k,W,E,I,M,L,F,R,S,K,P,B,O,_,j,D,N,z,A,q,U,$,G,Q,J,V,X={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return t(this).attr("href")},title:function(){return this.title},createImg:function(){var e=new Image,i=t(this).data("cbox-img-attrs");return"object"==typeof i&&t.each(i,function(t,i){e[t]=i}),e},createIframe:function(){var i=e.createElement("iframe"),n=t(this).data("cbox-iframe-attrs");return"object"==typeof n&&t.each(n,function(t,e){i[t]=e}),"frameBorder"in i&&(i.frameBorder=0),"allowTransparency"in i&&(i.allowTransparency="true"),i.name=(new Date).getTime(),i.allowFullscreen=!0,i}},Y="colorbox",Z="cbox",te=Z+"Element",ee=Z+"_open",ie=Z+"_load",ne=Z+"_complete",oe=Z+"_cleanup",re=Z+"_closed",he=Z+"_purge",ae=t("<a/>"),se="div",le=0,de={},ce=function(){function t(){clearTimeout(h)}function e(){(_.get("loop")||W[A+1])&&(t(),h=setTimeout(J.next,_.get("slideshowSpeed")))}function i(){S.html(_.get("slideshowStop")).unbind(s).one(s,n),ae.bind(ne,e).bind(ie,t),x.removeClass(a+"off").addClass(a+"on")}function n(){t(),ae.unbind(ne,e).unbind(ie,t),S.html(_.get("slideshowStart")).unbind(s).one(s,function(){J.next(),i()}),x.removeClass(a+"on").addClass(a+"off")}function o(){r=!1,S.hide(),t(),ae.unbind(ne,e).unbind(ie,t),x.removeClass(a+"off "+a+"on")}var r,h,a=Z+"Slideshow_",s="click."+Z;return function(){r?_.get("slideshow")||(ae.unbind(oe,o),o()):_.get("slideshow")&&W[1]&&(r=!0,ae.one(oe,o),_.get("slideshowAuto")?i():n(),S.show())}}();t[Y]||(t(p),J=t.fn[Y]=t[Y]=function(e,i){var n,o=this;return e=e||{},t.isFunction(o)&&(o=t("<a/>"),e.open=!0),o[0]?(p(),m()&&(i&&(e.onComplete=i),o.each(function(){var i=t.data(this,Y)||{};t.data(this,Y,t.extend(i,e))}).addClass(te),n=new r(o[0],e),n.get("open")&&f(o[0])),o):o},J.position=function(e,i){function n(){T[0].style.width=k[0].style.width=b[0].style.width=parseInt(x[0].style.width,10)-D+"px",b[0].style.height=C[0].style.height=H[0].style.height=parseInt(x[0].style.height,10)-j+"px"}var r,h,s,l=0,d=0,c=x.offset();if(E.unbind("resize."+Z),x.css({top:-9e4,left:-9e4}),h=E.scrollTop(),s=E.scrollLeft(),_.get("fixed")?(c.top-=h,c.left-=s,x.css({position:"fixed"})):(l=h,d=s,x.css({position:"absolute"})),d+=_.get("right")!==!1?Math.max(E.width()-_.w-z-D-a(_.get("right"),"x"),0):_.get("left")!==!1?a(_.get("left"),"x"):Math.round(Math.max(E.width()-_.w-z-D,0)/2),l+=_.get("bottom")!==!1?Math.max(o()-_.h-N-j-a(_.get("bottom"),"y"),0):_.get("top")!==!1?a(_.get("top"),"y"):Math.round(Math.max(o()-_.h-N-j,0)/2),x.css({top:c.top,left:c.left,visibility:"visible"}),y[0].style.width=y[0].style.height="9999px",r={width:_.w+z+D,height:_.h+N+j,top:l,left:d},e){var g=0;t.each(r,function(t){return r[t]!==de[t]?(g=e,void 0):void 0}),e=g}de=r,e||x.css(r),x.dequeue().animate(r,{duration:e||0,complete:function(){n(),$=!1,y[0].style.width=_.w+z+D+"px",y[0].style.height=_.h+N+j+"px",_.get("reposition")&&setTimeout(function(){E.bind("resize."+Z,J.position)},1),t.isFunction(i)&&i()},step:n})},J.resize=function(t){var e;U&&(t=t||{},t.width&&(_.w=a(t.width,"x")-z-D),t.innerWidth&&(_.w=a(t.innerWidth,"x")),I.css({width:_.w}),t.height&&(_.h=a(t.height,"y")-N-j),t.innerHeight&&(_.h=a(t.innerHeight,"y")),t.innerHeight||t.height||(e=I.scrollTop(),I.css({height:"auto"}),_.h=I.height()),I.css({height:_.h}),e&&I.scrollTop(e),J.position("none"===_.get("transition")?0:_.get("speed")))},J.prep=function(i){function o(){return _.w=_.w||I.width(),_.w=_.mw&&_.mw<_.w?_.mw:_.w,_.w}function a(){return _.h=_.h||I.height(),_.h=_.mh&&_.mh<_.h?_.mh:_.h,_.h}if(U){var d,g="none"===_.get("transition")?0:_.get("speed");I.remove(),I=n(se,"LoadedContent").append(i),I.hide().appendTo(M.show()).css({width:o(),overflow:_.get("scrolling")?"auto":"hidden"}).css({height:a()}).prependTo(b),M.hide(),t(q).css({"float":"none"}),c(_.get("className")),d=function(){function i(){t.support.opacity===!1&&x[0].style.removeAttribute("filter")}var n,o,a=W.length;U&&(o=function(){clearTimeout(Q),L.hide(),u(ne),_.get("onComplete")},F.html(_.get("title")).show(),I.show(),a>1?("string"==typeof _.get("current")&&R.html(_.get("current").replace("{current}",A+1).replace("{total}",a)).show(),K[_.get("loop")||a-1>A?"show":"hide"]().html(_.get("next")),P[_.get("loop")||A?"show":"hide"]().html(_.get("previous")),ce(),_.get("preloading")&&t.each([h(-1),h(1)],function(){var i,n=W[this],o=new r(n,t.data(n,Y)),h=o.get("href");h&&s(o,h)&&(h=l(o,h),i=e.createElement("img"),i.src=h)})):O.hide(),_.get("iframe")?(n=_.get("createIframe"),_.get("scrolling")||(n.scrolling="no"),t(n).attr({src:_.get("href"),"class":Z+"Iframe"}).one("load",o).appendTo(I),ae.one(he,function(){n.src="//about:blank"}),_.get("fastIframe")&&t(n).trigger("load")):o(),"fade"===_.get("transition")?x.fadeTo(g,1,i):i())},"fade"===_.get("transition")?x.fadeTo(g,0,function(){J.position(0,d)}):J.position(g,d)}},J.next=function(){!$&&W[1]&&(_.get("loop")||W[A+1])&&(A=h(1),f(W[A]))},J.prev=function(){!$&&W[1]&&(_.get("loop")||A)&&(A=h(-1),f(W[A]))},J.close=function(){U&&!G&&(G=!0,U=!1,u(oe),_.get("onCleanup"),E.unbind("."+Z),v.fadeTo(_.get("fadeOut")||0,0),x.stop().fadeTo(_.get("fadeOut")||0,0,function(){x.hide(),v.hide(),u(he),I.remove(),setTimeout(function(){G=!1,u(re),_.get("onClosed")},1)}))},J.remove=function(){x&&(x.stop(),t[Y].close(),x.stop(!1,!0).remove(),v.remove(),G=!1,x=null,t("."+te).removeData(Y).removeClass(te),t(e).unbind("click."+Z).unbind("keydown."+Z))},J.element=function(){return t(_.el)},J.settings=X)})(jQuery,document,window);
\ No newline at end of file
diff --git a/webskin/src/main/resources/js/vendor/what-input.js b/webskin/src/main/resources/js/vendor/what-input.js
deleted file mode 100644
index c4226e1..0000000
--- a/webskin/src/main/resources/js/vendor/what-input.js
+++ /dev/null
@@ -1,361 +0,0 @@
-/**
- * what-input - A global utility for tracking the current input method (mouse, keyboard or touch).
- * @version v4.2.0
- * @link https://github.com/ten1seven/what-input
- * @license MIT
- */
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define("whatInput", [], factory);
-	else if(typeof exports === 'object')
-		exports["whatInput"] = factory();
-	else
-		root["whatInput"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId])
-/******/ 			return installedModules[moduleId].exports;
-
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			exports: {},
-/******/ 			id: moduleId,
-/******/ 			loaded: false
-/******/ 		};
-
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-
-/******/ 		// Flag the module as loaded
-/******/ 		module.loaded = true;
-
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-
-
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-	'use strict';
-
-	module.exports = function () {
-	  /*
-	   * variables
-	   */
-
-	  // last used input type
-	  var currentInput = 'initial';
-
-	  // last used input intent
-	  var currentIntent = null;
-
-	  // cache document.documentElement
-	  var doc = document.documentElement;
-
-	  // form input types
-	  var formInputs = ['input', 'select', 'textarea'];
-
-	  var functionList = [];
-
-	  // list of modifier keys commonly used with the mouse and
-	  // can be safely ignored to prevent false keyboard detection
-	  var ignoreMap = [16, // shift
-	  17, // control
-	  18, // alt
-	  91, // Windows key / left Apple cmd
-	  93 // Windows menu / right Apple cmd
-	  ];
-
-	  // list of keys for which we change intent even for form inputs
-	  var changeIntentMap = [9 // tab
-	  ];
-
-	  // mapping of events to input types
-	  var inputMap = {
-	    keydown: 'keyboard',
-	    mousedown: 'mouse',
-	    mousemove: 'mouse',
-	    MSPointerDown: 'pointer',
-	    MSPointerMove: 'pointer',
-	    pointerdown: 'pointer',
-	    pointermove: 'pointer',
-	    touchstart: 'touch'
-	  };
-
-	  // array of all used input types
-	  var inputTypes = [];
-
-	  // boolean: true if touch buffer is active
-	  var isBuffering = false;
-
-	  // boolean: true if the page is being scrolled
-	  var isScrolling = false;
-
-	  // store current mouse position
-	  var mousePos = {
-	    x: null,
-	    y: null
-	  };
-
-	  // map of IE 10 pointer events
-	  var pointerMap = {
-	    2: 'touch',
-	    3: 'touch', // treat pen like touch
-	    4: 'mouse'
-	  };
-
-	  var supportsPassive = false;
-
-	  try {
-	    var opts = Object.defineProperty({}, 'passive', {
-	      get: function get() {
-	        supportsPassive = true;
-	      }
-	    });
-
-	    window.addEventListener('test', null, opts);
-	  } catch (e) {}
-
-	  /*
-	   * set up
-	   */
-
-	  var setUp = function setUp() {
-	    // add correct mouse wheel event mapping to `inputMap`
-	    inputMap[detectWheel()] = 'mouse';
-
-	    addListeners();
-	    setInput();
-	  };
-
-	  /*
-	   * events
-	   */
-
-	  var addListeners = function addListeners() {
-	    // `pointermove`, `MSPointerMove`, `mousemove` and mouse wheel event binding
-	    // can only demonstrate potential, but not actual, interaction
-	    // and are treated separately
-
-	    // pointer events (mouse, pen, touch)
-	    if (window.PointerEvent) {
-	      doc.addEventListener('pointerdown', updateInput);
-	      doc.addEventListener('pointermove', setIntent);
-	    } else if (window.MSPointerEvent) {
-	      doc.addEventListener('MSPointerDown', updateInput);
-	      doc.addEventListener('MSPointerMove', setIntent);
-	    } else {
-	      // mouse events
-	      doc.addEventListener('mousedown', updateInput);
-	      doc.addEventListener('mousemove', setIntent);
-
-	      // touch events
-	      if ('ontouchstart' in window) {
-	        doc.addEventListener('touchstart', touchBuffer);
-	        doc.addEventListener('touchend', touchBuffer);
-	      }
-	    }
-
-	    // mouse wheel
-	    doc.addEventListener(detectWheel(), setIntent, supportsPassive ? { passive: true } : false);
-
-	    // keyboard events
-	    doc.addEventListener('keydown', updateInput);
-	  };
-
-	  // checks conditions before updating new input
-	  var updateInput = function updateInput(event) {
-	    // only execute if the touch buffer timer isn't running
-	    if (!isBuffering) {
-	      var eventKey = event.which;
-	      var value = inputMap[event.type];
-	      if (value === 'pointer') value = pointerType(event);
-
-	      if (currentInput !== value || currentIntent !== value) {
-	        var activeElem = document.activeElement;
-	        var activeInput = false;
-	        var notFormInput = activeElem && activeElem.nodeName && formInputs.indexOf(activeElem.nodeName.toLowerCase()) === -1;
-
-	        if (notFormInput || changeIntentMap.indexOf(eventKey) !== -1) {
-	          activeInput = true;
-	        }
-
-	        if (value === 'touch' ||
-	        // ignore mouse modifier keys
-	        value === 'mouse' ||
-	        // don't switch if the current element is a form input
-	        value === 'keyboard' && eventKey && activeInput && ignoreMap.indexOf(eventKey) === -1) {
-	          // set the current and catch-all variable
-	          currentInput = currentIntent = value;
-
-	          setInput();
-	        }
-	      }
-	    }
-	  };
-
-	  // updates the doc and `inputTypes` array with new input
-	  var setInput = function setInput() {
-	    doc.setAttribute('data-whatinput', currentInput);
-	    doc.setAttribute('data-whatintent', currentInput);
-
-	    if (inputTypes.indexOf(currentInput) === -1) {
-	      inputTypes.push(currentInput);
-	      doc.className += ' whatinput-types-' + currentInput;
-	    }
-
-	    fireFunctions('input');
-	  };
-
-	  // updates input intent for `mousemove` and `pointermove`
-	  var setIntent = function setIntent(event) {
-	    // test to see if `mousemove` happened relative to the screen
-	    // to detect scrolling versus mousemove
-	    if (mousePos['x'] !== event.screenX || mousePos['y'] !== event.screenY) {
-	      isScrolling = false;
-
-	      mousePos['x'] = event.screenX;
-	      mousePos['y'] = event.screenY;
-	    } else {
-	      isScrolling = true;
-	    }
-
-	    // only execute if the touch buffer timer isn't running
-	    // or scrolling isn't happening
-	    if (!isBuffering && !isScrolling) {
-	      var value = inputMap[event.type];
-	      if (value === 'pointer') value = pointerType(event);
-
-	      if (currentIntent !== value) {
-	        currentIntent = value;
-
-	        doc.setAttribute('data-whatintent', currentIntent);
-
-	        fireFunctions('intent');
-	      }
-	    }
-	  };
-
-	  // buffers touch events because they frequently also fire mouse events
-	  var touchBuffer = function touchBuffer(event) {
-	    if (event.type === 'touchstart') {
-	      isBuffering = false;
-
-	      // set the current input
-	      updateInput(event);
-	    } else {
-	      isBuffering = true;
-	    }
-	  };
-
-	  var fireFunctions = function fireFunctions(type) {
-	    for (var i = 0, len = functionList.length; i < len; i++) {
-	      if (functionList[i].type === type) {
-	        functionList[i].function.call(undefined, currentIntent);
-	      }
-	    }
-	  };
-
-	  /*
-	   * utilities
-	   */
-
-	  var pointerType = function pointerType(event) {
-	    if (typeof event.pointerType === 'number') {
-	      return pointerMap[event.pointerType];
-	    } else {
-	      // treat pen like touch
-	      return event.pointerType === 'pen' ? 'touch' : event.pointerType;
-	    }
-	  };
-
-	  // detect version of mouse wheel event to use
-	  // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
-	  var detectWheel = function detectWheel() {
-	    var wheelType = void 0;
-
-	    // Modern browsers support "wheel"
-	    if ('onwheel' in document.createElement('div')) {
-	      wheelType = 'wheel';
-	    } else {
-	      // Webkit and IE support at least "mousewheel"
-	      // or assume that remaining browsers are older Firefox
-	      wheelType = document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll';
-	    }
-
-	    return wheelType;
-	  };
-
-	  /*
-	   * init
-	   */
-
-	  // don't start script unless browser cuts the mustard
-	  // (also passes if polyfills are used)
-	  if ('addEventListener' in window && Array.prototype.indexOf) {
-	    setUp();
-	  }
-
-	  /*
-	   * api
-	   */
-
-	  return {
-	    // returns string: the current input type
-	    // opt: 'loose'|'strict'
-	    // 'strict' (default): returns the same value as the `data-whatinput` attribute
-	    // 'loose': includes `data-whatintent` value if it's more current than `data-whatinput`
-	    ask: function ask(opt) {
-	      return opt === 'loose' ? currentIntent : currentInput;
-	    },
-
-	    // returns array: all the detected input types
-	    types: function types() {
-	      return inputTypes;
-	    },
-
-	    // overwrites ignored keys with provided array
-	    ignoreKeys: function ignoreKeys(arr) {
-	      ignoreMap = arr;
-	    },
-
-	    // attach functions to input and intent "events"
-	    // funct: function to fire on change
-	    // eventType: 'input'|'intent'
-	    onChange: function onChange(funct, eventType) {
-	      functionList.push({
-	        function: funct,
-	        type: eventType
-	      });
-	    }
-	  };
-	}();
-
-/***/ })
-/******/ ])
-});
-;
\ No newline at end of file
