<!--
  ~ 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.
  -->

<configuration>
  <listReferences>
    <listReference>
      <name>ListName1</name>
    </listReference>
    <listReference>
      <name>ListName2</name>
    </listReference>
    <listReference>
      <name>ListName3</name>
    </listReference>
  </listReferences>
  <setReferences>
    <setReference>
      <name>SetName1</name>
    </setReference>
    <setReference>
      <name>SetName2</name>
    </setReference>
  </setReferences>
  <properties>
    <property>value1</property>
    <property2>value2</property2>
    <something>
      <else>value3</else>
    </something>
  </properties>
  <baseDn>ou=People</baseDn>
  <baseDn>dc=archiva</baseDn>
  <baseDn>dc=apache</baseDn>
  <baseDn>dc=org</baseDn>
</configuration>
