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

     https://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.    
-->
<repository name='Felix-Releases' lastmodified='20120203022437.168'>
  <resource id='org.apache.felix.bundlerepository/1.0.3' symbolicname='org.apache.felix.bundlerepository' presentationname='Apache Felix Bundle Repository' uri='https://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.bundlerepository/1.0.3/org.apache.felix.bundlerepository-1.0.3.jar' version='1.0.3'>
    <description>Bundle repository service.</description>
    <size>130451</size>
    <documentation>http://oscar-osgi.sf.net/obr2/org.apache.felix.bundlerepository/</documentation>
    <source>http://oscar-osgi.sf.net/obr2/org.apache.felix.bundlerepository/org.apache.felix.bundlerepository-1.0.3-src.jar</source>
    <license>https://www.apache.org/licenses/LICENSE-2.0.txt</license>
    <category id='org.apache.felix'/>
    <capability name='bundle'>
      <p n='manifestversion' v='2'/>
      <p n='presentationname' v='Apache Felix Bundle Repository'/>
      <p n='symbolicname' v='org.apache.felix.bundlerepository'/>
      <p n='version' t='version' v='1.0.3'/>
    </capability>
    <capability name='service'>
      <p n='service' v='org.osgi.service.obr.RepositoryAdmin'/>
    </capability>
    <capability name='package'>
      <p n='package' v='org.osgi.service.obr'/>
      <p n='uses:' v='org.osgi.framework'/>
      <p n='version' t='version' v='1.0.0'/>
    </capability>
    <require name='package' filter='(&amp;(package=org.osgi.framework)(version&gt;=1.3.0))' extend='false' multiple='false' optional='false'>Import package org.osgi.framework ;version=1.3.0</require>
    <require name='package' filter='(&amp;(package=org.osgi.service.obr)(version&gt;=1.0.0))' extend='false' multiple='false' optional='false'>Import package org.osgi.service.obr ;version=1.0.0</require>
  </resource>
  <resource id='org.apache.felix.eventadmin/1.0.0' symbolicname='org.apache.felix.eventadmin' presentationname='Apache Felix EventAdmin' uri='https://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.eventadmin/1.0.0/org.apache.felix.eventadmin-1.0.0.jar' version='1.0.0'>
    <description>This bundle provides an implementation of the OSGi R4 EventAdmin service.</description>
    <size>73643</size>
    <source>http://felix.apache.org/site/downloads.cgi</source>
    <documentation>http://www.apache.org/</documentation>
    <license>https://www.apache.org/licenses/LICENSE-2.0.txt</license>
    <category id='org.apache.felix'/>
    <capability name='bundle'>
      <p n='manifestversion' v='2'/>
      <p n='presentationname' v='Apache Felix EventAdmin'/>
      <p n='symbolicname' v='org.apache.felix.eventadmin'/>
      <p n='version' t='version' v='1.0.0'/>
    </capability>
    <capability name='service'>
      <p n='service' v='org.osgi.service.event.EventAdmin'/>
    </capability>
    <capability name='package'>
      <p n='package' v='org.osgi.service.event'/>
      <p n='uses:' v='org.osgi.framework'/>
      <p n='version' t='version' v='1.1.0'/>
    </capability>
    <require name='service' filter='(service=org.osgi.service.event.EventHandler)' extend='false' multiple='true' optional='true'>Import Service org.osgi.service.event.EventHandler</require>
    <require name='service' filter='(service=org.osgi.service.log.LogService)' extend='false' multiple='false' optional='true'>Import Service org.osgi.service.log.LogService</require>
    <require name='service' filter='(service=org.osgi.service.log.LogReaderService)' extend='false' multiple='false' optional='true'>Import Service org.osgi.service.log.LogReaderService</require>
    <require name='package' filter='(&amp;(package=org.osgi.framework)(version&gt;=1.3.0))' extend='false' multiple='false' optional='false'>Import package org.osgi.framework ;version=1.3.0</require>
    <require name='package' filter='(&amp;(package=org.osgi.service.event)(version&gt;=1.1.0))' extend='false' multiple='false' optional='false'>Import package org.osgi.service.event ;version=1.1.0</require>
  </resource>
</repository>
