OSLC and REST APIs: “Cheat sheets” / “How To” for querying RQM 4.0/5.0 resources

During discussions with customers, business partners and IBM client technical representatives about OSLC integrations for RQM, I’ve realized related information is rather dispatched across disparate sources.  I got this impression confirmed when parsing the Jazz.net RQM-related forum questions.

The customers’ core question that typically arise aims at unblocking an on-going integration development effort and often resumes to :

How could I access/create this test artefact in RQM through OSLC or REST APIs?“.

There are de facto resources (Wikis, etc.) that you would want to consult for an exhaustive listing of parameters and options (see “References” section below). What we want to provide you here is consolidated information I collected from both Jumpstart work (during the development of a tool importing test results  into RQM) and readings of related sources of information in the community (posts, wikis, e-mails, etc.).

I decided to put an emphasis for providing sample URLs that you could quickly adapt to your CLM environment. Caution here, your attempts shall be done in a test environment first ! (remember that I’m not liable for any harm you could do to your computer…)

What this post provides you with :

  1. OSLC-oriented descending approach to discover test resources on your CLM system
  2. “Cheat sheet” for accessing test resources through OSLC
  3. “Cheat sheet” for accessing test resources through REST APIs
  4. “Cheat sheet” for creating test resources through REST APIs
  5. References

As you’ll be making HTTP calls, I’d advise you use Firefox with an add-on like Poster, RESTclient, or use standalone REST utilities like curl or HTTP4e. Unless specified differently, all example HTTP requests mentioned below are assumed to contain the following HTTP headers:

Name Value
OSLC-Core-Version 2.0
Accept application/xml
Content-Type application/rdf+xml

Be aware that :

  • I’ve cut parts of some server-returned RDF/XML contents reported below. Goal was to ease the reading of this post and focus on the main information. Each time, I’ve symbolized cuts by  “…”.
  • Most of the URLs I provide included some specifics (i.e. to my own CLM instance):
    • it either contains reference to the “JKE Banking (Quality Management)” project area, either include some specific context string in the URL (e.g. the “_7C2_YDQIEeKh2o37xigryw” context)
    • the “JKE Banking (Quality Management)” appears as “JKE+Banking+%28Quality+Management%29” (URL encoded string format). If just for playing with your favorite REST tool, you could keep the non URL-encoded format.

As a consequence, you’ll need to adapt these URLs to your own CLM specifics (including the server public URI). Which should be straightforward.

1. OSLC-oriented descending approach to discover test resources on your CLM system.

Now making our first step of our descent to the RQM testing resources.

Step 1: Retrieve the QM Root Services URL


<oslc_qm:qmServiceProviders xmlns:oslc_qm="http://open-services.net/xmlns/qm/1.0/" rdf:resource="https://localhost:9443/qm/oslc_qm/catalog" />...

What you locate here is the URL for discovering the QM’s various services and specific capabilities. For the following step, please note that – in contrary to the Root Services document – the Service Provider catalog  document is a protected document, so the client needs to authenticate with the JTS to be able to access it (Jazz form-based authentication). As a consequence, to proceed with the following HTTP requests from your browser, you’d need to authenticate on the RQM server first.

Step 2: Retrieve the QM Service Provider catalog (basically all QM project areas)


RQM Service Provider Catalog Rational Quality Manager version
JKE Banking (Quality Management)...

A Service Provider publishes all the services provided by a context of an OSLC application. In RQM, it is basically a Project Area.

Step 3: Retrieve the services of the “JKE Banking (Quality Management)” project area

JKE Banking (Quality Management) JKE Banking (Quality Management)...
Default creation factory for TestCase
https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestCase"/> ...
Default creation factory for TestResult https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.execution.ExecutionResult"/>
Default creation factory for TestPlan
https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestPlan"/> ...
Default creation factory for TestScript
https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedExecutionScript"/> ... Default creation factory for TestExecutionRecord
https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.execution.TestcaseExecutionRecord"/> ... Default query capability for TestCase... TestResult... TestPlan...TestScript... TestExecutionRecord... Select TestCase... TestResult... TestPlan...TestScript... TestExecutionRecord... New Test Case... Test Plan... Test Script...

In the RDF content above, we distinguish  shapes (“Creation Factory”, “Query capability”) and dialog (ie. representation/rendering of the properties dialogs that the QM provider has full control on).

Step 4: Access the list of test artefacts in the selected project area URLs for accessing list of Test Plans, Test Cases, Test Results, Test Scripts, TERS/TCERs appear highlighted in the above XML.

They’re consolidated with others in the following table.

2. “Cheat sheet” for accessing test resources through OSLC

Cheat Sheet #1

(GET)ting RQM Test artefacts through OSLC

QM Root Services URL https://localhost:9443/qm/rootservices
QM Users https://localhost:9443/qm/oslc/users
QM Service Provider catalog (basically all QM Project Areas) https://localhost:9443/qm/oslc_qm/catalog
“JKE Banking (Quality Management)” project area https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/services.xml
Test Plans https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestPlan
Test Cases https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestCase
Test Case #32 https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestCase?oslc.where=oslc:shortId=%2232%22
Test Cases (requesting partial representation title+creator in results) https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedTestCase?oslc.properties=dcterms:title,dcterms:creator
Test Results https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.execution.ExecutionResult
Test Scripts https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.planning.VersionedExecutionScript
Test Script Steps (v4.0.6+) https://localhost:9443/qm/oslc_qm/contexts/_Vq7X0qK7EeOXe4hxHLy8DQ/resources/com.ibm.rqm.planning.ExecutionElement2
TERS/TCERs https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.execution.TestcaseExecutionRecord
TER/TCER #39 https://localhost:9443/qm/oslc_qm/contexts/_7C2_YDQIEeKh2o37xigryw/resources/com.ibm.rqm.execution.TestcaseExecutionRecord?oslc.where=oslc:shortId=%2239%22

3. “Cheat sheet” for accessing test resources through REST APIs.

Cheat Sheet #2

(GET)ting RQM Test artefacts through REST APIs

Project Areas (for process related information) https://localhost:9443/qm/process/project-areas
Users/members of a Project Area https://localhost:9443/qm/process/project-areas/_7C2_YDQIEeKh2o37xigryw/members
Team areas of a Project Area https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/teamarea?abbreviate=false
Test Plans https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testplan
Test Plan (#2) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testplan/urn:com.ibm.rqm:testplan:2
Test Plan (filtered by “System” title name and wildcard in the title) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testplan?fields=feed/entry/content/testplan%5Btitle=’System X’]/(title|description)&wildcard=X
Test Cases https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase
Test Cases (filtered by a category) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase?fields=feed/entry/content/testcase/(title|description|category[@term=’Function’ and @value=’Data entry’])
Test Cases (filtered by a custom attribute value) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/?fields=feed/entry/content/testcase%5BcustomAttributes/customAttribute/name=&#8221;custom1” and (customAttributes/customAttribute/value=”AAA” or customAttributes/customAttribute/value=”BBB“)]/*
Test Cases included in Test Suite #2 (filtered by a test suite) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase?fields=feed/entry/content/testcase/(*|testsuite[@href=’https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testsuite/urn:com.ibm.rqm:testsuite:2′%5D)
Test Case (#32) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/urn:com.ibm.rqm:testcase:32
Test Case (#33) with UUIDs (Categories, etc.) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/urn:com.ibm.rqm:testcase:33?metadata=UUID
Keywords https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/keyword
Keyword (#3)
Keyword (filtered by title “JKE Logout”(v4.0.3+)
https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/keyword?fields=keyword%5Btitle=”JKE Logout”]
Test Case Execution Results https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionresult
Test Case Execution Result (#47) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionresult/urn:com.ibm.rqm:executionresult:47
Test Case Execution Results (filtered by test case #14) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionresult?fields=feed/entry/content/executionresult/testcase%5B@href=’https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/urn:com.ibm.rqm:testcase:14′%5D
Test Suite Execution Result (#267) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testsuitelog/urn:com.ibm.rqm:testsuitelog:267
TCERs https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionworkitem
TCERs (filtered by owner ‘Deb’) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionworkitem?fields=feed/entry/content/executionworkitem%5Bowner=’deb’%5D
TCERs (filtered by test phase #4 – identifiers returned) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionworkitem?fields=feed/entry/content/executionworkitem/(testphase%5B@href=’https://clmserver:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testphase/urn:com.ibm.rqm:testphase:4′%5D|identifier)
TSER (#67) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/suiteexecutionrecord/urn:com.ibm.rqm:suiteexecutionrecord:67
Test Environment (“TE13”) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/configuration/TE13
Test Cells https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcell
Test Phase (#36) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testphase/urn:com.ibm.rqm:testphase:36
Test Phases (filtered by test phase name ‘S1’) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testphase?fields=feed/entry/content/testphase%5Btitle=”S1″%5D/identifier
Test Script (#31) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testscript/urn:com.ibm.rqm:testscript:31
Adapters https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/adapter
Adapter Task (#2) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/tasks/urn:com.ibm.rqm:tasks:2
Attachment (#2) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/attachment/urn:com.ibm.rqm:attachment:2
Attachments (in Test Case #38) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/urn:com.ibm.rqm:testcase:38?fields=testcase/attachment
Test Plan, Test Case and Test Suite Templates https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/template
Test Plan Template (“Default”) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/template/testplan/com.ibm.rqm.planning.templates.testplan.default
Project Properties (from the “Manage Project Properties” menu) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/project/JKE+Banking+%28Quality+Management%29/settings
“Lab Resource and Channel Properties” (from the “Manage Project Properties” menu) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/catalog
Lab resources (v4.0.2+) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/labresource
Lab resources (#22) (v4.0.2+) Format: simple, tdm https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%292/labresource/urn:com.ibm.rqm:labresource:22
Lab resources (experimental, v4.0.5+) – for a complete interactivity, open this URL directly in a Browser https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/labresource?propertyDictionary=true
Lab resources groups (v4.0.2+) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/resourcegroup
Requests (v4.0.2+) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/request
Reservations (v4.0.2+) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/reservation

Note about the slug id (and how to handle them once they’re returned to you in the response header “Content-Location” following a POST operation):

4. “Cheat sheet” for creating test resources through REST APIs.

Cheat Sheet #3

(PUT/POST)ting test artifacts through REST APIs

Create a Test Case (v4.0.6+) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase
Create a Test Case (ext ID “myExternalID”) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/testcase/myExternalID
Create a Test Case Execution Results (ext  ID “myChosenID”) https://localhost:9443/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/JKE+Banking+%28Quality+Management%29/executionresult/myChosenID

A common pitfall I found myself helping customers with were failures at creating test resources due to failing HTTP requests (403, etc.)

Be aware such errors typically occurs in the case where :
– you’re using a browser
– you’re doing a POST access
– you’re targeting RQM version (or later)
There, you would directly get a 403 “Forbidden” HTTP status code returned.

Indeed, starting in RQM, there is an additional check for the header “X-Jazz-CSRF-Prevent“. It’s required ONLY for a POST access coming from a browser environment (note: this is detected by the Jazz server through the ‘user-agent’ header).

To stay on the safe path, I recommend you :
– either use a PUT access instead (depending on your use case),
– either add the additional header “X-Jazz-CSRF-Prevent” with the current JSESSIONID value in your favorite browser tool (Poster, RESTClient, etc.). For this,  you just need to search your cookies and copy the ‘Content‘ value of the JSESSIONID for the hostname and path (/qm) corresponding to your server public URI. A practical description on how to retrieve such value (from Firefox/Mozilla browser) is provided in this Jazz.net forum post.

Other things to keep in mind:

  • If providing an external ID, you should make sure your PUT does NOT contain any /urn:com.ibm.rqm:xxxxxx content (this is reserved for GUI created test artifacts).
  • If you don’t provide an external ID (like in the “Create a Test Case” sample above), RQM will auto generate one. It shall be returned in the  response header “Content-Location“.

5. References

5.1 QM OSLC References

5.2 RQM REST API References

6. Other resources

6.1 Additional samples for RQM REST API


19 thoughts on “OSLC and REST APIs: “Cheat sheets” / “How To” for querying RQM 4.0/5.0 resources

Add yours

  1. Thanks for this examples.I hope somebody can help me here.It is possible to execute a testcase via OSLC. Iam a student and i have a project and need a idea or solution to start a testcase(included testscripts) via OSLC.Thanks

    1. Hi Furkan,

      you’d want to post a question to the community on the Jazz.forum: https://jazz.net/forum/questions/

      In the meanwhile, I believe you’d need to clarify your business need – making abstraction of the solution/technology supposed to answer to it. Your specific context (manual testing or automated testing through execution adapters) is important. Have you already checked the OOTB capabilities provided in RQM ? On top of my mind:
      – test executions triggered from within the RQM UI, or
      – test executions triggered based on specific events (by using the RQM scheduling capabilities: handling regular executions and/or reacting to build completions. See: http://www-01.ibm.com/support/knowledgecenter/SSYMRC_5.0.2/com.ibm.rational.test.qm.doc/topics/c_exec_sequences.html), or
      – test executions ran from outside of RQM referential and tests results reported back into RQM through Excel/Word importer or using REST/OSLC APIs.

      Also, I want to emphasis on the distinction between:
      – the general REST / OSLC API used to manage all of the artifacts in the RQM system (as cheat-sheet’ed in this blog post) and
      – the REST API that is used by the RQM server to communicate with test adapters and facilitate remote execution (note that some related information exists: https://jazz.net/wiki/bin/view/Main/RQMTestAutomationAdapterAPI BUT be aware this provides you with the “internal” details – i.e. for developers of adapters – and NOT an RQM API wrapping test execution actions at a high-level).
      Again, this is the feedback with the limited information I had.
      I encourage you to describe your scenario in the forum where you could provide more detailed information and get answers from the whole community.


  2. Is there a OSLC/Rest service available to create a new project area as well as a new work item on a specific project? I have been searching and can only find how to query and update an existing project and work item.

    1. Hi Johannes,

      the term “work item” lets some space for clarification: are you targeting RTC or RQM here ?

      In the meanwhile, for a project area creation, you’d want to consider different options. The ones coming on top of my head:
      – check the Lyo SDK ( http://eclipse.org/lyo/ )
      – If RTC is your underlying context (again, the term you used,”work-item”, is pretty generic and rather associated to RTC than “test plans”, “TCERs”, etc. that are typical from RQM), then check the RTC SDK. If your underlying context is really RQM, I’m very unsure that it could be somewhat derived/re-used.

      Last comment (but be aware of the warning):
      – check the Process REST API.
      At your own risks…


  3. Hi Stephane
    I am able to create a test case programmatically but I am not able to get the created test case URL in the response. the response header Content-Location returns a value like: slug__hci80P-7EeSHXI4LxKwkkQ

      1. Thanks Stephane. That helped.I am able to use the slug id to get the generated test case URL. I was able to access the test case through browser. I had another query over here. I intend to link this test case to a workitem in RTC using OSLC. But when I perform a GET on this URL, I receive a 406 Not Acceptable error. Perhaps I cannot use this URL to fetch test case details from the server.

  4. I am using the below feed url to retrieve all the test scripts with steps of a particular test case using test case id using RQm urlutility


    With the above command i am able to get the test script name but not the test steps.Can some help me to modify the feed url?

  5. Hi ,
    You have mentioned for JKE Banking project with name JKE+Banking+%28Quality+Management%29, in URL but for my project how do i get that type of name. to mentioned in the URL.
    Please help…!

    1. Hi Vijay,
      following Step 2 of this blog post should give you the answer. Note also that checking the browser URL when running RQM is likely to provide you with the same information.

  6. Looking at a test script in RQM, I see 4 steps. Using the ‘Test Script (#31)’ example, it pulls each step twice and the stepIndex, ns7:name, and ns7:title values are the step #.

    I added / deleted a step between 1 & 2 to affect a change to the script and redid the Get, and step 2 now shows up 3x, but with the context.

    Is there some way to only extract 1 copy of each step?

  7. Hi Stephane,

    Is there a way to PUT requirement link in the test case with OSLC API?

    I’m able to update link to test case in RM project but the QM project doesn’t create the link back to the requirement and therefore you cannot see it in the UI.

    I understood i need to do that with OSLC API but i’m not able to.

    1. Hi Udi,

      as noted by Xin here ( https://jazz.net/forum/questions/111577/can-back-links-from-requirements-within-modules-in-rrc-be-generated-from-the-oslc-qm-api ), you have to create the 2 directional links using corresponding OSLC API of each application.

      You did well by raising the question on Jazz.net forum :

      I’d suggest you provide more details in your Jazz.net question wrt the problem you’re facing when trying to create the second link.

      Hope this helps

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: