Merge branch 'feature/jcr_oak'

Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/7a2710ec
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/7a2710ec
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/7a2710ec

Branch: refs/heads/master
Commit: 7a2710ec0a566f44a1f135b71176addfdd7047e7
Parents: f93a787 8838508
Author: olivier lamy <ol...@apache.org>
Authored: Sat Aug 19 21:37:35 2017 +1000
Committer: olivier lamy <ol...@apache.org>
Committed: Sat Aug 19 21:37:35 2017 +1000

----------------------------------------------------------------------
 .../archiva-consumer-archetype/pom.xml          |  20 ++
 .../core/AbstractArtifactConsumerTest.java      |   3 +-
 .../repository/AbstractRepositoryPurgeTest.java |   3 +-
 .../archiva-lucene-consumers/pom.xml            |  36 +-
 .../consumers/lucene/NexusIndexerConsumer.java  |  15 +-
 .../lucene/NexusIndexerConsumerTest.java        |  20 +-
 .../src/test/resources/spring-context.xml       |   3 +-
 .../src/test/resources/log4j2-test.xml          |  14 +-
 .../archiva-base/archiva-indexer/pom.xml        |  23 +-
 .../indexer/merger/DefaultIndexMerger.java      |  33 +-
 .../merger/TemporaryGroupIndexCleaner.java      |  26 +-
 .../indexer/search/MavenRepositorySearch.java   | 160 ++++-----
 .../search/NoClassifierArtifactInfoFilter.java  |   2 +-
 .../search/AbstractMavenRepositorySearch.java   |  44 +--
 .../search/MavenRepositorySearchTest.java       |  25 +-
 .../src/test/repo-release/.index/_7.fdt         | Bin 358889 -> 0 bytes
 .../src/test/repo-release/.index/_7.fdx         | Bin 3324 -> 0 bytes
 .../src/test/repo-release/.index/_7.fnm         |   5 -
 .../src/test/repo-release/.index/_7.frq         | 262 --------------
 .../src/test/repo-release/.index/_7.nrm         |   1 -
 .../src/test/repo-release/.index/_7.prx         | Bin 48973 -> 0 bytes
 .../src/test/repo-release/.index/_7.tii         | Bin 852 -> 0 bytes
 .../src/test/repo-release/.index/_7.tis         | Bin 67003 -> 0 bytes
 .../src/test/repo-release/.index/_8.fdt         | Bin 0 -> 86211 bytes
 .../src/test/repo-release/.index/_8.fdx         | Bin 0 -> 114 bytes
 .../src/test/repo-release/.index/_8.fnm         | Bin 0 -> 2157 bytes
 .../src/test/repo-release/.index/_8.nvd         | Bin 0 -> 2330 bytes
 .../src/test/repo-release/.index/_8.nvm         | Bin 0 -> 261 bytes
 .../src/test/repo-release/.index/_8.si          | Bin 0 -> 371 bytes
 .../test/repo-release/.index/_8_Lucene41_0.doc  | Bin 0 -> 21619 bytes
 .../test/repo-release/.index/_8_Lucene41_0.pos  | Bin 0 -> 40037 bytes
 .../test/repo-release/.index/_8_Lucene41_0.tim  | Bin 0 -> 91607 bytes
 .../test/repo-release/.index/_8_Lucene41_0.tip  | Bin 0 -> 1250 bytes
 .../src/test/repo-release/.index/segments.gen   | Bin 20 -> 36 bytes
 .../src/test/repo-release/.index/segments_8     | Bin 279 -> 0 bytes
 .../src/test/repo-release/.index/segments_9     | Bin 0 -> 102 bytes
 .../mock/MockRepositorySessionFactory.java      |   6 +
 .../archiva-base/archiva-plexus-bridge/pom.xml  |   1 +
 .../common/plexusbridge/MavenIndexerUtils.java  |  87 -----
 .../main/resources/META-INF/spring-context.xml  |  39 ++-
 .../archiva-base/archiva-proxy-common/pom.xml   |   4 +
 .../main/resources/META-INF/spring-context.xml  |   4 +-
 .../test/resources/META-INF/spring-context.xml  |   5 +-
 .../archiva/proxy/AbstractProxyTestCase.java    |   3 +-
 .../archiva-repository-admin-api/pom.xml        |   9 +
 .../archiva-repository-admin-default/pom.xml    |  15 +-
 .../managed/DefaultManagedRepositoryAdmin.java  |  92 ++---
 .../remote/DefaultRemoteRepositoryAdmin.java    |  55 ++-
 .../main/resources/META-INF/spring-context.xml  |   9 +-
 .../src/test/resources/spring-context.xml       |   9 +-
 .../archiva-scheduler-indexing/pom.xml          |   1 +
 .../indexing/ArchivaIndexingTaskExecutor.java   |  70 ++--
 .../indexing/ArtifactIndexingTask.java          |   8 +-
 .../DefaultDownloadRemoteIndexScheduler.java    |  32 +-
 .../indexing/DefaultIndexUpdateSideEffect.java  |  47 +++
 .../indexing/DownloadRemoteIndexTask.java       |  27 +-
 .../ArchivaIndexingTaskExecutorTest.java        | 123 +++----
 .../indexing/DownloadRemoteIndexTaskTest.java   |   8 +-
 .../default-repository/.indexer/_0.cfe          | Bin 0 -> 299 bytes
 .../default-repository/.indexer/_0.cfs          | Bin 0 -> 1053 bytes
 .../default-repository/.indexer/_0.si           | Bin 0 -> 364 bytes
 .../default-repository/.indexer/segments_2      | Bin 0 -> 136 bytes
 .../default-repository/.indexer/write.lock      |   0
 .../archiva-rest/archiva-rest-services/pom.xml  |  19 +-
 .../services/DefaultRepositoriesService.java    |   6 +-
 .../rest/services/AbstractArchivaRestTest.java  |   3 +
 .../services/utils/MavenIndexerCleaner.java     |   3 +-
 .../resources/META-INF/spring-context-test.xml  |   2 +
 .../archiva-web/archiva-web-common/pom.xml      |  18 +-
 .../archiva/web/startup/ArchivaStartup.java     |  12 +-
 .../TestRepositorySessionFactoryBean.java       |   6 +
 .../memory/TestRepositorySessionFactory.java    |   6 +
 .../resources/spring-context-test-common.xml    |   2 +
 .../test/resources/spring-context-with-jcr.xml  |   7 +-
 .../archiva-web/archiva-webapp/pom.xml          |  36 +-
 .../main/resources/META-INF/spring-context.xml  |   3 +-
 .../src/main/resources/log4j2.xml               |   6 -
 .../src/test/auto-admin-creation.properties     |  22 ++
 .../archiva-webapp/src/test/jetty-env.xml       |  48 +++
 .../archiva-webapp/src/test/jetty/jetty-env.xml |  48 ---
 .../archiva-webapp/src/test/log4j2-test.xml     | 101 ++++++
 .../test/tomcat/auto-admin-creation.properties  |  22 --
 .../src/test/tomcat/log4j2-test.xml             | 101 ------
 .../archiva-web/archiva-webdav/pom.xml          |  20 +-
 .../webdav/util/MavenIndexerCleaner.java        |  14 +-
 .../repository/RepositorySessionFactory.java    |   2 +
 .../AbstractMetadataRepositoryTest.java         |   9 +-
 .../plugins/maven2-repository/pom.xml           |   2 +-
 .../CassandraRepositorySessionFactory.java      |   6 +
 .../file/FileRepositorySessionFactory.java      |  15 +-
 .../plugins/metadata-store-jcr/pom.xml          |  95 ++++-
 .../jcr/ArchivaJcrRepositoryConfig.java         |  64 ----
 .../repository/jcr/JcrMetadataRepository.java   |  22 +-
 .../jcr/JcrRepositorySessionFactory.java        |  28 +-
 .../repository/jcr/RepositoryFactory.java       | 350 +++++++++++++++++++
 .../META-INF/spring-context.xml                 |   8 +-
 .../jcr/JcrMetadataRepositoryTest.java          |  32 +-
 .../JcrRepositoryStatisticsGatheringTest.java   |  41 ++-
 .../src/test/resources/log4j2-test.xml          |  37 ++
 archiva-modules/plugins/problem-reports/pom.xml |   2 +-
 .../plugins/repository-statistics/pom.xml       |  16 +
 .../plugins/stage-repository-merge/pom.xml      |   2 +-
 pom.xml                                         | 108 ++++--
 103 files changed, 1377 insertions(+), 1316 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/main/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/plugins/metadata-store-jcr/pom.xml
----------------------------------------------------------------------
diff --cc archiva-modules/plugins/metadata-store-jcr/pom.xml
index 8e71c4c,43522a0..6090113
--- a/archiva-modules/plugins/metadata-store-jcr/pom.xml
+++ b/archiva-modules/plugins/metadata-store-jcr/pom.xml
@@@ -143,6 -205,6 +213,15 @@@
            </instructions>
          </configuration>
        </plugin>
++      <plugin>
++        <groupId>org.apache.maven.plugins</groupId>
++        <artifactId>maven-surefire-plugin</artifactId>
++        <configuration>
++          <systemPropertyVariables>
++            
<appserver.base>${project.build.directory}/jcr/repo</appserver.base>
++          </systemPropertyVariables>
++        </configuration>
++      </plugin>
      </plugins>
    </build>
  </project>

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
----------------------------------------------------------------------
diff --cc 
archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
index f8393b8,2bf9406..9fca6b8
--- 
a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
+++ 
b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
@@@ -36,10 -35,10 +36,12 @@@ import org.apache.archiva.metadata.mode
  import org.apache.archiva.metadata.repository.MetadataRepository;
  import org.apache.archiva.metadata.repository.MetadataRepositoryException;
  import org.apache.archiva.metadata.repository.MetadataResolutionException;
 +import 
org.apache.archiva.metadata.repository.stats.model.RepositoryStatistics;
 +import 
org.apache.archiva.metadata.repository.stats.model.RepositoryStatisticsProvider;
  import org.apache.commons.lang.StringUtils;
  import org.apache.jackrabbit.commons.JcrUtils;
+ import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
+ import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java
----------------------------------------------------------------------
diff --cc 
archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java
index 63bfffb,0000000..be07e2e
mode 100644,000000..100644
--- 
a/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java
+++ 
b/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java
@@@ -1,220 -1,0 +1,219 @@@
 +package org.apache.archiva.metadata.repository.stats;
 +
 +/*
 + * 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.
 + */
 +
 +import junit.framework.TestCase;
 +import org.apache.archiva.metadata.model.MetadataFacetFactory;
 +import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest;
 +import org.apache.archiva.metadata.repository.RepositorySessionFactory;
 +import org.apache.archiva.metadata.repository.jcr.JcrMetadataRepository;
++import org.apache.archiva.metadata.repository.jcr.RepositoryFactory;
 +import 
org.apache.archiva.metadata.repository.stats.model.DefaultRepositoryStatistics;
- import org.apache.archiva.test.utils.ArchivaBlockJUnit4ClassRunner;
 +import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 +import org.apache.commons.io.FileUtils;
 +import org.apache.jackrabbit.commons.JcrUtils;
- import org.apache.jackrabbit.core.TransientRepository;
- import org.apache.jackrabbit.core.config.RepositoryConfig;
- import org.apache.regexp.RE;
++import 
org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 +import org.junit.After;
- import org.junit.Assert;
 +import org.junit.Before;
++import org.junit.BeforeClass;
 +import org.junit.Test;
 +import org.junit.runner.RunWith;
 +import org.springframework.context.ApplicationContext;
 +import org.springframework.test.context.ContextConfiguration;
 +
 +import javax.inject.Inject;
- import javax.inject.Named;
 +import javax.jcr.ImportUUIDBehavior;
- import javax.jcr.NamespaceRegistry;
 +import javax.jcr.Node;
 +import javax.jcr.Repository;
 +import javax.jcr.RepositoryException;
 +import javax.jcr.Session;
- import javax.jcr.SimpleCredentials;
- import javax.jcr.Workspace;
 +import javax.jcr.nodetype.NodeTypeManager;
 +import javax.jcr.nodetype.NodeTypeTemplate;
 +import java.io.File;
 +import java.io.IOException;
 +import java.util.Calendar;
 +import java.util.Date;
 +import java.util.Map;
 +import java.util.zip.GZIPInputStream;
 +
- import static org.junit.Assert.assertEquals;
- 
 +@RunWith( ArchivaSpringJUnit4ClassRunner.class )
 +@ContextConfiguration( locations = { 
"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
 +public class JcrRepositoryStatisticsGatheringTest extends TestCase
- 
 +{
 +    private static final int TOTAL_FILE_COUNT = 1000;
 +
 +    private static final int NEW_FILE_COUNT = 500;
 +
 +    private static final String TEST_REPO = "test-repo";
 +
 +    JcrMetadataRepository repository;
 +
 +    @Inject
 +    private RepositorySessionFactory repositorySessionFactory;
 +
 +    @Inject
 +    private ApplicationContext applicationContext;
 +
-     @Inject
-     @Named("repository")
-     Repository jcrRepository;
- 
 +    Session session;
 +
 +
++    private static Repository jcrRepository;
 +
- 
-     @Before
-     public void setUp()
-         throws Exception
++    @BeforeClass
++    public static void setupSpec() throws IOException, 
InvalidFileStoreVersionException
 +    {
- 
 +        File directory = new File( "target/test-repositories" );
 +        if ( directory.exists() )
 +        {
 +            FileUtils.deleteDirectory( directory );
 +        }
++        RepositoryFactory factory = new RepositoryFactory();
++        factory.setRepositoryPath( directory.getPath() );
++        factory.setStoreType( RepositoryFactory.StoreType.IN_MEMORY_TYPE );
++        jcrRepository = factory.createRepository();
++    }
++
++
++    @Before
++    public void setUp()
++        throws Exception
++    {
 +
 +        Map<String, MetadataFacetFactory> factories = 
AbstractMetadataRepositoryTest.createTestMetadataFacetFactories();
 +
 +        assertNotNull( jcrRepository );
 +        // TODO: probably don't need to use Spring for this
 +        JcrMetadataRepository jcrMetadataRepository = new 
JcrMetadataRepository( factories, jcrRepository );
 +
++
++        session = jcrMetadataRepository.getJcrSession();
++
 +        try
 +        {
 +            session = jcrMetadataRepository.getJcrSession();
 +
 +            // set up namespaces, etc.
 +            JcrMetadataRepository.initialize( session );
 +
 +            // removing content is faster than deleting and re-copying the 
files from target/jcr
 +            session.getRootNode().getNode( "repositories" ).remove();
 +        }
 +        catch ( RepositoryException e )
 +        {
 +            // ignore
 +        }
 +
 +        this.repository = jcrMetadataRepository;
 +    }
 +
 +    private static void registerMixinNodeType( NodeTypeManager 
nodeTypeManager, String type )
 +        throws RepositoryException
 +    {
 +        NodeTypeTemplate nodeType = nodeTypeManager.createNodeTypeTemplate();
 +        nodeType.setMixin( true );
 +        nodeType.setName( type );
 +        nodeTypeManager.registerNodeType( nodeType, false );
 +    }
 +
 +    @After
 +    public void tearDown()
 +        throws Exception
 +    {
 +        if (repository!=null)
 +        {
 +            repository.close( );
 +        }
 +
 +    }
 +
 +    @Test
 +    public void testJcrStatisticsQuery()
 +        throws Exception
 +    {
 +        Calendar cal = Calendar.getInstance();
 +        Date endTime = cal.getTime();
 +        cal.add( Calendar.HOUR, -1 );
 +        Date startTime = cal.getTime();
 +
 +        loadContentIntoRepo( TEST_REPO );
 +        loadContentIntoRepo( "another-repo" );
 +
 +        DefaultRepositoryStatistics testedStatistics = new 
DefaultRepositoryStatistics();
 +        testedStatistics.setNewFileCount( NEW_FILE_COUNT );
 +        testedStatistics.setTotalFileCount( TOTAL_FILE_COUNT );
 +        testedStatistics.setScanStartTime( startTime );
 +        testedStatistics.setScanEndTime( endTime );
 +
 +        repository.populateStatistics( repository, TEST_REPO, 
testedStatistics );
 +
 +        DefaultRepositoryStatistics expectedStatistics = new 
DefaultRepositoryStatistics();
 +        expectedStatistics.setNewFileCount( NEW_FILE_COUNT );
 +        expectedStatistics.setTotalFileCount( TOTAL_FILE_COUNT );
 +        expectedStatistics.setScanEndTime( endTime );
 +        expectedStatistics.setScanStartTime( startTime );
 +        expectedStatistics.setTotalArtifactFileSize( 95954585 );
 +        expectedStatistics.setTotalArtifactCount( 269 );
 +        expectedStatistics.setTotalGroupCount( 1 );
 +        expectedStatistics.setTotalProjectCount( 43 );
 +        expectedStatistics.setTotalCountForType( "zip", 1 );
 +        expectedStatistics.setTotalCountForType( "gz", 1 ); // FIXME: should 
be tar.gz
 +        expectedStatistics.setTotalCountForType( "java-source", 10 );
 +        expectedStatistics.setTotalCountForType( "jar", 108 );
 +        expectedStatistics.setTotalCountForType( "xml", 3 );
 +        expectedStatistics.setTotalCountForType( "war", 2 );
 +        expectedStatistics.setTotalCountForType( "pom", 144 );
 +        expectedStatistics.setRepositoryId( TEST_REPO );
 +
 +        System.out.println(testedStatistics.getTotalCountForType());
 +
 +        assertEquals( NEW_FILE_COUNT, testedStatistics.getNewFileCount());
 +        assertEquals( TOTAL_FILE_COUNT, testedStatistics.getTotalFileCount() 
);
 +        assertEquals( endTime, testedStatistics.getScanEndTime() );
 +        assertEquals( startTime, testedStatistics.getScanStartTime() );
 +        assertEquals( 95954585, testedStatistics.getTotalArtifactFileSize() );
 +        assertEquals( 269, testedStatistics.getTotalArtifactCount() );
 +        assertEquals( 1, testedStatistics.getTotalGroupCount() );
 +        assertEquals( 43, testedStatistics.getTotalProjectCount() );
 +        assertEquals( 1, testedStatistics.getTotalCountForType( "zip" ) );
 +        assertEquals( 1, testedStatistics.getTotalCountForType( "gz" ) );
 +        assertEquals( 10, testedStatistics.getTotalCountForType( 
"java-source" ) );
 +        assertEquals( 108, testedStatistics.getTotalCountForType( "jar" ) );
 +        assertEquals( 3, testedStatistics.getTotalCountForType( "xml" ) );
 +        assertEquals( 2, testedStatistics.getTotalCountForType( "war" ) );
 +        assertEquals( 144, testedStatistics.getTotalCountForType( "pom" ) );
 +        assertEquals( 10, testedStatistics.getTotalCountForType( 
"java-source" ) );
 +
 +
 +    }
 +
 +    private void loadContentIntoRepo( String repoId )
 +        throws RepositoryException, IOException
 +    {
 +        Node n = JcrUtils.getOrAddNode( session.getRootNode(), "repositories" 
);
 +        n = JcrUtils.getOrAddNode( n, repoId );
 +        n = JcrUtils.getOrAddNode( n, "content" );
 +        n = JcrUtils.getOrAddNode( n, "org" );
 +        n = JcrUtils.getOrAddNode( n, "apache" );
 +
 +        GZIPInputStream inputStream = new GZIPInputStream( 
getClass().getResourceAsStream( "/artifacts.xml.gz" ) );
 +        session.importXML( n.getPath(), inputStream, 
ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW );
 +        session.save();
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/archiva-modules/plugins/repository-statistics/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/7a2710ec/pom.xml
----------------------------------------------------------------------

Reply via email to