diff --git a/.gitignore b/.gitignore index bc6cbb7..69c3c06 100644 --- a/.gitignore +++ b/.gitignore @@ -27,11 +27,7 @@ var/ .DS_Store # Tests -test/virtuoso-test-data/ -test/virtuoso-meta-data/database/virtuoso.lck -test/virtuoso-meta-data/database/virtuoso.log -test/virtuoso-meta-data/index_entities.txt -test/qlever-index-data/oc-index-test.server-log.txt +test/qlever-data/oc-test.server-log.txt .coverage # uv diff --git a/Dockerfile b/Dockerfile index 0fc0977..fe80f45 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ FROM python:3.11-slim ENV BASE_URL="api.opencitations.net" \ LOG_DIR="/mnt/log_dir/oc_api" \ SPARQL_ENDPOINT_INDEX="http://qlever-service.default.svc.cluster.local:7011" \ - SPARQL_ENDPOINT_META="http://virtuoso-service.default.svc.cluster.local:8890/sparql" \ + SPARQL_ENDPOINT_META="http://meta-qlever-service.default.svc.cluster.local:7011" \ SYNC_ENABLED="true" # Ensure Python output is unbuffered diff --git a/README.md b/README.md index fa796b3..df20f23 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ For instance: BASE_URL=api.opencitations.net LOG_DIR=/home/dir/log/ SPARQL_ENDPOINT_INDEX=http://qlever-service.default.svc.cluster.local:7011 -SPARQL_ENDPOINT_META=http://virtuoso-service.default.svc.cluster.local:8890/sparql +SPARQL_ENDPOINT_META=http://meta-qlever-service.default.svc.cluster.local:7011 SYNC_ENABLED=true # Redis Configuration @@ -127,7 +127,7 @@ VERSION=$(grep -m1 '^version' pyproject.toml | cut -d'"' -f2) docker build -t opencitations/oc_api:$VERSION . docker run -p 8080:8080 \ -e SPARQL_ENDPOINT_INDEX=http://qlever:7011 \ - -e SPARQL_ENDPOINT_META=http://virtuoso:8890/sparql \ + -e SPARQL_ENDPOINT_META=http://meta-qlever:7011 \ opencitations/oc_api:$VERSION ``` @@ -141,7 +141,7 @@ You can customize the Gunicorn server configuration by modifying the `gunicorn.c ### Running Tests Locally -The tests require Docker. Pytest fixtures in `test/conftest.py` automatically start and stop the QLever and Virtuoso containers. +The tests require Docker. Pytest fixtures in `test/conftest.py` automatically start and stop the QLever container. 1. Install dependencies: ```bash diff --git a/api_oc.py b/api_oc.py index f1affaa..cef8f5b 100644 --- a/api_oc.py +++ b/api_oc.py @@ -108,11 +108,12 @@ skgif_api_manager = APIManager( c["api_skgif"], endpoint_override=env_config["sparql_endpoint_meta"] ) -for config in skgif_api_manager.all_conf.values(): - config["sources_map"] = { - "meta": env_config["sparql_endpoint_meta"], - "index": env_config["sparql_endpoint_index"], - } +for manager in (index_api_manager, index_api_manager_v2, skgif_api_manager): + for config in manager.all_conf.values(): + config["sources_map"] = { + "meta": env_config["sparql_endpoint_meta"], + "index": env_config["sparql_endpoint_index"], + } skgif_doc_manager = HTMLDocumentationHandler(skgif_api_manager) skgif_openapi_manager = OpenAPIDocumentationHandler(skgif_api_manager) diff --git a/conf.json b/conf.json index 0158bfd..8347274 100644 --- a/conf.json +++ b/conf.json @@ -4,7 +4,7 @@ "oc_services_templates": "https://github.com/opencitations/oc_services_templates", "base_url": " api.opencitations.net", "sparql_endpoint_index": "http://qlever-service.default.svc.cluster.local:7011", - "sparql_endpoint_meta": "http://virtuoso-service.default.svc.cluster.local:8890/sparql", + "sparql_endpoint_meta": "http://meta-qlever-service.default.svc.cluster.local:7011", "api_index": [ "src/api/index_v1.hf" ], "api_index_v2": [ "src/api/index_v2.hf" ], "api_meta": ["src/api/meta_v1.hf"], diff --git a/pyproject.toml b/pyproject.toml index c18030b..bb466e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ [project] name = "oc-api" -version = "4.0.1" +version = "4.2.0" description = "OpenCitations API" authors = [ {name = "Mario Petrella", email = "mario.petrella@unibo.it"}, @@ -20,7 +20,7 @@ dependencies = [ "gunicorn>=22.0.0", "idna>=3.15", "python-dateutil>=2.9.0.post0", - "ramose>=2.9.1", + "ramose>=2.10.1", "rdflib>=6.1.1", "redis>=7.0.1", "requests>=2.32.4", diff --git a/src/api/index_v1.hf b/src/api/index_v1.hf index 20a88f6..a093f6f 100644 --- a/src/api/index_v1.hf +++ b/src/api/index_v1.hf @@ -26,13 +26,15 @@ get(API_CALL, headers=HTTP_HEADERS) #contacts [contact@opencitations.net](mailto:contact@opencitations.net) #license This document is licensed with a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/legalcode), while the REST API itself has been created using [RAMOSE](https://github.com/opencitations/ramose), the *Restful API Manager Over SPARQL Endpoints* created by [Silvio Peroni](https://orcid.org/0000-0003-0530-4305), which is licensed with an [ISC license](https://opensource.org/licenses/ISC). #endpoint http://qlever-service.default.svc.cluster.local:7011 +#sources meta=http://meta-qlever-service.default.svc.cluster.local:7011;index=http://qlever-service.default.svc.cluster.local:7011 #method post #addon indexapi_v1 #url /citation/{oci} #type operation #oci str([0-9]+-[0-9]+) -#postprocess citations_info(oci,citing,cited) +#preprocess oci_search(oci) +#postprocess citations_info() #method get #description This operation retrieves the citation metadata for the citation identified by the input Open Citation Identifier (OCI). @@ -63,21 +65,89 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea "author_sc": "no" } ] -#field_type str(oci) str(citing) str(cited) +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) #sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?oci {} . - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +SELECT ?oci ?citing_br ?cited_br WHERE { + [[oci]] + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) +} +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?cited_br ?journal WHERE { + [[oci]] + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?cited_br ?author WHERE { + [[oci]] + ?cited_br pro:isDocumentContextFor ?cited_role . + ?cited_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?citing_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?citing_br pro:isDocumentContextFor ?citing_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) } -LIMIT 50000 #url /citation-count/{doi} #type operation #doi str(10\..+) -#preprocess lower(doi) --> id2omids(doi) -#postprocess count_unique_cits(oci,citing,cited) +#preprocess lower(doi) --> cited_search(doi) +#postprocess count_groups(citing) #method get #description This operation retrieves the number of incoming citations to the bibliographic entity identified by the input DOI. @@ -91,20 +161,41 @@ The field returned by this operation is: "count": "32" } ] -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?cited {[[doi]]} - ?oci cito:hasCitedEntity ?cited . - ?oci cito:hasCitingEntity ?citing . +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?cited_br WHERE { + [[doi]] +} +@@with index +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX cito: +SELECT DISTINCT ?citing_br ?cited_br WHERE { + ?citation cito:hasCitedEntity ?cited_br ; + cito:hasCitingEntity ?citing_br . } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) +} +GROUP BY ?citing_br #url /reference-count/{doi} #type operation #doi str(10\..+) -#preprocess lower(doi) --> id2omids(doi) -#postprocess count_unique_cits(oci,citing,cited) +#preprocess lower(doi) --> citing_search(doi) +#postprocess count_groups(cited) #method get #description This operation retrieves the number of outgoing citations from the bibliographic entity identified by the input DOI. @@ -118,22 +209,41 @@ The field returned by this operation is: "count": "75" } ] -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?citing {[[doi]]} - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?citing_br WHERE { + [[doi]] +} +@@with index +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX cito: +SELECT DISTINCT ?citing_br ?cited_br WHERE { + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . } LIMIT 200000 - - +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) +} +GROUP BY ?cited_br #url /citations/{doi} #type operation #doi str(10\..+) -#preprocess lower(doi) --> id2omids(doi) -#postprocess citations_info(oci,citing,cited) +#preprocess lower(doi) --> cited_search(doi) +#postprocess citations_info() #method get #description This operation retrieves the citation data for all the references appearing in the reference lists of other citing works to the bibliographic entity identified by the input DOI, that constitute the incoming citations of that identified bibliographic entity. @@ -179,21 +289,100 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea }, ... ] -#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(?journal_sc) str(?author_sc) -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?cited {[[doi]]} - ?oci cito:hasCitedEntity ?cited . - ?oci cito:hasCitingEntity ?citing . +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?cited_br WHERE { + [[doi]] +} +@@with index +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX cito: +SELECT ?oci ?citing_br ?cited_br WHERE { + ?citation cito:hasCitedEntity ?cited_br ; + cito:hasCitingEntity ?citing_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?cited_br ?journal WHERE { + [[doi]] + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?cited_br ?author WHERE { + [[doi]] + ?cited_br pro:isDocumentContextFor ?cited_role . + ?cited_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?citing_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?citing_br pro:isDocumentContextFor ?citing_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} #url /references/{doi} #type operation #doi str(10\..+) -#preprocess lower(doi) --> id2omids(doi) -#postprocess citations_info(oci,citing,cited) +#preprocess lower(doi) --> citing_search(doi) +#postprocess citations_info() #method get #description This operation retrieves the citation data for all the outgoing references to other cited works appearing in the reference list of the bibliographic entity identified by the input DOI. @@ -239,12 +428,91 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea }, ... ] -#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(?journal_sc) str(?author_sc) -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?citing {[[doi]]} - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?citing_br WHERE { + [[doi]] +} +@@with index +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX cito: +SELECT ?oci ?citing_br ?cited_br WHERE { + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?citing_br ?journal WHERE { + [[doi]] + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?citing_br ?author WHERE { + [[doi]] + ?citing_br pro:isDocumentContextFor ?citing_role . + ?citing_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?cited_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?cited_br pro:isDocumentContextFor ?cited_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} diff --git a/src/api/index_v2.hf b/src/api/index_v2.hf index e1165c0..9d13006 100644 --- a/src/api/index_v2.hf +++ b/src/api/index_v2.hf @@ -2,7 +2,7 @@ #type api #base https://api.opencitations.net #title The REST API for OpenCitations Index -#html_meta_description OpenCitations Index REST API: retrieve citation data, bibliographic references, citation counts using DOI, PMID, OMID identifiers. Free access. +#html_meta_description OpenCitations Index REST API: retrieve citation data, bibliographic references, citation counts using DOI, PMID, ISSN, ISBN, or OMID identifiers. Free access. #description This document describe the REST API for accessing the data stored in the [OpenCitations Index](https://w3id.org/oc/index) hosted by [OpenCitations](http://opencitations.net). This API implements operations to retrieve the citation data for all the references to other works appearing in a particular bibliographic entity, or the citation data for all the references appearing in other works to a particular bibliographic entity, given the identifier of a bibliographic entity, or to retrieve citation data about a particular citation identified by means of its [Open Citation Identifier (OCI)](https://opencitations.wordpress.com/2018/03/12/citations-as-first-class-data-entities-open-citation-identifiers/). All the present operations return either a JSON document (default) or a CSV document according to the mimetype specified in the `Accept` header of the request. If you would like to suggest an additional operation to be included in this API, please use the [issue tracker](https://github.com/opencitations/api/issues) of the OpenCitations APIs available on GitHub. @@ -24,13 +24,15 @@ get(API_CALL, headers=HTTP_HEADERS) #contacts [contact@opencitations.net](mailto:contact@opencitations.net) #license This document is licensed with a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/legalcode), while the REST API itself has been created using [RAMOSE](https://github.com/opencitations/ramose), the *Restful API Manager Over SPARQL Endpoints* created by [Silvio Peroni](https://orcid.org/0000-0003-0530-4305), which is licensed with an [ISC license](https://opensource.org/licenses/ISC). #endpoint http://qlever-service.default.svc.cluster.local:7011 +#sources meta=http://meta-qlever-service.default.svc.cluster.local:7011;index=http://qlever-service.default.svc.cluster.local:7011 #method post #addon indexapi_v2 #url /citation/{oci} #type operation #oci str([0-9]+-[0-9]+) -#postprocess citations_info(oci,citing,cited) +#preprocess oci_search(oci) +#postprocess citations_info() #method get #description This operation retrieves the citation metadata for the citation identified by the input Open Citation Identifier (OCI). @@ -61,23 +63,91 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea "author_sc": "no" } ] -#field_type str(oci) str(citing) str(cited) +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) #sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?oci {} . - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +SELECT ?oci ?citing_br ?cited_br WHERE { + [[oci]] + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) +} +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?cited_br ?journal WHERE { + [[oci]] + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?cited_br ?author WHERE { + [[oci]] + ?cited_br pro:isDocumentContextFor ?cited_role . + ?cited_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?citing_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?citing_br pro:isDocumentContextFor ?citing_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) } -LIMIT 50000 #url /citation-count/{id} #type operation -#id str((omid|doi|pmid):(.+)) -#preprocess lower(id) --> id2omids(id) -#postprocess count_unique_cits(oci,citing,cited) +#id str((omid|doi|pmid|issn|isbn):(.+)) +#preprocess lower(id) --> cited_search(id) +#postprocess count_groups(citing) #method get -#description This operation retrieves the number of incoming citations to the bibliographic entity identified by the input PID (DOI, PMID, OMID).. +#description This operation retrieves the number of incoming citations to the bibliographic entity identified by the input PID (DOI, PMID, ISSN, ISBN, OMID).. The field returned by this operation is: @@ -89,20 +159,41 @@ The field returned by this operation is: "count": "34" } ] -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?cited {[[id]]} - ?oci cito:hasCitedEntity ?cited . - ?oci cito:hasCitingEntity ?citing . +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?cited_br WHERE { + [[id]] +} +@@with index +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX cito: +SELECT DISTINCT ?citing_br ?cited_br WHERE { + ?citation cito:hasCitedEntity ?cited_br ; + cito:hasCitingEntity ?citing_br . } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) +} +GROUP BY ?citing_br #url /venue-citation-count/{id} #type operation #id str((issn):(.+)) -#preprocess lower(id) --> id2omids(id) -#postprocess sum_all(count) +#preprocess lower(id) --> issn_value(id) +#postprocess venue_count() #method get #description This operation retrieves the number of incoming citations to all the bibliographic entities published into aspecific journal identified by the input ISSN. @@ -116,21 +207,36 @@ The field returned by this operation is: "count": "64352" } ] -#sparql PREFIX cito: -SELECT (count(DISTINCT(?citing)) as ?count) -WHERE { - VALUES ?cited {[[id]]} - ?oci cito:hasCitedEntity ?cited . - ?oci cito:hasCitingEntity ?citing . +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?issn ?cited_br WHERE { + VALUES ?issn { "[[id]]" } + ?venue_identifier literal:hasLiteralValue ?issn . + ?venue datacite:hasIdentifier ?venue_identifier . + ?cited_br frbr:partOf+ ?venue ; + a fabio:JournalArticle . } +@@with index +@@join ?issn ?issn +@@values ?cited_br +PREFIX cito: +SELECT ?issn (COUNT(DISTINCT ?citing_br) AS ?count) WHERE { + ?citation cito:hasCitedEntity ?cited_br ; + cito:hasCitingEntity ?citing_br . + BIND("[[id]]" AS ?issn) +} +GROUP BY ?issn #url /reference-count/{id} #type operation -#id str((omid|doi|pmid|issn):(.+)) -#preprocess lower(id) --> id2omids(id) -#postprocess count_unique_cits(oci,citing,cited) +#id str((omid|doi|pmid|issn|isbn):(.+)) +#preprocess lower(id) --> citing_search(id) +#postprocess count_unique_cits() #method get -#description This operation retrieves the number of outgoing citations from the bibliographic entity identified by the input PID (DOI, PMID, OMID). +#description This operation retrieves the number of outgoing citations from the bibliographic entity identified by the input PID (DOI, PMID, ISSN, ISBN, OMID). The field returned by this operation is: @@ -142,22 +248,55 @@ The field returned by this operation is: "count": "35" } ] -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?citing {[[id]]} - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?citing_br WHERE { + [[id]] +} +@@with index +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX cito: +SELECT DISTINCT ?citing_br ?cited_br WHERE { + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX datacite: +PREFIX literal: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) +} +GROUP BY ?cited_br #url /citations/{id} #type operation -#id str((omid|doi|pmid):(.+)) -#preprocess lower(id) --> id2omids(id) -#postprocess citations_info(oci,citing,cited) +#id str((omid|doi|pmid|issn|isbn):(.+)) +#preprocess lower(id) --> cited_search(id) +#postprocess citations_info() #method get -#description This operation retrieves the citation data for all the references appearing in the reference lists of other citing works to the bibliographic entity identified by the input PID (DOI, PMID, OMID), that constitute the incoming citations of that identified bibliographic entity. +#description This operation retrieves the citation data for all the references appearing in the reference lists of other citing works to the bibliographic entity identified by the input PID (DOI, PMID, ISSN, ISBN, OMID), that constitute the incoming citations of that identified bibliographic entity. The fields returned by this operation are: @@ -201,23 +340,102 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea }, ... ] -#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(?journal_sc) str(?author_sc) -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?cited {[[id]]} - ?oci cito:hasCitedEntity ?cited . - ?oci cito:hasCitingEntity ?citing . +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?cited_br WHERE { + [[id]] +} +@@with index +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX cito: +SELECT ?oci ?citing_br ?cited_br WHERE { + ?citation cito:hasCitedEntity ?cited_br ; + cito:hasCitingEntity ?citing_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?cited_br ?journal WHERE { + [[id]] + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?citing_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?cited_br ?author WHERE { + [[id]] + ?cited_br pro:isDocumentContextFor ?cited_role . + ?cited_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?citing_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?citing_br pro:isDocumentContextFor ?citing_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} #url /references/{id} #type operation -#id str((omid|doi|pmid):(.+)) -#preprocess lower(id) --> id2omids(id) -#postprocess citations_info(oci,citing,cited) +#id str((omid|doi|pmid|issn|isbn):(.+)) +#preprocess lower(id) --> citing_search(id) +#postprocess citations_info() #method get -#description This operation retrieves the citation data for all the outgoing references to other cited works appearing in the reference list of the bibliographic entity identified by the input PID (DOI, PMID, OMID).. +#description This operation retrieves the citation data for all the outgoing references to other cited works appearing in the reference list of the bibliographic entity identified by the input PID (DOI, PMID, ISSN, ISBN, OMID).. The fields returned by this operation are: @@ -232,7 +450,6 @@ The fields returned by this operation are: The values of all the fields are prefixed with `[index name] => `, so as to cleary identify from where the related data is coming, and can contain one or more information, separated by `; `. This is particularly useful when a citation is actually contained in two or more OpenCitations Indexes. In this case, only one row will be returned, and the prefix used in the various data allows one to understand the source Index of such data. #call /references/doi:10.7717/peerj-cs.421 #output_json [ -[ { "oci": "06101801781-06101802023", "citing": "omid:br/06101801781 doi:10.7717/peerj-cs.421 pmid:33817056", @@ -262,12 +479,91 @@ The values of all the fields are prefixed with `[index name] => `, so as to clea }, ... ] -#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(?journal_sc) str(?author_sc) -#sparql PREFIX cito: -SELECT ?oci ?citing ?cited -WHERE { - VALUES ?citing {[[id]]} - ?oci cito:hasCitingEntity ?citing . - ?oci cito:hasCitedEntity ?cited . +#field_type str(oci) str(citing) str(cited) datetime(creation) duration(timespan) str(journal_sc) str(author_sc) +#sparql @@with meta +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +SELECT DISTINCT ?citing_br WHERE { + [[id]] +} +@@with index +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX cito: +SELECT ?oci ?citing_br ?cited_br WHERE { + ?citation cito:hasCitingEntity ?citing_br ; + cito:hasCitedEntity ?cited_br . + BIND(STRAFTER(STR(?citation), "https://w3id.org/oc/index/ci/") AS ?oci) } LIMIT 200000 +@@with meta +@@join ?citing_br ?citing_br +@@values ?citing_br +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?citing_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?citing_ids) (MIN(STR(?date)) AS ?citing_date) WHERE { + ?citing_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?citing_br prism:publicationDate ?date } +} +GROUP BY ?citing_br +@@with meta +@@join ?cited_br ?cited_br +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX prism: +SELECT ?cited_br (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=" __ ") AS ?cited_ids) (MIN(STR(?date)) AS ?cited_date) WHERE { + ?cited_br datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?scheme ; + literal:hasLiteralValue ?value . + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?value) AS ?id) + OPTIONAL { ?cited_br prism:publicationDate ?date } +} +GROUP BY ?cited_br +@@join ?oci ?oci type=left +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_journal) WHERE { + { + SELECT ?citing_br ?journal WHERE { + [[id]] + ?citing_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + ?journal a fabio:Journal . + } + } + ?cited_br a fabio:JournalArticle ; + frbr:partOf+ ?journal . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} +@@join ?oci ?oci type=left +@@values ?cited_br batch_size=10000 workers=8 +PREFIX datacite: +PREFIX literal: +PREFIX frbr: +PREFIX fabio: +PREFIX pro: +SELECT DISTINCT ?oci ("yes" AS ?same_author) WHERE { + { + SELECT ?citing_br ?author WHERE { + [[id]] + ?citing_br pro:isDocumentContextFor ?citing_role . + ?citing_role pro:withRole pro:author ; + pro:isHeldBy ?author . + } + } + ?cited_role pro:isHeldBy ?author ; + pro:withRole pro:author . + ?cited_br pro:isDocumentContextFor ?cited_role . + BIND(CONCAT(STRAFTER(STR(?citing_br), "https://w3id.org/oc/meta/br/"), "-", STRAFTER(STR(?cited_br), "https://w3id.org/oc/meta/br/")) AS ?oci) +} diff --git a/src/api/indexapi_common.py b/src/api/indexapi_common.py index 2427ed3..3d288ea 100644 --- a/src/api/indexapi_common.py +++ b/src/api/indexapi_common.py @@ -1,187 +1,66 @@ -import json -import os -from requests import RequestException, post -from json import loads from datetime import datetime from dateutil.relativedelta import relativedelta -with open("conf.json") as f: - c = json.load(f) - -env_config = { - "base_url": os.getenv("BASE_URL", c["base_url"]), - "sparql_endpoint_index": os.getenv( - "SPARQL_ENDPOINT_INDEX", c["sparql_endpoint_index"] - ), - "sparql_endpoint_meta": os.getenv( - "SPARQL_ENDPOINT_META", c["sparql_endpoint_meta"] - ), - "sync_enabled": os.getenv("SYNC_ENABLED", "false").lower() == "true", -} - def lower(s): return (s.lower(),) -def br_meta_metadata(values): - sparql_endpoint = env_config["sparql_endpoint_meta"] - - sparql_query = ( - """ - PREFIX pro: - PREFIX frbr: - PREFIX fabio: - PREFIX datacite: - PREFIX literal: - PREFIX prism: - SELECT DISTINCT ?val ?pubDate (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) (GROUP_CONCAT(?venue; separator="; ") as ?source) (GROUP_CONCAT(?raAuthor; separator="; ") as ?author) - WHERE { - VALUES ?val { """ - + " ".join(values) - + """ } - OPTIONAL { ?val prism:publicationDate ?pubDate. } - OPTIONAL { - ?val datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - OPTIONAL { - ?val a fabio:JournalArticle; - frbr:partOf+ ?venue. - ?venue a fabio:Journal. - } - OPTIONAL { - ?val frbr:partOf ?venue. - } - OPTIONAL { - ?val pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - } - } GROUP BY ?val ?pubDate - """ +def oci_search(oci): + citing, cited = oci.split("-") + return ( + f"VALUES ?citation {{ }} " + f"VALUES ?citing_br {{ }} " + f"VALUES ?cited_br {{ }}", ) - headers = { - "Accept": "application/sparql-results+json", - "Content-Type": "application/sparql-query", - } - - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query) - response.raise_for_status() - except RequestException: - return {}, [] - r = loads(response.text) - results = r["results"]["bindings"] - res_json = {elem["val"]["value"]: elem for elem in results} - return res_json, ["val", "pubDate", "ids", "source", "author"] - - -def br_meta_anyids(values): - sparql_endpoint = env_config["sparql_endpoint_meta"] - - sparql_query = ( - """ - PREFIX datacite: - PREFIX literal: - SELECT DISTINCT ?val (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) - WHERE { - VALUES ?val { """ - + " ".join(values) - + """ } - OPTIONAL { - ?val datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - } GROUP BY ?val - """ - ) - - headers = { - "Accept": "application/sparql-results+json", - "Content-Type": "application/sparql-query", - } - - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query) - response.raise_for_status() - except RequestException: - return {}, [] - r = loads(response.text) - results = r["results"]["bindings"] - res_json = {elem["val"]["value"]: elem for elem in results} - return res_json, ["val", "ids"] +def literal_search(value, variable): + return ( + f'?resolved_identifier literal:hasLiteralValue "{value}" . ' + f"?{variable} datacite:hasIdentifier ?resolved_identifier ." + ) -def get_unique_brs_metadata(l_url_brs, ids_only=False): - res: list[list[str]] = [] - l_brs = ["<" + _url_br + ">" for _url_br in l_url_brs] - - fetch = br_meta_anyids if ids_only else br_meta_metadata - i = 0 - chunk_size = 3000 - brs_meta: dict[str, dict[str, dict[str, str]]] = {} - while i < len(l_brs): - chunk = l_brs[i : i + chunk_size] - m_br = fetch(chunk) - brs_meta.update(m_br[0]) - if i == 0: - res.append(m_br[1]) - i += chunk_size - - unique_brs_anyid: list[set[str]] = [] - for k_val in brs_meta.values(): - br_ids = k_val["ids"]["value"] - if br_ids: - s = set(br_ids.split(" __ ")) - _c_intersection = 0 - for __unique in unique_brs_anyid: - _c_intersection += len(__unique.intersection(s)) - if _c_intersection == 0: - unique_brs_anyid.append(s) - br_values = [k_val[k]["value"] if k in k_val else "" for k in res[0]] - res.append(br_values) - - f_res = {} - for row in res[1:]: - f_res[row[0]] = {k_val: row[i] for i, k_val in enumerate(res[0])} - return f_res +def unique_citations(res): + citing_groups: dict[str, str] = {} + cited_groups: dict[str, str] = {} + citations: dict[tuple[str, str], dict[str, str]] = {} + for row in sorted(__rows(res), key=lambda row: (row["citing_br"], row["cited_br"])): + key = ( + __group(row["citing_br"], row["citing_ids"], citing_groups), + __group(row["cited_br"], row["cited_ids"], cited_groups), + ) + citations.setdefault(key, row) + return list(citations.values()) -def get_pub_date(elem): - return elem["pubDate"] +def count_unique_cits(res): + return [["count"], [len(unique_citations(res))]], True -def get_source(elem): - return elem["source"].split("; ") +def count_groups(res, side): + entities = sorted({(row[f"{side}_br"], row[f"{side}_ids"]) for row in __rows(res)}) + groups: dict[str, str] = {} + return [["count"], [len({__group(*entity, groups) for entity in entities})]], True -def get_author(elem): - return elem["author"].split("; ") +def citation_row(citation, citing, cited): + return [ + citation["oci"], + citing, + cited, + citation["citing_date"], + cit_duration(citation["citing_date"], citation["cited_date"]), + __yes_no(citation, "same_journal"), + __yes_no(citation, "same_author"), + ] def get_id_val(val): return val.replace("https://w3id.org/oc/meta/br/", "") -def cit_journal_sc(citing_source_ids, cited_source_ids): - if len(set(citing_source_ids).intersection(set(cited_source_ids))) > 0: - return "yes" - return "no" - - -def cit_author_sc(citing_authors, cited_authors): - if len(set(citing_authors).intersection(set(cited_authors))) > 0: - return "yes" - return "no" - - def cit_duration(citing_complete_pub_date, cited_complete_pub_date): def _contains_years(date): @@ -230,3 +109,25 @@ def _contains_days(date): result += "%sD" % abs(delta.days) return result + + +def __rows(res): + header = res[0] + return [ + {field: value for field, (_, value) in zip(header, typed_row)} + for typed_row in res[1:] + ] + + +def __group(br, ids, groups): + identifiers = ids.split(" __ ") + for identifier in identifiers: + if identifier in groups: + return groups[identifier] + for identifier in identifiers: + groups[identifier] = br + return br + + +def __yes_no(citation, column): + return "yes" if citation.get(column) == "yes" else "no" diff --git a/src/api/indexapi_v1.py b/src/api/indexapi_v1.py index b421392..b137003 100644 --- a/src/api/indexapi_v1.py +++ b/src/api/indexapi_v1.py @@ -16,151 +16,41 @@ __author__ = "Arcangelo Massari & Ivan Heibi" -from requests import RequestException, post -from json import loads from indexapi_common import ( lower, # noqa: F401 - used by ramose via getattr - env_config, - get_unique_brs_metadata, - get_pub_date, - get_source, - get_author, - get_id_val, - cit_journal_sc, - cit_author_sc, - cit_duration, + count_unique_cits, # noqa: F401 - used by ramose via getattr + count_groups, # noqa: F401 - used by ramose via getattr + oci_search, # noqa: F401 - used by ramose via getattr + literal_search, + unique_citations, + citation_row, ) -def id2omids(s): - MULTI_VAL_MAX = 9000 - sparql_endpoint = env_config["sparql_endpoint_meta"] - - sparql_query = ( - """ - PREFIX datacite: - PREFIX literal: - SELECT ?br { - { ?identifier literal:hasLiteralValue '""" - + s - + """'^^. } - UNION - { ?identifier literal:hasLiteralValue '""" - + s - + """'. } - ?br datacite:hasIdentifier ?identifier - } - """ - ) - - headers = { - "Accept": "application/sparql-results+json", - "Content-Type": "application/sparql-query", - } - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=45) - response.raise_for_status() - except RequestException: - return ("",) - r = loads(response.text) - results = r["results"]["bindings"] - omid_l = [elem["br"]["value"].split("meta/br/")[1] for elem in results] - - if len(omid_l) == 0: - return ("",) - - sparql_values = [] - for i in range(0, len(omid_l), MULTI_VAL_MAX): - sparql_values.append( - " ".join( - [ - "" - for e in omid_l[i : i + MULTI_VAL_MAX] - ] - ) - ) - return (sparql_values,) - - -def count_unique_cits(res, *args): - header = res[0] - citing_idx = header.index(args[1]) - cited_idx = header.index(args[2]) - set_oci = set() - - # build - if len(res) > 1: - citing_to_dedup = [] - cited_to_dedup = [] - for row in res[1:]: - citing_to_dedup.extend(row[citing_idx]) - cited_to_dedup.extend(row[cited_idx]) - - citing_to_dedup_meta = get_unique_brs_metadata( - list(set(citing_to_dedup)), ids_only=True - ) - cited_to_dedup_meta = get_unique_brs_metadata( - list(set(cited_to_dedup)), ids_only=True - ) - for _k_citing in citing_to_dedup_meta.keys(): - for _k_cited in cited_to_dedup_meta.keys(): - set_oci.add((_k_citing, _k_cited)) - return [["count"], [len(set_oci)]], True +def cited_search(doi): + return (literal_search(doi, "cited_br"),) -# args must contain the and -def citations_info(res, *args): +def citing_search(doi): + return (literal_search(doi, "citing_br"),) - header = res[0] - citing_idx = header.index(args[1]) - cited_idx = header.index(args[2]) - # build +def citations_info(res): f_res = [ ["oci", "citing", "cited", "creation", "timespan", "journal_sc", "author_sc"] ] - - if len(res) > 1: - citing_to_dedup = [] - cited_to_dedup = [] - for row in res[1:]: - citing_to_dedup.extend(row[citing_idx]) - cited_to_dedup.extend(row[cited_idx]) - - citing_to_dedup_meta = get_unique_brs_metadata(list(set(citing_to_dedup))) - cited_to_dedup_meta = get_unique_brs_metadata(list(set(cited_to_dedup))) - - for citing_entity in citing_to_dedup_meta: - for cited_entity in cited_to_dedup_meta: - _citing = citing_to_dedup_meta[citing_entity] - _cited = cited_to_dedup_meta[cited_entity] - - res_row = [ - # oci value - get_id_val(citing_entity) + "-" + get_id_val(cited_entity), - # citing - __get_doi(_citing), - # cited - __get_doi(_cited), - # creation = citing[pub_date] - get_pub_date(_citing), - # timespan = citing[pub_date] - cited[pub_date] - cit_duration(get_pub_date(_citing), get_pub_date(_cited)), - # journal_sc = compare citing[source_id] and cited[source_id] - cit_journal_sc(get_source(_citing), get_source(_cited)), - # author_sc = compare citing[source_id] and cited[source_id] - cit_author_sc(get_author(_citing), get_author(_cited)), - ] - f_res.append(res_row) - + for citation in unique_citations(res): + f_res.append( + citation_row( + citation, + __get_doi(citation["citing_ids"]), + __get_doi(citation["cited_ids"]), + ) + ) return f_res, True -def __get_doi(elem): - str_ids = [] - if "ids" in elem: - for id in elem["ids"].split(" __ "): - if id.startswith("doi:"): - str_ids.append(id.split("doi:")[1]) - - return " ".join(str_ids) +def __get_doi(ids): + return " ".join( + id.removeprefix("doi:") for id in ids.split(" __ ") if id.startswith("doi:") + ) diff --git a/src/api/indexapi_v2.py b/src/api/indexapi_v2.py index a9c8bc6..04ac76a 100644 --- a/src/api/indexapi_v2.py +++ b/src/api/indexapi_v2.py @@ -16,224 +16,74 @@ __author__ = "Arcangelo Massari & Ivan Heibi" -from requests import RequestException, post -from json import loads +import re + from indexapi_common import ( lower, # noqa: F401 - used by ramose via getattr - env_config, - get_unique_brs_metadata, - get_pub_date, - get_source, - get_author, + count_unique_cits, # noqa: F401 - used by ramose via getattr + count_groups, # noqa: F401 - used by ramose via getattr + oci_search, # noqa: F401 - used by ramose via getattr + literal_search, + unique_citations, + citation_row, get_id_val, - cit_journal_sc, - cit_author_sc, - cit_duration, ) -def id2omids(s): - if "omid" in s: - return (s.replace("omid:br/", "",) - return (__get_omid_of(s),) +def cited_search(s): + return (__br_search(s, "cited_br"),) -def count_unique_cits(res, *args): - header = res[0] - citing_idx = header.index(args[1]) - cited_idx = header.index(args[2]) - set_oci = set() - - # build - if len(res) > 1: - citing_to_dedup = [] - cited_to_dedup = [] - for row in res[1:]: - citing_to_dedup.extend(row[citing_idx]) - cited_to_dedup.extend(row[cited_idx]) - - citing_to_dedup_meta = get_unique_brs_metadata( - list(set(citing_to_dedup)), ids_only=True - ) - cited_to_dedup_meta = get_unique_brs_metadata( - list(set(cited_to_dedup)), ids_only=True - ) - for _k_citing in citing_to_dedup_meta.keys(): - for _k_cited in cited_to_dedup_meta.keys(): - set_oci.add((_k_citing, _k_cited)) +def citing_search(s): + return (__br_search(s, "citing_br"),) - return [["count"], [len(set_oci)]], True +def issn_value(s): + value = re.sub("[^X0-9]", "", s.removeprefix("issn:").upper()) + return (f"{value[:4]}-{value[4:8]}",) -# args must contain the and -def citations_info(res, *args): - header = res[0] - citing_idx = header.index(args[1]) - cited_idx = header.index(args[2]) +def isbn_value(s): + value = re.sub("[^X0-9]", "", s.removeprefix("isbn:").upper()) + return (value,) + - # build +def citations_info(res): f_res = [ ["oci", "citing", "cited", "creation", "timespan", "journal_sc", "author_sc"] ] - - if len(res) > 1: - citing_to_dedup = [] - cited_to_dedup = [] - for row in res[1:]: - citing_to_dedup.extend(row[citing_idx]) - cited_to_dedup.extend(row[cited_idx]) - - citing_to_dedup_meta = get_unique_brs_metadata(list(set(citing_to_dedup))) - cited_to_dedup_meta = get_unique_brs_metadata(list(set(cited_to_dedup))) - - for citing_entity in citing_to_dedup_meta: - for cited_entity in cited_to_dedup_meta: - _citing = citing_to_dedup_meta[citing_entity] - _cited = cited_to_dedup_meta[cited_entity] - - res_row = [ - # oci value - get_id_val(citing_entity) + "-" + get_id_val(cited_entity), - # citing - __get_all_pids(_citing, citing_entity), - # cited - __get_all_pids(_cited, cited_entity), - # creation = citing[pub_date] - get_pub_date(_citing), - # timespan = citing[pub_date] - cited[pub_date] - cit_duration(get_pub_date(_citing), get_pub_date(_cited)), - # journal_sc = compare citing[source_id] and cited[source_id] - cit_journal_sc(get_source(_citing), get_source(_cited)), - # author_sc = compare citing[source_id] and cited[source_id] - cit_author_sc(get_author(_citing), get_author(_cited)), - ] - f_res.append(res_row) - + for citation in unique_citations(res): + f_res.append( + citation_row( + citation, + __get_all_pids(citation["citing_br"], citation["citing_ids"]), + __get_all_pids(citation["cited_br"], citation["cited_ids"]), + ) + ) return f_res, True -# args must contain the -def sum_all(res, *args): - +def venue_count(res): header = res[0] - count_idx = header.index(args[0]) - - tot_count = 0 - for row in res[1:]: - tot_count += int(row[count_idx][1]) - - res = [header, [str(tot_count)]] - return res, True - - -# --- -# Local methods -# --- - - -def __get_omid_of(s): - MULTI_VAL_MAX = 9000 - sparql_endpoint = env_config["sparql_endpoint_meta"] - - # SPARQL query - is_journal = False - br_pre_l = [ - "doi", - "issn", - "isbn", - "pmid", - "pmcid", - "url", - "wikidata", - "wikipedia", - "jid", - "arxiv", - ] - for br_pre in br_pre_l: - if s.startswith(br_pre + ":"): - s = s.replace(br_pre + ":", "") - # check if is journal - is_journal = br_pre in ["issn"] - break - - sparql_query = ( - """ - PREFIX datacite: - PREFIX literal: - SELECT ?br { - { ?identifier literal:hasLiteralValue '""" - + s - + """'^^. } - UNION - {?identifier literal:hasLiteralValue '""" - + s - + """'.} - ?br datacite:hasIdentifier ?identifier - } - """ - ) - - # in case is a journal the SAPRQL query retrieves all associated BRs - if is_journal: - sparql_query = ( - """ - PREFIX datacite: - PREFIX literal: - PREFIX ns1: - PREFIX fabio: - SELECT ?br { - { ?identifier literal:hasLiteralValue '""" - + s - + """'^^. } - UNION - {?identifier literal:hasLiteralValue '""" - + s - + """'.} - ?venue datacite:hasIdentifier ?identifier . - {?br ns1:partOf ?venue .} - UNION { ?br ns1:partOf/ns1:partOf ?venue . } - UNION { ?br ns1:partOf/ns1:partOf/ns1:partOf ?venue . } - UNION { ?br ns1:partOf/ns1:partOf/ns1:partOf/ns1:partOf ?venue .} - ?br a fabio:JournalArticle . - } - """ + count = res[1][header.index("count")][1] if len(res) > 1 else "0" + return [["count"], [count]], True + + +def __br_search(s, variable): + scheme, value = s.split(":", 1) + if scheme == "omid": + return f"VALUES ?{variable} {{ }}" + if scheme == "issn": + value = issn_value(s)[0] + elif scheme == "isbn": + value = isbn_value(s)[0] + if scheme in {"issn", "isbn"}: + return ( + literal_search(value, variable) + + f" ?resolved_identifier datacite:usesIdentifierScheme datacite:{scheme} ." ) + return literal_search(value, variable) - headers = { - "Accept": "application/sparql-results+json", - "Content-Type": "application/sparql-query", - } - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=45) - response.raise_for_status() - except RequestException: - return "" - r = loads(response.text) - results = r["results"]["bindings"] - omid_l = [elem["br"]["value"].split("meta/br/")[1] for elem in results] - - if len(omid_l) == 0: - return "" - - sparql_values = [] - for i in range(0, len(omid_l), MULTI_VAL_MAX): - sparql_values.append( - " ".join( - [ - "" - for e in omid_l[i : i + MULTI_VAL_MAX] - ] - ) - ) - return sparql_values - - -def __get_all_pids(elem, uri_omid): - str_omid = "omid:br/" + get_id_val(uri_omid) - str_ids = [str_omid] - if "ids" in elem: - for id in elem["ids"].split(" __ "): - str_ids.append(id) - return " ".join(str_ids) +def __get_all_pids(br, ids): + return " ".join(["omid:br/" + get_id_val(br), *ids.split(" __ ")]) diff --git a/src/api/meta_v1.hf b/src/api/meta_v1.hf index 740b90f..a3028e3 100644 --- a/src/api/meta_v1.hf +++ b/src/api/meta_v1.hf @@ -21,7 +21,7 @@ get(API_CALL, headers=HTTP_HEADERS) #version Version 1.1.1 (2022-12-22) #contacts [contact@opencitations.net](mailto:contact@opencitations.net) #license This document is licensed with a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/legalcode), while the REST API itself has been created using [RAMOSE](https://github.com/opencitations/ramose), the *Restful API Manager Over SPARQL Endpoints* created by [Silvio Peroni](https://orcid.org/0000-0003-0530-4305), which is licensed with an [ISC license](https://opensource.org/licenses/ISC). -#endpoint http://virtuoso-service.default.svc.cluster.local:8890/sparql +#endpoint http://meta-qlever-service.default.svc.cluster.local:7011 #method post #addon metaapi @@ -65,247 +65,243 @@ It is possible to specify one or more IDs as input of this operation. In this ca "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" } ] -#sparql PREFIX foaf: -PREFIX pro: +#sparql PREFIX datacite: +PREFIX fabio: PREFIX literal: + +SELECT DISTINCT ?res +WHERE { + [[ids]] +} + +@@join ?res ?res type=left +@@values ?res PREFIX datacite: PREFIX dcterm: -PREFIX frbr: +PREFIX literal: +PREFIX prism: + +SELECT ?res ?title ?pub_date +(CONCAT(COALESCE(GROUP_CONCAT(DISTINCT ?external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) +WHERE { + OPTIONAL { ?res dcterm:title ?title } + OPTIONAL { ?res prism:publicationDate ?pub_date } + OPTIONAL { ?res datacite:hasIdentifier ?identifier } + BIND(COALESCE(?identifier, ) AS ?identifier_node) + OPTIONAL { ?identifier_node datacite:usesIdentifierScheme ?scheme } + OPTIONAL { ?identifier_node literal:hasLiteralValue ?literal_value } + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literal_value, " ") AS ?external_id) +} +GROUP BY ?res ?title ?pub_date + +@@join ?res ?res type=left +@@values ?res PREFIX fabio: + +SELECT DISTINCT ?res ?type +WHERE { + ?res a ?type. + FILTER(?type != fabio:Expression) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX frbr: PREFIX prism: + +SELECT DISTINCT ?res ?page +WHERE { + ?res frbr:embodiment ?embodiment. + ?embodiment prism:startingPage ?starting_page; + prism:endingPage ?ending_page. + BIND(IF(STR(?starting_page) = STR(?ending_page), STR(?starting_page), CONCAT(?starting_page, "-", ?ending_page)) AS ?page) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?issue +WHERE { + ?res frbr:partOf ?journal_issue. + ?journal_issue a fabio:JournalIssue; + fabio:hasSequenceIdentifier ?issue. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?volume +WHERE { + ?res frbr:partOf+ ?journal_volume. + ?journal_volume a fabio:JournalVolume; + fabio:hasSequenceIdentifier ?volume. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX dcterm: +PREFIX fabio: +PREFIX frbr: +PREFIX literal: + +SELECT ?res +(CONCAT(?venue_name, " [", COALESCE(GROUP_CONCAT(DISTINCT ?venue_external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?venue_resource), "/br/"), "]") AS ?venue) +WHERE { + ?res frbr:partOf ?direct_container; + frbr:partOf+ ?venue_resource. + ?venue_resource dcterm:title ?venue_name. + FILTER(?venue_resource = ?direct_container || (EXISTS { ?res a fabio:JournalArticle } && EXISTS { ?venue_resource a fabio:Journal })) + OPTIONAL { ?venue_resource datacite:hasIdentifier ?venue_identifier } + BIND(COALESCE(?venue_identifier, ) AS ?venue_identifier_node) + OPTIONAL { ?venue_identifier_node datacite:usesIdentifierScheme ?venue_scheme } + OPTIONAL { ?venue_identifier_node literal:hasLiteralValue ?venue_literal_value } + BIND(CONCAT(STRAFTER(STR(?venue_scheme), "http://purl.org/spar/datacite/"), ":", ?venue_literal_value, " ") AS ?venue_external_id) +} +GROUP BY ?res ?venue_resource ?venue_name + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: PREFIX oco: +PREFIX pro: -SELECT DISTINCT -?id -(STR(?title) AS ?title) -(GROUP_CONCAT(DISTINCT ?author_info; SEPARATOR="|") AS ?author) -(STR(?pub_date) AS ?pub_date) -(STR(?issue) AS ?issue) -(STR(?volume) AS ?volume) -?venue -?type -?page -(GROUP_CONCAT(DISTINCT ?publisher_info; SEPARATOR="|") AS ?publisher) -(GROUP_CONCAT(DISTINCT ?combined_editor_info; SEPARATOR="|") AS ?editor) +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?author) WHERE { - { - SELECT ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?pub_date ?page ?issue ?volume ?venueName ?venueMetaid - (GROUP_CONCAT(DISTINCT ?id ; SEPARATOR=" ") AS ?ids) - (GROUP_CONCAT(DISTINCT ?venue_ids_; SEPARATOR=' ') AS ?venue_ids) - WHERE { - [[ids]] - OPTIONAL { - ?res datacite:hasIdentifier ?allIdentifiers. - ?allIdentifiers datacite:usesIdentifierScheme ?allSchemes; - literal:hasLiteralValue ?allLiteralValues. - BIND(CONCAT(STRAFTER(STR(?allSchemes), "http://purl.org/spar/datacite/"), ":", ?allLiteralValues) AS ?id) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - OPTIONAL { - ?arAuthor oco:hasNext ?nextAuthorRole . - } - BIND(STRAFTER(STR(?arAuthor), "https://w3id.org/oc/meta/ar/") AS ?roleUri) - BIND(STRAFTER(STR(?nextAuthorRole), "https://w3id.org/oc/meta/ar/") AS ?nextRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raAuthor), "/ra/")) AS ?author_metaid) - OPTIONAL {?raAuthor foaf:familyName ?familyName.} - OPTIONAL {?raAuthor foaf:givenName ?givenName.} - OPTIONAL {?raAuthor foaf:name ?name.} - OPTIONAL { - ?raAuthor datacite:hasIdentifier ?authorIdentifier. - ?authorIdentifier datacite:usesIdentifierScheme ?authorIdSchema; - literal:hasLiteralValue ?authorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?authorIdSchema), "http://purl.org/spar/datacite/"), ":", ?authorIdLiteralValue) AS ?author_id) - } - BIND( - IF( - STRLEN(STR(?familyName)) > 0 && STRLEN(STR(?givenName)) > 0, - CONCAT(?familyName, ", ", ?givenName), - IF( - STRLEN(STR(?familyName)) > 0, - CONCAT(?familyName, ","), - ?name - ) - ) - AS ?authorName) - BIND( - IF( - STRLEN(STR(?author_id)) > 0, - CONCAT(?authorName, " [", ?author_id, " ", ?author_metaid, "]"), - CONCAT(?authorName, " [", ?author_metaid, "]") - ) - AS ?author_) - BIND(CONCAT(?author_, ":", ?roleUri, ":", COALESCE(?nextRoleUri, "")) AS ?author_info) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arEditor. - ?arEditor pro:withRole pro:editor; - pro:isHeldBy ?raEditor. - OPTIONAL { - ?arEditor oco:hasNext ?nextEditorRole . - } - BIND(STRAFTER(STR(?arEditor), "https://w3id.org/oc/meta/ar/") AS ?editorRoleUri) - BIND(STRAFTER(STR(?nextEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raEditor), "/ra/")) AS ?editor_metaid) - OPTIONAL {?raEditor foaf:familyName ?editorFamilyName.} - OPTIONAL {?raEditor foaf:givenName ?editorGivenName.} - OPTIONAL {?raEditor foaf:name ?editor_name.} - OPTIONAL { - ?raEditor datacite:hasIdentifier ?editorIdentifier. - ?editorIdentifier datacite:usesIdentifierScheme ?editorIdSchema; - literal:hasLiteralValue ?editorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?editorIdSchema), "http://purl.org/spar/datacite/"), ":", ?editorIdLiteralValue) AS ?editor_id) - } - BIND( - IF( - STRLEN(STR(?editorFamilyName)) > 0 && STRLEN(STR(?editorGivenName)) > 0, - CONCAT(?editorFamilyName, ", ", ?editorGivenName), - IF( - STRLEN(STR(?editorFamilyName)) > 0, - CONCAT(?editorFamilyName, ","), - ?editor_name - ) - ) - AS ?editorName) - BIND( - IF( - STRLEN(STR(?editor_id)) > 0, - CONCAT(?editorName, " [", ?editor_id, " ", ?editor_metaid, "]"), - CONCAT(?editorName, " [", ?editor_metaid, "]") - ) - AS ?editor_) - BIND(CONCAT(?editor_, ":", ?editorRoleUri, ":", COALESCE(?nextEditorRoleUri, "")) AS ?editor_info) - } - OPTIONAL { - ?res frbr:partOf ?container. - ?container pro:isDocumentContextFor ?arContainerEditor. - ?arContainerEditor pro:withRole pro:editor; - pro:isHeldBy ?raContainerEditor. - OPTIONAL { - ?arContainerEditor oco:hasNext ?nextContainerEditorRole . - } - BIND(STRAFTER(STR(?arContainerEditor), "https://w3id.org/oc/meta/ar/") AS ?containerEditorRoleUri) - BIND(STRAFTER(STR(?nextContainerEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextContainerEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raContainerEditor), "/ra/")) AS ?container_editor_metaid) - OPTIONAL {?raContainerEditor foaf:familyName ?containerEditorFamilyName.} - OPTIONAL {?raContainerEditor foaf:givenName ?containerEditorGivenName.} - OPTIONAL {?raContainerEditor foaf:name ?container_editor_name.} - OPTIONAL { - ?raContainerEditor datacite:hasIdentifier ?containerEditorIdentifier. - ?containerEditorIdentifier datacite:usesIdentifierScheme ?containerEditorIdSchema; - literal:hasLiteralValue ?containerEditorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?containerEditorIdSchema), "http://purl.org/spar/datacite/"), ":", ?containerEditorIdLiteralValue) AS ?container_editor_id) - } - BIND( - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0 && STRLEN(STR(?containerEditorGivenName)) > 0, - CONCAT(?containerEditorFamilyName, ", ", ?containerEditorGivenName), - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0, - CONCAT(?containerEditorFamilyName, ","), - ?container_editor_name - ) - ) - AS ?containerEditorName) - BIND( - IF( - STRLEN(STR(?container_editor_id)) > 0, - CONCAT(?containerEditorName, " [", ?container_editor_id, " ", ?container_editor_metaid, "]"), - CONCAT(?containerEditorName, " [", ?container_editor_metaid, "]") - ) - AS ?container_editor_) - BIND(CONCAT(?container_editor_, ":", ?containerEditorRoleUri, ":", COALESCE(?nextContainerEditorRoleUri, "")) AS ?container_editor_info) - } - BIND( - IF(BOUND(?editor_info), - IF(BOUND(?container_editor_info), - CONCAT(?editor_info, "|", ?container_editor_info), - ?editor_info), - IF(BOUND(?container_editor_info), - ?container_editor_info, - "") - ) - AS ?combined_editor_info) - OPTIONAL { - ?res pro:isDocumentContextFor ?arPublisher. - ?arPublisher pro:withRole pro:publisher; - pro:isHeldBy ?raPublisher. - OPTIONAL { - ?arPublisher oco:hasNext ?nextPublisherRole . - } - BIND(STRAFTER(STR(?arPublisher), "https://w3id.org/oc/meta/ar/") AS ?publisherRoleUri) - BIND(STRAFTER(STR(?nextPublisherRole), "https://w3id.org/oc/meta/ar/") AS ?nextPublisherRoleUri) - ?raPublisher foaf:name ?publisherName_. - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raPublisher), "/ra/")) AS ?publisher_metaid) - ?raPublisher foaf:name ?publisher_name. - OPTIONAL { - ?raPublisher datacite:hasIdentifier ?publisherIdentifier__. - ?publisherIdentifier__ datacite:usesIdentifierScheme ?publisherIdSchema; - literal:hasLiteralValue ?publisherIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?publisherIdSchema), "http://purl.org/spar/datacite/"), ":", ?publisherIdLiteralValue) AS ?publisher_id) - } - BIND( - IF( - STRLEN(STR(?publisher_id)) > 0, - CONCAT(?publisher_name, " [", ?publisher_id, " ", ?publisher_metaid, "]"), - CONCAT(?publisher_name, " [", ?publisher_metaid, "]") - ) - AS ?publisher_) - BIND(CONCAT(?publisher_, ":", ?publisherRoleUri, ":", COALESCE(?nextPublisherRoleUri, "")) AS ?publisher_info) - } - OPTIONAL { - { - ?res a fabio:JournalArticle; - frbr:partOf+ ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - ?journal a fabio:Journal. - } UNION { - ?res frbr:partOf ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - } - ?journal dcterm:title ?venueName. - OPTIONAL { - ?journal datacite:hasIdentifier ?journalIdentifier__. - ?journalIdentifier__ datacite:usesIdentifierScheme ?journalIdScheme; - literal:hasLiteralValue ?journalIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?journalIdScheme), "http://purl.org/spar/datacite/"), ":", ?journalIdLiteralValue) AS ?venue_ids_) - } - } - OPTIONAL {?res a ?type. FILTER (?type != fabio:Expression)} - OPTIONAL {?res dcterm:title ?title.} - OPTIONAL {?res prism:publicationDate ?pub_date.} - OPTIONAL { - ?res frbr:embodiment ?re. - ?re prism:startingPage ?startingPage; - prism:endingPage ?endingPage. - BIND(IF(STR(?startingPage) = STR(?endingPage), STR(?startingPage), CONCAT(?startingPage, '-', ?endingPage)) AS ?page) - } - OPTIONAL { - ?res frbr:partOf ?resIssue. - ?resIssue a fabio:JournalIssue; - fabio:hasSequenceIdentifier ?issue. - } - OPTIONAL { - ?res frbr:partOf+ ?resVolume. - ?resVolume a fabio:JournalVolume; - fabio:hasSequenceIdentifier ?volume. - } - } GROUP BY ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?issue ?volume ?pub_date ?page ?venueName ?venueMetaid - } - BIND(CONCAT(?ids, IF(STR(?ids) != "", " ", ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:author; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX frbr: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?editor) +WHERE { + OPTIONAL { ?res frbr:partOf ?container } + VALUES ?of_container { false true } + BIND(IF(?of_container, COALESCE(?container, ), ?res) AS ?context) + ?context pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:editor; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) BIND( - IF(BOUND(?venueMetaid), - IF(STR(?venue_ids) != "", - CONCAT(" [", ?venue_ids, " ", ?venueMetaid, "]"), - CONCAT(" [", ?venueMetaid, "]") - ), - "" + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) ) - AS ?venueIdentifiers) - BIND(CONCAT(?venueName, ?venueIdentifiers) AS ?venue) -} GROUP BY ?id ?title ?type ?issue ?volume ?venue ?pub_date ?page + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?publisher) +WHERE { + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:publisher; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res #url /author/{id} #type operation @@ -371,254 +367,248 @@ The fields returned by this operation are: "editor": "" } ] -#sparql PREFIX foaf: -PREFIX pro: +#sparql PREFIX datacite: +PREFIX fabio: PREFIX literal: +PREFIX pro: + +SELECT DISTINCT ?res +WHERE { + [[id]] + ?knownRole pro:withRole pro:author. + ?res pro:isDocumentContextFor ?knownRole; + a fabio:Expression. +} +LIMIT 1000 + +@@join ?res ?res type=left +@@values ?res PREFIX datacite: PREFIX dcterm: -PREFIX frbr: +PREFIX literal: +PREFIX prism: + +SELECT ?res ?title ?pub_date +(CONCAT(COALESCE(GROUP_CONCAT(DISTINCT ?external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) +WHERE { + OPTIONAL { ?res dcterm:title ?title } + OPTIONAL { ?res prism:publicationDate ?pub_date } + OPTIONAL { ?res datacite:hasIdentifier ?identifier } + BIND(COALESCE(?identifier, ) AS ?identifier_node) + OPTIONAL { ?identifier_node datacite:usesIdentifierScheme ?scheme } + OPTIONAL { ?identifier_node literal:hasLiteralValue ?literal_value } + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literal_value, " ") AS ?external_id) +} +GROUP BY ?res ?title ?pub_date + +@@join ?res ?res type=left +@@values ?res PREFIX fabio: + +SELECT DISTINCT ?res ?type +WHERE { + ?res a ?type. + FILTER(?type != fabio:Expression) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX frbr: PREFIX prism: + +SELECT DISTINCT ?res ?page +WHERE { + ?res frbr:embodiment ?embodiment. + ?embodiment prism:startingPage ?starting_page; + prism:endingPage ?ending_page. + BIND(IF(STR(?starting_page) = STR(?ending_page), STR(?starting_page), CONCAT(?starting_page, "-", ?ending_page)) AS ?page) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?issue +WHERE { + ?res frbr:partOf ?journal_issue. + ?journal_issue a fabio:JournalIssue; + fabio:hasSequenceIdentifier ?issue. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?volume +WHERE { + ?res frbr:partOf+ ?journal_volume. + ?journal_volume a fabio:JournalVolume; + fabio:hasSequenceIdentifier ?volume. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX dcterm: +PREFIX fabio: +PREFIX frbr: +PREFIX literal: + +SELECT ?res +(CONCAT(?venue_name, " [", COALESCE(GROUP_CONCAT(DISTINCT ?venue_external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?venue_resource), "/br/"), "]") AS ?venue) +WHERE { + ?res frbr:partOf ?direct_container; + frbr:partOf+ ?venue_resource. + ?venue_resource dcterm:title ?venue_name. + FILTER(?venue_resource = ?direct_container || (EXISTS { ?res a fabio:JournalArticle } && EXISTS { ?venue_resource a fabio:Journal })) + OPTIONAL { ?venue_resource datacite:hasIdentifier ?venue_identifier } + BIND(COALESCE(?venue_identifier, ) AS ?venue_identifier_node) + OPTIONAL { ?venue_identifier_node datacite:usesIdentifierScheme ?venue_scheme } + OPTIONAL { ?venue_identifier_node literal:hasLiteralValue ?venue_literal_value } + BIND(CONCAT(STRAFTER(STR(?venue_scheme), "http://purl.org/spar/datacite/"), ":", ?venue_literal_value, " ") AS ?venue_external_id) +} +GROUP BY ?res ?venue_resource ?venue_name + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: PREFIX oco: +PREFIX pro: -SELECT DISTINCT -?id -(STR(?title) AS ?title) -(GROUP_CONCAT(DISTINCT ?author_info; SEPARATOR="|") AS ?author) -(STR(?pub_date) AS ?pub_date) -(STR(?issue) AS ?issue) -(STR(?volume) AS ?volume) -?venue -?type -?page -(GROUP_CONCAT(DISTINCT ?publisher_info; SEPARATOR="|") AS ?publisher) -(GROUP_CONCAT(DISTINCT ?combined_editor_info; SEPARATOR="|") AS ?editor) +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?author) WHERE { - { - SELECT ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?pub_date ?page ?issue ?volume ?venueName ?venueMetaid - (GROUP_CONCAT(DISTINCT ?id ; SEPARATOR=" ") AS ?ids) - (GROUP_CONCAT(DISTINCT ?venue_ids_; SEPARATOR=' ') AS ?venue_ids) - WHERE { - { - SELECT DISTINCT ?res - WHERE { - [[id]] - ?knownRole pro:withRole pro:author. - ?res pro:isDocumentContextFor ?knownRole; - a fabio:Expression. - } LIMIT 1000 - } - OPTIONAL { - ?res datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - OPTIONAL { - ?arAuthor oco:hasNext ?nextAuthorRole . - } - BIND(STRAFTER(STR(?arAuthor), "https://w3id.org/oc/meta/ar/") AS ?roleUri) - BIND(STRAFTER(STR(?nextAuthorRole), "https://w3id.org/oc/meta/ar/") AS ?nextRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raAuthor), "/ra/")) AS ?author_metaid) - OPTIONAL {?raAuthor foaf:familyName ?familyName.} - OPTIONAL {?raAuthor foaf:givenName ?givenName.} - OPTIONAL {?raAuthor foaf:name ?name.} - OPTIONAL { - ?raAuthor datacite:hasIdentifier ?authorIdentifier. - ?authorIdentifier datacite:usesIdentifierScheme ?authorIdSchema; - literal:hasLiteralValue ?authorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?authorIdSchema), "http://purl.org/spar/datacite/"), ":", ?authorIdLiteralValue) AS ?author_id) - } - BIND( - IF( - STRLEN(STR(?familyName)) > 0 && STRLEN(STR(?givenName)) > 0, - CONCAT(?familyName, ", ", ?givenName), - IF( - STRLEN(STR(?familyName)) > 0, - CONCAT(?familyName, ","), - ?name - ) - ) - AS ?authorName) - BIND( - IF( - STRLEN(STR(?author_id)) > 0, - CONCAT(?authorName, " [", ?author_id, " ", ?author_metaid, "]"), - CONCAT(?authorName, " [", ?author_metaid, "]") - ) - AS ?author_) - BIND(CONCAT(?author_, ":", ?roleUri, ":", COALESCE(?nextRoleUri, "")) AS ?author_info) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arEditor. - ?arEditor pro:withRole pro:editor; - pro:isHeldBy ?raEditor. - OPTIONAL { - ?arEditor oco:hasNext ?nextEditorRole . - } - BIND(STRAFTER(STR(?arEditor), "https://w3id.org/oc/meta/ar/") AS ?editorRoleUri) - BIND(STRAFTER(STR(?nextEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raEditor), "/ra/")) AS ?editor_metaid) - OPTIONAL {?raEditor foaf:familyName ?editorFamilyName.} - OPTIONAL {?raEditor foaf:givenName ?editorGivenName.} - OPTIONAL {?raEditor foaf:name ?editor_name.} - OPTIONAL { - ?raEditor datacite:hasIdentifier ?editorIdentifier. - ?editorIdentifier datacite:usesIdentifierScheme ?editorIdSchema; - literal:hasLiteralValue ?editorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?editorIdSchema), "http://purl.org/spar/datacite/"), ":", ?editorIdLiteralValue) AS ?editor_id) - } - BIND( - IF( - STRLEN(STR(?editorFamilyName)) > 0 && STRLEN(STR(?editorGivenName)) > 0, - CONCAT(?editorFamilyName, ", ", ?editorGivenName), - IF( - STRLEN(STR(?editorFamilyName)) > 0, - CONCAT(?editorFamilyName, ","), - ?editor_name - ) - ) - AS ?editorName) - BIND( - IF( - STRLEN(STR(?editor_id)) > 0, - CONCAT(?editorName, " [", ?editor_id, " ", ?editor_metaid, "]"), - CONCAT(?editorName, " [", ?editor_metaid, "]") - ) - AS ?editor_) - BIND(CONCAT(?editor_, ":", ?editorRoleUri, ":", COALESCE(?nextEditorRoleUri, "")) AS ?editor_info) - } - OPTIONAL { - ?res frbr:partOf ?container. - ?container pro:isDocumentContextFor ?arContainerEditor. - ?arContainerEditor pro:withRole pro:editor; - pro:isHeldBy ?raContainerEditor. - OPTIONAL { - ?arContainerEditor oco:hasNext ?nextContainerEditorRole . - } - BIND(STRAFTER(STR(?arContainerEditor), "https://w3id.org/oc/meta/ar/") AS ?containerEditorRoleUri) - BIND(STRAFTER(STR(?nextContainerEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextContainerEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raContainerEditor), "/ra/")) AS ?container_editor_metaid) - OPTIONAL {?raContainerEditor foaf:familyName ?containerEditorFamilyName.} - OPTIONAL {?raContainerEditor foaf:givenName ?containerEditorGivenName.} - OPTIONAL {?raContainerEditor foaf:name ?container_editor_name.} - OPTIONAL { - ?raContainerEditor datacite:hasIdentifier ?containerEditorIdentifier. - ?containerEditorIdentifier datacite:usesIdentifierScheme ?containerEditorIdSchema; - literal:hasLiteralValue ?containerEditorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?containerEditorIdSchema), "http://purl.org/spar/datacite/"), ":", ?containerEditorIdLiteralValue) AS ?container_editor_id) - } - BIND( - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0 && STRLEN(STR(?containerEditorGivenName)) > 0, - CONCAT(?containerEditorFamilyName, ", ", ?containerEditorGivenName), - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0, - CONCAT(?containerEditorFamilyName, ","), - ?container_editor_name - ) - ) - AS ?containerEditorName) - BIND( - IF( - STRLEN(STR(?container_editor_id)) > 0, - CONCAT(?containerEditorName, " [", ?container_editor_id, " ", ?container_editor_metaid, "]"), - CONCAT(?containerEditorName, " [", ?container_editor_metaid, "]") - ) - AS ?container_editor_) - BIND(CONCAT(?container_editor_, ":", ?containerEditorRoleUri, ":", COALESCE(?nextContainerEditorRoleUri, "")) AS ?container_editor_info) - } - BIND( - IF(BOUND(?editor_info), - IF(BOUND(?container_editor_info), - CONCAT(?editor_info, "|", ?container_editor_info), - ?editor_info), - IF(BOUND(?container_editor_info), - ?container_editor_info, - "") - ) - AS ?combined_editor_info) - OPTIONAL { - ?res pro:isDocumentContextFor ?arPublisher. - ?arPublisher pro:withRole pro:publisher; - pro:isHeldBy ?raPublisher. - OPTIONAL { - ?arPublisher oco:hasNext ?nextPublisherRole . - } - BIND(STRAFTER(STR(?arPublisher), "https://w3id.org/oc/meta/ar/") AS ?publisherRoleUri) - BIND(STRAFTER(STR(?nextPublisherRole), "https://w3id.org/oc/meta/ar/") AS ?nextPublisherRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raPublisher), "/ra/")) AS ?publisher_metaid) - ?raPublisher foaf:name ?publisher_name. - OPTIONAL { - ?raPublisher datacite:hasIdentifier ?publisherIdentifier__. - ?publisherIdentifier__ datacite:usesIdentifierScheme ?publisherIdSchema; - literal:hasLiteralValue ?publisherIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?publisherIdSchema), "http://purl.org/spar/datacite/"), ":", ?publisherIdLiteralValue) AS ?publisher_id) - } - BIND( - IF( - STRLEN(STR(?publisher_id)) > 0, - CONCAT(?publisher_name, " [", ?publisher_id, " ", ?publisher_metaid, "]"), - CONCAT(?publisher_name, " [", ?publisher_metaid, "]") - ) - AS ?publisher_) - BIND(CONCAT(?publisher_, ":", ?publisherRoleUri, ":", COALESCE(?nextPublisherRoleUri, "")) AS ?publisher_info) - } - OPTIONAL { - { - ?res a fabio:JournalArticle; - frbr:partOf+ ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - ?journal a fabio:Journal. - } UNION { - ?res frbr:partOf ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - } - ?journal dcterm:title ?venueName. - OPTIONAL { - ?journal datacite:hasIdentifier ?journalIdentifier__. - ?journalIdentifier__ datacite:usesIdentifierScheme ?journalIdScheme; - literal:hasLiteralValue ?journalIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?journalIdScheme), "http://purl.org/spar/datacite/"), ":", ?journalIdLiteralValue) AS ?venue_ids_) - } - } - OPTIONAL {?res a ?type. FILTER (?type != fabio:Expression)} - OPTIONAL {?res dcterm:title ?title.} - OPTIONAL {?res prism:publicationDate ?pub_date.} - OPTIONAL { - ?res frbr:embodiment ?re. - ?re prism:startingPage ?startingPage; - prism:endingPage ?endingPage. - BIND(IF(STR(?startingPage) = STR(?endingPage), STR(?startingPage), CONCAT(?startingPage, '-', ?endingPage)) AS ?page) - } - OPTIONAL { - ?res frbr:partOf ?resIssue. - ?resIssue a fabio:JournalIssue; - fabio:hasSequenceIdentifier ?issue. - } - OPTIONAL { - ?res frbr:partOf+ ?resVolume. - ?resVolume a fabio:JournalVolume; - fabio:hasSequenceIdentifier ?volume. - } - } GROUP BY ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?issue ?volume ?pub_date ?page ?venueName ?venueMetaid - } - BIND(CONCAT(?ids, IF(STR(?ids) != "", " ", ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:author; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX frbr: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?editor) +WHERE { + OPTIONAL { ?res frbr:partOf ?container } + VALUES ?of_container { false true } + BIND(IF(?of_container, COALESCE(?container, ), ?res) AS ?context) + ?context pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:editor; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?publisher) +WHERE { + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:publisher; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) BIND( - IF(BOUND(?venueMetaid), - IF(STR(?venue_ids) != "", - CONCAT(" [", ?venue_ids, " ", ?venueMetaid, "]"), - CONCAT(" [", ?venueMetaid, "]") - ), - "" + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) ) - AS ?venueIdentifiers) - BIND(CONCAT(?venueName, ?venueIdentifiers) AS ?venue) -} GROUP BY ?id ?title ?type ?issue ?volume ?venue ?pub_date ?page + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res #url /editor/{id} #type operation @@ -658,251 +648,245 @@ The fields returned by this operation are: "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" } ] -#sparql PREFIX foaf: -PREFIX pro: +#sparql PREFIX datacite: +PREFIX fabio: PREFIX literal: +PREFIX pro: + +SELECT DISTINCT ?res +WHERE { + [[id]] + ?knownRole pro:withRole pro:editor. + ?res pro:isDocumentContextFor ?knownRole; + a fabio:Expression. +} +LIMIT 1000 + +@@join ?res ?res type=left +@@values ?res PREFIX datacite: PREFIX dcterm: -PREFIX frbr: +PREFIX literal: +PREFIX prism: + +SELECT ?res ?title ?pub_date +(CONCAT(COALESCE(GROUP_CONCAT(DISTINCT ?external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) +WHERE { + OPTIONAL { ?res dcterm:title ?title } + OPTIONAL { ?res prism:publicationDate ?pub_date } + OPTIONAL { ?res datacite:hasIdentifier ?identifier } + BIND(COALESCE(?identifier, ) AS ?identifier_node) + OPTIONAL { ?identifier_node datacite:usesIdentifierScheme ?scheme } + OPTIONAL { ?identifier_node literal:hasLiteralValue ?literal_value } + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literal_value, " ") AS ?external_id) +} +GROUP BY ?res ?title ?pub_date + +@@join ?res ?res type=left +@@values ?res PREFIX fabio: + +SELECT DISTINCT ?res ?type +WHERE { + ?res a ?type. + FILTER(?type != fabio:Expression) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX frbr: PREFIX prism: + +SELECT DISTINCT ?res ?page +WHERE { + ?res frbr:embodiment ?embodiment. + ?embodiment prism:startingPage ?starting_page; + prism:endingPage ?ending_page. + BIND(IF(STR(?starting_page) = STR(?ending_page), STR(?starting_page), CONCAT(?starting_page, "-", ?ending_page)) AS ?page) +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?issue +WHERE { + ?res frbr:partOf ?journal_issue. + ?journal_issue a fabio:JournalIssue; + fabio:hasSequenceIdentifier ?issue. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX fabio: +PREFIX frbr: + +SELECT DISTINCT ?res ?volume +WHERE { + ?res frbr:partOf+ ?journal_volume. + ?journal_volume a fabio:JournalVolume; + fabio:hasSequenceIdentifier ?volume. +} + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX dcterm: +PREFIX fabio: +PREFIX frbr: +PREFIX literal: + +SELECT ?res +(CONCAT(?venue_name, " [", COALESCE(GROUP_CONCAT(DISTINCT ?venue_external_id; SEPARATOR=""), ""), "omid:br/", STRAFTER(STR(?venue_resource), "/br/"), "]") AS ?venue) +WHERE { + ?res frbr:partOf ?direct_container; + frbr:partOf+ ?venue_resource. + ?venue_resource dcterm:title ?venue_name. + FILTER(?venue_resource = ?direct_container || (EXISTS { ?res a fabio:JournalArticle } && EXISTS { ?venue_resource a fabio:Journal })) + OPTIONAL { ?venue_resource datacite:hasIdentifier ?venue_identifier } + BIND(COALESCE(?venue_identifier, ) AS ?venue_identifier_node) + OPTIONAL { ?venue_identifier_node datacite:usesIdentifierScheme ?venue_scheme } + OPTIONAL { ?venue_identifier_node literal:hasLiteralValue ?venue_literal_value } + BIND(CONCAT(STRAFTER(STR(?venue_scheme), "http://purl.org/spar/datacite/"), ":", ?venue_literal_value, " ") AS ?venue_external_id) +} +GROUP BY ?res ?venue_resource ?venue_name + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: PREFIX oco: +PREFIX pro: -SELECT DISTINCT -?id -(STR(?title) AS ?title) -(GROUP_CONCAT(DISTINCT ?author_info; SEPARATOR="|") AS ?author) -(STR(?pub_date) AS ?pub_date) -(STR(?issue) AS ?issue) -(STR(?volume) AS ?volume) -?venue -?type -?page -(GROUP_CONCAT(DISTINCT ?publisher_info; SEPARATOR="|") AS ?publisher) -(GROUP_CONCAT(DISTINCT ?combined_editor_info; SEPARATOR="|") AS ?editor) +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?author) WHERE { - { - SELECT ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?pub_date ?page ?issue ?volume ?venueName ?venueMetaid - (GROUP_CONCAT(DISTINCT ?id ; SEPARATOR=" ") AS ?ids) - (GROUP_CONCAT(DISTINCT ?venue_ids_; SEPARATOR=' ') AS ?venue_ids) - WHERE { - { - SELECT DISTINCT ?res - WHERE { - [[id]] - ?knownRole pro:withRole pro:editor. - ?res pro:isDocumentContextFor ?knownRole; - a fabio:Expression. - } LIMIT 1000 - } - OPTIONAL { - ?res datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - OPTIONAL { - ?arAuthor oco:hasNext ?nextAuthorRole . - } - BIND(STRAFTER(STR(?arAuthor), "https://w3id.org/oc/meta/ar/") AS ?roleUri) - BIND(STRAFTER(STR(?nextAuthorRole), "https://w3id.org/oc/meta/ar/") AS ?nextRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raAuthor), "/ra/")) AS ?author_metaid) - OPTIONAL {?raAuthor foaf:familyName ?familyName.} - OPTIONAL {?raAuthor foaf:givenName ?givenName.} - OPTIONAL {?raAuthor foaf:name ?name.} - OPTIONAL { - ?raAuthor datacite:hasIdentifier ?authorIdentifier. - ?authorIdentifier datacite:usesIdentifierScheme ?authorIdSchema; - literal:hasLiteralValue ?authorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?authorIdSchema), "http://purl.org/spar/datacite/"), ":", ?authorIdLiteralValue) AS ?author_id) - } - BIND( - IF( - STRLEN(STR(?familyName)) > 0 && STRLEN(STR(?givenName)) > 0, - CONCAT(?familyName, ", ", ?givenName), - IF( - STRLEN(STR(?familyName)) > 0, - CONCAT(?familyName, ","), - ?name - ) - ) - AS ?authorName) - BIND( - IF( - STRLEN(STR(?author_id)) > 0, - CONCAT(?authorName, " [", ?author_id, " ", ?author_metaid, "]"), - CONCAT(?authorName, " [", ?author_metaid, "]") - ) - AS ?author_) - BIND(CONCAT(?author_, ":", ?roleUri, ":", COALESCE(?nextRoleUri, "")) AS ?author_info) - } - OPTIONAL { - ?res pro:isDocumentContextFor ?arEditor. - ?arEditor pro:withRole pro:editor; - pro:isHeldBy ?raEditor. - OPTIONAL { - ?arEditor oco:hasNext ?nextEditorRole . - } - BIND(STRAFTER(STR(?arEditor), "https://w3id.org/oc/meta/ar/") AS ?editorRoleUri) - BIND(STRAFTER(STR(?nextEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raEditor), "/ra/")) AS ?editor_metaid) - OPTIONAL {?raEditor foaf:familyName ?editorFamilyName.} - OPTIONAL {?raEditor foaf:givenName ?editorGivenName.} - OPTIONAL {?raEditor foaf:name ?editor_name.} - OPTIONAL { - ?raEditor datacite:hasIdentifier ?editorIdentifier. - ?editorIdentifier datacite:usesIdentifierScheme ?editorIdSchema; - literal:hasLiteralValue ?editorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?editorIdSchema), "http://purl.org/spar/datacite/"), ":", ?editorIdLiteralValue) AS ?editor_id) - } - BIND( - IF( - STRLEN(STR(?editorFamilyName)) > 0 && STRLEN(STR(?editorGivenName)) > 0, - CONCAT(?editorFamilyName, ", ", ?editorGivenName), - IF( - STRLEN(STR(?editorFamilyName)) > 0, - CONCAT(?editorFamilyName, ","), - ?editor_name - ) - ) - AS ?editorName) - BIND( - IF( - STRLEN(STR(?editor_id)) > 0, - CONCAT(?editorName, " [", ?editor_id, " ", ?editor_metaid, "]"), - CONCAT(?editorName, " [", ?editor_metaid, "]") - ) - AS ?editor_) - BIND(CONCAT(?editor_, ":", ?editorRoleUri, ":", COALESCE(?nextEditorRoleUri, "")) AS ?editor_info) - } - OPTIONAL { - ?res frbr:partOf ?container. - ?container pro:isDocumentContextFor ?arContainerEditor. - ?arContainerEditor pro:withRole pro:editor; - pro:isHeldBy ?raContainerEditor. - OPTIONAL { - ?arContainerEditor oco:hasNext ?nextContainerEditorRole . - } - BIND(STRAFTER(STR(?arContainerEditor), "https://w3id.org/oc/meta/ar/") AS ?containerEditorRoleUri) - BIND(STRAFTER(STR(?nextContainerEditorRole), "https://w3id.org/oc/meta/ar/") AS ?nextContainerEditorRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raContainerEditor), "/ra/")) AS ?container_editor_metaid) - OPTIONAL {?raContainerEditor foaf:familyName ?containerEditorFamilyName.} - OPTIONAL {?raContainerEditor foaf:givenName ?containerEditorGivenName.} - OPTIONAL {?raContainerEditor foaf:name ?container_editor_name.} - OPTIONAL { - ?raContainerEditor datacite:hasIdentifier ?containerEditorIdentifier. - ?containerEditorIdentifier datacite:usesIdentifierScheme ?containerEditorIdSchema; - literal:hasLiteralValue ?containerEditorIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?containerEditorIdSchema), "http://purl.org/spar/datacite/"), ":", ?containerEditorIdLiteralValue) AS ?container_editor_id) - } - BIND( - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0 && STRLEN(STR(?containerEditorGivenName)) > 0, - CONCAT(?containerEditorFamilyName, ", ", ?containerEditorGivenName), - IF( - STRLEN(STR(?containerEditorFamilyName)) > 0, - CONCAT(?containerEditorFamilyName, ","), - ?container_editor_name - ) - ) - AS ?containerEditorName) - BIND( - IF( - STRLEN(STR(?container_editor_id)) > 0, - CONCAT(?containerEditorName, " [", ?container_editor_id, " ", ?container_editor_metaid, "]"), - CONCAT(?containerEditorName, " [", ?container_editor_metaid, "]") - ) - AS ?container_editor_) - BIND(CONCAT(?container_editor_, ":", ?containerEditorRoleUri, ":", COALESCE(?nextContainerEditorRoleUri, "")) AS ?container_editor_info) - } - BIND( - IF(BOUND(?editor_info), - IF(BOUND(?container_editor_info), - CONCAT(?editor_info, "|", ?container_editor_info), - ?editor_info), - IF(BOUND(?container_editor_info), - ?container_editor_info, - "") - ) - AS ?combined_editor_info) - OPTIONAL { - ?res pro:isDocumentContextFor ?arPublisher. - ?arPublisher pro:withRole pro:publisher; - pro:isHeldBy ?raPublisher. - OPTIONAL { - ?arPublisher oco:hasNext ?nextPublisherRole . - } - BIND(STRAFTER(STR(?arPublisher), "https://w3id.org/oc/meta/ar/") AS ?publisherRoleUri) - BIND(STRAFTER(STR(?nextPublisherRole), "https://w3id.org/oc/meta/ar/") AS ?nextPublisherRoleUri) - BIND(CONCAT("omid:ra/", STRAFTER(STR(?raPublisher), "/ra/")) AS ?publisher_metaid) - ?raPublisher foaf:name ?publisher_name. - OPTIONAL { - ?raPublisher datacite:hasIdentifier ?publisherIdentifier__. - ?publisherIdentifier__ datacite:usesIdentifierScheme ?publisherIdSchema; - literal:hasLiteralValue ?publisherIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?publisherIdSchema), "http://purl.org/spar/datacite/"), ":", ?publisherIdLiteralValue) AS ?publisher_id) - } - BIND( - IF( - STRLEN(STR(?publisher_id)) > 0, - CONCAT(?publisher_name, " [", ?publisher_id, " ", ?publisher_metaid, "]"), - CONCAT(?publisher_name, " [", ?publisher_metaid, "]") - ) - AS ?publisher_) - BIND(CONCAT(?publisher_, ":", ?publisherRoleUri, ":", COALESCE(?nextPublisherRoleUri, "")) AS ?publisher_info) - } - OPTIONAL { - { - ?res a fabio:JournalArticle; - frbr:partOf+ ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - ?journal a fabio:Journal. - } UNION { - ?res frbr:partOf ?journal. - BIND(CONCAT("omid:br/", STRAFTER(STR(?journal), "/br/")) AS ?venueMetaid) - } - ?journal dcterm:title ?venueName. - OPTIONAL { - ?journal datacite:hasIdentifier ?journalIdentifier__. - ?journalIdentifier__ datacite:usesIdentifierScheme ?journalIdScheme; - literal:hasLiteralValue ?journalIdLiteralValue. - BIND(CONCAT(STRAFTER(STR(?journalIdScheme), "http://purl.org/spar/datacite/"), ":", ?journalIdLiteralValue) AS ?venue_ids_) - } - } - OPTIONAL {?res a ?type. FILTER (?type != fabio:Expression)} - OPTIONAL {?res dcterm:title ?title.} - OPTIONAL {?res prism:publicationDate ?pub_date.} - OPTIONAL { - ?res frbr:embodiment ?re. - ?re prism:startingPage ?startingPage; - prism:endingPage ?endingPage. - BIND(IF(STR(?startingPage) = STR(?endingPage), STR(?startingPage), CONCAT(?startingPage, '-', ?endingPage)) AS ?page) - } - OPTIONAL { - ?res frbr:partOf ?resIssue. - ?resIssue a fabio:JournalIssue; - fabio:hasSequenceIdentifier ?issue. - } - OPTIONAL { - ?res frbr:partOf+ ?resVolume. - ?resVolume a fabio:JournalVolume; - fabio:hasSequenceIdentifier ?volume. - } - } GROUP BY ?res ?title ?author_info ?combined_editor_info ?publisher_info ?type ?issue ?volume ?pub_date ?page ?venueName ?venueMetaid - } - BIND(CONCAT(?ids, IF(STR(?ids) != "", " ", ""), "omid:br/", STRAFTER(STR(?res), "/br/")) AS ?id) + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:author; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX frbr: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?editor) +WHERE { + OPTIONAL { ?res frbr:partOf ?container } + VALUES ?of_container { false true } + BIND(IF(?of_container, COALESCE(?container, ), ?res) AS ?context) + ?context pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:editor; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) + BIND( + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") + ) + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res + +@@join ?res ?res type=left +@@values ?res +PREFIX datacite: +PREFIX foaf: +PREFIX literal: +PREFIX oco: +PREFIX pro: + +SELECT ?res (GROUP_CONCAT(DISTINCT ?agent_info; SEPARATOR="|") AS ?publisher) +WHERE { + ?res pro:isDocumentContextFor ?agent_role. + ?agent_role pro:withRole pro:publisher; + pro:isHeldBy ?agent. + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + OPTIONAL { ?agent foaf:familyName ?family_name } + OPTIONAL { ?agent foaf:givenName ?given_name } + OPTIONAL { ?agent foaf:name ?name } + OPTIONAL { ?agent datacite:hasIdentifier ?agent_identifier } + BIND(COALESCE(?agent_identifier, ) AS ?agent_identifier_node) + OPTIONAL { ?agent_identifier_node datacite:usesIdentifierScheme ?agent_scheme } + OPTIONAL { ?agent_identifier_node literal:hasLiteralValue ?agent_literal_value } + BIND(CONCAT(STRAFTER(STR(?agent_scheme), "http://purl.org/spar/datacite/"), ":", ?agent_literal_value) AS ?agent_id) + BIND(CONCAT("omid:ra/", STRAFTER(STR(?agent), "/ra/")) AS ?agent_omid) + BIND( + IF( + BOUND(?family_name) && BOUND(?given_name), + CONCAT(?family_name, ", ", ?given_name), + IF( + BOUND(?family_name), + CONCAT(?family_name, ","), + ?name + ) + ) + AS ?agent_name) BIND( - IF(BOUND(?venueMetaid), - IF(STR(?venue_ids) != "", - CONCAT(" [", ?venue_ids, " ", ?venueMetaid, "]"), - CONCAT(" [", ?venueMetaid, "]") - ), - "" + IF( + BOUND(?agent_id), + CONCAT(?agent_name, " [", ?agent_id, " ", ?agent_omid, "]"), + CONCAT(?agent_name, " [", ?agent_omid, "]") ) - AS ?venueIdentifiers) - BIND(CONCAT(?venueName, ?venueIdentifiers) AS ?venue) -} GROUP BY ?id ?title ?type ?issue ?volume ?venue ?pub_date ?page + AS ?agent_label) + BIND(CONCAT(?agent_label, ":", STRAFTER(STR(?agent_role), "/ar/"), ":", COALESCE(STRAFTER(STR(?next_agent_role), "/ar/"), "")) AS ?agent_info) +} +GROUP BY ?res diff --git a/src/api/metaapi.py b/src/api/metaapi.py index 3f1d1d9..20ccca5 100644 --- a/src/api/metaapi.py +++ b/src/api/metaapi.py @@ -85,18 +85,10 @@ def generate_id_search(ids: str) -> Tuple[str]: other_values.append( ''' {{ - { - ?identifier literal:hasLiteralValue "''' + ?identifier literal:hasLiteralValue "''' + literal_value - + '''" - } - UNION - { - ?identifier literal:hasLiteralValue "''' - + literal_value - + """"^^ - } - ?identifier datacite:usesIdentifierScheme datacite:""" + + """"; + datacite:usesIdentifierScheme datacite:""" + scheme + """; ^datacite:hasIdentifier ?res. @@ -132,21 +124,13 @@ def generate_ra_search(identifier: str) -> Tuple[str]: else: return ( ''' - { - ?knownPersonIdentifier literal:hasLiteralValue "''' - + literal_value - + '''" - } - UNION - { - ?knownPersonIdentifier literal:hasLiteralValue "''' + ?knownPersonIdentifier literal:hasLiteralValue "''' + literal_value - + """"^^ - } - ?knownPersonIdentifier datacite:usesIdentifierScheme datacite:""" + + """"; + datacite:usesIdentifierScheme datacite:""" + scheme + """; - ^datacite:hasIdentifier ?knownPerson. + ^datacite:hasIdentifier ?knownPerson. ?knownPerson ^pro:isHeldBy ?knownRole. """, ) @@ -158,7 +142,13 @@ def create_metadata_output(results): for result in results[1:]: output_result = list() for i, data in enumerate(result): - if i == header.index("type"): + if i == header.index("id"): + sorted_ids = __sort_ids(data[1]) + output_result.append((sorted_ids, sorted_ids)) + elif i == header.index("venue"): + sorted_venue = __sort_venue_ids(data[1]) + output_result.append((sorted_venue, sorted_venue)) + elif i == header.index("type"): beautiful_type = __postprocess_type(data[1]) output_result.append((data[0], beautiful_type)) elif ( @@ -174,6 +164,18 @@ def create_metadata_output(results): return output_results, True +def __sort_ids(ids: str) -> str: + *external_ids, omid = ids.split(" ") + return " ".join(sorted(external_ids) + [omid]) + + +def __sort_venue_ids(venue: str) -> str: + if not venue: + return venue + name, ids = venue.rsplit(" [", 1) + return f"{name} [{__sort_ids(ids.removesuffix(']'))}]" + + def __postprocess_type(type_uri: str) -> str: if type_uri: type_string = URI_TYPE_DICT[type_uri] diff --git a/src/api/skgif_filters.ocdm.yaml b/src/api/skgif_filters.ocdm.yaml index 6f2f32b..0a70494 100644 --- a/src/api/skgif_filters.ocdm.yaml +++ b/src/api/skgif_filters.ocdm.yaml @@ -3,13 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 identifiers.id: - filter: |- - ?local_identifier datacite:hasIdentifier ?_filter_identifier . - { - ?_filter_identifier literal:hasLiteralValue "{{value}}" . - } UNION { - ?_filter_identifier literal:hasLiteralValue "{{value}}"^^ . - } + filter: '?local_identifier datacite:hasIdentifier [ literal:hasLiteralValue "{{value}}"^^ ] .' identifiers.scheme: filter: "?local_identifier datacite:hasIdentifier [ datacite:usesIdentifierScheme datacite:{{value}} ] ." contributions.by.local_identifier: @@ -17,7 +11,7 @@ contributions.by.local_identifier: cf.search.title: filter: |- ?local_identifier dcterm:title ?title . - ?title bif:contains "'{{value}}'" . + { SELECT DISTINCT ?title WHERE { ?title ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } contributions.by.family_name: filter: |- ?local_identifier pro:isDocumentContextFor [ pro:isHeldBy ?_filter_agent ] . @@ -33,12 +27,7 @@ contributions.by.name: contributions.by.identifiers.id: filter: |- ?local_identifier pro:isDocumentContextFor [ pro:isHeldBy ?_filter_agent ] . - ?_filter_agent datacite:hasIdentifier ?_filter_agent_identifier . - { - ?_filter_agent_identifier literal:hasLiteralValue "{{value}}" . - } UNION { - ?_filter_agent_identifier literal:hasLiteralValue "{{value}}"^^ . - } + ?_filter_agent datacite:hasIdentifier [ literal:hasLiteralValue "{{value}}"^^ ] . contributions.by.identifiers.scheme: filter: |- ?local_identifier pro:isDocumentContextFor [ pro:isHeldBy ?_filter_agent ] . @@ -46,13 +35,7 @@ contributions.by.identifiers.scheme: cf.contributions_orcid: filter: |- ?local_identifier pro:isDocumentContextFor [ pro:isHeldBy ?_filter_agent ] . - ?_filter_agent datacite:hasIdentifier ?_filter_agent_identifier . - ?_filter_agent_identifier datacite:usesIdentifierScheme datacite:orcid . - { - ?_filter_agent_identifier literal:hasLiteralValue "{{value}}" . - } UNION { - ?_filter_agent_identifier literal:hasLiteralValue "{{value}}"^^ . - } + ?_filter_agent datacite:hasIdentifier [ literal:hasLiteralValue "{{value}}"^^ ; datacite:usesIdentifierScheme datacite:orcid ] . product_type: filter: literature: |- @@ -88,14 +71,9 @@ cf.cites_doi: filter_preamble: |- PREFIX datacite: PREFIX literal: - SELECT DISTINCT ?_target WHERE { + SELECT ?_target WHERE { ?_target datacite:hasIdentifier ?_id_node . - ?_id_node datacite:usesIdentifierScheme datacite:doi . - { - ?_id_node literal:hasLiteralValue "{{value}}" . - } UNION { - ?_id_node literal:hasLiteralValue "{{value}}"^^ . - } + ?_id_node datacite:usesIdentifierScheme datacite:doi ; literal:hasLiteralValue "{{value}}"^^ . } @@values ?_target @@join ?_target ?_target type=inner @@ -111,14 +89,9 @@ cf.cited_by_doi: filter_preamble: |- PREFIX datacite: PREFIX literal: - SELECT DISTINCT ?_target WHERE { + SELECT ?_target WHERE { ?_target datacite:hasIdentifier ?_id_node . - ?_id_node datacite:usesIdentifierScheme datacite:doi . - { - ?_id_node literal:hasLiteralValue "{{value}}" . - } UNION { - ?_id_node literal:hasLiteralValue "{{value}}"^^ . - } + ?_id_node datacite:usesIdentifierScheme datacite:doi ; literal:hasLiteralValue "{{value}}"^^ . } @@values ?_target @@join ?_target ?_target type=inner diff --git a/src/api/skgif_filters.organisations.yaml b/src/api/skgif_filters.organisations.yaml index 01af5e9..7ba16ee 100644 --- a/src/api/skgif_filters.organisations.yaml +++ b/src/api/skgif_filters.organisations.yaml @@ -10,5 +10,4 @@ name: filter: "?local_identifier foaf:name '{{value}}'. " cf.search.name: filter: |- - ?local_identifier foaf:name ?name . - ?name bif:contains "'{{value}}'" . + { SELECT DISTINCT ?name WHERE { ?name ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } diff --git a/src/api/skgif_filters.persons.yaml b/src/api/skgif_filters.persons.yaml index 199a8a5..99a252d 100644 --- a/src/api/skgif_filters.persons.yaml +++ b/src/api/skgif_filters.persons.yaml @@ -15,12 +15,12 @@ name: cf.search.family_name: filter: |- ?local_identifier foaf:familyName ?familyName . - ?familyName bif:contains "'{{value}}'" . + { SELECT DISTINCT ?familyName WHERE { ?familyName ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } cf.search.given_name: filter: |- ?local_identifier foaf:givenName ?givenName . - ?givenName bif:contains "'{{value}}'" . + { SELECT DISTINCT ?givenName WHERE { ?givenName ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } cf.search.name: filter: |- ?local_identifier foaf:name ?name . - ?name bif:contains "'{{value}}'" . + { SELECT DISTINCT ?name WHERE { ?name ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } diff --git a/src/api/skgif_filters.venues.yaml b/src/api/skgif_filters.venues.yaml index 470e05d..0898452 100644 --- a/src/api/skgif_filters.venues.yaml +++ b/src/api/skgif_filters.venues.yaml @@ -5,14 +5,16 @@ type: filter: journal: |- - FILTER(?type = "journal") + ?local_identifier a fabio:Journal . conference: |- - FILTER(?type = "conference") + ?local_identifier a fabio:AcademicProceedings . book: |- - FILTER(?type = "book") + VALUES ?_book_type { fabio:Book fabio:ReferenceBook } + ?local_identifier a ?_book_type . repository: "FILTER(false)" other: |- - FILTER(?type = "other") + ?local_identifier a ?_other_type . + FILTER(?_other_type NOT IN (fabio:Expression, fabio:Journal, fabio:AcademicProceedings, fabio:Book, fabio:ReferenceBook)) unknown: "FILTER(false)" identifiers.value: filter: '?local_identifier datacite:hasIdentifier [ literal:hasLiteralValue "{{value}}"^^ ] .' @@ -23,4 +25,4 @@ name: cf.search.name: filter: |- ?local_identifier dcterms:title ?name . - ?name bif:contains "'{{value}}'" . + { SELECT DISTINCT ?name WHERE { ?name ?_word . FILTER STRSTARTS(?_word, "{{value}}") } } diff --git a/src/api/skgif_v1.hf b/src/api/skgif_v1.hf index c4e94a0..c2463b7 100644 --- a/src/api/skgif_v1.hf +++ b/src/api/skgif_v1.hf @@ -7,9 +7,9 @@ #version 1.0.0 #contacts [contact@opencitations.net](mailto:contact@opencitations.net) #license [ISC](https://opensource.org/licenses/ISC) -#endpoint http://virtuoso-service.default.svc.cluster.local:8890/sparql +#endpoint http://meta-qlever-service.default.svc.cluster.local:7011 #method post -#sources meta=http://virtuoso-service.default.svc.cluster.local:8890/sparql;index=http://qlever-service.default.svc.cluster.local:7011 +#sources meta=http://meta-qlever-service.default.svc.cluster.local:7011;index=http://qlever-service.default.svc.cluster.local:7011 #addon ramose.skg_if #disable_params require,filter,sort,format,json @@ -165,13 +165,13 @@ "entity_type": "venue", "local_identifier": "venues/br/062501778099", "identifiers": [ - { - "value": "S4210195326", - "scheme": "openalex" - }, { "value": "2641-3337", "scheme": "issn" + }, + { + "value": "S4210195326", + "scheme": "openalex" } ] } @@ -240,107 +240,172 @@ #sparql PREFIX fabio: PREFIX dcterm: PREFIX prism: -PREFIX frbr: -PREFIX datacite: -PREFIX literal: -SELECT ?local_identifier ?identifier_scheme ?identifier_value - ?title ?product_type - ?manifestation_type_class ?manifestation_type_label ?manifestation_type_label_lang - ?manifestation_type_defined_in - ?manifestation_dates_type ?manifestation_dates_value - ?manifestation_biblio_volume ?manifestation_biblio_issue - ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last - ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier - ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value +SELECT ?local_identifier ?title ?product_type + ?manifestation_dates_type ?manifestation_dates_value ?manifestation_type_class + ?manifestation_type_label ?manifestation_type_label_lang ?manifestation_type_defined_in + ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last ?manifestation_biblio_issue + ?manifestation_biblio_volume ?identifier_scheme ?identifier_value + ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme + ?manifestation_biblio_in_identifier_value ?contribution_by_family_name ?contribution_by_given_name + ?contribution_by_name ?contribution_by_local_identifier ?contribution_role + ?_contribution_key ?_contribution_next_key ?contribution_by_identifier_scheme + ?contribution_by_identifier_value WHERE { - BIND(<[[local_identifier]]> AS ?local_identifier) + VALUES ?local_identifier { <[[local_identifier]]> } ?local_identifier a fabio:Expression . OPTIONAL { ?local_identifier dcterm:title ?title } - OPTIONAL { ?local_identifier a ?manifestation_type_class . FILTER(?manifestation_type_class != fabio:Expression) } - BIND(IF(!BOUND(?manifestation_type_class), "literature", IF(?manifestation_type_class IN (, ), "research data", IF(?manifestation_type_class = , "research software", "literature"))) AS ?product_type) - BIND(IF(BOUND(?manifestation_type_class), LCASE(REPLACE(REPLACE(STR(?manifestation_type_class), "^.*[/#]", ""), "([a-z])([A-Z])", "$1 $2")), "") AS ?manifestation_type_label) - BIND(IF(BOUND(?manifestation_type_class), "en", "") AS ?manifestation_type_label_lang) - BIND(IF(BOUND(?manifestation_type_class), REPLACE(STR(?manifestation_type_class), "[/#][^/#]+$", ""), "") AS ?manifestation_type_defined_in) + OPTIONAL { ?local_identifier prism:publicationDate ?manifestation_dates_value } + BIND(IF(BOUND(?manifestation_dates_value), "publication", ?_unbound) AS ?manifestation_dates_type) OPTIONAL { - ?local_identifier prism:publicationDate ?manifestation_dates_value . - BIND("publication" AS ?manifestation_dates_type) - } - OPTIONAL { - ?local_identifier frbr:embodiment ?resource_embodiment . - ?resource_embodiment prism:startingPage ?manifestation_biblio_pages_first ; - prism:endingPage ?manifestation_biblio_pages_last . - } - OPTIONAL { - ?local_identifier frbr:partOf ?journal_issue . - ?journal_issue a fabio:JournalIssue ; - fabio:hasSequenceIdentifier ?manifestation_biblio_issue . - } - OPTIONAL { - ?local_identifier frbr:partOf+ ?journal_volume . - ?journal_volume a fabio:JournalVolume ; - fabio:hasSequenceIdentifier ?manifestation_biblio_volume . - } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier_node . - ?identifier_node datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } - OPTIONAL { - { - ?local_identifier a fabio:JournalArticle ; - frbr:partOf+ ?venue_resource . - ?venue_resource a fabio:Journal . - } UNION { - ?local_identifier frbr:partOf ?venue_resource . - FILTER NOT EXISTS { ?venue_resource a fabio:JournalIssue } - FILTER NOT EXISTS { ?venue_resource a fabio:JournalVolume } - } - ?venue_resource dcterm:title ?manifestation_biblio_in_name . - BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) - OPTIONAL { - ?venue_resource datacite:hasIdentifier ?venue_identifier_node . - ?venue_identifier_node datacite:usesIdentifierScheme ?venue_identifier_scheme_uri ; - literal:hasLiteralValue ?manifestation_biblio_in_identifier_value . - BIND(STRAFTER(STR(?venue_identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?manifestation_biblio_in_identifier_scheme) - } + VALUES ?_special_type { fabio:DataFile fabio:DataManagementPlan fabio:ComputerProgram } + ?local_identifier a ?_special_type . } + BIND(IF(!BOUND(?_special_type), "literature", IF(?_special_type = fabio:ComputerProgram, "research software", "research data")) AS ?product_type) } +ORDER BY ?local_identifier @@join ?local_identifier ?local_identifier type=left -PREFIX pro: -PREFIX foaf: +PREFIX fabio: + +SELECT ?local_identifier ?manifestation_type_class ?manifestation_type_label ?manifestation_type_label_lang ?manifestation_type_defined_in +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier a ?manifestation_type_class . + FILTER(?manifestation_type_class != fabio:Expression) + BIND(LCASE(REPLACE(REPLACE(STR(?manifestation_type_class), "^.*[/#]", ""), "([a-z])([A-Z])", "$1 $2")) AS ?manifestation_type_label) + BIND("en" AS ?manifestation_type_label_lang) + BIND(REPLACE(STR(?manifestation_type_class), "[/#][^/#]+$", "") AS ?manifestation_type_defined_in) +} +ORDER BY ?local_identifier ?manifestation_type_class + +@@join ?local_identifier ?local_identifier type=left +PREFIX prism: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier frbr:embodiment ?resource_embodiment . + ?resource_embodiment prism:startingPage ?manifestation_biblio_pages_first ; + prism:endingPage ?manifestation_biblio_pages_last . +} + +@@join ?local_identifier ?local_identifier type=left +PREFIX fabio: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_issue +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier frbr:partOf ?journal_issue . + ?journal_issue a fabio:JournalIssue ; + fabio:hasSequenceIdentifier ?manifestation_biblio_issue . +} + +@@join ?local_identifier ?local_identifier type=left +PREFIX fabio: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_volume +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier frbr:partOf+ ?journal_volume . + ?journal_volume a fabio:JournalVolume ; + fabio:hasSequenceIdentifier ?manifestation_biblio_volume . +} + +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier datacite:hasIdentifier ?identifier_node . + ?identifier_node datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value + +@@join ?local_identifier ?local_identifier type=left +PREFIX fabio: +PREFIX dcterm: +PREFIX frbr: + +SELECT DISTINCT ?local_identifier ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier frbr:partOf ?direct_container ; + frbr:partOf+ ?venue_resource . + ?venue_resource dcterm:title ?manifestation_biblio_in_name . + FILTER( + (?venue_resource = ?direct_container + && NOT EXISTS { ?venue_resource a fabio:JournalIssue } + && NOT EXISTS { ?venue_resource a fabio:JournalVolume }) + || (EXISTS { ?local_identifier a fabio:JournalArticle } && EXISTS { ?venue_resource a fabio:Journal }) + ) + BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) +} +ORDER BY ?local_identifier ?manifestation_biblio_in_local_identifier + +@@join ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_local_identifier type=left +PREFIX frbr: PREFIX datacite: PREFIX literal: + +SELECT DISTINCT ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier frbr:partOf+ ?venue_resource . + ?venue_resource datacite:hasIdentifier ?venue_identifier_node . + ?venue_identifier_node datacite:usesIdentifierScheme ?venue_identifier_scheme_uri ; + literal:hasLiteralValue ?manifestation_biblio_in_identifier_value . + BIND(STRAFTER(STR(?venue_identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?manifestation_biblio_in_identifier_scheme) + BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) +} +ORDER BY ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value + +@@join ?local_identifier ?local_identifier type=left +PREFIX pro: +PREFIX foaf: PREFIX oco: SELECT ?local_identifier ?contribution_by_family_name ?contribution_by_given_name - ?contribution_by_name ?contribution_by_identifier_scheme ?contribution_by_identifier_value - ?contribution_by_local_identifier + ?contribution_by_name ?contribution_by_local_identifier ?contribution_role ?_contribution_key ?_contribution_next_key WHERE { - BIND(<[[local_identifier]]> AS ?local_identifier) + VALUES ?local_identifier { <[[local_identifier]]> } ?local_identifier pro:isDocumentContextFor ?agent_role . ?agent_role pro:withRole ?role_type ; pro:isHeldBy ?responsible_agent . - FILTER(?role_type IN (pro:author, pro:editor, pro:publisher)) - BIND(IF(?role_type = pro:author, "author", IF(?role_type = pro:editor, "editor", "publisher")) AS ?contribution_role) + BIND(IF(?role_type = pro:author, "author", IF(?role_type = pro:editor, "editor", IF(?role_type = pro:publisher, "publisher", ?_unbound))) AS ?contribution_role) + FILTER(BOUND(?contribution_role)) BIND(STR(?agent_role) AS ?_contribution_key) - OPTIONAL { - ?agent_role oco:hasNext ?next_agent_role . - BIND(STR(?next_agent_role) AS ?_contribution_next_key) - } + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + BIND(STR(?next_agent_role) AS ?_contribution_next_key) OPTIONAL { ?responsible_agent foaf:familyName ?contribution_by_family_name } OPTIONAL { ?responsible_agent foaf:givenName ?contribution_by_given_name } OPTIONAL { ?responsible_agent foaf:name ?contribution_by_name } BIND(STR(?responsible_agent) AS ?contribution_by_local_identifier) - OPTIONAL { - ?responsible_agent datacite:hasIdentifier ?orcid_node . - ?orcid_node datacite:usesIdentifierScheme datacite:orcid ; - literal:hasLiteralValue ?contribution_by_identifier_value . - BIND("orcid" AS ?contribution_by_identifier_scheme) - } +} + +@@join ?contribution_by_local_identifier ?contribution_by_local_identifier type=left +PREFIX datacite: +PREFIX literal: +PREFIX pro: + +SELECT DISTINCT ?contribution_by_local_identifier ?contribution_by_identifier_scheme ?contribution_by_identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier pro:isDocumentContextFor ?agent_role . + ?agent_role pro:isHeldBy ?responsible_agent . + ?responsible_agent datacite:hasIdentifier ?orcid_node . + ?orcid_node datacite:usesIdentifierScheme datacite:orcid ; + literal:hasLiteralValue ?contribution_by_identifier_value . + BIND("orcid" AS ?contribution_by_identifier_scheme) + BIND(STR(?responsible_agent) AS ?contribution_by_local_identifier) } @@join ?local_identifier ?local_identifier type=left @@ -420,13 +485,13 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te ] }, "identifiers": [ - { - "value": "W4285173206", - "scheme": "openalex" - }, { "value": "10.1007/978-3-031-06981-9_18", "scheme": "doi" + }, + { + "value": "W4285173206", + "scheme": "openalex" } ], "contributions": [ @@ -684,13 +749,13 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te ] }, "identifiers": [ - { - "value": "W3106215946", - "scheme": "openalex" - }, { "value": "10.1162/qss_a_00023", "scheme": "doi" + }, + { + "value": "W3106215946", + "scheme": "openalex" } ], "contributions": [ @@ -764,13 +829,13 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/062501778099", "identifiers": [ - { - "value": "S4210195326", - "scheme": "openalex" - }, { "value": "2641-3337", "scheme": "issn" + }, + { + "value": "S4210195326", + "scheme": "openalex" } ] } @@ -788,13 +853,13 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te ] }, "identifiers": [ - { - "value": "W2938946739", - "scheme": "openalex" - }, { "value": "10.1007/s11192-019-03217-6", "scheme": "doi" + }, + { + "value": "W2938946739", + "scheme": "openalex" } ], "contributions": [ @@ -886,16 +951,16 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ { - "value": "S148561398", - "scheme": "openalex" + "value": "0138-9130", + "scheme": "issn" }, { "value": "1588-2861", "scheme": "issn" }, { - "value": "0138-9130", - "scheme": "issn" + "value": "S148561398", + "scheme": "openalex" } ] } @@ -1181,11 +1246,11 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ { - "value": "1588-2861", + "value": "0138-9130", "scheme": "issn" }, { - "value": "0138-9130", + "value": "1588-2861", "scheme": "issn" }, { @@ -1286,16 +1351,16 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te "local_identifier": "https://w3id.org/oc/meta/br/06160781188", "identifiers": [ { - "value": "S110615584", - "scheme": "openalex" + "value": "1432-1300", + "scheme": "issn" }, { "value": "1432-5012", "scheme": "issn" }, { - "value": "1432-1300", - "scheme": "issn" + "value": "S110615584", + "scheme": "openalex" } ] } @@ -1331,109 +1396,180 @@ ORDER BY ?local_identifier PREFIX fabio: PREFIX dcterm: PREFIX prism: -PREFIX frbr: -PREFIX datacite: -PREFIX literal: -PREFIX pro: -PREFIX foaf: -SELECT ?local_identifier ?identifier_scheme ?identifier_value - ?title ?product_type - ?manifestation_type_class ?manifestation_type_label ?manifestation_type_label_lang - ?manifestation_type_defined_in - ?manifestation_dates_type ?manifestation_dates_value - ?manifestation_biblio_volume ?manifestation_biblio_issue - ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last - ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier - ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value +SELECT ?local_identifier ?title ?product_type + ?manifestation_dates_type ?manifestation_dates_value ?manifestation_type_class + ?manifestation_type_label ?manifestation_type_label_lang ?manifestation_type_defined_in + ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last ?manifestation_biblio_issue + ?manifestation_biblio_volume ?identifier_scheme ?identifier_value + ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme + ?manifestation_biblio_in_identifier_value ?contribution_by_family_name ?contribution_by_given_name + ?contribution_by_name ?contribution_by_local_identifier ?contribution_role + ?_contribution_key ?_contribution_next_key ?contribution_by_identifier_scheme + ?contribution_by_identifier_value WHERE { ?local_identifier a fabio:Expression . - OPTIONAL { ?local_identifier dcterm:title ?title . } - OPTIONAL { ?local_identifier a ?manifestation_type_class . FILTER(?manifestation_type_class != fabio:Expression) } - BIND(IF(!BOUND(?manifestation_type_class), "literature", IF(?manifestation_type_class IN (, ), "research data", IF(?manifestation_type_class = , "research software", "literature"))) AS ?product_type) - BIND(IF(BOUND(?manifestation_type_class), LCASE(REPLACE(REPLACE(STR(?manifestation_type_class), "^.*[/#]", ""), "([a-z])([A-Z])", "$1 $2")), "") AS ?manifestation_type_label) - BIND(IF(BOUND(?manifestation_type_class), "en", "") AS ?manifestation_type_label_lang) - BIND(IF(BOUND(?manifestation_type_class), REPLACE(STR(?manifestation_type_class), "[/#][^/#]+$", ""), "") AS ?manifestation_type_defined_in) - OPTIONAL { - ?local_identifier prism:publicationDate ?manifestation_dates_value . - BIND("publication" AS ?manifestation_dates_type) - } - OPTIONAL { - ?local_identifier frbr:embodiment ?resource_embodiment . - ?resource_embodiment prism:startingPage ?manifestation_biblio_pages_first ; - prism:endingPage ?manifestation_biblio_pages_last . - } - OPTIONAL { - ?local_identifier frbr:partOf ?journal_issue . - ?journal_issue a fabio:JournalIssue ; - fabio:hasSequenceIdentifier ?manifestation_biblio_issue . - } - OPTIONAL { - ?local_identifier frbr:partOf+ ?journal_volume . - ?journal_volume a fabio:JournalVolume ; - fabio:hasSequenceIdentifier ?manifestation_biblio_volume . - } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier_node . - ?identifier_node datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } + OPTIONAL { ?local_identifier dcterm:title ?title } + OPTIONAL { ?local_identifier prism:publicationDate ?manifestation_dates_value } + BIND(IF(BOUND(?manifestation_dates_value), "publication", ?_unbound) AS ?manifestation_dates_type) OPTIONAL { - { - ?local_identifier a fabio:JournalArticle ; - frbr:partOf+ ?venue_resource . - ?venue_resource a fabio:Journal . - } UNION { - ?local_identifier frbr:partOf ?venue_resource . - FILTER NOT EXISTS { ?venue_resource a fabio:JournalIssue } - FILTER NOT EXISTS { ?venue_resource a fabio:JournalVolume } - } - ?venue_resource dcterm:title ?manifestation_biblio_in_name . - BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) - OPTIONAL { - ?venue_resource datacite:hasIdentifier ?venue_identifier_node . - ?venue_identifier_node datacite:usesIdentifierScheme ?venue_identifier_scheme_uri ; - literal:hasLiteralValue ?manifestation_biblio_in_identifier_value . - BIND(STRAFTER(STR(?venue_identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?manifestation_biblio_in_identifier_scheme) - } + VALUES ?_special_type { fabio:DataFile fabio:DataManagementPlan fabio:ComputerProgram } + ?local_identifier a ?_special_type . } + BIND(IF(!BOUND(?_special_type), "literature", IF(?_special_type = fabio:ComputerProgram, "research software", "research data")) AS ?product_type) } ORDER BY ?local_identifier @@values ?local_identifier @@join ?local_identifier ?local_identifier type=left -PREFIX pro: -PREFIX foaf: +@@with source=meta +PREFIX fabio: + +SELECT ?local_identifier ?manifestation_type_class ?manifestation_type_label ?manifestation_type_label_lang ?manifestation_type_defined_in +WHERE { + ?local_identifier a ?manifestation_type_class . + FILTER(?manifestation_type_class != fabio:Expression) + BIND(LCASE(REPLACE(REPLACE(STR(?manifestation_type_class), "^.*[/#]", ""), "([a-z])([A-Z])", "$1 $2")) AS ?manifestation_type_label) + BIND("en" AS ?manifestation_type_label_lang) + BIND(REPLACE(STR(?manifestation_type_class), "[/#][^/#]+$", "") AS ?manifestation_type_defined_in) +} +ORDER BY ?local_identifier ?manifestation_type_class + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX prism: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_pages_first ?manifestation_biblio_pages_last +WHERE { + ?local_identifier frbr:embodiment ?resource_embodiment . + ?resource_embodiment prism:startingPage ?manifestation_biblio_pages_first ; + prism:endingPage ?manifestation_biblio_pages_last . +} + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX fabio: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_issue +WHERE { + ?local_identifier frbr:partOf ?journal_issue . + ?journal_issue a fabio:JournalIssue ; + fabio:hasSequenceIdentifier ?manifestation_biblio_issue . +} + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX fabio: +PREFIX frbr: + +SELECT ?local_identifier ?manifestation_biblio_volume +WHERE { + ?local_identifier frbr:partOf+ ?journal_volume . + ?journal_volume a fabio:JournalVolume ; + fabio:hasSequenceIdentifier ?manifestation_biblio_volume . +} + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + ?local_identifier datacite:hasIdentifier ?identifier_node . + ?identifier_node datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX fabio: +PREFIX dcterm: +PREFIX frbr: + +SELECT DISTINCT ?local_identifier ?manifestation_biblio_in_name ?manifestation_biblio_in_local_identifier +WHERE { + ?local_identifier frbr:partOf ?direct_container ; + frbr:partOf+ ?venue_resource . + ?venue_resource dcterm:title ?manifestation_biblio_in_name . + FILTER( + (?venue_resource = ?direct_container + && NOT EXISTS { ?venue_resource a fabio:JournalIssue } + && NOT EXISTS { ?venue_resource a fabio:JournalVolume }) + || (EXISTS { ?local_identifier a fabio:JournalArticle } && EXISTS { ?venue_resource a fabio:Journal }) + ) + BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) +} +ORDER BY ?local_identifier ?manifestation_biblio_in_local_identifier + +@@values ?local_identifier +@@join ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_local_identifier type=left +@@with source=meta +PREFIX frbr: PREFIX datacite: PREFIX literal: + +SELECT DISTINCT ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value +WHERE { + ?local_identifier frbr:partOf+ ?venue_resource . + ?venue_resource datacite:hasIdentifier ?venue_identifier_node . + ?venue_identifier_node datacite:usesIdentifierScheme ?venue_identifier_scheme_uri ; + literal:hasLiteralValue ?manifestation_biblio_in_identifier_value . + BIND(STRAFTER(STR(?venue_identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?manifestation_biblio_in_identifier_scheme) + BIND(STR(?venue_resource) AS ?manifestation_biblio_in_local_identifier) +} +ORDER BY ?manifestation_biblio_in_local_identifier ?manifestation_biblio_in_identifier_scheme ?manifestation_biblio_in_identifier_value + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +@@with source=meta +PREFIX pro: +PREFIX foaf: PREFIX oco: SELECT ?local_identifier ?contribution_by_family_name ?contribution_by_given_name - ?contribution_by_name ?contribution_by_identifier_scheme ?contribution_by_identifier_value - ?contribution_by_local_identifier + ?contribution_by_name ?contribution_by_local_identifier ?contribution_role ?_contribution_key ?_contribution_next_key WHERE { ?local_identifier pro:isDocumentContextFor ?agent_role . ?agent_role pro:withRole ?role_type ; pro:isHeldBy ?responsible_agent . - FILTER(?role_type IN (pro:author, pro:editor, pro:publisher)) - BIND(IF(?role_type = pro:author, "author", IF(?role_type = pro:editor, "editor", "publisher")) AS ?contribution_role) + BIND(IF(?role_type = pro:author, "author", IF(?role_type = pro:editor, "editor", IF(?role_type = pro:publisher, "publisher", ?_unbound))) AS ?contribution_role) + FILTER(BOUND(?contribution_role)) BIND(STR(?agent_role) AS ?_contribution_key) - OPTIONAL { - ?agent_role oco:hasNext ?next_agent_role . - BIND(STR(?next_agent_role) AS ?_contribution_next_key) - } + OPTIONAL { ?agent_role oco:hasNext ?next_agent_role } + BIND(STR(?next_agent_role) AS ?_contribution_next_key) OPTIONAL { ?responsible_agent foaf:familyName ?contribution_by_family_name } OPTIONAL { ?responsible_agent foaf:givenName ?contribution_by_given_name } OPTIONAL { ?responsible_agent foaf:name ?contribution_by_name } BIND(STR(?responsible_agent) AS ?contribution_by_local_identifier) - OPTIONAL { - ?responsible_agent datacite:hasIdentifier ?orcid_node . - ?orcid_node datacite:usesIdentifierScheme datacite:orcid ; - literal:hasLiteralValue ?contribution_by_identifier_value . - BIND("orcid" AS ?contribution_by_identifier_scheme) - } +} + +@@values ?local_identifier +@@join ?contribution_by_local_identifier ?contribution_by_local_identifier type=left +@@with source=meta +PREFIX datacite: +PREFIX literal: +PREFIX pro: + +SELECT DISTINCT ?contribution_by_local_identifier ?contribution_by_identifier_scheme ?contribution_by_identifier_value +WHERE { + ?local_identifier pro:isDocumentContextFor ?agent_role . + ?agent_role pro:isHeldBy ?responsible_agent . + ?responsible_agent datacite:hasIdentifier ?orcid_node . + ?orcid_node datacite:usesIdentifierScheme datacite:orcid ; + literal:hasLiteralValue ?contribution_by_identifier_value . + BIND("orcid" AS ?contribution_by_identifier_scheme) + BIND(STR(?responsible_agent) AS ?contribution_by_local_identifier) } @@values ?local_identifier @@ -1481,25 +1617,33 @@ WHERE { } #format skg_if,to_skg_if,application/json #default_format skg_if -#sparql PREFIX datacite: -PREFIX literal: -PREFIX foaf: +#sparql PREFIX foaf: -SELECT ?local_identifier ?name ?family_name ?given_name ?identifier_scheme ?identifier_value +SELECT ?local_identifier ?name ?family_name + ?given_name ?identifier_scheme ?identifier_value WHERE { - BIND(<[[local_identifier]]> AS ?local_identifier) - ?local_identifier a foaf:Agent. - OPTIONAL { ?local_identifier foaf:familyName ?family_name . } - OPTIONAL { ?local_identifier foaf:givenName ?given_name . } - OPTIONAL { ?local_identifier foaf:name ?name. } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri; - literal:hasLiteralValue ?identifier_value. - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier a foaf:Agent . + OPTIONAL { ?local_identifier foaf:familyName ?family_name } + OPTIONAL { ?local_identifier foaf:givenName ?given_name } + OPTIONAL { ?local_identifier foaf:name ?name } FILTER(BOUND(?family_name) || BOUND(?given_name)) } +ORDER BY ?local_identifier + +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value #url /persons #type operation @@ -1558,29 +1702,49 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te } ] } -#sparql PREFIX datacite: +#sparql @@values ?local_identifier +PREFIX datacite: PREFIX literal: PREFIX foaf: -SELECT ?local_identifier ?name ?family_name ?given_name ?identifier_scheme ?identifier_value +SELECT DISTINCT ?local_identifier WHERE { - ?local_identifier a foaf:Agent. - OPTIONAL { ?local_identifier foaf:familyName ?family_name . } - OPTIONAL { ?local_identifier foaf:givenName ?given_name . } - OPTIONAL { ?local_identifier foaf:name ?name. } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri; - literal:hasLiteralValue ?identifier_value. - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } - FILTER(BOUND(?family_name) || BOUND(?given_name)) + ?local_identifier a foaf:Agent . + { ?local_identifier foaf:familyName ?family_name } UNION { ?local_identifier foaf:givenName ?given_name } [[filter]] } ORDER BY ?local_identifier @@page ?local_identifier default_size=10 max_size=100 +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX foaf: + +SELECT ?local_identifier ?name ?family_name + ?given_name ?identifier_scheme ?identifier_value +WHERE { + ?local_identifier a foaf:Agent . + OPTIONAL { ?local_identifier foaf:familyName ?family_name } + OPTIONAL { ?local_identifier foaf:givenName ?given_name } + OPTIONAL { ?local_identifier foaf:name ?name } +} +ORDER BY ?local_identifier + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value + #url /organisations/{local_identifier} #type operation #local_identifier str(https:/{1,2}w3id\.org/oc/meta/.+) @@ -1612,24 +1776,32 @@ ORDER BY ?local_identifier } ] } -#sparql PREFIX datacite: -PREFIX literal: -PREFIX foaf: -SELECT ?local_identifier ?name ?identifier_scheme ?identifier_value +#sparql PREFIX foaf: + +SELECT ?local_identifier ?name ?identifier_scheme + ?identifier_value WHERE { - BIND(<[[local_identifier]]> AS ?local_identifier) + VALUES ?local_identifier { <[[local_identifier]]> } ?local_identifier a foaf:Agent ; foaf:name ?name . - FILTER NOT EXISTS { ?local_identifier foaf:givenName ?givenName . } - FILTER NOT EXISTS { ?local_identifier foaf:familyName ?familyName . } + FILTER NOT EXISTS { ?local_identifier foaf:givenName ?given_name } + FILTER NOT EXISTS { ?local_identifier foaf:familyName ?family_name } +} +ORDER BY ?local_identifier - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) } +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value #url /organisations #type operation @@ -1682,28 +1854,51 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te } ] } -#sparql PREFIX datacite: +#sparql @@values ?local_identifier +PREFIX datacite: PREFIX literal: PREFIX foaf: -SELECT ?local_identifier ?name ?identifier_scheme ?identifier_value + +SELECT DISTINCT ?local_identifier WHERE { ?local_identifier a foaf:Agent ; foaf:name ?name . - FILTER NOT EXISTS { ?local_identifier foaf:givenName ?givenName . } - FILTER NOT EXISTS { ?local_identifier foaf:familyName ?familyName . } - - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } + FILTER NOT EXISTS { ?local_identifier foaf:givenName ?givenName } + FILTER NOT EXISTS { ?local_identifier foaf:familyName ?familyName } [[filter]] } ORDER BY ?local_identifier @@page ?local_identifier default_size=10 max_size=100 +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX foaf: + +SELECT ?local_identifier ?name ?identifier_scheme + ?identifier_value +WHERE { + ?local_identifier a foaf:Agent ; + foaf:name ?name . + FILTER NOT EXISTS { ?local_identifier foaf:givenName ?given_name } + FILTER NOT EXISTS { ?local_identifier foaf:familyName ?family_name } +} +ORDER BY ?local_identifier + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value + #url /venues/{local_identifier} #type operation #local_identifier str(https:/{1,2}w3id\.org/oc/meta/.+) @@ -1740,35 +1935,40 @@ ORDER BY ?local_identifier } ] } -#sparql PREFIX datacite: +#sparql PREFIX fabio: PREFIX dcterms: -PREFIX literal: PREFIX frbr: -PREFIX fabio: -SELECT ?local_identifier ?name ?identifier_scheme ?identifier_value ?type +SELECT ?local_identifier ?name ?type + ?identifier_scheme ?identifier_value WHERE { - BIND(<[[local_identifier]]> AS ?local_identifier) - ?br frbr:partOf+ ?local_identifier . - FILTER NOT EXISTS { ?local_identifier frbr:partOf ?parent. } + VALUES ?local_identifier { <[[local_identifier]]> } + FILTER EXISTS { ?br frbr:partOf ?local_identifier } + FILTER NOT EXISTS { ?local_identifier frbr:partOf ?parent } ?local_identifier a ?type_uri . FILTER(?type_uri != fabio:Expression) - OPTIONAL { - ?local_identifier dcterms:title ?name . - } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } + OPTIONAL { ?local_identifier dcterms:title ?name } BIND( - IF(!BOUND(?type_uri), "unknown", IF(?type_uri = fabio:Journal, "journal", IF(?type_uri = fabio:AcademicProceedings, "conference", IF(?type_uri = fabio:Book || ?type_uri = fabio:ReferenceBook, "book", "other"))) - ) AS ?type) + AS ?type) +} +ORDER BY ?local_identifier ?type + +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + VALUES ?local_identifier { <[[local_identifier]]> } + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) } +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value #url /venues #type operation @@ -1827,38 +2027,60 @@ Filters in the first group use exact matching. For `cf.search.*`, matching is te } ] } -#sparql PREFIX datacite: -PREFIX dcterms: +#sparql @@values ?local_identifier +PREFIX datacite: PREFIX literal: +PREFIX dcterms: PREFIX frbr: PREFIX fabio: -SELECT ?local_identifier ?name ?identifier_scheme ?identifier_value ?type +SELECT DISTINCT ?local_identifier WHERE { - ?br frbr:partOf+ ?local_identifier . - FILTER NOT EXISTS { ?local_identifier frbr:partOf ?parent. } + FILTER EXISTS { ?br frbr:partOf ?local_identifier } + FILTER NOT EXISTS { ?local_identifier frbr:partOf ?parent } ?local_identifier a ?type_uri . FILTER(?type_uri != fabio:Expression) - OPTIONAL { - ?local_identifier dcterms:title ?name . - } - OPTIONAL { - ?local_identifier datacite:hasIdentifier ?identifier . - ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; - literal:hasLiteralValue ?identifier_value . - BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) - } + [[filter]] +} +ORDER BY ?local_identifier + +@@page ?local_identifier default_size=10 max_size=100 + +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX fabio: +PREFIX dcterms: +PREFIX frbr: + +SELECT ?local_identifier ?name ?type + ?identifier_scheme ?identifier_value +WHERE { + FILTER EXISTS { ?br frbr:partOf ?local_identifier } + FILTER NOT EXISTS { ?local_identifier frbr:partOf ?parent } + ?local_identifier a ?type_uri . + FILTER(?type_uri != fabio:Expression) + OPTIONAL { ?local_identifier dcterms:title ?name } BIND( - IF(!BOUND(?type_uri), "unknown", IF(?type_uri = fabio:Journal, "journal", IF(?type_uri = fabio:AcademicProceedings, "conference", IF(?type_uri = fabio:Book || ?type_uri = fabio:ReferenceBook, "book", "other"))) - ) AS ?type) - [[filter]] + AS ?type) } -ORDER BY ?local_identifier +ORDER BY ?local_identifier ?type -@@page ?local_identifier default_size=10 max_size=100 +@@values ?local_identifier +@@join ?local_identifier ?local_identifier type=left +PREFIX datacite: +PREFIX literal: + +SELECT ?local_identifier ?identifier_scheme ?identifier_value +WHERE { + ?local_identifier datacite:hasIdentifier ?identifier . + ?identifier datacite:usesIdentifierScheme ?identifier_scheme_uri ; + literal:hasLiteralValue ?identifier_value . + BIND(STRAFTER(STR(?identifier_scheme_uri), "http://purl.org/spar/datacite/") AS ?identifier_scheme) +} +ORDER BY ?local_identifier ?identifier_scheme ?identifier_value #url /grants/{local_identifier} #type operation diff --git a/test/conftest.py b/test/conftest.py index 2a9746f..59ba7a9 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,5 +1,4 @@ import os -import shutil import subprocess import tempfile import time @@ -9,23 +8,15 @@ from ramose import APIManager, Operation -# v0.5.45 -QLEVER_IMAGE = "adfreiburg/qlever@sha256:4672a53f0ff4e55ac921d25832a21ec0bb3ca08f54d7c1950d04ebf6af7b8c21" +# v0.6.0 +QLEVER_IMAGE = "adfreiburg/qlever@sha256:37d5ede193f1bffb6aebf734d15d2a4c2a3228ee102858b0c6c2e65c149a78ec" QLEVER_CONTAINER = "oc-api-test-qlever" QLEVER_PORT = 7011 -INDEX_NAME = "oc-index-test" +INDEX_NAME = "oc-test" DOCKER_USER = f"{os.getuid()}:{os.getgid()}" -# v7.2.16 -VIRTUOSO_IMAGE = "openlink/virtuoso-opensource-7@sha256:e7a5cd1915569d70d8363503dc62f6bf818b485f1501b230c7608cde8528c72d" -VIRTUOSO_CONTAINER = "oc-api-test-virtuoso" -VIRTUOSO_HTTP_PORT = 8893 -VIRTUOSO_ISQL_PORT = 1112 - TEST_DIR = os.path.dirname(os.path.abspath(__file__)) -QLEVER_DATA_DIR = os.path.join(TEST_DIR, "qlever-index-data") -VIRTUOSO_DATA_DIR = os.path.join(TEST_DIR, "virtuoso-meta-data") -VIRTUOSO_DB_DIR = os.path.join(VIRTUOSO_DATA_DIR, "database") +QLEVER_DATA_DIR = os.path.join(TEST_DIR, "qlever-data") def _wait_for_http(port: int, timeout: int = 60) -> None: @@ -41,41 +32,6 @@ def _wait_for_http(port: int, timeout: int = 60) -> None: raise TimeoutError(f"Service did not become ready on port {port} within {timeout}s") -def _wait_for_virtuoso(container: str, timeout: int = 60) -> None: - deadline = time.monotonic() + timeout - while time.monotonic() < deadline: - result = subprocess.run( - [ - "docker", - "exec", - container, - "isql", - "1111", - "dba", - "dba", - "exec=SELECT 1;", - ], - capture_output=True, - ) - if result.returncode == 0: - return - time.sleep(1) - raise TimeoutError(f"Virtuoso did not become ready within {timeout}s") - - -def _enable_virtuoso_rdf_freetext(container: str) -> None: - commands = ( - "DB.DBA.RDF_OBJ_FT_RULE_ADD(null, null, 'All');" - "DB.DBA.VT_INC_INDEX_DB_DBA_RDF_OBJ();" - "checkpoint;" - ) - subprocess.run( - ["docker", "exec", container, "isql", "1111", "dba", "dba", f"exec={commands}"], - check=True, - capture_output=True, - ) - - @pytest.fixture(scope="session") def qlever_endpoint(): subprocess.run(["docker", "rm", "-f", QLEVER_CONTAINER], capture_output=True) @@ -99,7 +55,7 @@ def qlever_endpoint(): "--init", QLEVER_IMAGE, "-c", - f"qlever-server -i {INDEX_NAME} -j 4 -p {QLEVER_PORT} -m 1G -c 500M -e 500M -k 50 -s 30s", + f"qlever-server -i {INDEX_NAME} -j 4 -p {QLEVER_PORT} -m 1G -c 500M -e 500M -k 50 -s 30s --no-metrics-log --no-resource-usage-log", ], check=True, capture_output=True, @@ -111,50 +67,13 @@ def qlever_endpoint(): @pytest.fixture(scope="session") -def virtuoso_endpoint(): - with tempfile.TemporaryDirectory() as temp_dir: - database_dir = os.path.join(temp_dir, "database") - os.mkdir(database_dir) - for entry in os.scandir(VIRTUOSO_DB_DIR): - if entry.is_file() and entry.name != "virtuoso.log": - shutil.copy2(entry.path, database_dir) - - subprocess.run(["docker", "rm", "-f", VIRTUOSO_CONTAINER], capture_output=True) - subprocess.run( - [ - "docker", - "run", - "-d", - "--name", - VIRTUOSO_CONTAINER, - "-p", - f"{VIRTUOSO_HTTP_PORT}:8890", - "-p", - f"{VIRTUOSO_ISQL_PORT}:1111", - "-e", - "DBA_PASSWORD=dba", - "-v", - f"{database_dir}:/opt/virtuoso-opensource/database", - VIRTUOSO_IMAGE, - ], - check=True, - capture_output=True, - ) - _wait_for_virtuoso(VIRTUOSO_CONTAINER) - _enable_virtuoso_rdf_freetext(VIRTUOSO_CONTAINER) - yield f"http://127.0.0.1:{VIRTUOSO_HTTP_PORT}/sparql" - subprocess.run(["docker", "stop", VIRTUOSO_CONTAINER], capture_output=True) - subprocess.run(["docker", "rm", "-f", VIRTUOSO_CONTAINER], capture_output=True) - - -@pytest.fixture(scope="session") -def skgif_api_manager(virtuoso_endpoint, qlever_endpoint): +def skgif_api_manager(qlever_endpoint): manager = APIManager( [os.path.join(TEST_DIR, "..", "src", "api", "skgif_v1.hf")], - endpoint_override=virtuoso_endpoint, + endpoint_override=qlever_endpoint, ) for config in manager.all_conf.values(): - config["sources_map"] = {"meta": virtuoso_endpoint, "index": qlever_endpoint} + config["sources_map"] = {"meta": qlever_endpoint, "index": qlever_endpoint} return manager @@ -181,11 +100,7 @@ def execute_operation(api_manager: APIManager, operation_url: str) -> str: return response.body -def create_api_manager( - config_path: str, - replacements: dict[str, str], - env_vars: dict[str, str] | None = None, -) -> APIManager: +def create_api_manager(config_path: str, replacements: dict[str, str]) -> APIManager: full_config_path = os.path.join(TEST_DIR, "..", config_path) with open(full_config_path, "r", encoding="utf8") as f: @@ -194,10 +109,6 @@ def create_api_manager( for old, new in replacements.items(): config_content = config_content.replace(old, new) - if env_vars: - for key, value in env_vars.items(): - os.environ[key] = value - tmp_file = tempfile.NamedTemporaryFile( mode="w", suffix=".hf", delete=False, dir=TEST_DIR ) diff --git a/test/data/expected_search_products.json b/test/data/expected_search_products.json index cb4e36b..e951a50 100644 --- a/test/data/expected_search_products.json +++ b/test/data/expected_search_products.json @@ -68,10 +68,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -87,16 +87,16 @@ "local_identifier": "https://w3id.org/oc/meta/br/06160781188", "identifiers": [ { - "value": "S110615584", - "scheme": "openalex" + "value": "1432-1300", + "scheme": "issn" }, { "value": "1432-5012", "scheme": "issn" }, { - "value": "1432-1300", - "scheme": "issn" + "value": "S110615584", + "scheme": "openalex" } ] } @@ -119,13 +119,13 @@ ] }, "identifiers": [ - { - "value": "W2938946739", - "scheme": "openalex" - }, { "value": "10.1007/s11192-019-03217-6", "scheme": "doi" + }, + { + "value": "W2938946739", + "scheme": "openalex" } ], "contributions": [ @@ -194,10 +194,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -216,6 +216,10 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ + { + "value": "0138-9130", + "scheme": "issn" + }, { "value": "1588-2861", "scheme": "issn" @@ -223,10 +227,6 @@ { "value": "S148561398", "scheme": "openalex" - }, - { - "value": "0138-9130", - "scheme": "issn" } ] } @@ -349,10 +349,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -444,13 +444,13 @@ ] }, "identifiers": [ - { - "value": "W3106215946", - "scheme": "openalex" - }, { "value": "10.1162/qss_a_00023", "scheme": "doi" + }, + { + "value": "W3106215946", + "scheme": "openalex" } ], "contributions": [ @@ -502,10 +502,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -524,13 +524,13 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/062501778099", "identifiers": [ - { - "value": "S4210195326", - "scheme": "openalex" - }, { "value": "2641-3337", "scheme": "issn" + }, + { + "value": "S4210195326", + "scheme": "openalex" } ] } @@ -636,10 +636,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -653,11 +653,11 @@ "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ { - "value": "1588-2861", + "value": "0138-9130", "scheme": "issn" }, { - "value": "0138-9130", + "value": "1588-2861", "scheme": "issn" }, { @@ -685,13 +685,13 @@ ] }, "identifiers": [ - { - "value": "W4285173206", - "scheme": "openalex" - }, { "value": "10.1007/978-3-031-06981-9_18", "scheme": "doi" + }, + { + "value": "W4285173206", + "scheme": "openalex" } ], "contributions": [ @@ -754,10 +754,10 @@ { "type": { "class": "http://purl.org/spar/fabio/BookChapter", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book chapter" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -775,11 +775,11 @@ "local_identifier": "https://w3id.org/oc/meta/br/06401297735", "identifiers": [ { - "value": "9783031069819", + "value": "9783031069802", "scheme": "isbn" }, { - "value": "9783031069802", + "value": "9783031069819", "scheme": "isbn" } ] @@ -920,10 +920,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -971,13 +971,13 @@ "value": "9783319580678", "scheme": "isbn" }, - { - "value": "W3115553721", - "scheme": "openalex" - }, { "value": "9783319580685", "scheme": "isbn" + }, + { + "value": "W3115553721", + "scheme": "openalex" } ], "contributions": [ @@ -1061,10 +1061,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1078,19 +1078,19 @@ "local_identifier": "https://w3id.org/oc/meta/br/069066063", "identifiers": [ { - "value": "1864-3035", + "value": "0302-9743", "scheme": "issn" }, { - "value": "1861-2067", + "value": "1611-3349", "scheme": "issn" }, { - "value": "1867-7754", + "value": "1861-2032", "scheme": "issn" }, { - "value": "1611-3349", + "value": "1861-2040", "scheme": "issn" }, { @@ -1098,15 +1098,15 @@ "scheme": "issn" }, { - "value": "0302-9743", + "value": "1861-2067", "scheme": "issn" }, { - "value": "1861-2040", + "value": "1864-3035", "scheme": "issn" }, { - "value": "1861-2032", + "value": "1867-7754", "scheme": "issn" } ] @@ -1126,20 +1126,20 @@ }, "identifiers": [ { - "value": "9783319476025", - "scheme": "isbn" + "value": "10.1007/978-3-319-47602-5", + "scheme": "doi" }, { "value": "9783319476018", "scheme": "isbn" }, { - "value": "W4245488324", - "scheme": "openalex" + "value": "9783319476025", + "scheme": "isbn" }, { - "value": "10.1007/978-3-319-47602-5", - "scheme": "doi" + "value": "W4245488324", + "scheme": "openalex" } ], "contributions": [ @@ -1235,10 +1235,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1252,19 +1252,19 @@ "local_identifier": "https://w3id.org/oc/meta/br/069066063", "identifiers": [ { - "value": "1864-3035", + "value": "0302-9743", "scheme": "issn" }, { - "value": "1861-2067", + "value": "1611-3349", "scheme": "issn" }, { - "value": "1867-7754", + "value": "1861-2032", "scheme": "issn" }, { - "value": "1611-3349", + "value": "1861-2040", "scheme": "issn" }, { @@ -1272,15 +1272,15 @@ "scheme": "issn" }, { - "value": "0302-9743", + "value": "1861-2067", "scheme": "issn" }, { - "value": "1861-2040", + "value": "1864-3035", "scheme": "issn" }, { - "value": "1861-2032", + "value": "1867-7754", "scheme": "issn" } ] @@ -1300,20 +1300,20 @@ }, "identifiers": [ { - "value": "W2784292677", - "scheme": "openalex" + "value": "10.1007/978-3-319-11955-7", + "scheme": "doi" }, { "value": "9783319119540", "scheme": "isbn" }, - { - "value": "10.1007/978-3-319-11955-7", - "scheme": "doi" - }, { "value": "9783319119557", "scheme": "isbn" + }, + { + "value": "W2784292677", + "scheme": "openalex" } ], "contributions": [ @@ -1397,10 +1397,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1414,19 +1414,19 @@ "local_identifier": "https://w3id.org/oc/meta/br/069066063", "identifiers": [ { - "value": "1864-3035", + "value": "0302-9743", "scheme": "issn" }, { - "value": "1861-2067", + "value": "1611-3349", "scheme": "issn" }, { - "value": "1867-7754", + "value": "1861-2032", "scheme": "issn" }, { - "value": "1611-3349", + "value": "1861-2040", "scheme": "issn" }, { @@ -1434,15 +1434,15 @@ "scheme": "issn" }, { - "value": "0302-9743", + "value": "1861-2067", "scheme": "issn" }, { - "value": "1861-2040", + "value": "1864-3035", "scheme": "issn" }, { - "value": "1861-2032", + "value": "1867-7754", "scheme": "issn" } ] @@ -1461,10 +1461,6 @@ ] }, "identifiers": [ - { - "value": "W4249829199", - "scheme": "openalex" - }, { "value": "10.1007/978-1-4020-9632-7", "scheme": "doi" @@ -1476,6 +1472,10 @@ { "value": "9789048127108", "scheme": "isbn" + }, + { + "value": "W4249829199", + "scheme": "openalex" } ], "contributions": [ @@ -1521,10 +1521,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1544,14 +1544,6 @@ ] }, "identifiers": [ - { - "value": "9783642308598", - "scheme": "isbn" - }, - { - "value": "W2221102889", - "scheme": "openalex" - }, { "value": "10.1007/978-3-642-30859-8", "scheme": "doi" @@ -1559,6 +1551,14 @@ { "value": "9783642308581", "scheme": "isbn" + }, + { + "value": "9783642308598", + "scheme": "isbn" + }, + { + "value": "W2221102889", + "scheme": "openalex" } ], "contributions": [ @@ -1632,10 +1632,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1689,10 +1689,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" } } ], @@ -1720,10 +1720,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" } } ], @@ -1751,10 +1751,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" } } ], @@ -1769,10 +1769,6 @@ ] }, "identifiers": [ - { - "value": "9789264799318", - "scheme": "isbn" - }, { "value": "10.1787/b0e499cf-en", "scheme": "doi" @@ -1786,12 +1782,16 @@ "scheme": "isbn" }, { - "value": "W4221051054", - "scheme": "openalex" + "value": "9789264799318", + "scheme": "isbn" }, { "value": "9789264960114", "scheme": "isbn" + }, + { + "value": "W4221051054", + "scheme": "openalex" } ], "contributions": [ @@ -1818,10 +1818,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -1861,20 +1861,20 @@ }, "identifiers": [ { - "value": "9781402096327", - "scheme": "isbn" + "value": "10.1007/978-1-4020-9632-7", + "scheme": "doi" }, { - "value": "W4249829199", - "scheme": "openalex" + "value": "9781402096327", + "scheme": "isbn" }, { "value": "9789048127108", "scheme": "isbn" }, { - "value": "10.1007/978-1-4020-9632-7", - "scheme": "doi" + "value": "W4249829199", + "scheme": "openalex" } ], "contributions": [ @@ -1920,10 +1920,10 @@ { "type": { "class": "http://purl.org/spar/fabio/Book", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2004,10 +2004,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2023,16 +2023,16 @@ "local_identifier": "https://w3id.org/oc/meta/br/06160781188", "identifiers": [ { - "value": "S110615584", - "scheme": "openalex" + "value": "1432-1300", + "scheme": "issn" }, { "value": "1432-5012", "scheme": "issn" }, { - "value": "1432-1300", - "scheme": "issn" + "value": "S110615584", + "scheme": "openalex" } ] } @@ -2055,13 +2055,13 @@ ] }, "identifiers": [ - { - "value": "W2938946739", - "scheme": "openalex" - }, { "value": "10.1007/s11192-019-03217-6", "scheme": "doi" + }, + { + "value": "W2938946739", + "scheme": "openalex" } ], "contributions": [ @@ -2130,10 +2130,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2152,6 +2152,10 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ + { + "value": "0138-9130", + "scheme": "issn" + }, { "value": "1588-2861", "scheme": "issn" @@ -2159,10 +2163,6 @@ { "value": "S148561398", "scheme": "openalex" - }, - { - "value": "0138-9130", - "scheme": "issn" } ] } @@ -2285,10 +2285,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2380,13 +2380,13 @@ ] }, "identifiers": [ - { - "value": "W3106215946", - "scheme": "openalex" - }, { "value": "10.1162/qss_a_00023", "scheme": "doi" + }, + { + "value": "W3106215946", + "scheme": "openalex" } ], "contributions": [ @@ -2438,10 +2438,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2460,13 +2460,13 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/062501778099", "identifiers": [ - { - "value": "S4210195326", - "scheme": "openalex" - }, { "value": "2641-3337", "scheme": "issn" + }, + { + "value": "S4210195326", + "scheme": "openalex" } ] } @@ -2572,10 +2572,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2589,11 +2589,11 @@ "local_identifier": "https://w3id.org/oc/meta/br/0626055628", "identifiers": [ { - "value": "1588-2861", + "value": "0138-9130", "scheme": "issn" }, { - "value": "0138-9130", + "value": "1588-2861", "scheme": "issn" }, { @@ -2621,13 +2621,13 @@ ] }, "identifiers": [ - { - "value": "W4285173206", - "scheme": "openalex" - }, { "value": "10.1007/978-3-031-06981-9_18", "scheme": "doi" + }, + { + "value": "W4285173206", + "scheme": "openalex" } ], "contributions": [ @@ -2690,10 +2690,10 @@ { "type": { "class": "http://purl.org/spar/fabio/BookChapter", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "book chapter" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2711,11 +2711,11 @@ "local_identifier": "https://w3id.org/oc/meta/br/06401297735", "identifiers": [ { - "value": "9783031069819", + "value": "9783031069802", "scheme": "isbn" }, { - "value": "9783031069802", + "value": "9783031069819", "scheme": "isbn" } ] @@ -2856,10 +2856,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2941,10 +2941,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -2963,10 +2963,6 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/06101018", "identifiers": [ - { - "value": "1096-9926", - "scheme": "issn" - }, { "value": "10.1002/(issn)1096-9926", "scheme": "doi" @@ -2974,6 +2970,10 @@ { "value": "0040-3709", "scheme": "issn" + }, + { + "value": "1096-9926", + "scheme": "issn" } ] } @@ -3040,10 +3040,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -3062,10 +3062,6 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/06101018", "identifiers": [ - { - "value": "1096-9926", - "scheme": "issn" - }, { "value": "10.1002/(issn)1096-9926", "scheme": "doi" @@ -3073,6 +3069,10 @@ { "value": "0040-3709", "scheme": "issn" + }, + { + "value": "1096-9926", + "scheme": "issn" } ] } @@ -3393,10 +3393,10 @@ { "type": { "class": "http://purl.org/spar/fabio/ReportDocument", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "report document" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -3460,10 +3460,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -3482,10 +3482,6 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/06101018", "identifiers": [ - { - "value": "1096-9926", - "scheme": "issn" - }, { "value": "10.1002/(issn)1096-9926", "scheme": "doi" @@ -3493,6 +3489,10 @@ { "value": "0040-3709", "scheme": "issn" + }, + { + "value": "1096-9926", + "scheme": "issn" } ] } @@ -3620,10 +3620,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -3642,10 +3642,6 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/0622015443", "identifiers": [ - { - "value": "1097-0215", - "scheme": "issn" - }, { "value": "10.1002/(issn)1097-0215", "scheme": "doi" @@ -3653,6 +3649,10 @@ { "value": "0020-7136", "scheme": "issn" + }, + { + "value": "1097-0215", + "scheme": "issn" } ] } @@ -3719,10 +3719,10 @@ { "type": { "class": "http://purl.org/spar/fabio/JournalArticle", - "defined_in": "http://purl.org/spar/fabio", "labels": { "en": "journal article" - } + }, + "defined_in": "http://purl.org/spar/fabio" }, "dates": { "publication": [ @@ -3741,10 +3741,6 @@ "entity_type": "venue", "local_identifier": "https://w3id.org/oc/meta/br/06101018", "identifiers": [ - { - "value": "1096-9926", - "scheme": "issn" - }, { "value": "10.1002/(issn)1096-9926", "scheme": "doi" @@ -3752,6 +3748,10 @@ { "value": "0040-3709", "scheme": "issn" + }, + { + "value": "1096-9926", + "scheme": "issn" } ] } @@ -5403,48 +5403,54 @@ "identifiers.id:0000-0002-7562-5203": [ { "local_identifier": "https://w3id.org/oc/meta/ra/0622011040459", - "entity_type": "person", + "name": "Fabio Vitali", + "family_name": "Vitali", + "given_name": "Fabio", "identifiers": [ { - "scheme": "orcid", - "value": "0000-0002-7562-5203" + "value": "0000-0002-7562-5203", + "scheme": "orcid" } ], - "given_name": "Fabio", - "family_name": "Vitali", - "name": "Fabio Vitali" + "entity_type": "person" } ], "given_name:Greg": [ { - "entity_type": "person", + "local_identifier": "https://w3id.org/oc/meta/ra/06150114519", "family_name": "Kearsley", "given_name": "Greg", - "local_identifier": "https://w3id.org/oc/meta/ra/06150114519" + "entity_type": "person" } ], "cf.search.given_name:Greg": [ { - "entity_type": "person", + "local_identifier": "https://w3id.org/oc/meta/ra/06150114519", "family_name": "Kearsley", "given_name": "Greg", - "local_identifier": "https://w3id.org/oc/meta/ra/06150114519" + "entity_type": "person" + }, + { + "local_identifier": "https://w3id.org/oc/meta/ra/06150115060", + "family_name": "O'Brien", + "given_name": "Gregory", + "entity_type": "person" } ], "family_name:Nakamura": [ { - "entity_type": "person", + "local_identifier": "https://w3id.org/oc/meta/ra/060176", "family_name": "Nakamura", "given_name": "Takashi", - "local_identifier": "https://w3id.org/oc/meta/ra/060176" + "entity_type": "person" } ], "cf.search.family_name:Nakamura": [ { - "entity_type": "person", + "local_identifier": "https://w3id.org/oc/meta/ra/060176", "family_name": "Nakamura", "given_name": "Takashi", - "local_identifier": "https://w3id.org/oc/meta/ra/060176" + "entity_type": "person" } ], "cf.search.given_name:Silvio,cf.search.family_name:Peroni": [ @@ -5501,14 +5507,14 @@ "identifiers.id:140": [ { "local_identifier": "https://w3id.org/oc/meta/ra/0610116002", - "entity_type": "organisation", + "name": "Emerald", "identifiers": [ { - "scheme": "crossref", - "value": "140" + "value": "140", + "scheme": "crossref" } ], - "name": "Emerald" + "entity_type": "organisation" } ], "identifiers.scheme:crossref": [ @@ -5747,109 +5753,89 @@ "cf.search.name:Mit Press": [ { "local_identifier": "https://w3id.org/oc/meta/ra/0610116105", - "entity_type": "organisation", + "name": "Mit Press", "identifiers": [ { - "scheme": "crossref", - "value": "281" + "value": "281", + "scheme": "crossref" } ], - "name": "Mit Press" + "entity_type": "organisation" } ], "type:conference": [ { "local_identifier": "https://w3id.org/oc/meta/br/0607163623", - "entity_type": "venue", "name": "Proceedings Of The 24Th ACM/IEEE Joint Conference On Digital Libraries", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/061703214020", - "entity_type": "venue", "name": "2009 Fourth International Conference On Cooperation And Promotion Of Information Resources In Science And Technology", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/061703368436", - "entity_type": "venue", "name": "Proceedings Of The 14Th International Conference On World Wide Web - WWW '05", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/06401936298", - "entity_type": "venue", "name": "Proceedings Of The 25Th International Conference On World Wide Web", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/06603395157", - "entity_type": "venue", "name": "Proceedings Of The 8Th International Conference On Semantic Systems - I-SEMANTICS '12", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/06902363257", - "entity_type": "venue", "name": "2021 ACM/IEEE Joint Conference On Digital Libraries (JCDL)", - "type": "conference" + "type": "conference", + "entity_type": "venue" } ], "identifiers.value:2059-481X": [ { "local_identifier": "https://w3id.org/oc/meta/br/06160186133", - "entity_type": "venue", - "identifiers": [ - { - "scheme": "issn", - "value": "2059-481X" - }, - { - "scheme": "openalex", - "value": "S4210240912" - } - ], "name": "Journal Of Open Humanities Data", - "type": "journal" - } - ], - "identifiers.scheme:issn": [ - { - "local_identifier": "https://w3id.org/oc/meta/br/062502076212", - "name": "Data Technologies And Applications", "type": "journal", "identifiers": [ { - "value": "S4210171756", - "scheme": "openalex" - }, - { - "value": "2514-9318", + "value": "2059-481X", "scheme": "issn" }, { - "value": "2514-9288", - "scheme": "issn" + "value": "S4210240912", + "scheme": "openalex" } ], "entity_type": "venue" - }, + } + ], + "identifiers.scheme:issn": [ { "local_identifier": "https://w3id.org/oc/meta/br/06101018", "name": "Teratology", "type": "journal", "identifiers": [ { - "value": "1096-9926", - "scheme": "issn" + "value": "10.1002/(issn)1096-9926", + "scheme": "doi" }, { "value": "0040-3709", "scheme": "issn" }, { - "value": "10.1002/(issn)1096-9926", - "scheme": "doi" + "value": "1096-9926", + "scheme": "issn" } ], "entity_type": "venue" @@ -5899,10 +5885,6 @@ "name": "Journal Of The Medical Library Association", "type": "journal", "identifiers": [ - { - "value": "S146304353", - "scheme": "openalex" - }, { "value": "1536-5050", "scheme": "issn" @@ -5910,6 +5892,10 @@ { "value": "1558-9439", "scheme": "issn" + }, + { + "value": "S146304353", + "scheme": "openalex" } ], "entity_type": "venue" @@ -5920,11 +5906,11 @@ "type": "other", "identifiers": [ { - "value": "2194-5365", + "value": "2194-5357", "scheme": "issn" }, { - "value": "2194-5357", + "value": "2194-5365", "scheme": "issn" }, { @@ -5940,16 +5926,16 @@ "type": "journal", "identifiers": [ { - "value": "1521-3757", - "scheme": "issn" + "value": "10.1002/(issn)1521-3757", + "scheme": "doi" }, { "value": "0044-8249", "scheme": "issn" }, { - "value": "10.1002/(issn)1521-3757", - "scheme": "doi" + "value": "1521-3757", + "scheme": "issn" } ], "entity_type": "venue" @@ -5959,13 +5945,13 @@ "name": "Scientific Data", "type": "journal", "identifiers": [ - { - "value": "S2607323502", - "scheme": "openalex" - }, { "value": "2052-4463", "scheme": "issn" + }, + { + "value": "S2607323502", + "scheme": "openalex" } ], "entity_type": "venue" @@ -5975,13 +5961,13 @@ "name": "SSRN Electronic Journal", "type": "journal", "identifiers": [ - { - "value": "S4210172589", - "scheme": "openalex" - }, { "value": "1556-5068", "scheme": "issn" + }, + { + "value": "S4210172589", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6007,13 +5993,13 @@ "name": "Publications", "type": "journal", "identifiers": [ - { - "value": "S2738007992", - "scheme": "openalex" - }, { "value": "2304-6775", "scheme": "issn" + }, + { + "value": "S2738007992", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6023,10 +6009,6 @@ "name": "Journal Of Computational Chemistry", "type": "journal", "identifiers": [ - { - "value": "1096-987X", - "scheme": "issn" - }, { "value": "10.1002/(issn)1096-987x", "scheme": "doi" @@ -6034,46 +6016,50 @@ { "value": "0192-8651", "scheme": "issn" + }, + { + "value": "1096-987X", + "scheme": "issn" } ], "entity_type": "venue" }, { - "local_identifier": "https://w3id.org/oc/meta/br/061503030632", - "name": "The Australian Library Journal", + "local_identifier": "https://w3id.org/oc/meta/br/061502934", + "name": "Nucleic Acids Research", "type": "journal", "identifiers": [ { - "value": "0004-9670", + "value": "0305-1048", "scheme": "issn" }, { - "value": "2201-4276", + "value": "1362-4962", "scheme": "issn" }, { - "value": "S165931258", + "value": "S134668137", "scheme": "openalex" } ], "entity_type": "venue" }, { - "local_identifier": "https://w3id.org/oc/meta/br/061502934", - "name": "Nucleic Acids Research", + "local_identifier": "https://w3id.org/oc/meta/br/061503030632", + "name": "The Australian Library Journal", "type": "journal", "identifiers": [ { - "value": "S134668137", - "scheme": "openalex" + "value": "0004-9670", + "scheme": "issn" }, { - "value": "0305-1048", + "value": "2201-4276", "scheme": "issn" }, { - "value": "1362-4962", - "scheme": "issn" + "value": "S165931258", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6083,6 +6069,10 @@ "name": "The Charleston Advisor", "type": "journal", "identifiers": [ + { + "value": "1525-4003", + "scheme": "issn" + }, { "value": "1525-4011", "scheme": "issn" @@ -6090,10 +6080,6 @@ { "value": "S82568730", "scheme": "openalex" - }, - { - "value": "1525-4003", - "scheme": "issn" } ], "entity_type": "venue" @@ -6139,10 +6125,6 @@ "name": "Learned Publishing", "type": "journal", "identifiers": [ - { - "value": "S29676049", - "scheme": "openalex" - }, { "value": "0953-1513", "scheme": "issn" @@ -6150,6 +6132,10 @@ { "value": "1741-4857", "scheme": "issn" + }, + { + "value": "S29676049", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6163,13 +6149,13 @@ "value": "2288-7474", "scheme": "issn" }, - { - "value": "S2739153651", - "scheme": "openalex" - }, { "value": "2288-8063", "scheme": "issn" + }, + { + "value": "S2739153651", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6180,16 +6166,16 @@ "type": "journal", "identifiers": [ { - "value": "1097-4571", - "scheme": "issn" + "value": "10.1002/(issn)1097-4571", + "scheme": "doi" }, { "value": "0002-8231", "scheme": "issn" }, { - "value": "10.1002/(issn)1097-4571", - "scheme": "doi" + "value": "1097-4571", + "scheme": "issn" } ], "entity_type": "venue" @@ -6199,6 +6185,10 @@ "name": "Journal Of Informetrics", "type": "journal", "identifiers": [ + { + "value": "1751-1577", + "scheme": "issn" + }, { "value": "1875-5879", "scheme": "issn" @@ -6206,10 +6196,6 @@ { "value": "S205292342", "scheme": "openalex" - }, - { - "value": "1751-1577", - "scheme": "issn" } ], "entity_type": "venue" @@ -6219,13 +6205,13 @@ "name": "Journal Of Clinical Anesthesia", "type": "journal", "identifiers": [ - { - "value": "S155967237", - "scheme": "openalex" - }, { "value": "0952-8180", "scheme": "issn" + }, + { + "value": "S155967237", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6236,16 +6222,16 @@ "type": "journal", "identifiers": [ { - "value": "1097-0215", - "scheme": "issn" + "value": "10.1002/(issn)1097-0215", + "scheme": "doi" }, { "value": "0020-7136", "scheme": "issn" }, { - "value": "10.1002/(issn)1097-0215", - "scheme": "doi" + "value": "1097-0215", + "scheme": "issn" } ], "entity_type": "venue" @@ -6255,13 +6241,13 @@ "name": "Humanities And Social Sciences Communications", "type": "journal", "identifiers": [ - { - "value": "S4210206302", - "scheme": "openalex" - }, { "value": "2662-9992", "scheme": "issn" + }, + { + "value": "S4210206302", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6291,13 +6277,33 @@ "name": "Quantitative Science Studies", "type": "journal", "identifiers": [ + { + "value": "2641-3337", + "scheme": "issn" + }, { "value": "S4210195326", "scheme": "openalex" + } + ], + "entity_type": "venue" + }, + { + "local_identifier": "https://w3id.org/oc/meta/br/062502076212", + "name": "Data Technologies And Applications", + "type": "journal", + "identifiers": [ + { + "value": "2514-9288", + "scheme": "issn" }, { - "value": "2641-3337", + "value": "2514-9318", "scheme": "issn" + }, + { + "value": "S4210171756", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6344,11 +6350,11 @@ "type": "journal", "identifiers": [ { - "value": "1865-7648", + "value": "0341-4183", "scheme": "issn" }, { - "value": "0341-4183", + "value": "1865-7648", "scheme": "issn" }, { @@ -6363,13 +6369,13 @@ "name": "PeerJ", "type": "journal", "identifiers": [ - { - "value": "S1983995261", - "scheme": "openalex" - }, { "value": "2167-8359", "scheme": "issn" + }, + { + "value": "S1983995261", + "scheme": "openalex" } ], "entity_type": "venue" @@ -6379,10 +6385,6 @@ "name": "Cancer", "type": "journal", "identifiers": [ - { - "value": "1097-0142", - "scheme": "issn" - }, { "value": "10.1002/(issn)1097-0142", "scheme": "doi" @@ -6390,6 +6392,10 @@ { "value": "0008-543X", "scheme": "issn" + }, + { + "value": "1097-0142", + "scheme": "issn" } ], "entity_type": "venue" @@ -6400,11 +6406,11 @@ "type": "journal", "identifiers": [ { - "value": "1557-7317", + "value": "0001-0782", "scheme": "issn" }, { - "value": "0001-0782", + "value": "1557-7317", "scheme": "issn" }, { @@ -6419,14 +6425,14 @@ "name": "Journal Of Applied Polymer Science", "type": "journal", "identifiers": [ - { - "value": "0021-8995", - "scheme": "issn" - }, { "value": "10.1002/(issn)1097-4628", "scheme": "doi" }, + { + "value": "0021-8995", + "scheme": "issn" + }, { "value": "1097-4628", "scheme": "issn" @@ -6440,80 +6446,80 @@ "type": "journal", "identifiers": [ { - "value": "1521-4095", - "scheme": "issn" + "value": "10.1002/(issn)1521-4095", + "scheme": "doi" }, { "value": "0935-9648", "scheme": "issn" }, { - "value": "10.1002/(issn)1521-4095", - "scheme": "doi" + "value": "1521-4095", + "scheme": "issn" } ], "entity_type": "venue" }, { - "local_identifier": "https://w3id.org/oc/meta/br/069066063", - "name": "Journal On Data Semantics", + "local_identifier": "https://w3id.org/oc/meta/br/069039310", + "name": "Feddes Repertorium", "type": "journal", "identifiers": [ { - "value": "1861-2032", - "scheme": "issn" + "value": "10.1002/(issn)1522-239x", + "scheme": "doi" }, { - "value": "1861-2067", + "value": "0014-8962", "scheme": "issn" }, { - "value": "1867-7754", + "value": "0374-6577", "scheme": "issn" }, { - "value": "1864-3035", + "value": "1522-239X", "scheme": "issn" - }, + } + ], + "entity_type": "venue" + }, + { + "local_identifier": "https://w3id.org/oc/meta/br/069066063", + "name": "Journal On Data Semantics", + "type": "journal", + "identifiers": [ { - "value": "1861-2059", + "value": "0302-9743", "scheme": "issn" }, { - "value": "0302-9743", + "value": "1611-3349", "scheme": "issn" }, { - "value": "1611-3349", + "value": "1861-2032", "scheme": "issn" }, { "value": "1861-2040", "scheme": "issn" - } - ], - "entity_type": "venue" - }, - { - "local_identifier": "https://w3id.org/oc/meta/br/069039310", - "name": "Feddes Repertorium", - "type": "journal", - "identifiers": [ + }, { - "value": "0014-8962", + "value": "1861-2059", "scheme": "issn" }, { - "value": "1522-239X", + "value": "1861-2067", "scheme": "issn" }, { - "value": "0374-6577", + "value": "1864-3035", "scheme": "issn" }, { - "value": "10.1002/(issn)1522-239x", - "scheme": "doi" + "value": "1867-7754", + "scheme": "issn" } ], "entity_type": "venue" @@ -6522,35 +6528,35 @@ "cf.search.name:Digital Libraries": [ { "local_identifier": "https://w3id.org/oc/meta/br/0607163623", - "entity_type": "venue", "name": "Proceedings Of The 24Th ACM/IEEE Joint Conference On Digital Libraries", - "type": "conference" + "type": "conference", + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/06160781188", - "entity_type": "venue", + "name": "International Journal On Digital Libraries", + "type": "journal", "identifiers": [ { - "scheme": "issn", - "value": "1432-1300" + "value": "1432-1300", + "scheme": "issn" }, { - "scheme": "issn", - "value": "1432-5012" + "value": "1432-5012", + "scheme": "issn" }, { - "scheme": "openalex", - "value": "S110615584" + "value": "S110615584", + "scheme": "openalex" } ], - "name": "International Journal On Digital Libraries", - "type": "journal" + "entity_type": "venue" }, { "local_identifier": "https://w3id.org/oc/meta/br/06902363257", - "entity_type": "venue", "name": "2021 ACM/IEEE Joint Conference On Digital Libraries (JCDL)", - "type": "conference" + "type": "conference", + "entity_type": "venue" } ] } diff --git a/test/data/index_isbn.json b/test/data/index_isbn.json new file mode 100644 index 0000000..52efbd8 --- /dev/null +++ b/test/data/index_isbn.json @@ -0,0 +1,114 @@ +{ + "retrieved_at": "2026-09-29T13:38:24.769502+00:00", + "metadata": [ + { + "url": "https://api.opencitations.net/meta/v1/metadata/isbn:9789663601922", + "results": [ + { + "id": "doi:10.15407/akademperiodyka.192.304 isbn:9789663601922 openalex:W2790273689 omid:br/06101786021", + "title": "Coastal Zone Resources Management", + "author": "Ivanov, V.A. [omid:ra/06105318565]; Igumnova, E.M. [omid:ra/06105318566]; Timchenko, I.E. [omid:ra/06105318567]", + "pub_date": "2012-05-19", + "issue": "", + "volume": "", + "venue": "", + "type": "book", + "page": "", + "publisher": "National Academy Of Sciences Of Ukraine (Co. Ltd Ukrinformnauka) [crossref:6225 omid:ra/0610116288]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/061202333124", + "results": [ + { + "id": "doi:10.31519/conferencearticle_5b1b9384252a73.81999055 openalex:W2593131457 omid:br/061202333124", + "title": "Mapping Biochemical Fields In The Upper Layer Of The Black Sea By The Adaptive Balance Of Causes Method", + "author": "Lazarchuk, Inga [omid:ra/061206986868]; Lazarchuk, Inga [omid:ra/061206986869]; Timchenko, Igor [omid:ra/061206986870]; Timchenko, Igor [omid:ra/061206986871]", + "pub_date": "2017-10-11", + "issue": "", + "volume": "", + "venue": "Proceedings Of International Conference \"Managinag Risks To Coastal Regions And Communities In A Changinag World\" (EMECS'11 - SeaCoasts XXVI) [omid:br/061202334121]", + "type": "proceedings article", + "page": "", + "publisher": "Academus Publishing [crossref:15171 omid:ra/0670114706]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/06603737264", + "results": [ + { + "id": "doi:10.1357/002224090784984678 openalex:W2077769416 omid:br/06603737264", + "title": "A Nitrogen-Based Model Of Plankton Dynamics In The Oceanic Mixed Layer", + "author": "Fasham, M. J. R. [omid:ra/066010366029]; Ducklow, H. W. [omid:ra/066010366030]; McKelvie, S. M. [omid:ra/066010366031]", + "pub_date": "1990-08-01", + "issue": "3", + "volume": "48", + "venue": "Journal Of Marine Research [issn:0022-2402 issn:1543-9542 openalex:S166958622 omid:br/064064740]", + "type": "journal article", + "page": "591-639", + "publisher": "Journal Of Marine Research/Yale [crossref:270 omid:ra/0680114484]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/061502169014", + "results": [ + { + "id": "doi:10.1016/j.ecolecon.2008.01.017 openalex:W2079791368 omid:br/061502169014", + "title": "How To Be An Ecological Economist", + "author": "Faber, Malte [omid:ra/061506480601]", + "pub_date": "2008-05", + "issue": "1", + "volume": "66", + "venue": "Ecological Economics [issn:0921-8009 openalex:S136211407 omid:br/069053430]", + "type": "journal article", + "page": "1-7", + "publisher": "Elsevier Bv [crossref:78 omid:ra/0610116009]", + "editor": "" + } + ] + } + ], + "references": { + "url": "https://api.opencitations.net/index/v2/references/omid:br/06101786021", + "selected_results": [ + { + "oci": "06101786021-06603737264", + "citing": "omid:br/06101786021 doi:10.15407/akademperiodyka.192.304 isbn:9789663601922 openalex:W2790273689", + "cited": "omid:br/06603737264 doi:10.1357/002224090784984678 openalex:W2077769416", + "creation": "2012-05-19", + "timespan": "P21Y9M18D", + "journal_sc": "no", + "author_sc": "no" + }, + { + "oci": "06101786021-061502169014", + "citing": "omid:br/06101786021 doi:10.15407/akademperiodyka.192.304 isbn:9789663601922 openalex:W2790273689", + "cited": "omid:br/061502169014 doi:10.1016/j.ecolecon.2008.01.017 openalex:W2079791368", + "creation": "2012-05-19", + "timespan": "P4Y0M", + "journal_sc": "no", + "author_sc": "no" + } + ] + }, + "citations": { + "url": "https://api.opencitations.net/index/v2/citations/omid:br/06101786021", + "selected_results": [ + { + "oci": "061202333124-06101786021", + "citing": "omid:br/061202333124 doi:10.31519/conferencearticle_5b1b9384252a73.81999055 openalex:W2593131457", + "cited": "omid:br/06101786021 doi:10.15407/akademperiodyka.192.304 isbn:9789663601922 openalex:W2790273689", + "creation": "2017-10-11", + "timespan": "P5Y4M22D", + "journal_sc": "no", + "author_sc": "no" + } + ] + } +} diff --git a/test/data/index_issn.json b/test/data/index_issn.json new file mode 100644 index 0000000..04392cc --- /dev/null +++ b/test/data/index_issn.json @@ -0,0 +1,159 @@ +{ + "retrieved_at": "2026-09-29T15:23:49.872614+00:00", + "metadata": [ + { + "url": "https://api.opencitations.net/meta/v1/metadata/issn:1096-987X", + "results": [ + { + "id": "doi:10.1002/(issn)1096-987x issn:0192-8651 issn:1096-987X openalex:S21117631 omid:br/0615019585", + "title": "Journal Of Computational Chemistry", + "author": "", + "pub_date": "", + "issue": "", + "volume": "", + "venue": "", + "type": "journal", + "page": "", + "publisher": "Wiley [crossref:311 omid:ra/0610116001]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/06190415414", + "results": [ + { + "id": "doi:10.1080/07391102.2017.1386592 openalex:W2761138796 pmid:28978251 omid:br/06190415414", + "title": "Intermolecular Interactions Between DNA And Methamphetamine, Amphetamine, Ecstasy And Their Major Metabolites", + "author": "Reis, Arthur F.V.F. [omid:ra/061901185326]; Pereira, Igor L. G. [orcid:0000-0002-8022-3612 omid:ra/06160113859]; Neto, Abel F.G. [omid:ra/061901185327]; Santos, Alberdan S. [omid:ra/061901185328]; Kuca, Kamil [omid:ra/061901185329]; Nepovimova, Eugenie [orcid:0000-0003-0281-246X omid:ra/068012488831]; Neto, Antonio M.J.C. [omid:ra/061901185330]", + "pub_date": "2017-10-23", + "issue": "12", + "volume": "36", + "venue": "Journal Of Biomolecular Structure And Dynamics [issn:0739-1102 issn:1538-0254 openalex:S178711970 omid:br/061708427]", + "type": "journal article", + "page": "3047-3057", + "publisher": "Informa Uk Limited [crossref:301 omid:ra/0610116005]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/061701295110", + "results": [ + { + "id": "doi:10.1088/0953-4075/47/14/143001 openalex:W2042280112 omid:br/061701295110", + "title": "Understanding The Structure And Dynamic Of Odorants In The Gas Phase Using A Combination Of Microwave Spectroscopy And Quantum Chemical Calculations", + "author": "Mouhib, Halima [orcid:0000-0001-5031-3468 omid:ra/069014588]", + "pub_date": "2014-07-04", + "issue": "14", + "volume": "47", + "venue": "Journal Of Physics B: Atomic, Molecular And Optical Physics [issn:0953-4075 issn:1361-6455 openalex:S108417319 omid:br/0616036311]", + "type": "journal article", + "page": "143001", + "publisher": "Iop Publishing [crossref:266 omid:ra/0610116040]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/06101680950", + "results": [ + { + "id": "doi:10.1484/eer-eb issn:2295-9254 issn:2295-9262 openalex:S4210239944 omid:br/06101680950", + "title": "", + "author": "Essary, Kirk [omid:ra/06035094624]; Van Gent, Jacqueline [omid:ra/06035094625]; Adams, Tracy [omid:ra/06035094626]; Jamroziak, Emilia [omid:ra/06035094627]; Meyer, Matthias [omid:ra/06035094628]; Ricciardelli, Fabrizio [omid:ra/06035094629]; Ruys, Juanita Feros [omid:ra/06035094630]; Sigurðsson, Jón Viðar [omid:ra/06035094631]; Terpstra, Nicholas [omid:ra/06035094632]", + "pub_date": "", + "issue": "", + "volume": "", + "venue": "", + "type": "", + "page": "", + "publisher": "Brepols Publishers Nv [crossref:7597 omid:ra/0610116091]", + "editor": "" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/061602440477", + "results": [ + { + "id": "doi:10.1057/9780230298125_8 openalex:W2339586113 omid:br/061602440477", + "title": "Francis Bacon’s Bi-literal Cipher And The Materiality Of Early Modern Diplomatic Writing", + "author": "Stewart, Alan [omid:ra/061607098301]", + "pub_date": "2011", + "issue": "", + "volume": "", + "venue": "Diplomacy And Early Modern Culture [doi:10.1057/9780230298125 isbn:9780230298125 isbn:9781349316267 openalex:W599936931 omid:br/061602440482]", + "type": "book chapter", + "page": "120-137", + "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", + "editor": "Adams, Robyn [omid:ra/061607098305]; Cox, Rosanna [omid:ra/061607098306]" + } + ] + }, + { + "url": "https://api.opencitations.net/meta/v1/metadata/omid:br/06130803068", + "results": [ + { + "id": "doi:10.1080/0268117x.2021.1926651 openalex:W3180010455 omid:br/06130803068", + "title": "Addressing Audiences Abroad: Cultural And Public Diplomacy In Seventeenth-Century Europe", + "author": "Lamal, Nina [orcid:0000-0002-7460-5163 omid:ra/0613061148]; Van Gelder, Klaas [orcid:0000-0002-9250-629X omid:ra/061302457354]", + "pub_date": "2021-05-04", + "issue": "3", + "volume": "36", + "venue": "The Seventeenth Century [issn:0268-117X issn:2050-4616 openalex:S4210210779 omid:br/06130803749]", + "type": "journal article", + "page": "367-387", + "publisher": "Informa Uk Limited [crossref:301 omid:ra/0610116005]", + "editor": "" + } + ] + } + ], + "citations": { + "url": "https://api.opencitations.net/index/v2/citations/omid:br/0615019585?limit=2", + "selected_results": [ + { + "oci": "06190415414-0615019585", + "citing": "omid:br/06190415414 doi:10.1080/07391102.2017.1386592 openalex:W2761138796 pmid:28978251", + "cited": "omid:br/0615019585 doi:10.1002/(issn)1096-987x issn:0192-8651 issn:1096-987X openalex:S21117631", + "creation": "2017-10-23", + "timespan": "", + "journal_sc": "no", + "author_sc": "no" + }, + { + "oci": "061701295110-0615019585", + "citing": "omid:br/061701295110 doi:10.1088/0953-4075/47/14/143001 openalex:W2042280112", + "cited": "omid:br/0615019585 doi:10.1002/(issn)1096-987x issn:0192-8651 issn:1096-987X openalex:S21117631", + "creation": "2014-07-04", + "timespan": "", + "journal_sc": "no", + "author_sc": "no" + } + ] + }, + "references": { + "url": "https://api.opencitations.net/index/v2/references/omid:br/06101680950", + "selected_results": [ + { + "oci": "06101680950-061602440477", + "citing": "omid:br/06101680950 doi:10.1484/eer-eb issn:2295-9254 issn:2295-9262 openalex:S4210239944", + "cited": "omid:br/061602440477 doi:10.1057/9780230298125_8 openalex:W2339586113", + "creation": "", + "timespan": "", + "journal_sc": "no", + "author_sc": "no" + }, + { + "oci": "06101680950-06130803068", + "citing": "omid:br/06101680950 doi:10.1484/eer-eb issn:2295-9254 issn:2295-9262 openalex:S4210239944", + "cited": "omid:br/06130803068 doi:10.1080/0268117x.2021.1926651 openalex:W3180010455", + "creation": "", + "timespan": "", + "journal_sc": "no", + "author_sc": "no" + } + ] + } +} diff --git a/test/qlever-index-data/index_subset.nt b/test/qlever-data/index_subset.nt similarity index 93% rename from test/qlever-index-data/index_subset.nt rename to test/qlever-data/index_subset.nt index 7126ef0..3a4c441 100644 --- a/test/qlever-index-data/index_subset.nt +++ b/test/qlever-data/index_subset.nt @@ -215,3 +215,17 @@ . . . + . + . + . + . + . + . + . + . + . + . + . + . + . + . diff --git a/test/virtuoso-meta-data/meta_subset.nq b/test/qlever-data/meta_subset.nq similarity index 99% rename from test/virtuoso-meta-data/meta_subset.nq rename to test/qlever-data/meta_subset.nq index 8a4b66d..3a963cf 100644 --- a/test/virtuoso-meta-data/meta_subset.nq +++ b/test/qlever-data/meta_subset.nq @@ -34648,3 +34648,80 @@ . . "Zenodo" . + "2012-05-19"^^ . + . + . + . + "2017-10-11"^^ . + . + . + "2008-05"^^ . + . + . + "1990-08-01"^^ . + . + . + . + "10.1016/j.ecolecon.2008.01.017"^^ . + . + "10.1357/002224090784984678"^^ . + . + "10.15407/akademperiodyka.192.304"^^ . + . + "10.31519/conferencearticle_5b1b9384252a73.81999055"^^ . + . + "9789663601922"^^ . + . + "W2077769416"^^ . + . + "W2079791368"^^ . + . + "W2593131457"^^ . + . + "W2790273689"^^ . + . + "2014-07-04"^^ . + . + . + "2017-10-23"^^ . + . + . + . + . + "10.1080/07391102.2017.1386592"^^ . + . + "10.1088/0953-4075/47/14/143001"^^ . + . + "S21117631"^^ . + . + "W2042280112"^^ . + . + "W2761138796"^^ . + . + "28978251"^^ . + . + . + . + . + "2021-05-04"^^ . + . + . + "2011"^^ . + . + . + . + "10.1057/9780230298125_8"^^ . + . + "10.1080/0268117x.2021.1926651"^^ . + . + "10.1484/eer-eb"^^ . + . + "2295-9254"^^ . + . + "2295-9262"^^ . + . + "S4210239944"^^ . + . + "W2339586113"^^ . + . + "W3180010455"^^ . diff --git a/test/qlever-data/oc-test.index.ops b/test/qlever-data/oc-test.index.ops new file mode 100644 index 0000000..b62ccd3 Binary files /dev/null and b/test/qlever-data/oc-test.index.ops differ diff --git a/test/qlever-data/oc-test.index.ops.meta b/test/qlever-data/oc-test.index.ops.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.ops.meta differ diff --git a/test/qlever-data/oc-test.index.osp b/test/qlever-data/oc-test.index.osp new file mode 100644 index 0000000..fc721b8 Binary files /dev/null and b/test/qlever-data/oc-test.index.osp differ diff --git a/test/qlever-data/oc-test.index.osp.meta b/test/qlever-data/oc-test.index.osp.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.osp.meta differ diff --git a/test/qlever-data/oc-test.index.patterns b/test/qlever-data/oc-test.index.patterns new file mode 100644 index 0000000..b34d29d Binary files /dev/null and b/test/qlever-data/oc-test.index.patterns differ diff --git a/test/qlever-data/oc-test.index.pos b/test/qlever-data/oc-test.index.pos new file mode 100644 index 0000000..4355c91 Binary files /dev/null and b/test/qlever-data/oc-test.index.pos differ diff --git a/test/qlever-data/oc-test.index.pos.meta b/test/qlever-data/oc-test.index.pos.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.pos.meta differ diff --git a/test/qlever-data/oc-test.index.pso b/test/qlever-data/oc-test.index.pso new file mode 100644 index 0000000..c247ea5 Binary files /dev/null and b/test/qlever-data/oc-test.index.pso differ diff --git a/test/qlever-data/oc-test.index.pso.meta b/test/qlever-data/oc-test.index.pso.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.pso.meta differ diff --git a/test/qlever-data/oc-test.index.sop b/test/qlever-data/oc-test.index.sop new file mode 100644 index 0000000..90c06d4 Binary files /dev/null and b/test/qlever-data/oc-test.index.sop differ diff --git a/test/qlever-data/oc-test.index.sop.meta b/test/qlever-data/oc-test.index.sop.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.sop.meta differ diff --git a/test/qlever-data/oc-test.index.spo b/test/qlever-data/oc-test.index.spo new file mode 100644 index 0000000..7f22de5 Binary files /dev/null and b/test/qlever-data/oc-test.index.spo differ diff --git a/test/qlever-data/oc-test.index.spo.meta b/test/qlever-data/oc-test.index.spo.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.index.spo.meta differ diff --git a/test/qlever-data/oc-test.internal.index.pos b/test/qlever-data/oc-test.internal.index.pos new file mode 100644 index 0000000..6d64467 Binary files /dev/null and b/test/qlever-data/oc-test.internal.index.pos differ diff --git a/test/qlever-data/oc-test.internal.index.pos.meta b/test/qlever-data/oc-test.internal.index.pos.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.internal.index.pos.meta differ diff --git a/test/qlever-data/oc-test.internal.index.pso b/test/qlever-data/oc-test.internal.index.pso new file mode 100644 index 0000000..62bd397 Binary files /dev/null and b/test/qlever-data/oc-test.internal.index.pso differ diff --git a/test/qlever-data/oc-test.internal.index.pso.meta b/test/qlever-data/oc-test.internal.index.pso.meta new file mode 100644 index 0000000..d4227fa Binary files /dev/null and b/test/qlever-data/oc-test.internal.index.pso.meta differ diff --git a/test/qlever-data/oc-test.meta-data.json b/test/qlever-data/oc-test.meta-data.json new file mode 100644 index 0000000..9e040eb --- /dev/null +++ b/test/qlever-data/oc-test.meta-data.json @@ -0,0 +1 @@ +{"date-of-index-build":"2026-09-29T15:24:24Z","encoded-iri-prefixes":{"prefixes-with-leading-angle-brackets":["o.‰”ÿéÿèÿïj «$>ÿéÿèþM�lq#~3”ˆ0<ÿéÿèþ›V?ˆ<^›b11 -m j$~9;-0Â.ªopÂ*°1|#;? \!;mÿéÿèþMu$4c-üIu-Rp ¢«'él�<ÿãÿéÿèþÿéÿèþMý'Vl?~JËÿéÿèþb11| j$ ¢k1=q#IkLb u;¦UY?¸/777ç7ç7ë(UÔ,U8)86ç7ë(U,XBU+®7ç7ë(U,(+8U,)�ç7ë(U,‹ú®,Ÿç7ë(U,NGU�BþÚç7ë(U,S6U»Úç7ë(U,Û6U,�ç7ë(U,2)6U®®ç7ë(U,ÜU,ÀþÚç7ë(U,»)UN6)ç7ë(U»,2UÀBŸç7ë(U,8)8U6),ç7ë(U,)77U(Åç7ë(U6(N)U—»ç7ë(UÇ+,U8˜¶ç7ë(UÇÑU(Å6ç7ë(U66+BU,,—ç7ë(U6Ï,UBŶç7ë(U6B+,UÚN’ç7ë(U6á7U+,8þÚç7ë(U8æU68+8ç7ë(U8,“Uz)6ç7ë(UÒÏU´¬ç7ë(U)´BU8+¥ç7ë(U)Ç(U¯Sç7ë(U)6)6U7‚8ç7ë(U¨¨U6+,þÚç7ë(UBT(U6(Ïç7ë(UB2¨U()®ç7ë(UáXU,8N’ç7ë(Uá(+U66+¶ç7ë(Uâ8+UT7’ç7ë(UB),+U»6’ç7ë(UB)8BU+Ï8ç7ëúz7BUÑ)7ç7ëú™,+UN®Ÿç7ëúx`UÇ)6ç7ëúxB)UN)Çç7ëú7)+)UÚN’ç7ëú7¨,U)6Óç7ëú7âBU+T(ç7ëú(((+U8,˜ç7ëú((ÇU(+,(ç7ëú(N68Uz+ç7ëú(N8BU,(—ç7ëú(,(,U77Úç7ëú(,N8U)+˜ç7ëú‹ÀU6+Äç7ëú‹—U)8+,ç7ëúN2(2U+‹Ÿç7ëúN2)7UX8’ç7ëúNÏBU(϶ç7ëúS(6Uâ“ç7ëúSSU6)8ç7ëú+Ä+UT,ç7ëúT((U+´7ç7ëúÅ6)U){’ç7ëúÑ(úâÄç7ëú¥`U6,(’ç7ëú¥86U(ÛþÚç7ëú266)U,)2’ç7ëú2)(6U�6’ç7ëú2)ÛU6»’ç7ëú˜{UN68Ÿç7ëú,�+U8),(ç7ëú,N)2UÖBç7ëú,S(U+(“ç7ëú,Å6U(Ö6ç7ëú»�U»BŸç7ëú»,)UÀ7’ç7ëú,Æ(U2)8Ÿç7ëú´B+U)´Ÿç7ëú]8BU+)Sç7ëú6+B(U2�’ç7ëúÆ+)U+,“ç7ëú8+,ú(T7ç7ëú8+ÏU‚)8ç7ëú8,(6U]26ç7ëú8»ú,`ç7ëú86()U8ÖŸç7ëú8]7U(¯6ç7ëú86—U(ÑŸç7ëúÒ]U+®ç7ëú)�ú2(+(ç7ëúÏ+BUÿq7ç7ëúϘU],ç7ëú)S7U8N6(ç7ëú)T6U+)Æç7ëú)“7Uxáç7ëú)Ñ2U)28Ÿç7ëú),)8U)6(’ç7ëú)6B(UÒNþÚç7ëúB(¨U)Æ6ç7ëúB+ÑUXÖç7ëúá)7UÀN’ç7ëúB)(úT6,ç7ë+U77B,U+»’ç7ë+U‚8BU8+)ç7ë+U‚)+U6BXç7ë+UzB+U7϶ç7ë+U™N8U6+)þÚç7ë+U{SUÅ{ç7ë+U(‹BU‹+8ç7ë+U(À)U©+¶ç7ë+U(S2U�+¶ç7ë+U(+86U)T¶ç7ë+U(+ÒUB+)6ç7ë+U(+)6U•+(ç7ë+U(2�UNT,ç7ë+U�+2UÀáç7ë+U`B)U28´ç7ë+UNT(U“Àç7ë+UNÏBU6Æ,ç7ë+UÖN)UB¯6ç7ë+U+(6,U,+Ñç7ë+U+(¨U]8ç7ë+U—6)U¬(,ç7ë+U+¯BUÏ]ç7ë+U+B+2U7•Ÿç7ë+UTGU8êç7ë+U2((2U•2þÚç7ë+U2((,U](,ç7ë+U2(,,U´Xç7ë+UÅ8ú¬2(ç7ë+UјU+((Ÿç7ë+U28N8UBÅ,ç7ë+U2828U2®’ç(ç(U•ÏçŸçúÏ+(ç¬çÀçÖççç2Uá®ç¯6®ç’ç)U,ÅþÚç¶çBë+UÆ6(UB+XçBë)U(266UÒ“7‚(’7‚7‚2U)áŸ7‚87z77z7UÆÛ7z(7z(U)Ó,7z¬TÚ8)¯)268’7zBŸ7�77�7U+®¶7�©7�7�2Uϯ7•Ÿ77’77Ú77B,‚‚7‚X‚+’‚+)UB(S‚‚“‚6‚8‚8¶‚)‚)—‚)8‚¶‚BŸ‚Bú)6,(z7z7¶z(,zŸz+zz,z,+z6)(ĺz)6zBÞŸÞúâÅÞ,Þ,UX2’™(™Ÿ™‹8™N8™2(™2(U2()™,™,8™8™82U6,Ò�Û8�®{{(G{S{+)8x`xáxB’xB)(•NÅ•+(•+B(XŸ•2º•Ï7’7϶7)+’7)Ñ7¨,7¨87¨8UÑ867B+,7B+,Uá2’7B,Ÿ7B,ú)()77B,7B,+U(,(7â¶yyUŸyfÆU(²Y-å5 t!. Š[­±5F!l'Í¿Øg'F¹!04 †s!O€ u.};�IÕl9 ¢§ïš Š�Σ٠�®¿��ËZ9 $\b'I�!/ t.F|$ !c;Uu!9ñÉlµ �\ uQžI²9![3Q*UÕ\4LV>ß «!L4 +2£Ùy7@fØ<#ÙXáUB)8º@fØ<#ÙXáUÓN6@fØ<#ÙXí‚“@fØ<#ÙXíz(,@fØ<#ÙXí¥Æ@fØ<#ÙXí2]’@fØ<#ÙXB)UÀá@fØ<#Ù(,‹U+8,8@fØ<#Ù(,‹UTB,@fØ<#Ù(,¬UÀBº@÷öáUÓN6Ø�ÓXÙG^2àÄ8^òUÂ-ró$ðª@÷öí‚“Ø�â(X(Ù)7^Bà()7)^òU0#05(ió$ð¶@÷öí‚“Ø�Ó{‚Ù),^Bà(¨,^òU0#05¡ó$ð$@÷öí‚“Ø�Ó{‚Ù),^Bà�™^òU0#05Wó$ð6@÷öí‚“Ø�Ó{‚Ù),^Bà�©^òU0#05_ó$ðä@÷öí‚“Ø�Ó{‚Ù),^Bà�,)^òU0#05(¡ó$ð'@÷öí‚“Ø�Ó{‚Ù),^Bà�66^òU0#05(Pó$ðR@÷öí‚“Ø�Ó{‚Ù),^Bà�),^òU0#05(œó$ð$@÷öí‚“Ø�Ó{‚Ù),^Bà�á^òU0#05Ä"ó$ð9@÷öí‚“Ø�Ó{‚Ù),^Bà`‚^òU0#05(ió$ð5@÷öí‚“Ø�Ó{‚Ù),^Bàã8^òU0#05`"ó$ðO@÷öí‚“Ø�Ó{‚Ù),^Bà`À^òU0#05‹"ó$ðŸ@÷öí‚“Ø�Ó{‚Ù),^Bà`26^òU0#05À"ó$ð/@÷öí‚“Ø�Ó{‚Ù),^Bà`6)^òU0#05©"ó$ð’@÷öí‚“Ø�Ó{‚Ù),^Bà`8+^òU0#05Nœó$ð¹@÷öí‚“Ø�Ó{‚Ù),^Bà`Ò^òU0#05N_ó$ð@÷öí‚“Ø�Ó{‚Ù),^Bà`B(^òU0#05Nió$ð9@÷öíz(,Ø`77‚(,Ù),^Nà(G^òU.¹0¡ó$ð,@÷öíz(,Ø`77‚(,Ù),^Nà(66^òU.¹0Pó$ð3@÷öíz(,Ø`77‚(,Ù),^NàÄ(^òU.¹0Wó$ðR@÷öíz(,Ø`77‚(,Ù),^NàÄ6^òU.¹0aó$ðŽ@÷öíz(,Ø`77‚(,Ù),^Nà(Ï^òU.¹0œó$ð/@÷öíz(,Ø`77‚(,Ù),^Nà�N^òU.¹0ió$ðL@÷öíz(,Ø`77‚(,Ù),^Nàã^òU.¹0hó$ð3@÷öíz(,Ø`77‚(,Ù),^Nà¬+^òU.¹0(¡ó$ð9@÷öíz(,Ø`77‚(,Ù),^Nà¬)^òU.¹0(Pó$ð¶@÷öíz(,Ø`77‚(,Ù),^NàÀ6^òU.¹0(Wó$ð,@÷öíz(,Ø`77‚(,Ù),^NàN2)^òU.¹0(œó$ðO@÷öíz(,Ø`77‚(,Ù),^Nà©+^òU.¹0Ä"ó$ð'@÷öíz(,Ø`77‚(,Ù),^NàNG^òU.¹0(ió$ð5@÷öíz(,Ø`77‚(,Ù),^NàN8,^òU.¹0`"ó$ð,@÷öíz(,Ø`77‚(,Ù),^NàN)(^òU.¹0‹"ó$ð@÷öíz(,Ø`77‚(,Ù),^NàN)B^òU.¹0¬"ó$ðÐ@÷öíz(,Ø`77‚(,Ù),^NàÖ6^òU.¹0À"ó$ðä@÷öíz(,Ø`77‚(,Ù),^NàÖ)^òU.¹0NWó$ð3@÷öí¥ÆØ�)®(Ù+)^(à2)^òU”.hó$ð’@÷öí¥ÆØ�)®+Ù+)^Nà(S^òU”._ó$ð7@÷öí¥ÆØ�)®+Ù+)^Nà(—^òU”.ió$ð1@÷öí¥ÆØ�)®,Ù+)^+à()2^òU”._ó$ðL@÷öí¥ÆØ�)®,Ù+)^+à‹(^òU”.X"ó$ð'@÷öí¥ÆØ�)®8Ù+)^2àÀB^òU”.Wó$ð6@÷öí¥ÆØ�)®8Ù+)^2àÖ)^òU”.X"ó$ðÐ@÷öí¥ÆØ�)®8Ù+)^2àS8^òU”.(Wó$ð8@÷öí¥ÆØ�¨™Ù+B^NàX,^òU”._ó$ð3@÷öí¥ÆØ�¨7BÙ+B^,àÛN^òU”.Ä"ó$ðF@÷öí¥ÆØ�¨((Ù+B^6àT7^òU”.Pó$ðä@÷öí¥ÆØ�¨((Ù+B^6àT)^òU”.Wó$ðþa@÷öí¥ÆØ�)Ú,ÙT^+à(,N^òU”.Pó$ðc@÷öí¥ÆØ�)Ú,ÙT^+à(,)^òU”.œó$ð'@÷öí¥ÆØ�)Ú,ÙT^+à‹2^òU”.(¡ó$ðc@÷öí¥ÆØ�Ú™Ù2(^Nà8B^òU”.ró$ð6@÷öí¥ÆØ�Ú�Ù2(^+à‹6^òU”.(Pó$ð6@÷öí¥ÆØ�Ú7BÙ2(^6à¥B^òU”.(Wó$ð,@÷öí¥ÆØ�Ú(NÙ2(^)à»7^òU”.¡ó$ð@÷öí¥ÆØ�Ú(NÙ2(^)à,)(^òU”.Wó$ð'@÷öí¥ÆØ�BX+Ù“^NàÓ^òU”.Pó$ðO@÷öí¥ÆØ�BX,Ù“^2àN8B^òU”.Wó$ð$@÷öí¥ÆØ�BX,Ù“^2àS)^òU”._ó$ð/@÷öí¥ÆØ�BX6Ù“^,à+2(^òU”.Wó$ð8@÷öí¥ÆØ�BX)Ù“^8à26B^òU”.¡ó$ð@÷öí¥ÆØ�BX)Ù“^8àè^òU”.aó$ðO@÷öí¥ÆØ�B((NÙ“^XàÆ,^òU”.Wó$ðD@÷öí¥ÆØ�B((NÙ“^Xà828^òU”.ió$ð8@÷öí¥ÆØ�B((NÙ“^Xà8,2^òU”.hó$ð0@÷öí¥ÆØ�B((NÙ“^Xà8,)^òU”.(ró$ð@÷öí¥ÆØ�BãÙÅ^(à]^òU”.œó$ð0@÷öí¥ÆØ�BãÙÅ^(à)7^òU”.ió$ðƒ@÷öí¥ÆØ�B`+ÙÅ^Nà()+^òU”.(ró$ðD@÷öí¥ÆØ�B`2ÙÅ^+à‹7^òU”.Pó$ð#@÷öí¥ÆØ�B`,ÙÅ^2àÖ,^òU”.Wó$ð'@÷öí¥ÆØ�B‹7ÙÅ^BàGN^òU”.Pó$ðä@÷öí¥ÆØ�B‹7ÙÅ^Bà6(6^òU”.Wó$ðƒ@÷öí¥ÆØ�BS(ÙÑ^(à,8^òU”.œó$ðO@÷öí¥ÆØ�BS2ÙÑ^+à(6(^òU”.aó$ð’@÷öí¥ÆØ�B+XÙÑ^Bà¯+^òU”.ró$ð/@÷öí¥ÆØ�B+XÙÑ^Bà,Å^òU”.Wó$ðL@÷öí¥ÆØ�BT2Ù¥^+à()6^òU”.ió$ðL@÷öí¥ÆØ�BT,Ù¥^2à©(^òU”.Pó$ð@÷öí¥ÆØ�BT6Ù¥^,à+À^òU”.œó$ð/@÷öí¥ÆØ�BT6Ù¥^,à+“^òU”.(ró$ð¹@÷öí¥ÆØ�BTBÙ¥^)à»(^òU”.Wó$ð0@÷öí¥ÆØ�B2XÙ¥^Bà66B^òU”.Wó$ð1@÷öí¥ÆØ�B2(NÙ¥^Xà8S^òU”.Pó$ðR@÷öí¥ÆØ�B2(NÙ¥^Xà8,+^òU”.œó$ð0@÷öí¥ÆØ�B2(NÙ¥^XàÒ(^òU”.hó$ð8@÷öí¥ÆØ�BèÙ26^(àS^òU”.Wó$ðL@÷öí¥ÆØ�BÜÙ26^,à+)2^òU”.ió$ð@÷öí¥ÆØ�B˜8Ù26^6àT7^òU”.¡ó$ðŒ@÷öí¥ÆØ�B˜BÙ26^)à6((^òU”.hó$ðR@÷öí¥ÆØ�B˜BÙ26^)à]+^òU”.(¡ó$ðŸ@÷öí¥ÆØ�B,(NÙ26^Xà8)+^òU”.(ró$ð3@÷öí2])Ø�â•()Ù6,^+à,©^òU-11(¡ó$ðR@÷öí2])Ø`77{ÀÙ86^)à(Ö6^òU-11X"ó$ð#@÷öB)UÀáØ�Ó7Ú(Ù—^+à`8^òUy7£()6,+fO(f``£<*1U(£Ÿy7£‹+Bf<<5#£(6+ÓB’y7£ÀÇ7³8NÅ£(N26ÚB2£O(y7£©¯,f8AºcU5*Æy7£+(,�f0JL=>…;n0dÿæ,F(FB+)“,N-8+£)�Ó{,y7£+À+f$*$£28—B�y7£,N)(fª>$*$£28—B`y7£,N)(fª>$*$£28+¥(Ÿy7£,N)(fª>$*$£,,,®N’y7£,—2f¹$9*£Ä’y7£G)2f/B£L.A<9;!£‹82826(£Oy7£G)2f/B£L.A<9;!£‹828,Û£Oy7£G)2f/B£L.A<9;!£+Ñ+)86£O8y7£G)2f/B£L.A<9;!£66)+),,£O(y7£G)2f/B£L.A<9;!£682(“N£O(’y7£G)8fc0 £�Ÿy7£8N)8f1!=¹£1e1ñ4<£+26BO(y7£ÒÄf1!=¹£“‚y77y7zy7•y‚y‚6y‚’yzyz¶y™y™Ÿy™’y�y�Ÿy�8y�’y{y{8yxyx7yx•¥yx7)+,y•y•‹Æ7y•’y7’y7)7y7)8y7¨y7¶y7By7áy7áUB)8þÚy7áUÓN6y7ây7í‚“y7íz(,y7í¥Æy7í2]’y7B’y7B)UÀáy(yXyX’yX¶y((y((y(Ÿy(y(y(¥y(,y(6y(]y(ÇyÄy(’y(),y�y�,,yŸy`y‹y‹y‹¶y¬y¬’yÀyÀ’yNyN26ÚBy©yN6yN68yN8yN8¶yN’yÖyÖ6yySyS7ySyS8y+(y+Ÿy—y+y+,y+,(y+,8yÛyÛŸyÛú¯]yÛºy+8y+86y+Òy+’y+)6y+)6´Ÿy+¶yyTyT7y2(y2�y“yÅyÅ7‚yÅŸyÅú(S7yÅúèŸyÅyÅ6yÑyÑŸy¥y26y266y28y2’y2)y¯y¯6y2 y,y˜y,(y,(y,(,y,Ÿy,‹y,‹U+8,8y,‹UTB,y,¬y,¬UÀBþÚy,©y,©UT™y,©UT((y,N8y,y,Ûy,ÛUÔ7y,y,T8y,2(y,,y,»y,»UÜ’y,,8y,,8U8+Äy,,’y,,)UBŶy»y,8y,®y,®U7)Ñy,Òy,’y,¨y,¨UN)6(y´y6yGy6(y6((y6((U—¯y]y6y6+ÓB’yÇyÇy6,y66y68y68+(—¶y6’y6¶y8y®yÆy8Ÿy8N]y8y8y82(y82(U2),8y8,y8,(y8,(U(,Òy8»y8»U™,8y86yÒy8’y8)8y8¶y8Úy’y)7y)7’y)7¶y)(y)XyÏy϶y)y)y),y)6y)6(y)6(U`+Ÿy)6(U`Ty)6(U`´y)6(U`68y)Çy)ÇUS+,y)6,y)6,U8Ç’y)6,y)68y)68UÒ,y)8y)®y)8,y)8,U,)8¶y¨y¨(y¨,y)¶y)By¶yÚyÚŸyÚyÚ8yÚ¶yB(yB(6yBŸyB`yB©yBN66,(yByBSyB+ŸyB+yB+¶yByB¥yB,yB,’yáyáyá,yá6yá8yá’yá¶yâyâ7yâ(yâŸyâNY4'ž#4-1=bR;¤QU¤-m[!pÂL-…^ „5'ɱ×yâyâ+Y4'ž#4-1=bR;*¿§#b3$AEl9/ „E î>=KoYË'04'±3Y'5 AK\š ŠÍ|<9 j!ºÐyâyâ,yâ6yâ8yâ¶yB’yB)7yB)(yBÏyB)yB)yB),yB)®(yB)®yB)®,yB)®8yB¨™yB¨7¶yB¨((yB)Ú,yÓyÓ7yÓ7U7)U‚yÓ7™yÓ7�yÓ77¶yÓ‚ŸyÓXyÓX,yÓX6yÓX’yÓ((ŸyÓŸyÓãyÓ`yÓ`yÓ`,yÓ‹7yÓS(yÓSyÓ+XyÓTyÓT,yÓT6yÓT¶yÓ2XyÓ2(ŸyÓ,yÓèyÓÜyÓ˜8yÓ˜¶yÓ,(ŸyÓ6yӮƒyÓÆX(yÓ’yÓ¶yÓÚèyÓÚÚ(yÓBXyÓºy5yþgþ4Ÿ``7`77`77‚(,`77{À`‚`‚�(,`‚x`zz‚`z{`{`7’`7)U{`7¶`7B „$'5 pÂ#q#€�JL=>… k#~$$1=q#›Î5‰$ך \$'5…I Y°>…›j!m#$AŒãã7ãŸãú{U�ã`Tãã,ã6ã8ã8UXU((ã’ã¶`Ÿ```‹`‹b�¤fvŠŠŠ ¾$[4~JL=>… k# �.Al€u.};�Iؾ��uÙ`¬`À``+Ÿ``T`“`26`,`,Ÿ`,úÑ6`»`´`´U2)(þÚ`6`68`6’`8`8Ÿ`8úÿq8`8`86`Ò`’`¶`Ú`B(`BŸ`B’‹‹7‹�+‹(‹Ÿ‹À‹‹—‹+8‹+¶‹‹,‹6‹68‹68U)+´‹8‹82826(‹828,Û‹’‹)¯‹¶‹B‹B2U,+,8‹B2U,Û,‹É¬¬7¬‚¬‚U“86¬{¬(¬X¬XU¯6’¬(,¬Ÿ¬¬¬2(¬,¬6¬8¬’¬¨¬¨U828¬¨U)x¬¶¬B,¬B,UB©¬B,UBN]ÀÀ7À�À�U6Ò,À7’À(ÀŸÀN’ÀÀÀ,À6À]¯¶À]ÿqÀÇÀÇU((),ÀÇU(,2(ÀÇ7À8À’À¶ÀBŸÀáÀBºNNTNT(NT,N2(N2(N“NÅNÑN¥N26N28N2’N2)7N¯N2 ©©7©(©(©(2UBN¨©(2UB+(’©Ÿ©©+8)+T©+¶©©¯,©,©6©8©’©¶© N6NGN6(N]N6NÇNÇ(NÇ(U—+8N6,N66N6]N6]UÓBŸN68N68ŸN6’N6)N6¶N6âÏÑN8N®N®ŸNÆN8ŸN8N8N8,N8èN86NÒN8’N8¶N’N)7N)(NÏN϶N)N)N),N)6N)6(N)ÇN)8N)8N“8N)82)7¶N¨N)¶N)âÏ,(ÖÖ7Ö(ÖŸÖN’ÖÖ+(NÏÖÖ,Ö6Ö8Ö’Ö¶ÖBN#SS7S(S(6SŸSSSS+,SS,S6S8S’S)´S)ÚÆ(S¶+(+X+((+((Ÿ+(Ÿ+(+(+(“+(,+(,�+(6+(6,+Ä+Ä+Ä6+(’+()+,,’+(¨+�+Ÿ+`+‹+‹Ÿ+‹+¬+À+À+À¨+N+©+N6+N8+N’+N),+Ö——7—(—Ÿ——+8——¯—,—»—6—6’—8—’—¶—Ú++T+T(+2(+“+Å+Ñ+Ñ+)86+¥+26+26BO(+28+2’+¯+¯¶+,+˜+˜BŸ+,(+,Ÿ+,+,+,“+,,+»+»’+,8+,8º+,’+´+´7+´ÛêÛ(ÛX6Û(ŸÛŸæÛÛ,Û6Û8ÛÒ+)¶Û’Û¶+8+®+®7+®©26+®+®¶+Æ+8Ÿ+8+8+8,+8,8+86+Ò+8’+8¶+’+)7+)(+Ï+Ï8+)+)S+)+),+)Æ+¨+)¶+¶+Ú+B(+BŸ+B++B+B,+á+â+B’+ÓTT7T™T7’T(T((TŸT`TTT,T,T6TGT6,T8T8,T’TB,TÓ2(2X2((2((2((,2(Ÿ2(2(+(2(2(,2(,,2(62Ä2()2�’““7“‚“(“Ÿ“À“““,“6“8“86“’“¶ÅÅ7Å{ÅŸÅ6Å6’Å8Å8ŸÅ’ŶÑÑ7Ñ(ŸÑÑÑÅÑ,јÑ6Ñ86Ñ’Ñ)7Ѷ¥¥7¥(¥Ÿ¥`¥¥¥8¥Æ¥86¥’¥)6,8¥¶¥B,262G26(2]2]’H‹‚zH‹‚™H‹‚�H‹‚{H‹‚xH‹‚•H‹‚XH‹‚((H‹‚(ŸH‹‚(H‹‚(,H‹‚(6H‹‚ÄH‹‚(’H‹zzH‹z™H‹z{H‹zxH‹z7’H‹z7¶H‹zXH‹z((H‹z(ŸH‹z(H‹z(H‹ÞŸH‹ÞH‹Þ,H‹Þ6H‹Þ8H‹Þ’H‹™XH‹�xH‹�((H‹�(H‹�(6H‹{zH‹{™H‹{�H‹{{H‹{xH‹{•H‹{7’H‹{7¶H‹{((H‹{(ŸH‹xzH‹x™H‹x�H‹x{H‹xxH‹x•H‹x7’H‹x7¶H‹xXH‹x((H¬‚™H¬‚�H¬‚{H¬‚xH¬‚•H¬‚7¶H¬‚XH¬zzH¬z™H¬z�H¬z{H¬zxH¬z•H¬z7¶H¬zXH¬z((H¬z(ŸH¬z(H¬z(,H¬ÞŸH¬ÞH¬ÞH¬Þ,H¬Þ6H¬Þ8H¬Þ’H¬™((H¬™(ŸH¬�zH¬�™H¬��H¬�{H¬�xH¬�•H¬�7¶H¬�XH¬�((H¬�(ŸH¬{zH¬{™H¬{�H¬{{H¬{xH¬{•H¬{7’H¬{7¶H¬{XH¬{(ŸH¬{(H¬xzH¬x™H¬x�H¬x{H¬xxH¬x7’HÀ‚zHÀ‚™HÀ‚�HÀ‚{HÀ‚xHÀ‚•HÀ‚7’HÀ‚XHÀ‚((HÀzzHÀz™HÀz�HÀz{HÀzxHÀz7’HÀz7¶HÀzXHÀÞŸHÀÞHÀÞHÀÞ,HÀÞ6HÀÞ8HÀÞ’HÀÞ¶HÀ™XHÀ™((HÀ�zHÀ�™HÀ��HÀ�{HÀ�xHÀ�•HÀ�7¶HÀ{™HÀ{�HÀ{{HÀ{xHÀ{•HÀ{7’HÀ{7¶HÀ{XHÀ{((HÀxzHÀx™HÀx�HÀx{HÀxxHÀx•HÀx7’HÀx7¶HÀxXHÀx((HNTXŸHNTXHNTXHNTX,HNTX6HNTX8HNTX’HNTX¶HNT(XHNT((ŸHNT((HNT`HNT`HNT`,HNT`6HNT`8HNT`’HNT`¶HNT‹7HNT‹(HNT‹HNTSŸHNTSHNTSHNTS,HNTS6HNTS8HNTS’HNTS¶HNTTHNTTHNTT,HNTT6HNTT8HNTT’HNTT¶HNT2((HNT2(ŸHNT2(HNT2(HNTÿqHNT˜HNT˜HNTÔHNTÜHNT˜8HNT˜’HNT˜¶HNT,XHNT,((HNT,(ŸHNTGŸHNTGHNTGHNTG6HNTG8H©‚zH©‚™H©‚�H©‚{H©‚xH©‚•H©‚7’H©‚7¶H©‚XH©‚((H©zzH©z™H©z�H©z{H©zxH©z•H©z7’H©z7¶H©zXH©z((H©z(ŸH©ÞH©ÞH©Þ,H©Þ6H©Þ8H©Þ’H©Þ¶H©™XH©™(ŸH©™(H©�zH©�™H©��H©�{H©�xH©�•H©�7’H©�7¶H©�XH©{zH©{™H©{�H©{{H©{xH©{•H©{(H©xzH©x™H©x�H©x{H©xxH©x•H©x7’H©x(ŸH©x(HNÁzHNÁ™HNÁ�HNÁ{HNÁxHNÁ•HNÁ7’HNÁ7¶HNG`HNG`HNG`6HNG`8HNG`’HNG`¶HNG‹7HNG‹HNGSŸHNGSHNGSHNGS,HNGS6HNGS8HNGS’HNG+XHNGTŸHNGTHNGTHNGT,HNGT6HNGT8HNGT¶HNG2((HNGÿqHNG˜HNG˜HNGÔHNGÜHNGGŸHNGGHNGGHNGG,HNGG6HNGG8HNGG’HN®XŸHN®XHN®XHN®X,HN®X6HN®X8HN®X’HN®X¶HN®(XHN®((HN®`ŸHN®`HN®`HN®`,HN®`6HN®`8HN®`’HN®‹,HN®SŸHN®SHN®S,HN®S6HN®S8HN®S’HN®S¶HN®+XHN®TŸHN®THN®THN®T,HN®T8HN®T’HN®T¶HN®2XHN®2((HN®2(ŸHN®ÿqHN®˜HN®˜HN®ÔHN®ÜHN®˜8HN®˜’HN®˜¶HN®,XHN®,((HN)‚™HN)‚�HN)‚{HN)‚xHN)‚•HN)‚7’HN)‚(HN)‚(HN)‚(,HN)z™HN)z�HN)z{HN)zxHN)z•HN)z7’HN)z7¶HN)z((HN)ÞŸHN)ÞHN)ÞHN)Þ,HN)Þ6HN){zHN){™HN){{HN){xHN){•HN){7’HN){7¶HN){XHN)x™HN)x�HN)x{HN)xxHN)x•HN)x7’HN)x7¶HN)xXHN)x(HN)x(’HÖ‚zHÖ‚�HÖ‚{HÖ‚xHÖ‚•HÖz™HÖz�HÖz{HÖzxHÖz•HÖz7’HÖÞŸHÖÞHÖÞHÖÞ,HÖÞ6HÖÞ8HÖÞ’HÖÞ¶HÖ™((HÖ™(ŸHÖ™(HÖ™(HÖ�™HÖ��HÖ�{HÖ�xHÖ�•HÖ�7’HÖ�7¶HÖ�XHÖ�((HÖ�(HÖ�(,HÖ{™HÖ{�HÖ{{HÖ{xHÖ{•HÖ{7’HÖ{XHÖ{(ŸHÖ{(HÖ{(’HÖx™HÖx�HÖx{HÖxxHÖx•HÖx7’HÖxXHÖx((HÖx(ŸHS‚™HS‚�HS‚{HS‚xHS‚•HS‚7’HS‚7¶HS‚((HSzzHSz™HSz�HSz{HSzxHSz7’HSz7¶HSzXHSz((HSz(ŸHSz(HSz(HSz(,HSz(6HSÞHSÞHSÞ,HSÞ6HSÞ8HSÞ’HSÞ¶HS™XHS™(HS�™HS��HS�xHS�7’HS�7¶HS�XHS�(ŸHS�(HS�(HS{zHS{™HS{�HS{{HS{xHS{•HS{7’HS{7¶HS{XHS{((HS{(ŸHS{(HSx�HSxxHSx•HSx7’HSx7¶HSxXHSx((HSx(ŸHSx(,HSx(6HSxÄHSx‹H+XXŸH+XXH+XXH+XX,H+XX6H+XX8H+XX’H+X`ŸH+X`H+X`H+X`,H+X`6H+X`8H+X`’H+X`¶H+X‹7H+X‹ŸH+XSŸH+XSH+XSH+XS,H+XS8H+XS’H+XS¶H+X+XH+X+((H+X+(ŸH+X+(H+X+(H+X+(,H+X+(6H+X+ÄH+XTŸH+XTH+XTH+XT,H+XT6H+XT8H+XT’H+XT¶H+X2((H+X2(ŸH+X2(H+X2(H+X2(,H+X2ÄH+X˜H+X˜H+XÔH+XÜH+X˜8H+X˜’H+X˜¶H+X,XH+X,((H+X,(H+X,(6H+XGŸH+XGH+XG,H+XG6H+XG8H+XG’H+XG¶H+X6XH+X6((H+X6(ŸH+X6(H+X6(H+X6(,H+ãzH+ã™H+ã�H+ã{H+ãxH+ã•H+ã7’H+ã7¶H+ãXH+ã((H+ã(ŸH+ã(H+``ŸH+``H+``H+``,H+``6H+``’H+`‹7H+`‹(H+`‹ŸH+`SŸH+`SH+`SH+`S,H+`S6H+`S8H+`S’H+`S¶H+`+XH+`+((H+`+(ŸH+`+(H+`TŸH+`TH+`TH+`T,H+`T6H+`T8H+`T’H+`T¶H+`2XH+`2((H+`˜H+`˜H+`ÔH+`,(H+`,(,H+`,(6H+`,ÄH+`,(’H+`,�H+`GŸH+`GH+`G,H+`G6H+`G8H+`G’H+`G¶H+`6XH—‚zH—‚�H—‚{H—‚xH—‚•H—‚7’H—‚7¶H—‚XH—‚((H—‚(ŸH—zzH—z™H—z�H—zxH—z•H—z7’H—z7¶H—zXH—z((H—z(H—ÞŸH—ÞH—ÞH—Þ,H—Þ6H—Þ’H—Þ¶H—™XH—™((H—™(ŸH—™(H—™(,H—�zH—�™H—��H—�{H—�xH—�•H—�7’H—�7¶H—{™H—{�H—{{H—{xH—{•H—{7’H—{7¶H—{XH—{((H—{(ŸH—{(H—{(H—{(,H—{(6H—{ÄH—{(’H—{`H—xzH—x™H—x•H—x7’H—x7¶H—xXH—x((H+TXŸH+TXH+TXH+TX,H+TX6H+TX8H+TX’H+TX¶H+T(XH+T(((H+T`ŸH+T`H+T`H+T`,H+T`6H+T`8H+T`’H+T`¶H+T‹7H+TSŸH+TSH+TSH+TS,H+TS8H+TS’H+TS¶H+T+XH+T+((H+TTH+TTH+TT,H+TT6H+TT8H+TT¶H+T2XH+T2((H+T2(ŸH+T2(H+T2(,H+T2(6H+T2ÄH+T2(’H+TÿqH+T˜H+T˜H+TÔH+TÜH+T˜8H+T˜’H+TGH+TG,H+TG6H+TG8H+TG’H+TG¶H+T6XH+èzH+è™H+è�H+è{H+èxH+è•H+è7’H+è((H+ÿqzH+ÿq™H+ÿq�H+ÿq{H+ÿqxH+ÿq•H+ÿq7’H+ÿq7¶H+ÿqXH+ÿq((H+ÿq(6H+ÿqÄH+˜SŸH+˜SH+˜SH+˜S’H+˜S¶H+˜+XH+˜+((H+˜+(ŸH+˜+(H+˜TH+˜TH+˜T,H+˜T6H+˜T8H+˜T’H+˜2XH+ÔzH+Ô™H+Ô�H+Ô{H+ÔxH+Ô•H+Ô7’H+Ô7¶H+ÔXH+ÜzH+Ü�H+Ü{H+ÜxH+Ü•H+Ü7’H+Ü7¶HêX(HêXŸHêXHêXHêX,HêX6Hê`ŸHê`Hê`Hê`,Hê`6Hê`8Hê`’Hê`¶HꋟHêSHêS,HêS6HêS8HêS’HêS¶Hê+XHê+((Hê+(Hê+(Hê+(,HêTŸHêTHêTHêT,HêT6HêT8HêT’Hê2((HêÿqHê˜Hê˜HêÔHêÜHê˜8HꘒH꘶Hê,XHê,((Hê,(ŸHê,(6HêGHêG,HêG6HêG8HêG’HêG¶Hê6XHê6((Hê6(H+®XŸH+®XH+®XH+®X,H+®X6H+®X8H+®`6H+®‹6H+®+XH+®+`H+®TH+®2ÄH+®,((H+®,ÄH+®G6266’26’26¶282®’28N828—B�28—B`28+¥(Ÿ282828´28GŸ28’2’2)(62)(º2)Û2),˜2),82)8Ÿ2¨¯¯¯S¯]¯6’,˜˜7˜{èèŸÿq7ÿq8Ô7Ô,Ü’˜8,(,X¶,(—,(+8,(,(6,�,�,�,,Ÿ,`,‹Ÿ,Àº,©,NG,N)(,N),Ö,,S(,S6,—,+Ñ,+,8,Û,,Û6,+8,,Å,Å6,ź,2)6,,,Ü,,Ÿ,,—,,,®N’,»’»»7»�»(»»,»,’»6’»’»)¶»Ú»BŸ,8,Æ(,8N’,8)8,’,)77,)�,)x’,)(,)2’,)8¶,)¶´´X´¬´B,F(FB+)“,N-86GGŸG)G)86(6((6(N’6(6(,6(66(Ï]](,]]26],]8]8]8¶66+(6+Ä6+,º6+)º6+B(ÇÇŸÇ+,ÇÑÇ)66,6˜6,(’6»’6,Ò6666+¶66)+),,66¶686Æ,6868+8682(“Ÿ6Ò6Ò,6’6)(S6Ï,6),6)86¶6BX6B+,6á78®®T8®,Ÿ®®ÆÆÛÆ+’Æ,Æ6(8Ÿ8¬8N6(8N)88ÖŸ88S8+Ä8+¥8+,Ÿ8Û8ê8æ8+Ï8+)88Å88288288,8˜¶8,(68,8,8,“8,˜8»8»Ÿ8,’8´8686(’8]786—8Ç’ÒÒ(ÒÄÒNºÒ“Ò,Ò6Ò]ÒÏ8’8)8),(8)868¶8Ú8â118Aºc’)7)™)�Ÿ){’)x)x)()()7)�Ó{,ÏÏ+(Ï+¶ϯϘÏ]))S7)+˜)+´))T6)T¶)“7)Ñ)28Ÿ),),)8)´Ÿ)´¶)6)6(’)Ç()6,()6)6)6B()6Ó)8)Æ6)8+,¨¨¨)¶)B+B()B¯,)áŸ)Ó,) ¶ÚÚN’ÚB(B(SB(¨BŸB©B©BN]BN¨BBS7B)(B+XB+(’B+ÑB+)6BBT(BÅ,BŶB2¨B¯6B,ááXá(á+Ÿá2’á®á)7ââÄâ“âÅâ8â’â)zSÖ)(©â)(T`á+N8â)S+X6B)zâ)S+X6B)�â)—�(�,Tâ)—�(�,,8â)—�28Á’â)—�28G©â)—�,)x8’â)—�,)x),â)—�6)(Ö7â)—�6)(S6â)—�®T68â)—�®T8â)Û“S),)(â)Û“S)´’â)Ú2)(NÆ7’â)BNÇ´8,)8â)BNÇ8´´6â)BNÇ8Ó+(’â)BNÇá‚(â)á6ê�¬B’B)(ŸB),B)8¶B)8ºÓÓN6ÓBŸÓÓ‡¼ t.F|‰†s0›V?ˆIkL~=4-[Y°>… ul=K'e¼ t.F|‰†s0 �Ë.Fµ.J Õ9Z9 !V3? ÕEcD¼~3'¸5›V?ˆIkL †s!O€ÎKÂ#I§/JA t.F|$A51-9Z �K-F”\¼~3'¸ñAb3AEl9/ t” k# à5 ý'=�D¼~½lq#-1š ¢g½Ì3p*ZKEI¤$­/>м~‰1;K.­›V?ˆIkL kF<$d<…#…KÂ#IkL ¢Ã£g¿î!$<°>… ul=K'e¼~‰1;JšY!­±3 ÿí.1LU4?1! �Ë.Fµ.JI j9!.5 î$$*#\IkL „l j$ uQA'-¦ �Kƒ¼~‰1;Jš ¢²!-*-F.|4?šbFɱ04IÕl9 j9!.5Y$'5… �½'/>4D¼~‰1;Jš ¢²!-*-F.|4?šY?#$1 I§#ksA[€§5n0dI„E ŠÍ[!=oY?#$1 D¼~‰1;Jš jR$Y?¸/IkL Õ!.A9·t$$dQ †s!OV¼~‰1µ=pÂ/Ì5? „EpÂ-0n­ �K-F”!Y!;mo¿v¿�\.A#¼~‰1µ=pÂ/Ì5? „EpÂ-0n­ �K-F”!Y!;mo¿vv¿ŠOV'¼~‰1µ=Ut”5½'e „E ì!?RE*pžºoš ‘!R<1-1=D¼~Ee3q#š t.F|$A±19Z �K- Šd/>4I„E àpb î>=V.ª „.dQ-¦/>4Y?¸/¼~$É$ž3 „E ŠOV'Ko †s!O€g?¸/D¼ �K-YË'04'e „E †s!OV¼ �!°ˆJ j9!E†Z „$'#*q# „Epžºo¼ �!°ˆJ j9!E? ô�Rš ¢ ø× †s!O€gl'¼ �!°ˆJ j9!E? ô�Rš ¢ ø× †s!O€gl'q#^› k1=q#I²\!;mb11 -m¼ �0s/[Q4 „'#0×pžº „EY?¸/ ŠOV'¼ �$ˆ¼ �s33›α0n… A±/ „E k#|#! †s!OV¼ „3$R~9;4 „Epžºo Õl9b j9\-'5'D¼ „E/K „E ¢g4Q*;*.ª~lq#š t$ 'F|<9›Ã#1'F|<9 �½'/>4D¼ „±/!REc „E ¢g4'*?š Š/=Ao ‘†REc j!m#$AŒ¼ „'ªª?Y†~9;-0Â.ªq#špÂ-0×pY°>nLZ \!;m¼ „'ªª?Y† j9!E?b11 -m j$=.$*Z€t[*o �!°ˆJD¼ î>=€„E/'3q#š t±*LE*üg �Ë.Fµ.J^ ¢î±19Uks>·*b11 -m¼ î>=€g4Kn0€¤$ž3 „E ŠÉ./Ko „µ'e �!éu!­3IkL �K-Ut”! Ãn|ªq# Õl9[› †s!O€k5AQ.ª¼ î>=€g4Kn0€¤$ž3 „Ep0e”o ŠLLZ�#0?›*~JLï>…pQ'€�K-~d0×Y?¸/Ij9 'A9Y-/1|ͼ î>=€j9!E?š t.F|‰†s0›k =~'/'3K.­b*OQ4-¦5½\ D¼ î>=V.ª~J…14'€�!­3$1/>4 „E ¢§#V?ˆI§#„3$Rš¼ î>=V.ª „3$Rm;4 „E ¢Ã š k²tvjþ^þ$›k = k#U|#!pÂ-0n­ t.F|$A±19ZY!;mY?¸/D¼ «.A93?b<<½Ìn­ �½'/>4 †s!O€g?¸/¼ ì!?RE*Y?¸/ „EY/V3~>ÂD¼ u.};? ‘†REc$ž3¼K9!/KZ€¤$ž3 „E~‰1;Jš t.F|$A±19Z �K- t”\¼!”'eš~3”I�J…#Ëq#p t.F|‰†s0D¼†VQA'-¦ „EY?¸/KZ \!;m k# «'é~‰/'#Zq# ôÌ ‘K'±3 uQA'-¦¼†K9!E? „E ¢�!­3$1/>4šbY°>…š¼†9$„E;n×o ¢¾$'5#€ul=K'e¼†9$„EY4'*?opÂ0Ee3K~.50'3q#KÂ#I u.};?Y?¸/D¼$ž3 „Eb Õ!.A9·²†s!O€g?¸/¼$ž3 „E ¢g4$11o t!9-O.Eš à5IkL k#|#!Y?¸/D¼$ž3 „E ÕE*~3'¸ñA¼'3nL-…·¤Z€�K-Y?¸/›k#! *'04^ ¢ žºU«Q*F$$cš k4$4$ºZb¦#4D¼'3nO;Ì·Y4Kn0€§#V?ˆIkL ¢Ã šbY°>nLZ~‰1µ= t”~'5e#4U§R;>\I ø× †s!O€g?¸/¼ ‘!.3¼ ‘!R~‰1;J t†R!>~J­#×€ žºo ؤŠ�u§²gÙ›*bµ‰KZ j!º45½\ˆÍ Øg¤§²jÙ¼ ‘!R Š*lE „E ¾§gvg¼ ‘$4q# „E �\0sFo ¢�‰1J>4IkL u.};?Y?¸/D¼ ‘$·bF$µY°>… \!;m¼ ‘$· k# ÿéÿèþMgm;|#\<ÿéÿèþ›ÿéÿèþMv/1-04ÿéÿèþ¼ ‘$· k#›pÂ#q#€ O.Fd~d¦ „E ŠºmQ¦¼ ‘$· k#~'/'3K.­b*OQ4-¦ �Ë.Fµ.JD¼ ‘$· k# ¢¤K9!/KZ€t”š ¢guv�pžº¼ ‘$· k# ¢Ã š ‘!;\4 ‘!.A9FEI„E v/1d/>nÍYod u[c-¦ �½'/>4~3”ˆLZq#D¼ ‘$­39.3$<$19? „E ¢�\.A#šY4E-¦›²†s!O€g?¸/I§11 1sK! „E ¢ÿéÿèþ:®ÿéÿèÿïg¼=<1!0n­ k#Y!0J*;?b0……b0nOl�I Y/V3~$'#Ë�<^ ¢�”!š v<±È¼ F-F.|ÉZb11 -m j$bµ‰KZ ì!?RE*pžºo¿Î;4 v¿k# ¢�Ë.Fµ.JšY1!°V4? ÕE*I b j!m#Z€ul=K'e¼ F-F.|ÉZb11 -m j$bµ‰KZ ì!?RE*pžºo¿Î;4 vv¿§#b3AEl9/ „E F-F.|ÉZpžºo¼ F-F.|ÉZb11 -m j$ †s!O€ Y?¸/IÕl9 t$$dQY!;m !ä'\4 „E/'3q#D¼ F-F.|ÉZ$ž3 „E ¢�Ë.Fµ.Jšbµ9E<9.1D¼ F-F.|ÉZ j9!E?špžºo›*Y./.3;l?!”'e t” k#~l›*~lo �½'/>4D¼ Fd/p †s!O€Õl9 „'ªª?Y†D¼ A±//opÂL-… „E~eKo �K-b00E*o j$ ¢gΧ² k#4$A�I§#¢k1>�lq#I�K-$ž3¼ Ae jR$ „E/IkL t±*LE*üIu-R¼ ÈÌF.|4? j9!E†Z~JÉ5'04 „Eb< <ˆÍ „3$Rp ‘†REcD¼ !1|0q#𠢑È4p j!-mo ÿéÿèþMt$ ˆž<ÿéÿèþ j9[co¼ !13? j$ $F=4š Õ!!c3? «.A9 �$  ,U„3'E$'±°3›u!'0$OE[bI§ N2U«$'5pL'ˆJpK�#4IÕl9b*OQ…*~E!04€�;°#‰ƒ¼Y½.$AZ€§11 -m j$ ¢�\.A#šY?¸/D¼Yµ.J j$ ¢§gvg „.dQ-¦/>4 Šº=°  ÃˆÍ �§üIÃuf(¼Y4K! j±#ˆ×›V?ˆIkL k#|#!Ug!!co t!9-O.E¼Y4Kn0€�!°ˆJ$ž3 „E=.$*Z€gÈ!0× „EbY1!°V.ª~>¼Y4'*?š «juôUvpL!0×›te”4~Q…5I jñï-*›j$F-A$¼Y4'*?šY4Kn0€¤!”'eI„Ee*ZnÍ j=/Iàj$pžº �½'/>4D¼Y?¸/KZ ul=K'e !O�R k# Õ.cïKƒ¼Y?¸/I§11 -m j$ ¢�\.A#šY?¸/D¼Y?¸/IŠOV'q#š ¢Š*'0q#€ ø×Y?¸/ „E k#4;.$¼ j-FdšY† j9!E? ‘$4q#D¼ j!m#.ä'! „E ŠOV'Kobµ‰KZ j=/~3'¸ñA¼ j!m#.ä'! „EJlEo à5 t!9-O.Eb4 ¢�‰1µ= j=/[€ ÂL-…¼ j!m#.ä'!š jR$Ug4-¦~3'¸ñAb11| j$ Š#O.5J/>4€§#*~.O.3 ŠÍ[!=o›²ÈK†9$*IkL~lq#›V?ˆD¼ j\4š t'0cüIÎs/! ‘'/F=~$*oYå/޼ j\4šY.A#.LZQ… „E ¢Õ9lRE �Ë.Fµ.J¼ j9!E?š j=/ v/1E4Q…pbµ‰KZ j!º4›V?ˆD¼ j9e<9²'db11| j$ ¢²†s!O€�!°ˆJ$ž3¼ j±#<3Ko~‰1µ=pÂL-… „E Š#*Uà5 k1=q#𠫆=$¦#!$'I²†s!O€g?¸/<¿v¿�\.A#¼ j±#<3Ko~‰1µ=pÂL-… „E Š#*Uà5 k1=q#𠫆=$¦#!$'I²†s!O€g?¸/<¿vv¿ŠOV'q#D¼ Ã#.­5<€g$'5… j9\-'5'I§I§~3”ˆLZq# î>=KE¼ ô=? Š;3? Õ;#oY?¸/ „E ¢²-1ï vž#nLZq#›j±#nLZ›j!m#Z€ ø×$|0Œ¼ ÕEcY4'*?š ¢²!O�R *'0×5½\D¼ ÿí.1LÌ#$ž3š›bµ‰KZ t.F|$A±19ZY?¸/^›b11|0q# j$Š�uv‘мw¼¿tw¼¿t=ËQ¼¿�$'A3”¼¿Šw¼¿„w¼¿î±9-/¼¿ìw¼¿¤-¹ï¼¿‘!.3¼¿ÎKs°ƒ¼¿²$F[¼¿Õw‡+8,/‡VF=nLZ ul=K'e‡¼«½›*YÈ!0n­ j±#<3q#IkLY°>nLZ›j!m#Z€¾$'5#€§5n0d<^ j9!.5~9;-0Ân0I§#Î$<ˆFde*Z4-F.|4Œ‡*-14‡*-1n­¼*-1n­ Š#O.5J/>4€¤Q-¦/>м*-1n­Y?¸/^ ¢g4'*?šßKÂ#ß›t!9-O.E‡*ž‡žä'-0Œ‡*¹'¸¼*¹'¸*b¦ �Ë.Fµ.J›v4I§11|0q# j$ v/1-04 „-04E›v//Ì0?pžº‡*/-)x‡*/[ˇ*/[ËK.­¼*/[ËK.­›„[Q°€§<1!04IkL~‰1µ=I Š*'0‡*/ˆF.|4Œ¼*/ˆF.|4?š �È!AK\ j$pÂ#q#€¤!†oD‡*$1ׇ*sQ¼*sQ‡*OQ…¼*OQ…„!F-0c†9$*I  †s!OV¼*OQ…¤K=Ì3D‡*OQ…D¼*OQ…I p·3|¦#4Y?¸/I§#*~‰1µo‡*OQ4-¦‡*OE‡=$*.¦É.­‡=J-µZV‡LL!0n͇LL.5/K.­‡L-?Q¼L-?Q‡Ls0ƒ‡L‡LÂ/K9‡A‡A-[ɇ¦‡¦#0Œ‡¦#4D‡AAeAKއA±L.$nD¼A±L.$nD‡A±RV¼A±RV‡As0'34'±3‡AsD‡ï‡ï‡ïD‡.c$'¼.c$'‡[\¼[\‡.5¼.53µ.J j!m#Z€ ø× ‘†REc^b !Ob11 -m‡.R!.¼.R!.‡¹.L='c޼¹.L='cއc-ž/1=.$*?cƒ‡ccQ-¼ccQ-‡3‡3ƒ¼u§ î3$<<;?š u.};?›*Y°>…¿�9Z-A$ß vu^b/=ZQ u.};?b<<½Ì×ÿà �)+^ N¥1£ß þ~˜‡3-[¼3-[‡3Q¼3Q¼3Q Šw¼3Q Š*R;¼3Q „w¼3Q uw¼3Qw¼3Q w‡3”*-.5¼3”*-.5 ¾¿îw‡3F=м3F=м3F=4 tw¼3F=4 «w‡3}!m4 #¼3}!m4 #‡30$9$|!p kO;Ì#~Q…5¼3d|0 v/FVQ…p ¢�3J€ŠOµ.Jš ÉK!~;°#‰ƒ‡3d#¼3d#‡3dOÌ·‡33½Kއ33½Ko‡33½¼33½q#š \$'5…I ›Y?¸/‡3$AEl9/‡3J<$‡319ƒ‡3‡3¼3 î”ËZ Š1l9ÈÌ3~È3 ì[†ZI[«ÈZ$F-0Â?3E.U§<<½Ì·*p·É[€¤†-13”Ì^ v/1|0q#I„E î”ËZ~;°#$¦#\‡3Â#K.­‡3Â#K.­D‡34ûþ+D¼34ûþ+D‡3O;!ª¼3O;!ª‡3O[¼3O[ Šw‡é¼é‡/=Zƒ‡/=ZQ‡/.‡/Zc¼/Zc‡/JA‡/E19$'D‡/Œ¼/Œ‡#¼#b0ä'l.JI�!°ˆJ$ž3 „Eb0-ž/Z u.};�D¼#b3AEl9/ „E~‰1µo~Ee3q#Ks…D¼#b319-U‘'/=ZY4E-¦›²†s!O€g?¸/¼#›V?ˆIkLQ'€�.50'3q#Y?¸/I„Eb0-ž/Z u.};�D¼#›V?ˆIkL ¢�.LL=>…It†R!> �>ˆ4?UkLUà Qco›²-RUà Qcoš u.};? ¾$'5#€Ã ¼#›V?n0€¤$ž3šb u.};? ‘†REc¼#b11|0q#šQ-¦s€�$Éb00$'#nÍ j$bY°>…~>¼#b11 -m j$b<<½Ìn­ †s!O€j9 'A9 ¢j9!E?š „'ªª?Y†D¼#b'*.$A±19ZY?¸/ „EYÈLU É5'0×¼#bµ‰K~'5e#4U§R;>\Ig=OZ! „E'F|0 u.};�D¼#bµ‰KY4E-¦›²†s!O€g?¸/ „E~|#Z€Î9;/-…µZ€²\!;m �½'/>4D¼# Š0J‰Z›V?ˆIkL ¢�!é„EY°>nLZ ¾$'5#VD¼# Š0J‰Z q#V! „E-¦›*Y'F/ˆJ~9;¦It?b0-ž/Z ¾$'5#VD¼# Š0J‰4üg !Ld0×Ik#›pÉlµ! „E ¢§*OQ…*Y4'*?šY°>…¼# Š/1.s0€Šº-/[q#š t±*LE*üIu-R›¢g0KÂošY°>nLZ ul=K'e¼# Š/1.s0€Šº-/[q#š u$4c-üIu-R¼# Š/1.s0V3? î '#ž¤$ž3š ¢§*$1ךp·3d04'€j!m#$A�D¼# ŠOV'q#špžºZ'I§#¤Š�u§²gp ¢„�3*š k19 V/$AŒ¼# ŠOV'q#š ¢²9!'/K$A?~$­±¦špžºZ'<¿§e|/[;? !1Eм# ŠOµ.J;?b11 -mpY?¸/Ig°>…¼# Šº-/[q#š �.LL=>…It†R!> jR$Y4'*�IkL «.A93?~l k3Î-1=D¼# Šº=° p~‰1µ= „.dQ-¦/>м# Šº1=./>4p �Ìd0n0Y?¸/D¼# Šº1=./>4ppžº j=/ „eä'>0Œ¼# Šº1=./>4p ‘†REco^ ¢u«‘�t� Šº1=./>4€�§v ‘†REcß �Æÿéÿèþÿ“�8,¼# Šº1=./>4 j$Y4'*? ¢Ã š t$$dQ#$4 u$AZ j$ v/1 ­ ¢Îe°ˆJšYÈ!0n­ � /[q#š¼# Šº1=./>4€�‰1;Jš ¢ŠLL!0n­#\IkL~‰1µ=I§#«'éI§Ig!;mpÂ/Ìs\¼# Šº1=./>4€„±/!REc „E kF 5Oo ¢ žºo5½\D¼#›V?ˆI�> ŠLL!0n­#\I�9eɉK9Œ¼#b11 -m j$ Šº-/[o �!­3$1/>4I › Š#=A? j!m#$A?^~$€î”.LZ¼#Y°>nÉüg ô�R k# ŠOOo j!m#$AŒ¼# j±#4€j!m#$AŒ¼#p­É.Aq#š �.LL=>4YËo~$*o†9$*D¼#p­É.Aq#š k#|#!Y!;å5 j±lI§#j9!.5 Èq#<9.1 j$Y!;m kµ0‰Ž¼#p­É.Aq#š ¢ôVïl?š t.F|$A±19Z~lq#D¼# k” Õ9=!Q? j±.3I� <<^ ¢v/1 F-Fd~½lq# ‘†REcIkLb'3n*°1|#޼# kF¹!04Ut” !ä'.e/>4I¤$ž|͆9$¼# k#|#!Y?¸/ „EbAAeAK!Y4K!›u½€§e- Š0J‰Z �Kƒ¼# k­5O�RšY½Ì3!”'eIkL‡#ƒ¼#- �w¼#- �.O[$‡#V$AŒ‡#V?ˆÍ¼#V?ˆÍY4'ž#4<ÿéÿèÿï àš !0Ežu!04'eIj9 'A9†9$*$AZ€jsQA'3‡#V?ˆD¼#V?ˆIkL �.e04E?Y!;mo¼#V?ˆIkLpžºo j=/I„E3”n0D¼#V?ˆIkLY°>nLZ ul=K'e j$b<ˆÉp Fd/YOo‡#V?n0V¼#V?n0€¤$ž3I„E u.};?3Q#o‡#V?ª=‡#-/E19D‡#Q¼#Qtw‡#‡#ž5…‡#\ \̇Í!¥8‡Íȃ¼ÍÈ-w‡Íûþ.d‡ÍÈ$¼ÍÈ$‡Í!RQ*·¼Í!RQ*·~9!/�‡Í.$¦#\¼Í.$¦#\›¤”4~È3 �>ˆ4? Õl9 j5?14”!b0nOl?p0e”!Y./'34Q!$'<3? Õl9K9$AZ€Î Ae<ˆJp tU…33 #JU«$*Ac[üIu?/19‰”‡Í.J޼Í.JއÍd‡#lƒ¼#lƒ¼#l- uw‡#c=¼#c=‡#c'5¼#c'5‡##¼## «w¼##Yw¼##U*./>ˆJ€²†s!O€¤$ž3‡##ƒ¼##ƒ¼##- uƒ¼##-;̇##޼##! tw¼##! Šw‡##$·¼##$·u4 $L�=0$<1E-Y1!°\ ØŠ1l9†I§ÿéÿèþÿ“tÙ �\0sF t?~£�9'11‡##'V‡#‰V$'D‡#$ =¼#$ = u$$cb4 k�u�üIÎ$·#n€„EY1!°€u.};�D‡#4<^Y‰!pL=>… �\0s1×I§#j!º4Ug!;mo †s!O€²\'34D‡#·…ž#4D‡# JŒ¼# JŒ¼# J? Šw¼# J? vw¼# J? ¾w¼# J?w‡#n94-/[\‡#n # ‡#n4'/E‡#4$[޼#4$[އ#4J[.¼#4J[.‡#4J.$¼#4J.$‡#4JŒ¼#4J? „¿²w‡#Œ‡11X‡11(Ÿ‡11>*.º¼11>*.º^ !13? j$ ¢Õ.3|-/I§#ì./b5n0d‡11d4J¼11d4J‡11|0¼11|0q#šb~d0×U�JË$ž3 „EY°>nLZ u.};�D¼11|0q#š$ž5# j!m#$A�Ij$pÂ|};? \$'5…Ug9;o ‘†REcD¼11|0q#š ý'!'!o ‘†REc$ž3Ij$ k1n/.ªq#š \$'5…b33½q# Õl9[ u.};�D‡11|0q#D¼11|0q#IkL'3n*./>ˆJ€g0Vo^~‰/>4 k# ÿéÿèþM§†9$„EY4'*?opÂ0Ee3K~.50'3q#KÂ#I u.};?Y?¸/<ÿéÿèþ‡11|¼11| t.F|‰†s0<^ ÈÍ~lq#›V?ˆI ¢¾$'5#€g'F/ˆJ5½\D‡113?o¼113?o î-/! j9!E? j$ u.};? ‘†REcD¼113?o ¢¤Q-¦/>4Ut?UkF¹!0n­Ij!m#.ä'!p›p*'És€u.};Œ‡11±V‡11 -m‡11 -åD¼11 -åIj$ „E!0”nÍ �!é*I„E u.};? ‘†REcY=OZ\¼11 -åIj$-m[! u!;#o‡11 1sKއ±FZ‡5F!l>‡5FE\…#D‡50Q¦3$¼50Q¦3$‡5m.­‡5m.Oo‡e¼e ‘K'epžº ¾$'5#VI§ ôVï t” „Eb0-ž/Zb< <4^bY4'*?šb0-ž/Z v/1-04›�5'1n­p#$Oq#b< <4 t” k# k1> t.F|$A±19Z†-*K-›*~lq# �Kƒ¼e j9=! Š#*'ñAK>4<ÿã¼e jldIkL~9!/Z€Î-1=It!0‰oE!pøn­ÿã‡eƒ‡e”‡e޼eއe33ƒ¼e33ƒ‡sQ#ƒ¼sQ#ƒ‡s޼sއ5¹'#¼5¹'# w‡5/[¼5/[‡5/É5JA¼5/É5JA‡5#o¼5#o‡5#¼5#Õw‡5±Í!/>Ї5Ї54Q*.¼54Q*.‡5 '5¼5 '5 ôw‡5n0d‡5n0dD‡5nLZÌ3¼5nLZÌ3p·3|¦#…^bYÈ!0·t.F|$A±19Œ¼5nLZÌ3p·3|¦#…^~J…14<ß j!m#.ä'\ßb11|0q#<ß5‰޼5nLZÌ3p·3|¦#…^ Ã#ž53?ob<<'/1×I§#t”Z kF¹!0n­D‡5'#-mV-/¼5'#-mV-/ûþ(5'1‡5º.O‡D‡<-.¼<-.‡<…54-[o¼<…54-[ob0nOl�I bY'F¹!04be- j9 'A9 t.F|‰†s0›V?ˆ<¿§11|0q# j$|};? ul=K'e‡<9dŒ¼<9dŒ‡<9/$d¼<9/$d‡ˆ‡ˆ(‡ˆX‡ˆX�‡ˆXx‡ˆ((‡ˆ(Ÿ‡ˆ(‡ˆ(‡ˆÄ‡ˆŸ‡ˆ‡ˆ‡ˆ,‡ˆ6‡ˆ8‡ˆ’‡ˆ¶‡ˆD¼gvg �nÍ'9 u!04'eU�8N^ k1=q#I²\!;m›*Y°>…U§~‰/J~-' ¼gvgfgu§=¦5~‰/>4D‡<1!04D‡< !LlI§#Î5‰!š›pÂ#q#€ ø× A±/ اî²vgÙ¼< <ˆÍ ¢ŠLL!04š~‰1µ=b'A/>4q# k#Y4-LL *'0nOlŒ¼< <ˆÍ ¢v/1-04š~‰1µ= j!m#$A? k# ¢Î=ø#…špÂ|};? u$Q ‘†REcD‡< <Ї<ˆÉ‡<ˆÉQ…‡<ˆ¸‡<<½Ì·‡<<½Ì×¼<<½Ì× „E~‰1µq#€uo'n0Iا03Ù¼<<½Ì× „E~‰1µo-m[=? ا0/Ù‡<<½Ì×D‡<<½Ìn­¼<<½Ìn­Y!;m j!m#.ä'\ ô=<'IÎ F-F.|ÉZ †s!O€¤$ž3D‡<<'/1×D‡<<'#4ƒ‡É5½?4‰ƒ‡É5J‰Œ‡4‡'A/>·‡'A'Én<å#‡µ9E¼µ9E~½lq#^b ul=K'e!”'ešp·3d04'€gË'04'e‡µ9ElŒ‡µ9ED‡µ9E<9.1D‡µ$F.$A±19ZV‡µ‰K¼µ‰Kpžºo ô=<'IìR½^b=ø#…~‰1;J‡µ‰KZ¼µ‰KZbFɱ0nÍ›*pžºo¿vv¿Î *'0ךp*ZK.­bFɱ04It?b11|0q#š~J·º4'€ L=>…›*Y?#4-0n0~$9=>…~sÂ̼µ‰KZbïIj$ L.d~JÉ5'0×¼µ‰KZ~3”ˆLZq#š «;sIg'5­? ý'\×<^› Šº1=./>4p ¢k5AQ.ªq#𼵉KZ �†!0×›*~Ee0ךY1È|Í Š55EI b u;¦ �K- t”޼µ‰KZpžºošK9$A? �Kƒ¼µ‰KZ ‘!19~$*oš �\0s1n­ jldI„E=/µpžº î>=¼µ‰KZ5½\ˆÍš „E!.A# uQA'-¦ �½'/>4D¼µ‰KZ ý'=? „E/'3q#I  †s!OV¼µ‰KZ Qc kµ1µ „5‰ t$$dQY!;åI Yv²Š¼µ‰KZ j!º4›V?ˆD¼µ‰KZ j!º4›V?ˆIt” k# j±#ˆ×9>‰>-š ÕEk00'5e#…D‡µ‰‡O-.3-F.|4Œ¼O-.3-F.|4?›V?ˆD¼O-.3-F.|4?š �.Al€kF¹!04 vž#nL�5IØ�kv<Ùp Õ!FšY°>…›*Y0$1'D‡O-.3-Fd‡­5<ƒ¼­5<ƒ‡O±/¼O±/‡O±/\0'¼O±/\0'‡R;‡R;އR;>\D‡ºÈ¼ºÈU�?s3d‡º.‰‡º4J¼º4J‡?é¼?éFtwt¿§wt¿�wt¿¾wt¿¤wt¿jwt¿j‰/�F7!¯B0LF--ct--cF-Fƒt-FƒF-0ct-0ct-0cš t$$cpžº\›¢�9;-0Ân0IkLbµ9E›‘J-µ9Epžºo^ !1E4š› Šº13EKE?Y4'*ŒF-0cA '#*DF-AdŒt-AdŒF-.dŒt-.dŒF-.5t-.5F-c=t-c=FV”'}-éÌ#tV”'}-éÌ#FV3F-/LEt-/LEFQ…3tQ…3FQ.tQ. ìwFQcF-$c¸[t-$c¸[F;t;U«.3d3F;Kªt;KªF;F;ƒt;F;ƒt;F;-bwt;F;- „wt;F;- «wt;F;- ¾wt;F;-wt;F;-;�t;F;- ‘wF;F=t;F=F;F�±4$t;F�±4$F;F[t;F[F;*.t;*.F;>t;>F;c=t;c=F;3$Rt;3$RF;s=F;s½QVF;5Œt;5? ìwF;Ât;ÂY?¸/ „E \!;å5<^b 1$t> «wt>U§/.F>m/;cF>ž5t>ž5F>!LlF>!LlDF>>LÈt>>LÈF>AÐt>AÐF>¹-/[t>¹-/[t>¹-/[ uwt>¹-/[YwF>#†Ðt>#†ÐF>#.Jt>#.JF><ét><éF=At=AF=¦t=¦F=¦5Jt=¦5JF=c$LLt=c$LLF=|F!?=é#t!?=é#F!?Jt!?Jt!?JÿéÿèþM�)2ÿéÿèþ^ ¢„µ'eš u.};? j!m#Z€g=OZ\¿Î†= îÈ3K3?ß Š*¿‘!R ÿìEc^ «-RE e<<ÿà �)2^ N6,1¿Îs…^ þ~N2£B, «;*~$­^ ¢„µ'eš u.};? j!m#Z€g=OZ\¿Î†= îÈ3K3?ß Š*¿‘!R ÿìEc^ «-RE e<<ÿà �)2^ N6,1¿Îs…^ þ~N2£B, «;*~$­^ ¢„µ'eš u.};? j!m#Z€g=OZ\¿Î†= îÈ3K3?ß Š*¿‘!R ÿìEc^ «-RE e<<ÿà �)2^ N6,1¿Îs…^ þ~N2£B, «;*~$­^ ¢„µ'eš u.};? j!m#Z€g=OZ\¿Î†= îÈ3K3?ß Š*¿‘!R ÿìEc^ «-RE e<<ÿà �)2^ N6,1¿Îs…^ þ~N2£B, «;*~$­5F!ª.33ƒt!ª.33ƒFL1F9Kt9KF9J…I„E ‘'/=ZY½Ì3Y°>… �K- „.d<^Y'A¦¸î'ïÈ[\F.F|$A±19�DF.F|$A±19ŒF.F|$A51-9ZF.F|‰†s0t.F|‰†s0p*ZKEIô=<'IŠº1=4 k1[.Jpb< <ˆÍ \!;m=ø#…t.F|‰†s0$ž3I„EQ-¦/>4š›Y4E!¿v¿�.LL=>n€Ãn|4?b/JA v·/Dt.F|‰†s0$ž3I„EQ-¦/>4š›Y4E!¿vv¿Ã bI§ „'#0ךb¦šK=Ì3t.F|‰†s0$ž3I„EQ-¦/>4š›Y4E!¿vvv¿�!­3$1o› Š/1.s0€¤$ž3t.F|‰†s0 j!m#.ä'\b11| j$ v<<'\Q-¦/>4^b~”!Y4'*ŒF.F|‰†s0DF.F|$ !ct.F|$ !c „EFZ9·d5tZ9·d5F�#=Ðt�#=ÐF.3A[t.3A[F.33t.33F[;ŒF[*oF[9t[9F.½9!/ËŒF.$A±19ZVF.‰ZVF.$ˆDF.$·ƒt.$·-ßY!én0I„E'F/~>ËVF.5¦5t.5¦5F.5Al4ƒt.5Al4ƒF9$1t9$1FR”tR”F.O[DF.ª=t.ª=F¹=cO.At¹=cO.AF3-0ct3-0cF3-0cét3-0céF3-.5t3-.5F3Qc>t3Qc>Fd#F3‰F=At3‰F=AF3‰äOÐt3‰äOÐF3'/ƒt3'/-~wF$;F$-ªt$-ªF$FZct$FZcF$!9/F$>·t$>·F$A*QLLŒt$A*QLLŒF$l>t$l>F$.O[t$.O[U§Íûþ.dF3t3F‰/=t‰/=FJ0c-=ÐtJ0c-=ÐFJ[.tJ[.FJ[$FJ#�tJ#�wFJª.tJª.F$$cF$$cDF$$c¸[t$$c¸[F$$dF$$dQF$$dQ#$ÐF$Jt$J k5 t'Éÿãb0…4Dt±*LE*üI�Ë.Fµ.J^b ‘!R „E/'3t±*LE*üIu-R›¢Î=.$*Z€ul=K'ešY°>…}-*dŒt±*dŒ}-Aƒt±Aƒ}-/=t±/=}Q*9EÉt±#*9EÉ}”Žt± }-'#t±'#}-'#¸[t±'#¸[}-ª.3}!-* }!-cote-co ¢�‰/'#Zq# t;s= t†R!>Y!;å5›ul=K'e „.d^›pÂ-0n­ î'ïŽ}!”Ð}!D}>#=te##=}Ì#}�Lts!L «4E?šY°>…}�#}.AADtsAAD}.Al4ƒtsAl4ƒ}.Al·tsAl·}.33$'[}l9}l4-[ts44-[}$-*'Dt -*'D}$*�t *�}‰F=At5‰F=A}‰$ >?3}$$c\t $c\}$$cL�3t $cL�3}$$cDt $cD}$R#t R#}'…t5'…t5'… twt5'…~wt5'… ¾wt5'…w}ûÿòA¦}'A¦#}'#>cQÐt5'#>cQÐ}?$19?·DF'å|t'å|F'0ct'0cüIÎs/! ‘'/F=~$*oYå/ŽF'0c3Qt'0c3QF'0cdŒt'0cdŒF'*¦ÐF'*¦nÍF'È3t'È3F'.3*ot'.3*o t†ÂY�v L.dI„E à5IkL u;¦ß'3n*°1|#;? �K- t”\t'.3*o ¢Ã#.­5<€§5m.­šY$'5…~$žF'¹*$<ûþ"t'¹*$<ûþ"F'|0ct'|0cF'#˽ct'#˽cF'5#Dt'5#DF'5e5Œ�¿²w�¿²¿îw�¿gw�¿g-/'È�¿jw�¿Õw0-(©0-žÐ�-žÐ0-AQ�-AQ0-.0-c;#�-c;#0V-}ûþ3�V-}ûþ30V0'3'D0V9$'#�V9$'#0V3-9Q�V3-9Q0-/}ï¦0-/=J0Q�Q�Q †s!O€kL „5‰~lq#pžº\ t!Y./1|L�*ÿã'3n1d>ךb !L=>…bI§~9;-0Ân0š ¢u[c t†R!>~l›*~lob5n0d0Q-*Ì#�Q-*Ì#Y°>nLZ ¾$'5#V<^;4 (ß~$­±¦�Q-*Ì#Y°>nLZ ¾$'5#V<^;4 vvßpÂ-0×0QF=±0Q…330Q…5�Q…50Q…5D0Qž3ƒ�Qž3ƒ0Q.0Q4V3$1D0-1lV0-13Q�-13Q0;F$0;FJÈ3�;FJÈ30;°#$¦#0;°#$¦#\0;°#‰ƒ0;�;0;*.$O”0'3;�;*.$O”0'3;Y=Ì3 ul=K'e^~9;-0Ân0<ß *'0n­ ¾$'5#V<ß›*bFɱ0nÍf žºo~$­±¦0;*D0;L�30;3�;30;|Â�;1>Â0;1[$�;1[$0;50; 33�; 330;­5�;­50;?3�;?30”0”Ž�”Ž0”./.5�”./.50”1=�”1=0”Ë$0KV$A�KV$A›j!º4bI *ZKEIkL È!OQ…0KV$Ao0KV$A'Ž0K!AE�D0K!AE.ª0K9=[Ž�K9=[Ž0K9Œ�K9?bw0K|#Ž0-' 0-' D�-' IkL u$R›«.A9~lq#$·#nVI Y°>…^~lq#›V?ˆIkL t.½9!/Ë?›Î3Q49?ˆ$A? ¾$'5#VD0-Ol0-RcÈ3�-RcÈ300/0*��2þYß «u§~3”IvUeÉs0·*ß~?4?n0 jU3?/19½?·~3J!bA-[És/;?V.A#Q4ÈQ‰-~È3D…*;�;…33…33D…#Â…#ÂD…#ËV…#4'5Œ…1Q!0�!1Q!0…50JŽ�=0JŽ…eFÈ3$1Jn#Ž…5#Œ�=#Œ…54-[…5OZVm-L†ª�9-L†ªm-.�9-.mVZŽ�9VZŽmVdÍ\m-/F=D�9-/F=DmQ*±�9Q*± îwmQAm�#�9QAm�#mQ¦mQ¦mQ¦DmQAom-1é�9-1ém;ƒm;-0Ân0m;-0Ân0D�9;-0Ân0IkLb ul=K'ebIÎe*Z4EIkL ÈK#\It†R!>~l›*~lo ÕEcDm;-0Â.ª�9;-0Â.ªq#š �K-F”\p ¢§As0'34'±3Y°>…D�9;-0Â.ªq#š ¢²\!;m-1=IkL ãg¿¤Z€gm$Dm;-0Â.ªo�9;-0Â.ªo ¢ *'És€g1!°€u.};? Ã#.­5 m;-cÂ�5'Ím;¦Dm;Aom;dD�9;dD�9;dItw�9;dIŠw�9;dIîw�9;dI«w�9;dIuw�9;dI¤w�9;dIÎw�9;dIjw�9;dIÕ¿‘wm;dÉJm;Ðm;ËQ�9;ËQm-ª>�9-ª>å0c<'/å/0JL�«Š¤�k‘„^› Šº1=./>4ppÂ#q#€k#|#!~JL=>°Íå/ZV�9!/Z€‘Q$| $A±19? Õl9 Šd0ËJ t!-/D�9!/Z€gË'04'eI§4 ¢�\c4$1^p·A±nÍ �±Ro j$IÕl9 k#Uu[! !AË? „.dDå/�å/ËŒå/4Då/|#Žå/$>*½ñŽå#�9>åÍ�9>Aå55Œ�9=5Œå5?3�9=?3bwmÌÍ�9ÌÍmZ-A$mZ9\Âm�0$�9�0$UtÌ#m.m.9m.3m.3*9$$m.3*e#m.3*enÉI j9!.5 kR#'F|0q#D�lq#š ¢ul=K'e t?Y°>nÉI j9!.5 kR#'F|0q#…D�lq# Èq# ŠOV'q#~3;.LZ°4q#D�lq#I„E/K�lq#<ß !L=>…I§#¢î R šY°>nLZ ul=K'e^b$ž3š �?#-/ZpÂ-0×°·°Â°nͰO.303-A'Ž�3-A'Ž03-.e�3-.e�3-.e ìw03;ƒ�3;ƒ03;Ž�3;Ž03;.LZ03;c�3;c�3;cbw03;cŽ�3;cŽ03”D03” D�3” IkL Š55EI �kv ‘-/\ Ø�K-Q-¦/>43QÙ03”ˆ0D03”ˆLZ�3”ˆLZq# „5‰²Š�vg^Y‰!$<ˆF.|n\�3”ˆLZq#šY°>nLZ �½'/>4It?!QIkLYÈLUî>=K î '1IŠ/13$?o „e! uQA'-¦03”ˆLZq#D03”ˆLŒ03-'ž�3-'ž03-'*Ì�3-'*Ì03-'*.$�3-'*.$0dQo�dQo �.LL=>4 j?1\š �kv Š55EI„$'#*p~l !L=>…Ik#~ <D�d/>D0d/>Ð�d/>4 jw0d­3Q�d­3Q0|LL0|LLE�|LLE*bw0|/>4~3”ˆLZ�|ä'!oU- j!m#.ä'! „E *'°Í-º./V3?~J#!0·*~3'¸5D03JV03JŽ03$'*Œ03'¸503'¸e03'¸ñA�3'¸ñA u;¦ „.dIkL �½'/>4IÃˆÍ ¢godUu[c†9$�3'¸ñAšY°>nLZ ¾$'5#VD03'¸5D0#05(Ÿ0#05(0#05(60#05Ä0#05(’0#05Ÿ0#05`0#05‹0#05À0#05©0#05N60#05N80#05N’0#050#0580#D0$�$U°4q#›V?ˆI§#¢ O.Fd~d¦�$U°4q#p ¢g°>nLZ ul=K'e^b ‘!R!”'eš ¢²Èq#<9.1 t†R!> jR$ �½'/>4D0$V�$€î”.LZ0½9±#Ž�½9±#Ž0½.0½l0½l�½lbµ9E †s!O€k#|#!^› Šº1=./>4 Õl9 ¢g½Ì3p*ZKEIul=K'e0$ž0$ž#0$*o0$*Œ�$*Œ0$A#l.J0$A#l.­0$9>�$9>0$9=>…0$.d�$.d0$[-¦�$[-¦š ¢j=/[ø×Y°>…0$[L$0�j?1!~‰1$ˆ×^ v4Iv/1-04 k# u.};?›*Y°>…0$d�$d0$|#�$|#�$|# ìw03-FE�3-FEq#p~‰1µq#€¤'ˆ0$AŒ0d-A'\0d0×�d0×›*~9;-0Â.ªq#šY1È|Í Š55EI Y°>nLZ›*Ym;3? j!ºÐ�d0× k­53-1bI§ „'#0ך u.};?Y.ª!^b~‰1;Jšb/=ZQ›*~Q-*Ì#'F|0 u.};�D0d0×D0d0n­�d0n­ Šº1=./>4€ÕEcpY°>… j!-mo0d¦0|#D�|#D0JZlŒ0E!04V0µ!ƒ0­5�­50‰F[q#D0‰F[0‰/>Ð0‰/>4;Œ�‰/>4;? k# „£Õ¿«E4JüIÿéÿèþM§# t.33š .A94<ÿéÿèþ0‰/>4D0‰/=°V0‰/=°V3Œ0‰/l·Ž0‰/J0‰/'#ZKo�‰/'#ZKo j$~‰/'#ZKED0‰/'#Z0‰/'#Zq#D�‰/'#Zq#I ~‰1µ=›*Y°>…�‰/'#Zq#IkL ¢§�¤0‰/'#ZKED0‰/'#l�D0‰/'#lŒ0‰1;K.­�‰1;K.­ ŠOV'q#š jR$pžºo†9$*IÃˆÍ ¾'*¦D0‰1;Ž0‰1;o14 �K- t”\�‰1;Jš!=›*~lq#b< <4š ¢ L3'>…šY°>nLZ ¾$'5#VD�‰1;Jšñ·t.F|$A±19Z �\0s1×I�Ë.Fµ t? tvkgvgß~§gß›Š.�‰1;Jš !…#4b0ä'l.JI§#k�u� „[²K\ „E j9e!~Q-*Ì#Y1!°€u.};�D0‰1;JD0‰1>žº0‰1†l.J0‰1.30‰1d/>4;lŒ�‰1d/>4;l? t†R!>b àY4'*?›*b~lq#Y4'*?p~JˆžñA'F|0q#±0n…I ¢Î9?ˆ0€§#*Y½Ì3Y°>…D0‰1dº0‰1|00‰1J>4D0‰1$ˆ×0‰1$'#�‰1$'#ÕE*<^b Fd/p$ÉU�$E*[K! †s!O€g?¸/D0‰1e<ˆJ�‰1e<ˆJš~Jn#'$'IÎ   j!º4IÃˆÍ ô;�4? î>=0‰1µ0‰1µq#V0‰1µ=�‰1µ=Y./'3q#š ¢�.50'3q#Y'F…0JL=>…;n0d0JL=>°Í0JLï>…0J¦5�J¦50JAe…D0J 5O0Jˆž±×D0JˆžñA0J4D0JÉ5'0Ð0JÉ5'0×0J<'/=�J<'/= «!V pøn0<^ «!V  j!m#$A? „E~J<'/=D0J<'/=D0J4-A.J0J·#Ð0J·#4D0J·ºÐ0J·º4'V0J·º4'V.ª0Jn#'0Jn#'Ž0Jn#'lŒ0Jn#'$'D0J4$'5D0JË.Fµ.J0JË.Fµ.JD0JË.FµED0JË0JËd0J­#×V0J­5nF.|4Œ0$$1=�$$1=0$$1=�$$1=q#›*~‰1†l.Jb/JA u.};? ‘†REcD0$E*[KŽ0$E*[0$1Ž0$11[.�$11[.0$1?sA9Ð0Em-*$�Em-*$0EžD�EžD0EŽ0EdŒ�EdŒ0E#È3�E#È30E#=D0E#$A�E#$A0E10E1E0E1'D0Ee0nÍ�Ee0nÍbµ9Eß jld›¤'3n1dUj=/pžº Š#Ë�I !mQ.ª t.F|$A±19?e1;0Ee0×0Ee3K\0Ee30$\Ig$'5…I ¢Î9;/-…µZ€ *'É5Œ�$ÉUt>!Ll$ž3š u.};?b0ä'l.JI j=/IkL à^ AeD�$ªª>D0±.A�±.A0±/1J�±/1J0±­#�±­#0±­#D�±­#D0±RLE�±RLE0eKo0e1D�e1D0e4<$D�e4<$D0sÉÌ#�sÉÌ#0sÂÌ0sn0V�sn0€j9e<9*I ~$U�lq# î±19D0snä'Ž0 LÐ� LÐ0 <”� <”0 „5‰9?ˆ0D0 <\IÕl9›b'A/>·*~9!/Z€jldI„.d�'5e#4pžº j$ ¾$'5#VI Š*'0q#¿‘!R ÿìEcß~�¤~E1Eq#ß �6BUJ 3?ß Õl9Y!/.U§##'€§#*›#'€�'/'3q#D�'5e#4 v<<'\p…^›V?ˆI§#�!­3$1/>Ð�'5s0'3-pY°>…^ „$'5 ÿì!; Ae4I§#je#*D�K- F”\ÿéÿèÿî§ «4E?š �!­3$1/>4I§#je#*I„5‰ �66 j9 'A9 �8,�K- t”\ÿéÿèÿî«4E?š �!­3$1/>4›je#*D�K-Y°>…›ŠÍ[!=o�K- j!m#$A�I§#*b11|0q#D*K-F”Ž�K-F”!~‰1;J*K-F”\*K-°·�K-°· Ub î3$F€²!AËq#b¦#0? „E \!;m �Kƒ�K-�l! Ub î3$F€²!AËq#b¦#0? „E \!;m �Kƒ*K”†D*KŽ*K>­±5F!l'Í*K4ƒ�K4ƒ*-Oï�-Oï�-Oïbw�-Oï tw�-Oï~w�-Oï �w�-Oï Šw�-Oï îw�-Oï «w�-Oïw�-Oï Õw*-Oï…žLZ�#°\�!LZ�#°\šY°>nLZb0……žL[l.JDždAK\ž|­5Œž3E>ª$�ÈE>ª$ž/žéžé*Dž#.ª�>.ªž#c�>cž##�># tw�># wž##Œ�>#Œž#ˆn\�>ˆn\š àߛ*bF #…š kF<$d<…#…ßp9?ˆ0I¾$'5#VI§4 v jž#ˆ4Œž1;4/>О1;4/>4Vž1!R�!1!Rž1dמ1 �!1 špžºož5žec�=!c �!Y3ƒ�=!c ¾¿g3ƒžsO�=.Oq#šbY-/1dš ¾$'5#€v<<'\ „E j\4IkLbO-.3-F.|4?›àžs­žsOo�=.Oo j=/ Èq#I„Eb~E1'It? î±19 j9!E†Z€�3'¸5Dž55�=5ž54q#š› k#Uu[!~9!/Z€�Z×;? Ø�«Š¤uv‘ŠÙ�\.A# Šä'q#I„E †s!O€g?¸/It” k# ¢gR†I¤$ž3žˆA#o�\.A#ob'3n|Í'€j=/[$A? tQc „E Ã#lY4K\ j±#<3KED�\.A#ob ‘!R „-°|4? „EY=OZ\ž†Z?/E19/š «'é «=1\ ô.5'Ij?1! )p Š#ž/Z k5 Š1ï!/Z ì-1$ˆüIg;0‰- „5‰ Õ\4›*~>Ë€§Ls0-ß›*Y$µ9b/=ZƒžÂ/[Q4DžÂ/[�†=/[q#šYKL-04E?Y0V! „E �K-5½\ˆÍ „-°|n\�†=/[q#š ¢�J 5Oq# j./!š=.$*ZVI„E k1n/€g9ÈL-[·#Q…šb u.};ŒžÂ/[q#DžÂ/[ož­3$1ž­3$1o�!­3$1ob0-ž/Z u.};? �!°ˆJY'11E4Y?¸/Dž­3$1/>Ð�!­3$1/>4šbY!én0 �.LL=>n€j$b0…4š›p·A±·Š#=A? ô½-F'3;?›¢Î$<ˆF.|n\ „E k#U|#!Y'F¹!04YRlmo�!­3$1/>4š \$'5…Y9;o ‘†REc<^ ‘†REcIg4'*? ‘$¿¬¿§t‘~JL=>… Ø�)+^ÈF$'5#!ß ôZ4EÌÙ¿„.5Ébt‘~JL=>…ß ¾'3? (Nÿéÿèþÿ“(2ß �)+ßÈF$'5#!ß-1=I§#Î5½!o<ßb'ɱ|Q t.F|$A±19Z ‘†REc¿�QF=±^ ‘q#€u.};?šb'ɱ|-ÿà �)+^ ‹21ž­3$1/>4Dž­3$'º�!­3$'ºžO.3*9-cV�9-cV*9Q\<;�9Q\<;*.�.~$…*Ì#ƒ�Ì#ƒ*Ì#Ž�Ì#Ž�Ì#!w*ÌË.FŽ*Z×;Œ�Z×;?-co t?~JL=>…›*~‰/l·!^ ‘§�§›¢§/=ZQb=J-µZ€uQA'-¦ß �(6ÿéÿèþÿ“�+*�#=��#=*�4;Œ*� Q-/[Ž*�ËZ9*.LL=>…D*.LL=>Ð*.LL=>nV*.LL'ˆJ*.AlV*.|1�.|1*.33-é�.33-é*.3|J*.33$�.33$*.33J�.33J*./>ˆJV*./>ˆJVlŒ*./>ˆJD*./ls$D�./ls$Iôw*./lsD�./lsD*[!9�[!9*od�odU�|LL*.$*K$�.$*K$*.e0×D�.e0×I u.};? ‘†REco*.e04EŒ�.e04E?š k1>b0…Ð�½'/>4~3'¸ñAß ÃˆÍ-0 †s!O€j!m#.ä'\�½'/>4 !1e #4q#p F-F.|ÉZ$ž3IkL †s!OV�½'/>4 †s!O€§#¢�J…14šY†D�½'/>4 †s!O€Šº1=./>4IÈÍ~3'¸5›V?ˆD*½'/>4*½'/>4D*$*�$**$\�$\pžºo Šº9-'É.Ol?KÂÿã*$.*$*$c'/>4*‰-[�‰-[›V?ˆ<ß ul=;? Õ;±#4ß›*~J #<'<^ ¢�”!š „Z×Y4'*�D*‰>Z$�‰>Z$*‰[K\*‰[Z�‰[Z*‰[.cƒ�‰[.cƒ*J�J uw�J w*JV�JV�JV*bw�JV*b¿tw�JVtw�JVŠw�JV„w�JV«w�JV¾w�JVuw�JV‘w�JVjw�JVÕw*JA�JA*J#ƒ�J#ƒ*J#È3Œ�J#È3Œ*J$9'Ž�J$9'Ž*$$dŒ�$$dŒ*E!Ì#�E!Ì#*E�E uw*E$ !Ž�E$ !Ž*E$ Œ�E$ Œ�E$ ? ¾w*$<ƒ�$<ƒ*$ *$ˆ*$'Fd�$'Fd «”9o*$'A�$'A*$'A3”�$'A3”�$'A3”~w�$'A3” Šw*$'#�$'#*$'O.3d�$'O.3d*$R�$R*$R#!Œ�$R#!Œ*$R 4Ð�$R 4Ð*±Ro*e-/*s33*5JF=¦5�5JF=¦5* 4Ð� 4Ð*5?-*4ƒ*'V*'Ž*'/J�'/J*'/Jn=�'/Jn=*'#0Q�'#0Q*'#9-/�'#9-/*'#¹ƒ�'#¹ƒ*'1|0�'1|0q#š ¾-1Q\! ‘-/\^b Fd/p~lq#I§#t.F|$A±19�D*'1JÐ�'ÎJÐ*'ñA*µ4ƒ�µ4ƒ*?/�?/*?#-/Z*?#-/ZDŽŠwŠ¿§wŠ¿t'54JŠ¿�wŠ¿ŠwŠ¿„wŠ¿«wŠ¿kw!“‚!6!8!;3Š;3 ¾w!;3Œ!KJŠKJ!F!0cŠ0c!0$d0J!0$AZV!0J‰ZŠ0J‰Z$ž|Í^›bï j$ ¢Îs°ÍšY=OZ\!0J‰ZD!0J‰Ð!0$…Y=OZ\^b~”!Y4'*ŒŠ*'0q#›j±[o „E~‰1µ=Ut” !L=>…Y=OZ\^ !O�Rš j±[o ŠLLE4Ij$ �KŽŠ*'0q# „EY°>…bI§ L\ˆJŠ*'0q#pY°>…'0q#V'0KEDO;* #Š*O;* #R;Š*R;*bwŠ*R;îwŠ*R;¾wŠ*R;¾$9#Š*R;*YwR;*DŠ*R;*D!=!=$Š=$!LL!0ЊLL!04špÉQ4Q!$'I²†s!O€k#pžºo~sÂÌ!LL!0n­!LL!0n­#\DŠLL!0n­#\IkL †s!O€ì!?bF}!OÌ×Yå/\!LL!04DŠLL!04IkL›n94-/[\ k# +ß2U¤†9?d#.$º?/†9-/19†-/[!U *'…�!1dךY=$4J[p KDŠLL!04IkL~KV$Ao ô'/!b4 ¢u.};?š~JAeŠ.d>w![F-mŠ>F-mÈŠ3U„-9-/Š3Ug9-/.Š3ü-*Uÿì;'/È-[ŽŠ3-[ŽŠ3-[!wÈå #Š3å #Èž53ŒÈ!QEŠdQEŠdQE �wŠdQE¿twÈ!0ËZVÈ!0ËJÈ!0ËJZŠd0ËJZ'F|<9o^ ¢Îe*Z-/>4š k00”.J€Ã 5I ¢Š*lEÌ35½\DÈ!0ËJZDŠd0ËJZ<ß ¢�$É �!”!ß›¢k1=q#š u.};�DÈ!0Ë$1E†ZÈ!cËJå5È!/>ÐÈ!/>4DÈ>ƒŠd#ƒÈ!OÈÌŠ|ƒÈÌDŠ|”È�ª=Š|!ª=È-F†9Š|<-F†9Èl/È.ª-F†9Š|ª-F†9YwŠ|ª-F†9 ôQÈd#Š3d#È|ÍŠ3|ÍÈ|$Њ3|$ÐÈ|$4Њ3|$4ÐÈ|DŠ3|DÈ$ŽŠ3$!~wÈ O�5Š3 O�5 tOÈR?#Š3R?#!é'È!/=VŠ/=V!/=¦#0Œ!/=Ao!/.3Š/.3 «w!/.3ŒŠ/.3Œ!/3ŒŠ/3Œ!//ƒŠ//- Šw!/19”.ª\!/1.s0V!/1.s0V3Œ!/13$?o>>0$*oD>>ž/Z>*$ ÈÌ3>*'ñA>=AŒŠ#=A? j!m#$A?ÿéÿèÿî§~Ee0×>AŠÍ>¦}-K>ŠÍ!}-K>>A[!=o>A[!=D>A|<9>n4ŒŠ#n4? �'1|0q# k#Ym;3?�Kƒ>Ë�D>Ë$1ŒŠ#Ë$1?›*^b'3n*°1|#;? k­5O�R>'/=K.­>O.5J/>Ð>O.5J/>4V>O.5J/>4D!1ï!/Z!1ï!/.$AŒ!1l9ÈÌ3!1l9È.$ï!1l9†D!1¸[Š1¸[!ä'q#D!ä'.OV>…=\ŠeD=ZŠs0=Z9Šsm=.cŠscŠsc=#ûÿñŠ5#ûÿñ=5EŠ55E ŠOV'q# „EY·//ob3AEl9/I§I�3'¸ñAb3AEl9/D=5ED=?ˆ19V\=? ž5/Z\>Š #bw\<-?DŠ<<-?IkL›Y°>nÉß ô¿v›((¿Š'¦#!~;L�3*¿Î9.3-ž319Ìß§ ^ vgvenÉß ô¿ôv¿Š'¦#! î;L�3*¿Î9.3-ž319Ìß§^ vgve<<ÿà �)2^ þÚ.ºU68+1¿Îs…^ þ~©£77 vgt‘ 7U)B¯,U™ú7\ =ŠÉ9=ŠÉ9= Šw\n/KoŠÉ./Ko ¢�!é„E u.};?Y=OZ!^ j9!E?›α0n…\R0††9ÈŠ Ȇ9ZDŠ ZIkL ì#$Ro!'¦#ŽŠ'¦#ŽŠ'¦#! twŠ'¦#! „w!'.Š'. «QA!' 1ŽŠ' 1!¤�^b „'33Uj!º4 ul=K'e �K-F”! „E ¢u.L!Y°>…I§#Î3KLE/ „Ep#$O!' 1!QŠ' 1!Q \!;m u†Â^Y½Ì3Y°>… \!;mŠ' 1!Q \!;m u†Â^ j!-mo k#|#! †s!O€ Ã#l ìo*‰ u.};?Ym$D!OƒŠOƒ!OV'KoŠOV'KoY°>nLZ ¾$'5#VIRl9¾$'5#€�lq# !1E4Iÿéÿèÿîb~”!Y4'*?pb0$'ÉZD!OV'ŠOV'q#šb ìÕv�pžº „E u.};? ul=K'eŠOV'q#š~'5e#4bR;>\Ig=OZ! „E9?ˆ0I§#*bÉ5J‰? ul=K'eŠOV'q#š †s!O€g?¸/<^b �!°ˆJ j9!E?b11 -m!OV'q#D!OQDŠOQD!­3$Š­3$!­3?#Š­3?#!­#DŠ­#D!­#4D!­5?*-Œ!Oï>…ŠOï>…š~‰1dº~l=$nOq#DŠOï>…š k�u�üIÎ$·#n€„EY1!°€u.};�I§#j!m#Z€ ø×~>ÂD!Oµ.J!Oµ.J;Œ!OOo!º!º-0Ð!º-/[!º-/[oŠº-/[o �\.A#b<<'/1×I„E› †s!O€g=OZ!^Y�v à „EY°>nLZ›j!m#Z€�K-F”\!º-/1d!º-/1dD!ºmQ¦!º03'ˆOlŒ!º=° !º9-'É.OlŒ!º1Q*oŠº1Q*o ¢�K!AE�IkL „!F-0c!º1QˆJ!º1!0·!º1=�#…!º1=�#…!º1=�#…D!º1=./>Ð!º1=./>4V!º1=./>4Šº1=./>4q# Õl9~‰1µ=U§<ˆ¸[žºo^§/=ZQ �½'/>4q#ß ô'/! `!º1=./>4DŠº1=./>4I§#*›V?ˆIkL à›ôV'!pb �!°ˆJU¤-co~J·ºÐ!º1=Њº1=4Y?¸/<^b jµEÌ3!º13-[!º1|°ÐŠº1|°4›v/1|°4 ô;ÌFdI  †s!O€Øv²ÙY?¸/D!º13$loŠº13$lo ¢¤-º./'/ Š#Ë$1?ñ°1d j$p0e”! †s!O€ŠLL!0n­#\D!º13EKEŒ!º1e< !º1e<ˆJŠº1e<ˆJš ôJ Õ.3d}Q„-04Eß› Š#*$ ÈÌ3~È3;c=ß vIÃ1U²!A'3K t?›A.$¦#\ „-04E<^b$·#n€¤†9$„E kF¹!0n­b< <4š j'/E›A.$¦#\!º1e<ˆJD!º·#ž!º·#*oŠº·#*o †s!O€gËK!A�Ij$ ‘†REc Š#O.5J/>4<^ k3Õ-?<ß ‘!R Õ-?<ß›*b~sn0€u$$cb4 Õ§vg!º·#Ð!ºË-0×!ºË-04D!ª±Šª±L„¿„3$?„¿«w„¿¤w„¿ÕwL-F=„-F=L-F.$„-F.$„-F.$ ôlV.L-…L-°|n\L-°|4ŒL-04$L-04EL-04ED„-04EI§LL!0nÍ k#|#! t.F|$A±19Z †s!OV^b~J…14'€„±/!REc „E \!;m„-04EI§LL!0nÍY'F¹!04~KV$AY!;mY'0……DL-.5 E#ŽLV0$„V0$LV.„V.YwL-/.|V„-/.|€²Èq#<9.1I j9? ï~Q…5 t? «4$UÎK9$AZ€j?1ŽL-/.3ŒL-/'3'D„§¤ÃuÃg !Ol^ j> ÿì!;IkL=!Œ„!>!ŒL![é„![éLÈ*é„È*éL!/ƒL>Z9È„>Z9ÈL>#=„>#=„>#=;n#L=*[Q„=*[Q„wL=#Q*$„=#Q*$ �! uƒ„=#Q*$ ¾wL=e5„=e5L†Â鄆ÂéL.}$F3”4DLZ×LïÈ„ïÈL�3L�3*DL.A<9;ŽL.d„.d-[·#Q…š!g« «!-*oI |#ŽL.dDL.|ÍL[VL[Q°V„[Q°€§<1!04IkLp*'És€ ø×~>Â<^bY'5­ŒL[L[*oL[cȸ[„[cȸ[L[c=D„[c=DL[#„[# ûþõ5'1L.5É„v²gj^ „dº.Fd †s!O€g?¸/ „E j!ºÐLm9$LL„m9$LLLlL.­L.ºL3Q-AQ„3Q-AQLd*¦Ldº.FdL3$$„3$$L3$RL3$Rm;ÐL3$Rm;4DL3$RDL3$?L3'04'q#D„3'04'q#I Qc k5ž5IkL=.$*ZVDL3'E$'±°3L$-/DLc3EŽLELE!0”ÐLE!0”nÍLE!.A#LE=?ˆ19Žø3øÐ„E/K !0$A#l.J^b !1E4šb ¹!04b4 ¢u.};?š~JAe4š~=OZ€�;°#‰ƒL±/Ž„±/ŽL±/!REcL±#…D„±#…D„±#…IŠw„±#…I«w„±#…IuwL±#…<0$„±#…<0$L±#°D„±#°D„±#°IÕwL±#°<0$„±#°<0$L±#0$„±#0$L±#0$„±#0$L±#ûÿð$L±#c„±#c„±#c twL±#D„±#DL5}Le„e*~w„eŠw„e²wLežs0„ežs0„ežs0 uwLežs0c„ežs0cbwLe*¹„e*¹LeŽLe!F”ŽLeé„eéLe‰Le!é„e!éLeï\„eï\Leä'>0Œ„eä'>0?U±#c �Ë.Fµ.JDLe'ž#eZ9„e'ž#eZ9Le'ž# V„e'ž# VLs0c„s0cLs0cŽ„s0cŽLsƒ„s- kwLs3Qž5„s3Qž5Lssm„ssmLs< „s< Ls4D„s4DLs4ª„s4ªL5‰„5‰ „e!F”! j$ Õ.cïKƒ„5‰'3n*°1|#;? j$pÂ*°1|#;? \!;m^ ŠLL!04IkLY?¸/Ik# „E/€k5AQ.ªq#DL5‰>Є5‰>ÐL5'ɱ×L5?0c.„5?0c.L5? 5„5? 5L'>·D„'>·DL'Aé#„'Aé#L'c'/$4$„'c'/$4$L'c'$cƒ„'c'$cƒL'33L'33ŒL'/Ìc.„'/Ìc.L'#0×L'#0×D„'#0×IkLbQU¤-m[!pÂ-0n­ †s!O€g?¸/L'Í„'ÍL'Í$ï\Lûÿò5L'5 „'5 L'5'Ž„'5'ŽLµ'eL'ªªL'ªªŒ„'ªª? Èq#€�K-F”\ÿéÿèÿî- ì!? j$ Šº1=4Y?¸/<¿¤¿ÿí!éc$O-Uu!!m›*b¿ìQž3¿ Â*°1|#;?Y?¸/I²\!;mß ô=3-A jÃô^ 9![3Q*ß ì#ÿà �)2ß Ä)1w„'ªª? !ä'\4<^›b11 -m j$ Õ!.A9·t$$dQY!;åDAîwA-FEî-FE ¾wA-}�3î-}�3A-FŒî-FŒA-A#$'î-A#$'A-.3î-.3bwA-[A-[AVûþA5±AƒîVûþA5±AƒAV3$R-ŒîV3$R-ŒA-/ŽA-/\AQ*ÐîQ*ÐAQ¦/.îQ¦/.A;°ƒî;°ƒA;0ûþ6ƒî;0ûþ6-Ut;s½QVî;0ûþ6-U�”Ë$A;L�3î;L�3A;s¦Žî!ަ>î!>¦33K3Œ¦3d5îÈd5¦/°4-F[ަ#ž5¦#ަ#=V¦#=VlŒ¦#=V.ª¦#=K¦#=Ko¦#=¦#=KE¦#†Z¦#ndî>nd¦½9!/ËŒ¦$LLeŒî!$LLe?w¦$1$|n0Dî!$1$|n0IkL^ «$R Õ\Â#~'34'e �‰[K\ ¢ÕE3*¿§# J?Y/l9¿‘!R ÿìEc^ kºLEÃ#.­5ˆ4?e<<ÿà �)7ÿà �N1¿Îs…^ þ~(+£B,¦EAî!EAî!EA ‘w¦E¦î!E¦î!E¦ «wî!E¦ wî!E¦Yw¦$<°>…¦±3î=Vî=V*bwî=V¾wî=Vjw¦±5î=;¦59;¦s4Œî=lŒ¦5c>î=c>¦5R$$AeAîeAAeAEŒîeAEŒAe4å#îe4å#Ae Žîe ŽAe­#AsLLl9îsLLl9AsLLl9DîsLLl9DAs<9éîs<9éA î A '#žA '1A '1oA '1DA RoA R î R �?#-/ZIkLY!;mY=OZ\î R p9.Fl.Jš~=OZ€�Q…5~È3It? ¢«'é †[$Zb°²!…14E þgþ÷ î>ŽA5'#ªŽî5'#ªŽA5'?ÂA'QAî'QAA'Qï[.'/A'Q[ŽA'=5Œî'=5ŒA'ïŽA'ïÈ[\A'ïoA'.3F=Ðî'.3F=4~wA'33î'33Aûÿò3 #îûÿò3 #A'/1>F=¦5î'/1>F=¦5A'14ƒî'14ƒA'Œî'ŒA'?#'1î'?#'1A?'#9«U±<ß tµ ‘$4 ‘U±<ßp*'…I§#pO”.­9>$4?1!p «'é te”4 Š1l9ÈÌ3~È3<^b $d „E¤ÎUNp ¢«U²”U *'…*pO”.­9>$4?1Ž«w«¿�3-.e«¿�'5nD«¿Šw«¿Š*R;«¿ìÈ3Œ«¿Îw«¿gw9--c«--c9-FlD9->«->9-9«-99VL9V3«V39V1[«V1[9-/.33«-/.339Q-Œ«Q-Œ9Q9Q*F$$c9Q*Z-1D9QA9Qc«Qc9QdŒ9Q#Ž«Q#Ž9Q#!é9QD«QD«QI«w9Q #9;ƒ9;V«;V9;9;*o«;*o9;«;9;é«;é9;/J«;/J9;«;«;tw«;Šw9;s†«;s† Õw9;sD«;sD9;5Œ«;5? tw9;«;Â9;nA«;nA9;4/µ«;4/µ «w9;4«È>«È> «$L=«È> ¾w9È/c-/1«È/c-/19È/µ«È/µ9È/µ9«È/µ99!/V.«!/V.9!éA.‰ƒ9!//[c.«!//[c.9!/?n09!/E59-AZ«!/E59-AZ Š1l9È.$ï›*Y1[*d~È3 «!éA.‰ƒ9>*s0cD«>*s0cD«>*s0cIî[#Œ9>cd[«>cd[9>s†·«>s†· �w9>5Œ«>5Œ9>449$!Œ«$!Œ9$L=9}$$c«}$$c9¦5«¦593Œ«3? t5ûÿòA¦9/\«/\9$A±19Œ«$A±19?bI§11| j$Y4E-¦›²†s!O€g?¸/D9ЫÐ9‰Ž«‰Ž9‰=«‰= ¾w9$$LЫ$$LÐ9E-c«E-c9E.ªJ9E#«E#9E$Rlª«E$Rlª9EÉ«EÉ9E4J9ER$$9$ «$ 9$É9$'59$' 9$R«$RQ?~;*IÎ= „.d î'ï!ÿã k1n/.ªo ¢jR$Uu!­3 „.d«$R j$~$1! Õl9 ¢„E!.A#UuQA'-¦ Fd/^ Šº1=�#… î-[b4b'3n*°1|#;? u-FEKEŒ9$R;«$R;«$R;�w«$R;¤w9ˆ!9«ˆ!9Uÿì!Ž9<'«<'943O9'«'9'F=Ы'F=Ы'F=4 «w9'=e«'=e9ûÿò3?ƒ«ûÿò3?ƒ9'é«'é~‰/'#Zq# ‘!I§#k5AQ.ªq#€Î *'0nOl?^ ¢Î$·#n€v/1-04ššLZ!bµ‰«'é „-04EI ¢�\.A#š›pÂ-0n­ u.};?Y?¸/«'é!/E? k5AQ.ªq# „E~‰1µ= A±/D«'é-1.33‰-O.5'I§#Î A#$ IkLK�#4IÕl9~Q…5IkL ¢Ã11=b=$*.¦É.­ j±0Ð9'él�D«'él�I§#*Y½Ì3Y°>…I�‰/'#Zq#D9'éD9'/19eŒ«'/19eŒ9'#Ы'#Ð9'5Ы'5Ð9µ4J«µ4J9R!Œ9?!JA«?!JAU²!9~9$.9?$«?$U¾!JA9?1=·ºÐ9?1$ \.vwv¿ì¿²-OZ9Q*±v¿gwÌ./DÌ#vQbwvQ vwvQ ¾Z<'ï0ï!ƒvž- j-0n0Dï>nLZï>nL�5ï>nL�5Dï>nLŒï>nL?ovž#nL?o›*~Ee0nÍpOVï~lq#I�'! j$ �kv Š55EI ~ <n4Œ�!Ž.A#EŽ......9.v9..¹0(Ÿ.¹0(.¹0(.¹0(6.¹0Ä.¹0(’.¹0Ÿ.¹0`.¹0‹.¹0¬.¹0À.¹0N.¹0.¹0.¹0,.¹06.¹0’.¹0¶.¹<}Qv¾<}Q¾Q.3.3*.c$v3*.c$ �w.|”v|”bw.33'ɱnÍ.33'ɱ×D./-¦.éÐvéÐ./-ª'/.v/-ª'/../FVQ….//Ì0Œ.//'#Ž.//'#lŒ./1-0Ð./1-0nÍ./1d/>4./1d/>nÍ./1|0q#Dv/1|0q#IkL «$A±19? „EY?¸/Dv/1|0q#IkL ¢Šº-04 t±*LE�Ë.Fµ.J./1|°Ð./13Œ./1E4Q…./1E4QÐ./1$ ./1 F-Fd./1 ­./1 ­/>Ðv/1 ­/>4šbµ‰KZbFɱ04It? ¢Ã šYË'04'±3›V?ˆD./1 ­D./1 Oov/1 Oob „�3*Ut” ÿéÿèþMŠs0U|c!ÿéÿèþY?¸/v/1 Oob0…nLZ ul=K'e Õl9 ì#$Rd*¦ î±19Dv/1 Oo ì!?RE*pžºov/1 Oo u.};? ŠLL!0n­#\<^b 1$<€„Eb113?o „'ªª?Y†~J…14I ¢¤Q-¦/>4š u;¦~d0×D[ �!L>…š È!OQ… ô.O$ Šd0Ë$1E†Z j±#4š «!1K½È3'3;~;°#‰-p KD[°ž#…[03'ˆJ[0e”Ž[0e” 0e”p°ž#… K\ tµ ‘$Y1-…ÿéÿèþÿ“j./!~3'¸ñAš~9.3*9$$*bÉ5½?4‰-pYR!ž#ß �8+ÿéÿèþÿ“�BŸ[0e”o[ [žº[žº\[žºo žºo žºo›*bµ‰KZY.A#.LZQ…›V?ˆD žºo›t!9-O.E žºo �½'/>4It? îQc> Šº1=./>4 žºo Šº9-'É.Ol?›¢�‰1µq#šY./.3;l?Ks…D[*Ì[*Z[*ZK.­[*ZKE[*ZKED[*.Oï'V[*.Oï'VD[*'…[*'…D[*'0× *'0ך›n4'/E v//'#l? t? ·”‰!U 9.FlY?Í>!Z „.}$F3”4IÎ'3 Õl9b$*.L�j§§!1nž[*'ÉsV[*'É5Œ[!ä'lŒ[LQ4D[L!0·[L!0×[L=>… L=>…~JË!mQ/ „EY4Kn0€�K-F”!^ „eä'>0?U./1$ �K- �4E×D[L.3Ë[L3'>… L3'>…š ��4;? „-04EIk# k±3e0Q… 'Iu\.JI b$1'3q#Ut”~”!U�JËY4'*?p ì=V-ßp*Ì L3'>…š �� Q-/[! k# «;*Y!A/>4 k5žñAp „dº.Fd?'e Q! „$-/D L3'>… k# k#|#! t.F|$A±19ZY=OZ\ k#Y4'ž#4 t!9-O.E[ø ø Ãc u./l[ø3 ø3~‰/'#Zq#b/JAY°>nÉI Yd!1 \!;m ø3~‰/'#Zq#šY°>nLZ[øn0D øn0I§#*Y/V3~‰1µ=I uK[b/=Zƒ øn0I§#j±#4q#p~9.d^ Ae4<¿v¿t”Z j9!E†Z€§#*~J…14'€�!­3$1/>Ð ø× „3$R›*›V?ˆ<^ j9!E?ßY./'3q#ß›Šº1=./>4<¿vv¿g./'3q#ß Šº-/1d<ß›²\'34D ø× „3$R›*›V?ˆ<^ j9!E?ßY./'3q#ß›Šº1=./>4<¿vvv¿Îe|/[;? Šº1=./>4I§#*›V?ˆD ø× „E!-… !/;cIj$ ¢§/=ZQY½�4? „EY°>… ø× ‘†REc<^ �!L[l.JI§#¤\<-¦ j±#4pQ ø× \$'5…I§#k5AQ.ªq#€gË'04'e ø× \$'5…I§IÿéÿèþMî$$*<ÿéÿèþp ¢u.L!~?0dš *'0× ø× †s!O€g?¸/<^~9;-0Ân0<ß j\nÍ›ŠOV'q#ß N‘Š*¿„¿Õ.3LsuQ0”¿‘!R ÿìEc^ Õ.d?ÿà �8B¿Îs…^ þ~�£8, ø× †s!OVß N‘Š*¿�£¾¿ôQ .¹n€u!;#o5½\D ø×Y°>…›¢ ø×U�J<°$'Ig½�4Œ ø×Y°>…›¢Î9>‰>Jš ø×Y°>… \!;m^ ¢g!;m „E ¢‘K'eš ø×Y°>… j=/[$AŒ ø×Y!;m j-0n0D ø×Y!!co Šº1e<ˆJIkL à5D ø×Y4E-¦›�13-Œ ø×Y?¸/ �\.A#†9$*$AŒ ø× j!m#$A?›¢j9.5ÕE3 ø× j!m#$A?›¢Ã#.­5ˆ4?^p·A±×YËK!A�I„E ¢‹g4~>4'5Œ ø× j9!E?bI§!”'eš~J·#Ð ø× j±#Ð ø×U15½\ˆÍ$ž3IkL~$A#l.J ø×U !co t!9-O.Ep›b11| \!;mfg=OZ! �È.­5?Y†nÍ[ø×V ø×€�?#-/ZIkL ¾$'5#€§5n0d jldD[ø×dÐ[ÂmQ¦[Â0Ee3K[Â0$'#4Œ[ž1>ž#… ž1>ž#…š²Š�vg $d k1=KE<^b ý'QnnK.­›V?ˆIkL j9!.5b<<½Ì×D[Â*°1|#;Œ[Â*½'/>Ð[Â\Ð[ÂL-… ÂL-… �\.A# „E›pÂ-0n­ †s!O€g?¸/^b ul=K'eY'5­?›*b \!;mY?¸/ �\0s1×[Â|};Œ Â|};? u$Q<^ v/1-04𠢑!R~$1?sA94 u-R[Â/Ìs\[Â/Ì5Œ[Â#q#V Â#q#€�$$1=q#pY?¸/I§#*Y=OZ\ Â#q#€«.A9UŠ#=A?9?ˆ0IÎe1ñ4 ‘†REc Š/19”.ª\pÉlµ.J€ŠºmQ¦ Â#q#€¾$'5#€kL~Q…5 Â#q#€¾$'5#€k# �.Al€u.};�D[Â#q#VlŒ Â#q#Vl?š ¢g½Ì3Y°>…<^ v/1|0q#I„E j±#nLZ ¾$'5#VD[ÂO�R[·É[V[nª;[4$[Ë$*'0× Ë$*'0× Ë$*'0×›k­5O�R Ë$*'0× j$ufv A±//o „E u.};?›*Y°>…¿j9‰” «¿¤$44ß ¾5£ßY'?YË'/o=¿‘!R ÿìEc^b0-ž/Ze<<ß À(13 Ø�8NÙ[OVï[O”.­[­É.AKo[­É.A[O.Fd[O­/>Ð.$Q#v$Q#.ƒv- tÈd.$Dv$IÎe… Š*'0q#p �!­3$1o~$'#Ë�Dv<<'\p j!m#$A?p ¢Ã#lY4K\lVŒl!/l!/DlD.OQvOQ.O$vO$¹¾w¾¿§w¾¿�w¾¿�¿²w¾¿�-OïA¾>A¾>AUÿì.¹>c[D¾>c[D¹>#.L=¾>#.L=¹!JA¹=!/Œ¾=!/? ¾w¹=é¾=é¹=‰Ž¾=‰! jw¹=5Œ¾=5Œ¾=5? w¾=5? Õw¹\ ¾\  «w¹\ˆ0ƒ¾\ˆ0- uw¹!?;-¹-9¾!?;-¹-9¹Ì;Ì͹Ì#ºÌ¾Ì#ºÌ¹.3*-'¾.3*-'¹./J¾./J¹[#¾[#Ug9.'/¹l<'$¾l<'$¹/3ƒ¹$¾$¹$Q¾$Q Šw¾$Qw¹$FD¹½9!/D¾½9!/D¹$9Q¾$9Q¹$9Q#ƒ¾$9Q#ƒ¾$9Q#-~w¾$9Q#- Šw¹$9Q #¹$9¹$9#¾$9#¾$9#bw¾$9# tw¾$9# Šw¾$9# Š*R;¾$9# „w¾$9# îw¾$9# ¾w¾$9# uw¾$9#w¾$9# ‘w¾$9#Yw¾$9# jw¾$9# ôw¹$9#D¾$9#D¹$9#4šb ¾$'5#€�d0×¾$'5#€�$­±¦ k­53-1p~'5e#4~J·#4Iþ^þ$ Š*l.JD¾$'5#€�1$ˆ× �!°ˆJ$|°\¾$'5#€ŠOV'¾$'5#€ŠOV'q#pb u;¦ \!;m u.};Œ¾$'5#€kLb11|?/=Y°>…¾$'5#€kL~|#Z€§#\ \̾$'5#€kL~‰1µq#€�9!/ËŒ¾$'5#€kLpLE/†s0D¾$'5#€kL k1> «'él�I�Kƒ¾$'5#€kL ¢§/=ZQY½�4? „EY°>…¾$'5#€kL ¢§gvg ô<¿‘-msm·# „ûÿò5 �$c'/>4q#^b~‰1;K.­›V?ˆIkL~lq#D¾$'5#€kL ¢¤Z€u.};?b<<½Ì×¾$'5#€k# �K-Y!én0D¹$'5#VD¹$?…¾$?…¹5¹'Q¾'Q¾'Q~;3$IôVž5±/ƒ¾'Q „w¾'QQ'Ⱦ'Q w¹'*¦D¹'*A/>4D¹'*l9¾'*l9¾'*l9bw¹'*Œ¾'*Œ¹'=¦#ì;>ì;>bwì;> twì;>Y1;0cc;.ì;.cK9=[ŽìK9=[! «wìK9=[! ¾wìK9=[! ÕwcK¹ƒìK¹ƒcK$ìK$cKª=ìKª=c-Œì-? uwc-ª3-'#Œì>#Œc>#†9ì>#†9c>Ðì>Ðc=Vƒc=>ì=>c=#.ªQì=#.ªQc=5Œì=5Œc=Éì=Éc=·<ªì=·<ªc!O[ì!O[ì!O[wc!Œì!? v<<'\pY$O�4c!?Dc!?REc9Vì9Vwc9!.5ì9!.5 Š**[Žc.FFÈì.FFÈcïž5c� ì� c.3A$'5c./ì./c[†ZDcoìoco*‰coì½9>c½94Q!cì½94Q!cc$!9d5ì$!9d5c$>.Aì$>.Ac$9ì$9cûÿñ9d5ìûÿñ9d5c$9#$ì$9#$c$9µì$9µc$.ª'/.ì$.ª'/.c$cì$cc3ì3c#cûÿñ3#cE!QìE!Q~$'#°3šY°>… Š*lEDcELV.ìELV.cEL9-¦ìEL9-¦c$4-/;nì$4-/;nc$O-0Dì$O-0Dc$Rlªì$Rlªc±LÐì±LÐc±<$­0ì±<$­0c±'ªŽì±'ªŽce�#}½cìe�#}½cceÈ..ce'ª=ìe'ª=ceOlÐìeOlÐcs<°'#”ìs<°'#”csÉ[ƒìsÉ[ƒc !F=ì !F=üIÿéÿèþMg'1=EAQZ<ÿéÿèþc 9#ì 9#c 33ì 33c5J!F'Ac'mì'mc'!93ì'!93c'¦3ì'¦3c'9ì'9c'9#ì'9#c'33*ELLì'33*ELLc'#¹ì'#¹ twcûÿò11=ìûÿò11=c'113'Íì'113'Í ô‰ Ã5J.'/Ufî'Qï[.'/Uj?1^Y?# \! Ã#*~9;-cÂ�5'Í �=bµ9>n<å# Ã5J.'/u¿uw3ƒu- îe0ƒ3-FEKEŒ3-0cu-0cšY4Q*;*.ªq#š ¢¾$'5#€jld �K- Šd/>4p �K-F”\3-0$¸u-0$¸3-0ª3-0ÿíU#!$² j±#!Z K<^ î R KÂ#›*~9;-0Â.ªq#𠢫$É v//'#! \1J bA-[É~È3Ij±#<13Q·*pˆž›kµˆž ¢�#D3-//!Œu-//!Œ3Q0”ÂuQ0”Â3Q*-'uQ*-'3QžD3Q*5ŒuQ*5Œ3Q¦uQ¦3Q¦#F=AuQ¦#F=A3QAdŒuQAdŒ3QA3$uQA3$3QA'-¦3QA'-¦D3Q#=ouQ#=o3Q#‰uQ#‰3;¦3;5Œu;5Œu;5? ¾w3;Du;D3;…d04'eDdŽu!Žd!mdL!­5u!L!­5dL±#ûÿð$u!L±#ûÿð$dAVdA3d9#'Du!9#'Dd9ñÉlµd.d./c'9d5u!./c'9d5dÍ d#cu>cd#EŽu>E!Ywd#ŒdJdJ;u!J;‘wd5#=u=#=dˆJDd<|Žu\|! „wdƒu.F>ƒ|};Ì#D|};Ì#<9.1|};�D|};Œu.};? ‘†REcI§#²\$'5…Y9;op ¢Ã#lY4K\^› «4EZ€§#Î9.3$<$19Z€k­5O�Ru.};?f[ø×Y=OZ\›¢‘q#üg Š3ž53Œ|0c|ž5uZc|ž5|!F<å5u�F<å5|u�|\>=u� #=|!Ru�R|LŽ|L†./Žu.L†./!U°4q# K\^bK9!/KZ€¤$ž3 j$~‰1;!Y°>nÉ<ü ÕEc|9|cŽ|3Œu.3Œ|/l|#u[|#0#|#*ƒu[*ƒu[*-~w|#*F=Au[*F=A£�w|#*ä'Ðu[*ä'Ð|#* Œu[* Œ|#Žu[Ž|Íuo «R!Œ|Í'n0|Í'n0Duo'n0I§#*Y°>…|#c|#c-¦|#c|JÈu.JÈw|Eu.E|1†ªu.1†ª|<ƒ|É|ÉJu4J|ÉD|Â;Œ|ÂK'e|ÂK'eD|44d|­5|R>u.R>3303d53$Q3$QD3$FQ$Ou$FQ$O3½V3$AAo3$AZ3$A|#!;3$9u$93$9 u$9 3$u$ „w3J*J3JA3JAl'*[VuJAl'*[€§µ9E~½lq#-11o^ ¢�9QAoYË'04'eš-0 !0J‰ZD3JAéuJAé3JA$uJA$3$$c3$1!ªu$1!ª3E>uE> �w3E#ƒuE#ƒ3E±[ŽuE±[ŽuE±[!¿Î'5A-.|D3$ Žu$ Ž3$ ;u$ ;3$4cƒu$4c-›*Y°>…u$4c-üI„eä'>0? �Ë.Fµ.JšY°>nLZ *'0nOlŒu$4c-üIu-R›*~‰1µ=Y°>… ul=K'eu$4c-üIu-R›¤-1 u.};Ì#<9.13$4c”u$4c” u-Rp ¢«'él�Du$4c” u-RUÿì!; t? ÿì!;3$'u$'u$'bwu$' Õw3$'Žu$'Ž3$O[Du$O[D3$R3$RŽu$RŽ3$R=343'°ƒu'°ƒ3'°Qƒu'°Qƒ3'°=u'°=3'°#*ƒu'°#*- �w3'0c9'5Éu'0c9'5É3'*R.Au'*R.A3'.A.u'.A.3'u'3'ƒu'ƒ3'.ªu'.ª3'#u'#*U¾$9Q #3'Íu'Í~-Olq#^› Ã#RQ·*~‰1|0q#š~$OïU� u'Í �!”Ž3'#[u'#[3'<9=u'<9=3?*Ìu?*Ì3?*�u?*�3?/19½?·u?/19½?·Y'F1$1'3q#I K�#4IÕl9'3n1ds/;? j'/ED3?/19‰ƒ3?/19‰”3?#mu?#m3?##u?## �w/¤w¤¿tw¤¿�w¤¿�;3¤¿Šw¤¿Š¿�w¤¿«w¤¿¾w/¶/ƒ¤ƒ/-0AeAE/-m-*$¤-0«-*$/-m[ޤ-m[!pžºo^ uo'n0›*Y!/.$n0 v/1|0q#D¤-m[!U”ˆ¸*b11 -m j$ î>=€²!L=>…K=Ì3D¤-m[!U”ˆ¸*pžºošY°>nLZ \!;mY'//;�D¤-m[!Ue-*-Fd kµ1µ „5‰ k#|#!Y!;åD/-m[=Œ/-m3'1¤-m3'1/-°#4?e¤-0 4?e/-0c-Œ¤-0c-Œ/-0c>ª�¤-0ì>ª�/-0c\Œ¤-0c\Œ/-0d$¤-0d$/-019=4š j‘„þgþ4›vuU(þgþ4/-**½c¤-**½c/-9-1K±¤-9-1K±/-[¤-[/-[·#Q…/-¹ï/-c\/-co¤-co k#Uu[!Y!;mbO-.3-Fdp›p*'És€²\!;m Š#O.5J/>Ð/-csD¤-csD/V.A#Q0Œ/V.A#QÐ/VJ!Œ¤VJ!Œé¤Q~w¤Qßß›*Y½�4?^ ‘!RKÂ#IkLpÂ-0×é-¦/>Ðé-¦sVé-Ao¤Q-Ao› Ã#0JËdô½-F'3;? Šº$É „-04$éž5<3$$ФQž5<3$$ÐéLe¤QLeéA9.¤QA9.éc[¤Qc[é#½°¤Q#½°¤Q#½°›*eƒéEQ¹Q¤QEQ¹Qé1$R=énLZ›j!m#Z€ ø×Y=OZ\p*'É5?^ �!­3$1/>4›„µ'e �.e0×D¤;c†oY!0J*;? *'04I§#*Y=OZ\/;c$O/;c'D¤;c'D/;J¤;J/;5J¤;5J/;<9¤;<9/;4ƒ¤;4ƒ¤;4- uw/; ƒ¤; ƒ¤; - Šw¤; - ¾w/;n#¤;n#¤;n# ¾w¤;n#w/;n#=¤;n#=/;4J¤;4J/;4Jޤ;4JŽ/;4?#¤;4?#/;'3|¤;'3|/;'?-/ƒ¤;'?-/ƒ/;Œ¤;?›#¤;? Šw¤;? Š3d#¤;? ¾w¤;? uw¤;?Y'Ž/;?Q#¤;?Q# Šw/;?Èd#¤;?Š3d#~w/;ª'33$¤;ª'33$/”-9;'¤”-9;'/”-c.¤”-c./”D/”<-m' 44D/”<;.¤”<;./”ˆ/$¤”ˆ/$/”Ð/”Â/”µ-cƒ¤”µ-cƒ/Kå¤Kå*~”!U�JËY4'*�I ~lq#›V?ˆD/Kmo/K=Ì3/K=Ì3D/K9!/KZV/K9\J¤K9\J/K9!RD¤K9!RD/K9¤K9/Ks…D/KD¤KIîw/KÂ/K·<ˆm¤K·<ˆm/K !R¤K !R¤K !Rbw¤K !RYw/-'0de¤-'0de/-'=9$LL¤-'=9$LL/-'e>¤-'e>/-'s¤-'sw/-'s…¤-'s… tw/-º¤-º/-º./V3Œ/-º./.|>¤-º./.|>/-º./'/¤-º./'/ Š#Ë$1?ñ°1d/-º[¤-º[/-?=¤-?=/-?\¤-?\/-?#;¤-?#;/-?'/.¤-?'/./0V|¸5¤0§3|¸5/00-[¤0�-[/00V3ƒ¤0�V3ƒ/00V3'/¤0�V3'//00;#¤0�;#/00E/Zc¤0�E/Zc/0*J$'A9¤0*J$'A9/…39[#!Œ¤0Š39[#!Œ/0¦Ž¤0î!Ž/0A.33¤0î.33/0A± ¤0A± ¤0î± /0/'55Œ¤0¤'55Œ/0/'5Ë-Œ¤0¤'5Ë-Œ/*1.¤*1.bA/*D/!-*$R¤!-*$R/!Qo/!QD/!;ƒ¤!;ƒ/!”'e/!”'e/>Ф!”'e/>4pY°>…^ kF¹!0n­›*Y'F¹!0n­†s0€g1-…¤!”'e/>4š «$R ÕÈ3 L\ˆJ€Î!$1d ì!!1 Ã1 Õl9 j9!.5 j!m#Z€ul=K'e¤!”'e/>4š ¢Î$·#n€�!é„Eb0-ž/Z›Î L\ˆJ€¾$'5#V<^b†9$*$AŒ/!”'eD¤!”'eIkL ŠLL!0n­#\I„Eb Ã#.­5ˆ4? u.};Œ¤!”'eIkL ¢Ã L'3#\IkL Õs4·# j!m#Z€ ø× j$~9!/Z€²\!;å5D/!”'ñA/!mQZD/!mQ//!mQ/D¤!mQ/I„E ŠOV'KoY°>nLZ›¢²$dš!= !O�R/!mQ.ª/Ì/ZV/Z'D/.ª[/3;D/|#ޤ|#!^›pË$*'0× j$ k#Uu[!Y!;mo¤Š�uv‘Š^›pË$*'0× j$ k#|#!Y!;mo/!†o/!†oD/!94ƒ¤!94ƒ/![0cޤ![0cŽ/!cE.¤!cE./ÈQ‰ƒ/ÈF$'5#Ž/È=$¤È=$U„'>·D/È<ƒ¤È<ƒ/È#?c¤È#?c/ÈO[/!/!º/!/EŒ/>ž3<$9#¤>ž3<$9#/>o.‰”/>$'¤>$'/>4V/>×/=0ûþ.¤=0ûþ./=l9¤=l9/=¦5/=Ao/=|#¤=|#/\9/\<-¦/†ƒ/†-*Kƒ/†VQA'-¦/†-13”Ì/†”°>…/†K9!EŒ/†9$/†9$*$AZV/†9$*$AŒ/†9$*D/†9?d#.$º?/†9-/19†-/[Ž/†s0V/†'å#/.¤.Ug'Í/Z9-ȤZ9-ȤZ9-Èbw¤Z9-È �w¤Z9-È Š¿�w¤Z9-È „w¤Z9-È ¾w¤Z9-È ìw¤Z9-È w¤Z9-È ¿Õw¤Z9-È Õw/Z9-ȃ¤Z9-ȃ/Z9ȤZ9ȤZ9È ¾w/Z9�/Z9.9.c$¤Z9.9.c$/Zc¤Zc/Z5½‰1µ=¤Z5½‰1µ=U¦#=K î±19Z �13-?I§I§#bïpYËopžºo/Z LZ9ޤZ LZ9!^bY4'*?š à5b4n4'žI§#²!-*o «-FlD/Z L.3/¤Z L.3/ „[*oUì!?<^ �'€�Z×;Œ/Z \-'s/ï*d4J¤ï*d4J/�0ª?<3-R¤�0ª?<3-Rw/�4å#¤�4å#/.A#Kn¤.A#Kn/.A#J¤.A#J/.cޤ.cŽ/.dO…/$žD/$*.L�/$*'3;/$È3¤$È3/$A9*-/¤$A9*-//$9-/-¤$9-/-ÿì”=/$9-//¤$9-//w/$9Q/$d0'3;¤$d0'3; �†=/[Q4IkL Ã�‘U‚U[*'…î R p9.Fl.Jp «'é u'Í~Q…5~È3D/$|4E¤$|4E/‰>!ޤ‰>!Ž/J.cƒ¤J.cƒ/JlE/JlEo/J$A±19¤J$A±19 ŠOV'q# „Eb0ä'l.JI b u;¦ \!;m u.};Œ/JD¤JD/J 33¤J 33/J4QŽ/J4A‰=Œ¤J4A‰=Œ/J 3Œ/$J¤$J/$Jcƒ¤$Jcƒ/$E¤$E/$Eޤ$EŽ/Eƒ¤E-U�Q4V3$1D/E-O0ˆc¤E-O0ˆc/EޤE! k# Õ[*$¤E>$/E†n¤E†n/EsD¤EsI§¤EsIŠw/EsÐ/5#ƒ/ûÿòA¦¤ûÿòA¦/'9-//-¤'9-//-¤'9-//-*pnª;/'3ž5¤'3ž5/'3|¦#/'3n/'3n*K-F”Ž/'3n*./>ˆJV¤'3n*./>ˆJ€g0Vo›ô'V.ªq#š u;¦$d0'3;Y./.3;l? j-FdD/'3n*°1|#;Œ/'3n*°1|#Ž/'3nL-…·/'3n|Í'V/'3n1d/'3nO;Ì·/'±Éc�RZª¤'±Éc�RZª/'519Œ¤'519Œ/'5±Œ¤'5±Œ/'5n¤'5n/'5'¦nÉI§#ŠÍ[!=<¿u!ºo4Jß”<£ß «!K9ß �®¿+261#!$-*¹'OQÐ#!E#!19‘!19^b ‘\·*UÎ9± pžºoY?¸/#\·#†9=3Q*D#†REc‘†REc k5AQ.ªq#€�!­3$1/>4p ¢Î'F|0Y!04E^b~”!Y4'*?𠢄!ž±3 Š/=¦#0?Q-¦/>4b*/[Ëq# Ø„Š¤§Ù#†REc#†REco#†REcD‘†REcI„E k#Uu[! �K- t”!b0…‘A'?>#Z9”‘Z9”‘Z9” ¾w#Zc‘Zc#ZcÈ #‘ZcÈ ##Z$‘Z$#Z-Œ‘Z-Œ#�9$LL‘�9$LL#�3 #‘�3 #‘�3 # „[# ûþõ5'1#.¦3‘.¦3#.c3”‘.c3”#.3|-/‘.3|-/ tw#[†!>#[†!> #9.$‘9.$#9.$cƒ‘9.$cƒ#J¦5‘J¦5#l!0c.‘l!0c.#¹#3/#$#$=5‘$=5#‰ƒ‘‰ƒ#‰[q#D#J#J-µ9E#JF.F|$A±19Z‘JF.F|$A±19Z k#Uu[! �K- t”!Y=OZ\#$E*9$LL#$$<9[‘$$<9[#E°$‘E°$#E!-'3БE!-'3Ð#E!>‘E!>#E/V.ª#Eé‘Eé �w‘Eé w#E =##ER$$#$Ð#$4#$4q#D#$·‘$·#$·D‘$·Ik# ¢î'14-U²-O[*±# k1n/€g4E-¦$ž3#$n…‘$n…~J…5#o ‘$n…D#$n…D#$×#$­3#$OZŽ#$R-c‘$R-c#$RZc.‘$RZc.#1e#kü�J#Ekü«;ƒkü«-­5$6k6UØ2U}‰$ >?3ÙA'Q[! v/1 ­I¢j9=-1!µZpžºš j!/$ª‰ï!bA-[Éb+8,¤ÈQ‰- þÚ>$A±L4D$”$F¹!0Ð$F¹!0n­$F¹!0n­D$F¹!04D$F 5O$F 5Oq#D$F 5Oo$F<$d<…#…kF<$d<…#…šY1!°€u.};?=.$*ZV<^Y-/1|Í Š55EI§#Ãn|4?~J4$'5D½0”.JV½0'5e#…k00'5e#…š u†ÂI ŠÍ[!=o=.$*Z€jldD½0'5e#…D½0'5ñA½9Ì.kmÌ.½30$!0k!0kŠ�� Š0J‰ZY'5­?<^~9[ƒkŠ�� Š0J‰ZY'5­?<^~9[- `¬$È>kÈ>$L$LF03$L…50$<1Eƒ$LLZŽkLLZ!bµ‰q# j!m#$A?›„'#0×<^› k­5O�R$L¹”$L Ž$9/$4$k9/$4$$94-cŽk94-cŽ$c-/$4$kc-/$4$-Lk3-L-L #k3-L #-Ok3-O-O$k3-O$ tJ[$ �-Y.3O-YQ4$Dk3*›‘!R$ž3I„EšLZ!bµ‰ž#k3ž#Aƒk3Aƒk3A- twk3A- î.±3*$$|AJ'0d$nž$|O”Ë$k|O”Ë$$|O�5k|O�5dk3d…k# �=.Oo �\.A# Šä'q#I„E †s!O€g?¸/Dk# „'ªª?Y†<^ !13? j$~=#Œk# «.A9= u!­3b<<½Ì×!”'eDk#pžºoß †s!O€§#¢¤!QošbF$µk#Y°>…k#pÂe3q#<9.1IkL ¢g°>…I§#j!m#$A?bIŠº1e< t?b~K!AE.ª u4š ¾$'5#VI§#¤$*.L�t?b~3”ˆLZq#Y?¸/k# u†ÂIj$ ¢Š*lEk# k1n/€g4E-¦š t$$cIt?Y.ªŽk#YÈ!0nÍb!”'eš †s!O€ŠLL!0n­#\Dk#YÈ!0nÍb!”'eš †s!O€ŠLL!0n­#\IÎ;4 vv¿v/1d/>4q#š ¢Î9.3$<$19Œk# j=/[$A? „EY!;mYËK!A�Dk# ¢�!­3$1/>4šY°>…k# ¢�./>ˆJVl?š à5<üb4n4'žIj$R;k#Uu[! †s!O€…š t$$dQ›Õ!.A9·*Y!;mo t” k# ¢�J­5nF.|4?š ý'=? „E/Dk# ¢ŠOµ.JšY°>…k# ¢„$'#*q#š ŠOV'k# ¢«†=$¦#!l?›*~3”ˆLZq#šbµ9EYÈLU�lq#Dk# ¢v/1E4Q…š $$4Ug·/ j5'#0q#p ÕE*U„eä'>0?›V?ˆDk# ¢‘;QQpÂ1e4q#š t±*LE*üIu-Rk# ¢‘K'eš „'ªª^b �ÌË.FŽk# ¢Î=.3IkL=Ao t$$dQ›Õ!.A9·²†s!O€g?¸/Dk# ¢ôV'!šk# j?1\šY!;m›¢§33½q#š u.};? \$'5…Dk#U|#! u$AAopš=.$*ZVIt?~k�Š‘ ÈÍpÂ-0n­ ý'=? !1E45½\…›j!m#$AŒk#U|#!Y?¸/I ¢�‰/'#Zq#5½\<^ ¹!0×Dk#U|#!Y?¸/IkL �°1|#\›*Y1!°V4?be”pY°>…›j!m#$AŒk#U|#!Y?¸/<^ «4E?ß j!m#$A?ß›Š0J‰ZDk#U|#!Y?¸/<^5‰!›ÎlLV3DJŽJA$oJ|#Žk#|#!Y!;mKÂ#<^ ‘u¤~§juv‘Š �K-F”Žk#|#!Y!;mo›Î-1=d4 j?1\š Šº1=�#…Dk#|#!Y!;mo^ ¢v/1-04 k# à5~9;¦IkL ¢Šº·#žàš k#|#!Y=OZ\¿j¿Î¿t;R!¿Î;^pÂ#q#€�$'#°3šY°>nLZ Ã#.JI§Fɱ0nÍ t$;*ÿà �8Bwk#|#!Y?¸/<^ «4E?ß j!m#$A?ß›Š0J‰ZDJ$k#$J ÐJ4;.$J4$A�DJ4$AŒJ'.AF$k#'.AF$$1>$1>-.e$1>°4q#Dk1>�lq#I¤†ƒk1>�lq#<ß›pL±É5'04'e k5AQ.ªq# „E k1>Ym;<9.1$1=-Fd$1=$1=q#V$1=q#D$1=KE$1=KED$19 V/$AŒ$1[.Jk1[.J-1=^ �\.A#~sÂÌ „E �½'/>4q# †s!O€uQA'-¦Dk1[.J-1=^Y°>…ßY9m;Q4 k#~$1?sA94 �!FKŽk1[.J-1=¿�!­3$1/>4I Y°>nLZ �½'/>4q#p ¢uJA j=/k1[.J-1=¿ ø×p›dnÉk1[.J-1=¿k# j9!E? �!­3$1/>4pY°>…k1[.J-1=¿k1=q#I²\!;mp u.};�<^b~sn0€§< <Ðk1[.J-1=¿Î±A/KZ kF 5Oq#Ik# j9!E†Z€²\!;mpY°>…k1[.J-1=¿¢g°>nLZe/\šY°>…$11>9!./k11>9!./$11E4'#lŒ$1n0V$1n/Vk1n/€²\$'5…b33½q#p u.};?Y?¸/Dk1n/€gÈ!0ךb0ä'l.JY$'5…Dk1n/€g4E-¦š t$$cIt?Y.ª!^› k1=q#I²\!;mb11 -mk1n/€ôV'\š !0V3›Îe°ˆJ$1n/V3Œ$1n/.ª$1n/.ªoEk² ‘kj^ ¢Ã#' k1=KEEVE-/k±/EFlE°k²�v�^bY?¸/ j$ Ã#.ä'È? vž#nL? \!;å5DEžñAEž5DEAQk5AQq# „E Š0J‰Z~$Uk1=q#›�!­3$1/>4 Øk!0*ÙEAQ/DEAQ.ªEAQ.ªq#VEAQ.ªq#DE�#·E.A[E.A[VE#3E‰Q=k5‰Q=$ˆD$ =k =!$1dI¤4-c\$ =D$4$4$ºZ$4·#k4·#$'1$µ$µ0‰Žkµ0‰!š=J!€‘!' 1K9�I K�#4IÕl9Y?¸/ZV.A#Q4 �!”Ž$µ1µ$µ1µD$µˆž$O;Ì#$­53-1k­53-1b/JA ¢¾$'5#€§5n0dIgÈ!0·„E~$­±¦ t? tvkgvgß~§gß›Š.k­53-1p ¢u4IkL ¾$'5#VI¤JlE t? t.$ˆ<ß~§gß›Šv$­5O�R$O<9[… Š*'01;n°1Q4D1;n0'3;1;n×o1”0VΔ0V1”ä'VŽΔä'VŽ1”D1”<-¦1”<-¦D1KÎK1KÈÎKÈ1K>ÐÎK>4šLZ!~3”ˆLZq#^ v4IÕ9KI§#Õ9?D1K>4D1K9QÎK9Q1K9$AZV1K9$AŒ1Kï;ÎKï;1K�#4D1Ks°ƒÎKs°ƒÎKs°- ‘w1Ks0cÎKs0c1K5JÎK5J àš› k#|#!~.50'3q#Y?¸/p ì#$R#Uv·/Y!;mo1KÂ#1KÂ#DÎKÂ#I ¢Ã š^ ¢².A94 j$ t! �.LL=>ÐÎKÂ#IkL~lq# �>ˆn\ t? �K!š'F|0q#p9?ˆ0€²!O�RÎKÂ#IkL ¾$'5#€Ã pb �!1;4/>4€u.};?^b~lq#›V?ˆD1-'3Î-'3Î-'3bwÎ-'3 twÎ-'3 �ŽÎ-'3 îwÎ-'39.3|1Î-'3 w1-'|#ŽÎ-'|#ŽÎ-'|#! ôw1-?#ŽÎ-?#Ž1-ª1!-…1!!cÎ!!c1!=1!=¹Î!=¾1!AAŒÎ!AAŒ1ÈAñÎÈAñ1È|<ˆ=ÎÈ|<ˆ= jQJ1È4ƒÎÈ4ƒ1>#=Î>#=1>#.éÎ>#.é1>4ªÎ>4ª1!$1d1!$1dD1!1[4$ž3 „Eb0-ž/Z u.};�DÎ=ø#…š ì.3A$'5üIj5'#0q#b3AEl9/p „.dIkL �.LL=>4Y'F¹!04DÎ=ø#… j\nÍšb t$$c›v4I žºbI§# †s!O€g?¸/Î=ø#… j\nÍšb t$$cpžº1=LE/oÎ=LE/o ŠOV'q#Y4'*�I Y°>…1=.3D1=[.Î=[.1=.$*ZV1=.$*ZVD1=.19=V1=lªÎ=lª1=cÎ=c1=/µ1=/µ=/1=J!V1=J.Î=J.Î=J.Y.3O.$1=1=Î=1=1=5ŒÎ=5Œ1= 0µ.J1=ˆQ.Î=ˆQ.1=ˆÉD1=…¿�!FJ<ß› J?ÿà~-/=Jß Õ.3|-/ ¾£ß Š*<¿u!?ž#ß ¢‘†9=3Q*<^ ‘$E*9$LLpÂ#q#€Î'F|<9=<ÿà �8,^ 8âÎ1£ß v33'ɱ×<ßpžº¿Îs…^ þ~6,¿Ø‘§jkb*OQ…*Y4'*?pÉlµ!Y=�<¿g=�IŠ^b11|Y…[…U‘$¿X£Ù1=<…1†ŽΆŽΆ! ¾w1†=Ά=Ά=b~Ά= twΆ=~wΆ= ¾wΆ=¿¤w19;/-…µZ-.19;/-…µZV19>‰>ƒ19>‰>J19>$4?1Ž19.3-ž319Ì19.|1Î9.|1Î9.|1 ŠÎ9.|1 îwÎ9.|1wÎ9.|1 wÎ9.|1 ôw19.|11ŽÎ9.|11Ž19.3|1Î9.3|1w19.3$<$19ZV19.3$<$19Œ19.31Î9.3119$4½$1�D19$4$A±19Œ19± 19?3|DÎ9?3|I§w19?ˆ0V19?ˆ0D19?ˆ$AŒ1�5eÎ�5eÎ�5e ¾w1.3$Ð1.3ªŽÎ.3ª!p.ª[ß „c3E! Ã#²È.A.J1[…›j!m#$AŒ1$<ˆF.|n\1$<ˆFd1$É1$É0$E*[KŽÎ$É0$E*[K! †s!OV^b~‰1;Jš jR$pžºo uQA'-¦D1$É[*'ÉsV1$É/>$1-'Ð1e*Z4-F.|4Œ1e*ZnÍÎe*ZnÍ=ø#…šY1!°V4D1e*Z×D1e*Zn­1e*Z4ED1eL=>…1eL.º\1e.F9Îe.F91e|/[;Œ1e/\1e1;Îe1;q# „EpÂ1=…D15½'e15½'eD15½!oDÎ5½!oIkL ¢(2j9pÂ#q#€�JL=>… k# ÕE3Õï! Õ!F U ÕÕÕ ü{Î5½!oIkL ¢N2j9b�¤fvŠŠŠ ¾$[4~JL=>… k# �.Al€u.};�DÎ5½!oIkL ¢©j9pÂ#q#€�JL=>… k# ÕE3Õï! Õ!FÎ5½!oIkL ¢)j9pÂ#q#€�JL=>… k#Y!én0Y?¸/IU vUgФ§‘jv�g ü(Ÿ15½\D15½\ 15½\ D15½\ˆÍ15½\…<ß ô'/! (¿¤ÈO[ ¾¿ô$.A4›î=9;¾¿«Q#!é¿‘ER$$*ß ‘¾^btuŠþÚ'F|<9o~E1£ÿà �8B^ �)1¿vgt‘ 7U)B+B(U‚7U2ÿà vgg‘ ‚6+U»)Bw1 Ae<ˆJ1 ¹!0Ð1 ¹!0×D1 ¹!04D15‰Ž15‰oÎ5‰o �!­3$1/>4I ~‰1µ=U§<ˆ¸*pÉ5'0×15‰$×Î5‰$ךY=OZ\^› ŠOV'q#šb3Â#K.­b11 -åD1 1=4Œ1 1$…1·uo'n0D1'F|01'F|0Î'F|0q#p*ZKEIkL ÈK.­ \!;m ŠLLE4I 9?ˆ0Ig'FL�3*DÎ'F|0q# KoIô=<'IÎ!= KoIkL Ã#.­5ˆn\1'F|0q#DÎ'F|0q#D1'F|0q#<ÚX‚Ÿ1'F|<91'F|<9=D1'F|<9o1'F/1'3d#Î'3d#1'3 1'5A-.|D1'51$ 1?3E.ää!.$Dý!.$Iu4ä.'ý.'ä…Y4'*�Dä'QnnK.­ä'=�Dä'=Œä'\×ý'\× î>=q#›„E/'3q#^›p*Zq#š ‘!ä'\×-Fdý'\×-Fd ôVïl?š$!µq#I ô[?3~93Eï!U *'…u.­5 j'/$'5I§e~;°#$¦#Ug1!°LZ tµ ô;? Õl9~È3 j?1!›*Y1!°\±<<$c9[²”<$c9[±É$A.²”4$A.±·±·D± 4š~$­±¦šs/;? ¾$'5#VI§#k­53-1 t†R!>Y=OZ\±4#=²K#=±4D±O.²-O.±OZ9Q*±±O[*±²-O[*±±O[*±#²-O[*±#±R±?ƒ²-?ƒ50ƒ5*Æ5*LÝ-0nÍÝ-²!-Ý-*-F.|4ŒÝ-*-FdÝ-*oÝVlŒÝV3ŒÝ”JDÝ0V3Ý…#ÐÝ…14EÝ0$A#l.JÝ0EžÝ0E*DÝÝžˆA#o²!žˆA#o u.};? ¾$FDÝ*'0ײ'0×p›A.$¦#\bL ‘!$-*¹'OQ4~9!/$>*½ñ! j9=-1?pK�#4IÕl9 k1=-Fd te”4~;°#‰ƒÝ\²!\ÝL-04EoÝL=!\ÝL=>…²!L=>… ý'\×›V?ˆI§#*Y!;mYËK!A? �!­3$1/>4 t?Q›¤-m[ŽÝL=>…DÝL=>°ÍÝLd0×DÝA-ªª.²!A-ªª.ÝA./>ÝA.JVÝAËÝAËŒÝA'3KÝ9ÝZ9²!Z9Ý[cŽÝ[Â1e4Ý[4¹\²![4¹\Ý.1o²!.1oÝ3KÝ3K#\DÝ3²Èq#š jld u>A j$ ‘'/F=šbµ9ED²Èq#š jld u>A j$ ‘'/F=šbµ9EI ¾$'5#€§5n0dDÝ3q#V²Èq#€j9\-'sp †s!OVÝ3q#DÝ3q#<9.1²Èq#<9.1 t†R!> *'0nOl? þ} kF<$d<…#…Ý3q#<9.1DÝ3K.­²ÈK.­ ŠLL!0n­#\IkL jld<ßbFɱ04<ß›*Y'F¹!04 «!-*oI„E-m[! †s!O€„5‰ ¢�k¤ÎŠ‘�ŠþÚY=OZ\Ý3K.OlŒÝdOQ…²È!OQ…²È!OQ… Õ!.A9nÍšY!;m j=/D²ŠuŠô§‘�Š^b !O�Rš›*b „±/!REc „E ¢j9[co k# ¢‘$×pY°>…²È!OQ…ÿãÝ|-F.|4ŒÝ|A.JÝ/;cDÝ/$·Ý#Kƒ²>KƒÝ#޲>ŽÝ#L ²>L Ý##²>#Ý1=4E.'/Ý1|0Ý13ŒÝ13?DÝ1Eв!1E4 k# ¢ŠOV'q#š› Šº1=./>4€�‰1µ=Ut”~'5e#4U§R;>\Ig=OZ! „E~9!/4DÝ1E4DÝ1$ˆ4EŒÝ1e #4²!1e #4q#š~J…14 Èq#IÃˆÍ ¢jkg§²Y?¸/š ¢v��^ jeK! vvv k# †s!O€j9!EŒ²!1e #4q#š ¢�9Q¦šY4K!p›p*.Oï'€²\'3nÍ „5‰ �K-b0ä'.e*›Î5½\ Ý1e #4q#D²!1e #4q#<ß5½\ <ß!/E?!mQ/<^ ¢t”Z~‰1J>4IkL~$A#l.JÝ1ñÐÝä'\ÐÝä'\4DÝä'.e/>4D²!ä'.e/>4I„E ¢�!­3$1/>4š îvgUF” î '1 �!°ˆJUg'11E4Y?¸/DÝ ;m²\!;m *'0nOl?›te-* špÂ\4š~‰1µ=Y°>nÉDÝ ;å5DÝ<$'5…Ý<$'5…DÝ<1!0ÐÝ<1J ²\1J  j./! ô;Ì×I › k#|#!Y!;mY?¸/²\1J  j$ ¢u†Âš «Qd? Š4b3¿Øþï�ÓþÉ j=K$A? ´^+ÀU+N2Ùß~J…5#o ¢§5n0d t? $? Š4b3¿Øþï�B)þÉ j=K$A? ,)^]U6)ÙÝ<1JˆF.|4ŒÝÉs0·Ý<'3nÍÝ<'34DÝn#$ZÝË�OV²†s!O€t!9-O.Eš �=.­j5'#0KY!;m ì!?I„Eb u;¦ k#Uu[! t.F|$A±19Z „.d²†s!O€„5‰ ŠÍ[!=opžº^ �!;Y.5²†s!O€uQA'-¦šY½Ì3Y°>…I§#‘K'±3Y°>…<^bY4Kn0€ ­É.A²†s!O€Î;-/†=I î Ro �K- t”\ÝË�­ÝË�Oo²†s!Oo Õl9pÂ-0n­ ôï!$*0D²†s!Oo !0E*I„5‰b î.A-F?·š j!º4 k#b[Z‰1µ= ÈÍY4Kn0€²QcoÝË$<1!0n­Ý4'5#Ý­5 ÝO�R²!O�Rš~'5e#4 �K- v/1-0nÍ Š;3? �†!0× î'ïÈ[\ „E ÉK!~Q…5^ u4š;n°1Q4I„Eb�g~‰/'#Zq# î '1šb5n0dIt!A[#o k#-¦ ()X²!O�Rš †s!O€§#�½'/>4q#p~9!/Ë?¿�9;dI«¿�-O›¾-/\ Š¿²'<9¿Õ\41E4ß~J#!0n0µ^ îe>R$$Îe<ƒ²$R>- Õw²$R>- Õ!D ºQ#Ž Œ²$Œ ?V5'F>²'F>5'm-/ƒ²'m-/ƒ5'0c|*¦²'0c|*¦5'*L²'*L ¾w5'LL#=²'LL#=5'd5'dD5'<9²'<95'< 33²'< 33~w5'<ˆQ5'<<$²'<<$5µ9²µ9²µ9›#²µ9 ì-Œ²µ9 uw²µ9 ‘w²µ9 ![cŽ5?ª[²?ª[5ª”ƒ²ª”ƒ–gwg¿�wg¿¾wg¿Õwg£ÿìw–7•Ó–X+2Ï)+’gX+2Ï)+’–(X6(,,)g(X6(,,)–((�Ÿ–(+266)(+8g(+266)(+8–(26SÅ,g(26SÅ,–(2)»(+B’g(2)»(+B’–(,´68À8g(,´68À8–(6´+(©’g(6´+(©’–�)+Ó,N6(g�)+Ó,N6(–`,ÖÀ“g`,ÖÀ“–‹(Ä6+(g‹(Ä6+(–N2)Ç(X‹gN2)Ç(X‹–NG8+ÀÿqgNG8+Àÿq–N8+)7•ÓŸgN8+)7•ÓŸ–N8+B(,Û,(gN8+B(,Û,(–N8ÇÚ˜+’gN8ÇÚ˜+’–Ö68G¯gÖ68G¯–NQgN§‘�^b t>m/;c›ŠOV'q#Y?¸/ „Ebµ9E ‘-/! �-/F.A'–2X�–2(´¶–“XÄÄ»g“XÄÄ»–“XÄ©)¶g“XÄ©)¶–“XÄ8À,g“XÄ8À,–“X�,+N6g“X�,+N6–“X`6SŸg“X`6SŸ–“X¬Û¯g“X¬Û¯–“XÀÓÑg“XÀÓÑ–“XNTB(Ÿg“XNTB(Ÿ–2)8Ñ,,(g2)8Ñ,,(–Ï»)8SgÏ»)8S–)B»¥2’g)B»¥2’–-F' g-F' –-å5Žgm$>Ž–m;–m;|#\D–m;3Œgm;3?'F|<9o›u[c �Kƒ–m;3?*Kƒ–m;<9.1–m$|ƒgm$|-ßY°>4‰†s0I§#Õ.cïKƒ–md5gmd5–mªgmª–m$–m$9$' –m$D–mE5gmE5–m !ž5gm !ž5–m'3·Dgm'3·D–m'3 !ªgm'3 !ª–m'34ªgm'34ª–mR;ªgmR;ª–°–°>…g°>…~lq#pžºüI�$­±¦š ¢Îe0|#Z€g°>… ul=K'eg°>… Š*log°>…ßY9m;Q…D–°>nLZg°>nLZ›j!m#$AZ€ ø×Y?¸/I ¢g$O�4 Ã#.Jg°>nLZ �Kƒg°>nLZ Š|n…g°>nLZ „e‰›²\1JˆF.|4Œg°>nLZpä'.5?^b$ž3 „E k#|#!Y!;mo–°>nÉ–°>nÉD–°>4‰†s0Dg°>4‰†s0D–0$1'D–0$n#.$nDg0$n#.$nD–0$4Ðg0$4Ðg0$44 ¾wg0$44 uw–0e>o–*Kƒ–*.–*1–!;mg!;mpÂO�R j!m#.ä'\›* î-[bI§#·…ž#4IkL à5YKL-0× Õl9 k#|#! t.F|$A±19Z †s!OVg!;mYËK!A?ß~JÉ5'0×›àš~lq# ‘†REc<ß Õl9bY½.$Ug°>nLZ Šº-/1d^ ÿéÿèþM§/E19$'Ig!/.U�J*'04EI§#*Y£²¿kO<9[4 †s!O€g?¸/Dg!;mo ¢�9!/Z€ul=K'eg!;mo ¢�9!/Z€ul=K'e ôÌ j9e! k#Uu[! ô>*E<^b~‰1;J–!F”nQg!F”nQ–!…F; g!…F; –!0Jg!0J*U9Qì#$Rd*¦¿§#pä'.5?p4$~$A#l.­bµ9El?¿ÎKs0c Õ.3R$$Îe<<ß �)–!0J*;Œg!0J*;?Y=OZ\pY°>…›j!m#$A?^b Õï!U§Íd ô�R–!0×g!0× vvv¿«!V ›V?ˆI�>Â<ß~d;o9$' <ß›k =Y1!°€Î ¹!04<¿„!ž±3 «!V ~d;o9$' D–!04E–!0's4Œ–!!co–!AVg!AV–!A-Rƒg!A-Rƒ–!¦F; g!¦F; –!A/>Ж!A'5g!A'5–!9mQAg!9mQA–!.¹.g!.¹.–Èûÿð'cgÈûÿð'c–È!0ЖÈ!0·gÈ!0·²\'34I„5‰›pä'.5?p4$ j\nÍš †s!O€g?¸/D–È!0nÍgÈ!0nÍ~‰1µ= \$'5…I„Ep03'ˆJ Õl9[bs°ÍY?¸/–È!0×gÈ!0ךY°>nLZ=.$*ZVI ›p*'És€²\!;m u.};Œ–È!0n­–ÈL–!én0g!én0 Èq#<9.1It†R!>~l›*~lob5n0dI u.};?›*Y°>… ¾$'5#VDg!én0Ym;g!én0 Õ!Fg!én0 Õ!F~JL=>… k#4$A? Ub !L-04EoYµ.J–!én0D–!/.–!/.$n0–!//Èg!//È–>AÉ-Ag>AÉ-A–>·#…D–!11$g!11$–!ä'ÈgŠýÊubI§ uQA'-¦ „E �½'/>4 †s!OV–!ä'>nV–=¦Œg=¦Œ–=Ì3g=Ì3b0ä'l.JbI§~-1l€t'*¦nÍ Fd/–=Ì3D–=�D–=$4J[–=±–='/g='/~§(© ŠdOq#›²cš~|#Z€�†!0ך~Q…5pb$1-'<€Õ‰>–=O.g=O.–=OZŽ–=OZ\–†–†D–†nÍ–!'Íg!'ÍU«!Ž–!­±3–!­e–9-0cÈg9-0cÈ–9-L4Jg9-L4J–9-9ïª-ž9g9-9ïª-ž9–9-93ƒ–9-.d#*±g9-.d#*±–9-/-/Ì#g9-/-/Ì#–9-/.–9Q#Jg9Q#J–9-$?.g9-$?.–9-1.±g9-1.±–9-1. g9-1. –9;o–9-'A9#\<Œg9-'A9#\<Œ–9-Rg9-R–9m;Q–9!19=g9!19=–9=g9=–9=ƒg9=ƒ–9.LLg9.LL–9.L�4Ðg9.L�4Ж9[g9[–9[$ª-c.g9[$ª-c.–9.eŒg9.eŒ–9.'/–9.O”9Qc;g9.O”9Qc;–9.O9;Žg9.O9;Ž–9$!/-c=g9$!/-c=–9$LL#=g9$LL#=–9$44Jg9$44Jg9$44J �-Oï–95'F–9'3*F=Ag9'3*F=A–Z9ÈgZ9È–Z.–�ALsg�ALs–�­5Ðg�­5Ж.A#K'e–.A#.LZQ…–.A#D–.c$Dg.c$D–.3Oƒ–.3O.$g.3O.$–./.3;lŒg./.3;l?›*Y4-F.|4?›V?ˆIkL ¢jR$;n×o j?1!~3'¸ñAb3AEl9/Dg./.3;l?!”'eI„E t$$dQY!;m !ä'\4 „E/'3q#Dg./.3;l?š±44üI¤!”'eš~3”I�J…#Ëq# j$ ¢î[.pžº–./c[Dg./c[D–./Jg./Jg./Jw–./JŽg./JŽ–./1|L�–./'3Kog./'3Ko~.50'3q#Uà~9;-0Ân0~'5­IÈÍ~.50'3q# �Kƒ–./'3–./'34Q!$'<3Œ–odgodU1”I¤†9$„E �†=/[o ¢g!én0 Èq#<9.1It†R!> j=/D–[9ƒg[9ƒ–.5–.e–l'–.ªŽ–cK\gcK\–c†m–c[–3ƒ–3-/!0cƒg3-/!0cƒ–3K=g3K=–3-­#Dg3-­#D–d!1–|0–3$4c[g3$4c[–/V3g/V3–/VdŒg/VdŒ–/;Ж/.dŒg/.dŒ–/l9g/l9–#-11=g#-11=–#?ž5ég#?ž5é–½Ì3g½Ì3Y°>…~9;-0Ân0IÕl9;n0'3; !L=>… j$ ¢Š*'0q#€²\$'5…I ø×~>ÂIØŠ²v�Ù–½�4Œ–½.$–½.$ž/$A±19Zg½.$ž/$A±19Z~Ee3K\špÂ0$'#4? ô;Ì×I ¢Î'F|0 u.};? kµ1µ–½.$!0J‰Zg½.$!0J‰Z~J*l.JI²ÈK j$b0nOl?p u\I�!­3$1~$'#Ë�D–½.$!/$×V–½.$AZV–½.$AŒ–$=¦3g$=¦3–$L4R;Žg$L4R;! !O�R^~k�vß ¢k1>�lq#I žºš~ < �kvU4$U�kv~lq#D–;gku§²^bY4E-¦›k#Uu[!bµ‰KZ †s!O€g?¸/–3ƒ–‰Jg‰J–µ.J–µ.JDgµ.JI„E vž#nLZq# Fd/<^b u$$cb4 ¢²\!;m k5AQ.ªq# !AËŒ–Oo–‰”'#*;-/g‰”'#*;-/–‰Žg‰!b<1!04IkL~lq# t!9-O.E^b.3$4Y4'*?p t'ˆ#\I§*/[Ëg‰!~'5e#4 †s!O€²\!;mp ¢Ã#l ìo*‰g‰! v/1|0q#IkLbµ‰KZ !0$A#l.Jš t.F|$A±19Z Šd/>4Dg‰! !Ld0×Ik# „!ž±3$|0? „EY!0J*;?Y?¸/I§#*Y=OZ\ß �¥ÿéÿèþÿ“�)(g‰! Èq#It†R!> ý'=�I§#*Y!;mUj=/Iî>=K t?~KV$A à5Dg‰! ÈÌF.|4? v<<'\p ô=? u;¦ �K-F”\g‰! !/;cIk# Š|n‰>JpY°>…g‰!Y$O�4~J…14IkL „EY°>…g‰!Y4Kn0€§<1!04I$L¾§gvg'F|0q#Dg‰!Y4?|ÉZ ô;Ì×I Y°>nLZ ÕsnÍ–JŽgJŽ–JAgJA–E>gE>–ûÿñe#gûÿñe#–ûþ*e# #gûþ*e# #–EZ†ngEZ†n–$'3–$'5…–$'5…D–$µ9–$'ªƒ–$O�Ж$O�4D–$Rž#g$Rž#–1-…g1-…UŠLLZ�#4 !1e #4q#š~lq# �K”†D–1-…D–1;–1;0c–1KÌ3–1-'3*og1-'3*o–1!-c=Dg1!-c=I§4 ¢�8N îE*J \!;m~JL=>…^ j9!.5 t-0cA '#*I§#ul=K'e !0E*I§IgÈ!0×bïI„E ÿéÿèþMkµUkLUg1!°V4?ÿéÿèþY°>nÉI§#k =D–1!mÐg1!mЖ1!°V–1!°V4D–1!°V.ª–1!°Vn\–1!°V4Œ–1!°\–1!°LZ–1È|Í–1>…5g1>…5–1=|Íg1=|Í;n#–1Z=g1Z=–1� $LLg1� $LL–1.3d5D–1[*d–1[$LL–1|Ðg1|4~lq# vž#n4?^b~”!Y4'*? „5‰ Š0J‰ZDg1|4Y.ª!U²Qc$ž3I„E ¢�Ë.Fµ.Jšpžº j=/D–1±A'Žg1±A'Ž–1ñ¦5g1ñ¦5Y°>…›t'ˆ#\I¤Ì u30–ä';Ž–ä'.FFgä'.FFY°>…Y?¸/^~‰1µ=.ªYÈ!0n­ � /[q#ß~'5e#4bR;>\<ß›²† <1!0n­Y!;moš9;/-…µZ-. ul=K'e–<5#gg²‘ Šd0ËJZ ¾$'5#V–4-F.|4Œ–4-*d5g4-*d5–4-LL–4-LLEg4-LLE–4-¦–4Q*;*.ªg4Q*;*.ªq#š ¾$'5#€jldI �K-F”\–4Q*;*.ª–4Q*;*Dg4Q*;*I„E ÕsnÍbFɱ04D–4Qž±g4Qž±–4Qc!Œg4Qc!Œ–4QdŒg4QdŒ–4Q$'3$Og4Q$'3$O–4Q4Jg4Q4J–4;cDg4;cD–4;5g4;5 $ºQ#Ž–4KŽ–4K!/>Ж4K\–4Kn0Vg4Kn0€�Ež5›¢§#V?ˆIkLb~‰/'#Zq#Uî±19g4Kn0€²!0$A#l.Jš~J·#4 j=/I î>=€j!ºÐ–4Kn0V3Œ–4Kn0D–·LQ$g·LQ$g·LQ$ ÿí-0m. |–·[-0c=g·[-0c=–·[F=Ag·[F=A–·[=g·[=–·[/†ªg·[/†ª–·|$Dg·|$D–·33/-å5g·33/-å5–·/–·//o–·19>g·19>g·19>bwg·19> twg·19> ¾wg·19>wg·19> kwg·19>wg·19>Yw–·19>…pb ¾$'5#€‘†REcgË'04'±3 Šä'.OV>…pb!LlIkL uŠþÚË-04Eß› k1=q#€�‰1µ= A±/ „Ebµ‰KZ ŠºË-0ך~”!Y'//;�I§#�1$ˆ×I„5‰~$'54 �!°ˆJD–Ë'04'eD–Ë'/o=gË'/o=–4';Ðg4';Ðg4';4bwg4';4 îw–4'ž#Ðg4'ž#4-1=bR;�82¿g?¸/KZY!;mošbFɱ04I§#*pžº\ppÂ*°1|#;?be”–4'ž#4D–4'ž5g4'ž5–4'*�Dg4'*�I Š5?ˆ19V\›-/E19IØvvÙ^�µ!-b5FE\…#<ßb ‘!R «$É LEŠ5?ˆ19!V0ª!R…5½\ˆÍ–'F/ˆJ–'F1$1'3q#D–'}-éÌ#g'}-éÌ#–'}-é?-/g'}-é?-/–'F<0s1×–'FÉQ…D–'FF=AgR>F=A–R=4ªgR=4ª–R†D–R.LÐgR.LЖRlmo–?/F.$ˆD–?#,–?#-1 g?#-1 –?#*5‰Ž–?Í>!Z–?#$1 D–?#4-0n0–?#4-0n0V3Œg?#4-0n0V3? t”pžºo–?# \Ž–?# †Z–?¸/g?¸/ �\.A# „E �†!0×›*~Ee0ךY1È|Í Š55EI Y°>nLZ›*Ym;3? j!ºÐ–?¸/KZg?¸/KZ Ãn|ªq#š «'é \$'5…I§I§#p·A±3;4šY°>… ÕEc–?¸/Z–?¸/Dg?¸/I�!L[l.JDg?¸/Ij9!E?›¢¤!QošÐjwj¿tsQ «wj¿�wj¿�¿�wj¿¤;cj¿ôwj¿Õ.3|-/4-ƒ4-Fd4-FdD4-0n0D4-*-$j-*-$4-ž'<ªj-ž'<ªj-ž'<ª ìw4-Žj-!Uî?'#4-A|-0$ªª$j-A|-0$ªª$4-A'Žj-A'Ž4-c-c'±j-c-c'±4-c-‰.j-c-‰.4-c”9.j-c”9.4-c>4V-O-¦jV-O-¦4V3éjV3é4V/JjV/J4-/;j-/;4-/'±j-/'±4Q-cƒjQ-cƒ4QAjQA4QJ4”cj”cUE�#·*b0…4Y?¸/ àpb u.};?Ym$~'5s0'3'/·FFµÐj!FFµÐ·m#ZVj!m#Z€ ø×~>Â<^Y1!°V.ªY=OZ\ j$Y°>…›j!m#$A?¿§# k­5O�R·m#.ä'Ž·m#.ä'\·m#$AZV·m#$A�D·m#$AŒj!m#$A?›*~‰/'#Zq#p ¢„µ'ej!m#$A? j±#nLZ›j!m#Z€ ø×$|0?›v4Iv/1-04 k# j!m#$AZ€î R ·j·Lc$j!Lc$·c-Ìj!c-Ì·/$ª‰ïŽ·/13K!L.3d5·#j> ÿì!;IkL ¢ul=K'eš k#|#!Y!;mo^››V?ˆIkL k#|#!›k#|#! !O�RÂ-(ÂK$AŒj=K$AŒÂ!19 VK\Â/j=/UÂ/~Ee3q# „E u;¦Ks…DÂ/[VÂ/[ø×Â/[$AŒÂ/D±#Ðj=±#ÐÂe#…j=e#…bwÂ5Œj=5Œj=5? w j=  ul=K'e<^ v¿j= ~J03'ˆJD·É·¸/VŽj\·/VŽ·Éoj\nÍšb ‘K'±3 uQA'-¦ †s!O€g?¸/ „Eb „'33 j!º4 ì#$Rd*¦ t”Ž·ÉD·ºÐj!º4~‰1e<ˆJ ÃˆÍ ô;ÌFdUj$ „.ºUu>A Š#0$*oDj!º4Y!;mo †s!O€kL›·#…I§#k =›=Vl?ÿéÿèþ ŠLL!04›¢²†s!O€ŠOV'q# „E u;¦~d0×D¢§Fɱ04 ¾$'5#Vß ÄÚU�`^ ksA[ß �!­3$1/>4›�.LL'ˆJ¿¤Qª=ß t5'…¿¤†'å#ß ‘¾ßY0;!0 Re<<ÿà �Ò^ +‹1¿Îs… þ~(N£˜¢§žä'-0?š ¢g°>…~lq#pžº Øg�vÙbI§#p*ZKEšpÂ#q#€g°>nLZb0nOlŒ¢§11|0q#šb[Z‰1µ= j$ j9\-'5'I�JÉ5'0×¢§11|0q#š „'#0× �\0s14EIj$ ¢�!­3$1/>4š›Y?¸/ j$1$AŒ¢§11|0q#š'3n1dU�sÂÌ Ãn|4? j9!E? j$ ¢ŠOV'q#šY?¸/D¢§'ɱ|Q u.};? ¾$'5#V¢t.F|$UÎ L.dÿéÿèÿî§ jR$U Uk#!-0c-¦š^ v4IÎe1;q#ß *'0×ß;c†oß Ã D¢t[;? ‘K'eš~Jn#'$'I²È!OQ… ¾'*A/>4<^bY4'*?š à5<ü=…1×D¢tuŠ‘�Y?¸/^ A±//! „E ¢g4'*?šY‰! ÿéÿèþMŠd0ËJZ ¾$'5#V<ÿéÿèþ¢t±*LEu-R^b ‘!R~V0'3'I„E ¢g½Ì3Y°>…<ÿã¢ts33$'[!”'eš›bµ9Eüg~JË.Fµ.J j$b ul=K'ep4š=4 †s!OV¢�‰/'#l?~d¦ u.};? „s4ª ô!l¿Õ\41E4ß~j^ îe>R$$Îe…ß ‘$¿(2Ù¢�J<'/=IkL ‘!R j!m#$A?^bY'5­?š ¢Ãn|ªq#šŠ�uv‘Š¢�E#=I§#Š*¦IkL ¢Îe°ˆJU²!0V3Yä';Ž¢�Ee3q# t†R!>=n#>…›²K!š~lq# �'1|0q#p'3n*K-F”!Y!;åD¢�$ÉUŠLL!0n­#\I§#V?ˆIkL †s!O€§#� /[q#Y?¸/D¢�'34'±3b11±€kL ŠLLE4Ij$b3dOÌ·p!ä'lŒ¢�?F=#†ZIkL t.F|$A±19Z~JË^ j$R;*b j9!E?š �½'/>4 †s!O€g?¸/D¢�!­3$1/>4›Îe|/[;? j\4š t!9-O.E ÈK �./>ˆJIkLY?¸/D¢�!­3$1/>4šbY!én0 �.LL=>n€j$b< … †s!O€g?¸/¢�.LL'ˆJš~E!'F|0q#I b/=ZQY½.$AŒ¢�.3|J «?1$ \š jl'3;~JZl?^› Š/1.s0€j\4 „5‰ ¢Š0$AZ€g°>…D¢�./>ˆJIkL=….­*b0…<ˆF.|4? j$^ v/1|0q#I„E ¢�È.­5?šY?¸/I§#*Y=OZ\¢� /[q#š j”c›*Y½.$!/$×€ ø×p›pÂ#q#€�‰/'#l?šY°>nÉD¢�Ë.Fµ.JšY°>nLZ *'0nOl?›*Y½Ì3~9Q¦¢�5?-�.Al€²!1$ˆ4E?^'F|<9 ŠOµ.J;? �K-bIÎ;4š ¢îeK= �K- Š0$4 k5žñAp ½m.$üg~3'¸ñAb3AEl9/¢ŠLL!04šp*.Oï'€�.LL=>…IkL~$A#l.­Y4?d k# ¾'*A/>4IkL �½'/>4 È!OQ…¢ŠLL!04š;-/†= Ã#…54-[n\ k# ¢Îe*Z×IkLb u.};? ‘†REc$ž3¢ŠLL!04š=4ß Ã11=Uu$R=~”! u†Â~‰F[q#<ß›²!­5  ôï!$ k#K5J \1J  j$~²j �13-?~KV$A !0E*D¢ŠLL!04šY'F¹!04K k# ¢§µ‰KZpžºoš „'33 j!ºÐ¢ŠLL!04IkL î>ž5›*b¦ k#e4š~3”ˆLZq#;4 vv^ «$R Õ!~3”ˆLŒ¢Š#O.5J/>4š~3”ˆLZq#^ ¢�J…14šµ'€Šº03'ˆOlŒ¢Š1ï!/Z5½\I§#¢�J4-A.J$ž3¢Š1ï!/.$A?š \!;m k# ÿéÿèþM§#‰V$'IÕK=ÿéÿèþ¢Š' 1!/0~JnLZ �K-Q-¦/>4›*Y·R;*<9.1¢„[€²!1E4š ¢�‰1;K.­Y?¸/Iu-FEKE?^b !O�R¢„.­U§º.‰ j9!E?špžºo›*Y'113Œ¢„E/€§#V?ˆIkL �½'/>4 †s!O€g?¸/D¢„'#0×IkLbFɱ04I ¢ lÌ3Y0e>oš j!m#Z€�½'/>4It? ¢Ã 5¢„µ'ešpžºo›*bFɱ0nÍY=OZ\¢«VLUu.L!š ¢�9!/Z€ul=K'e¢v�gÃbt Â#q#€�3”ˆLZq#Y?¸/ „E9?ˆ0<^ v4I«4E?›„µ'e¢vž#nL�5†9$*š!”'ñA àbI§11| j$$ž|Í ¢�.50'3q# àš t$$cI„5‰b Ã#.­5ˆ4? u.};Œ¢v/1-04špÂ|};?b0…4q#šY�§jj¢v/1E4Q…š !0V3¢v/1E4Q…šY�v „E~'5e#4bR;>\I „�3*IÕl9Y!­eY0Kš¢ *'És€g1!°€u.};? '#.­5 ÿéÿèÿî§ ÿéÿèþMt”! u[!ÿéÿèþY4'*?š v4IŠº·#4›*~9;-0Ân0D¢ øn­b04›v4I§LÂ/K9^ j$R;*be*Zn­Y°>…𢠷A±×š ¢¾-1Q u[c~>ÂÿéÿèÿïIt.F|$A±19Z �K-p4$ k1>�lq#D¢¾§gvg ìÕk�pžº¢u.};?bI§# Ãn|4?p ¢Ã#.­5ˆ4?~J·º4^ ŠOµ.J›¤!”'e/>4šY=OZŽ¢u.};?~‰/'#l?b4b j!m#$AZ€§#Î9.3$<$19Z€� << -*<^ ‘!…<<;?›*Y'LLZ�#4~J*l.JI„EY'5O.OV¢¤Q-¦/>4›*Y½Ì3Y°>… ul=K'e<^›pÂ*°1|#;?~ <4š j=/ v/1E4Q…pbµ‰KZpžºo¢k1>§v²Š ÕEcL3$RI„E �K-Q-¦/>Тk1>�lq#I žº^ �\0s1ךb �K-F”! Oïo k1>~lq# �Kƒ¢k5AQ.ªq#›àš^~JË.Fµ.JIkLY°>…ß~‰1µq#€uo'n0I§#*b5nLZÌ3p·3|¦#…¢Î=/µ=/Y'F¹!04pžº^›bµ$F.$A±19Z€²!O�R¢Î=… j$ ¢Î Fd/IkL j±#<|Âq#ßeL.º\ß›*~‰1$'#„-/.3? ‘-/\¢Î 1$ ìÕv�pžº „E4€j\4š v4IŠLL!0n­#\D¢Îbµ9E ‘-/\›*bµ9E Š#Ë�I b u;¦ k#Uu[! Ã#.J~KV$AbI²†s!­ÃˆÍ j5'#0K ì!?D¢²\!;m†9$à*pY'FL�3*I§#¢î R š'F|<9 ul=K'ep j9$ Y'FL�3*<^ ô=·}K!V!J4$A?›î!½9!/ËŒ¢²†s!O€Î Fd/p9$4$A±19? Ø�+NÙ¿Šé'È î*F=A Ø(¨(U�®Ù¢²$dšb44E#!?>4€¤$ž3IkL u-Rp~”! È!OQ… �†=/[q#<^› Šº13EKE?›V?ˆD¢²$dšbµ‰KZpžºopb0…4pY'11EnÍ u.};?›* \!;mp ¢Ã#l ìo*‰¢²$dIkL !O�RI  j±# ~>4'5?b/=ZQY°>…¢g!én0 Õ!F¢g!én0 Õ!F^ ŠgÕ� ã2YKÈ|· Š­#4D¢g½.$AZ€²Èq#<9.1IkLY°>…¢g$'3šb ‘!R-m[!¿j±0? ìïž5¿t$ÉJ^ ul4d t R#ÿà �)(w¢g4-F.|4?š jR$~‰/JKmo „'#0×I ~3”ˆLZq# Õl9 \1!04 j$b 1$ ¤!”'e¢g4K!šY!0J*;?b0……D¢g'0…<‰>J›t.F|‰†s05½\ D¢g?¸/I§11 -m^ v4Iô;�4?šb<1!04D¢g?¸/I¤$­/>4^› k­5O�R „EY°>nÉD¢j!m#$A?š u.};?›* ‘†REcD¢j9!E†Z€„$'#*q#š ÿí.1LüIu-R›v4I§11|0q# j$ ¢t.F|$A±19Z �K-F”! Š#O.5J/>ТàšbF}!OÌ×I§#*b05J?/I ¢Î9?ˆ0Iul=K'e¢Ã š~‰1µ=U¤JlE �K-pY°>…›*~‰/'#Zq# \!;m¢Ã š �0s/[Q4›V?ˆIj$YÈ!04~J·#4Ut!;o ÕE*D¢Ã š ŠºË-04I Y=OZ\¢Ã š ý'!'o ‘†REcI§#¤.ºp·¦5 A±//o j$b33½K! \$'5…Ik1n/V3? Õl9[b u.};? u-?$µ¢Ã šY4Kn0€¤†9$*I u.};?›*Y°>…¢Ã š jldI„Ebµ‰KZ �½'/>4~3”ˆLZ¢Ã KÂ#IkL9?ˆ0I¾$'5#VI b u;¦b0-ž/Z \!;m u.};Œ¢Ã 5pÂL-… „EpÂ-0n­ t.F|$A±19ZY!;mo^››V?ˆIkL ¢§4n4'žIkL ‘[†!>Y°>nÉD¢Õ5JA Õ-? j$ î$¢ÿì�3„E/'3-›t±*LE*üg u-R !Vƒj9!§u§ „.|Í 'd<^ „3$Rm;4Iv33'ɱnÍ j9!.5b11|0q#ß Õl9b~snä'!›*Y'A¦É.JI„E v/1 ­/>Ð !.5 È/ƒj9È/ƒ !/KZj9!/KZ›V?ˆI§#ÿéÿèþMkF<$d<…#…ÿéÿèþj9!/KZ›V?ˆI Y°>…j9!/KZ›V?ˆI Y°>…^ ¢Šº-/1dš ÿéÿèþMul=K'e kF<$d<…#…ÿéÿèþ !$*EŽj9!$*EŽj9!$*E!bwj9!$*E!~wj9!$*E!w !E†Z !E†ZVj9!E†Z€„$'#*q#IkL j9\-'5'°Íš j=/I„Ep03'ˆJpb~$E*[K!pžº ÕEuÐ \\ !Œ �55Œj9�55Œ o [co .5 ‰j9‰ ‰ƒj9‰ƒ ‰”j9‰”j9‰”~wj9‰” �wj9‰” Šwj9‰” Š*J›*<°>…j9‰” «wj9‰” ¾wj9‰”wj9‰” wj9‰” jwj9‰” Õw ‰1…Djld ô=<'Ijldf§Fɱ04 j!º4Y!;mopY�vY?¸/Dn4dDn4'3;4c-0ª?cjc-0ª?c4#Lþgþ44$j$j$ ·É k5 j$ vA#E!ÿãbY°>nÉügb3Â#K.­I !-0nÍ j$ ¢Î= 0µ.Jš «~d-A'\4$F-A$4$FÌDj$FÌD4$FŒj$FŒ4½K|Qj½K|Q4$*-Œ4$*j$*4$|};Œ4djd4|­5j|­54‰/�4‰$-c.j‰$-c.4‰$9ïŽj‰$9ïŽ4‰$?ƒj‰$?ƒ4J.jJ.~;F$4$$!Œj$$!Œ4$D4$14$1ZD4$1$AŒ4$1<Œj$1… �K- „.dDj$R;*b ‘!R «E.ªJpY°>…^ �‰-[UQV?ˆDj$R;*b;-*.A/ „EY°>…^ ¢ L3'>…š �=!c �!Y3-s…j$R;*b j9!E?š [žºoÿéÿèÿîvvj$R;*p0e” ý'Vl?~J<°$'<#\I„Eb30$9$|…š^pø4$AŒj$R;*I§ j9!E?š �½'/>4 u!;#oj$R;*IŠ­5?*-? uQA'-¦ †s!O€g?¸/IôÌ[Z‰1µ=Dj$R;*IŠº1=4Y?¸/I„E ¢gÈ!0ךY!;m ì!?Dj$R;*I„'33?U„d*¦*b5m.Oo „E �„ �K”†D4$ºZlŒ4$º|#ŽjkþÚuv‘Š^ ŠOµ.Jš› k#|#!pÂ-0n­ t.F|$A±19Z �K-F”ŽË-0ÐË-0Œj±0?U§##Ë-.3DË-[oË-lDËQnLZ›j!m#Z€§5n0dDËQ<3KEDËQ<|Í'Vj±#<|Í'€§3Âq#š~J…14'€ ø×pZ€j±#<3ËQ<|ÂËQ*Dje#*I u.};?›*Y°>… Š*'0je#*I Q1$R= ‘!I Y°>… „5‰ �68 j$ �ÏËûþ+1$j5ûþ+1$Ë!'je'Ë!OEjeOE ¾wËÌËÌÍ'3Ë[ï-Ë0;.js<0;.ËJ0Œj5J0ŒË'*.j5'*.Ë'\RÈ3j5'\RÈ3Ë'#0KË'#0Ë'ÉË?14”Ž4<-.j<-.Ug9>4'3$ɉƒj'3$ɉ- ìeÈ..ßb ‘!RY1!°\ „5‰ j'#Ìß ‘E =#bLs0ƒ4'/E4'/ED4'/$'5D4'#Ì4'±3j'±34'5#=j'5#=4' LLj' LL4'<0QŒ4µEÌ3jµEÌ3^K9!/KZ€¤$ž|Íš u.};?Y?¸/D4'O4R.¹#ɱjR.¹#ɱ4R$jR$$ž3I„Ee*ZnÍY'F¹!04~.50'3q#^b~JË.Fµ.J j$ ¢§33½q# Fd/jR$$žIkL~‰1µ=b<ˆ¸*pÉ5'0×pb u.};? !L=>…~$'5 jR$;n×o j?1!~3'¸ñAb3AEl9/D4?14?1Ž4?1\4?±##Œ4??#ȃj??#ȃ4ª!9$OVjª!9$OV'Ãwÿ‘;-?Q'FV*[$ÃFV*[$ �Q4”'F.ä'lŒÃF.ä'l?e<<ß u4*w'0#'ž#Þ#'[-/Ã[-/ ¾w'c'3'3LÃ3L'3­É-Ã3­É-'#ƒÃ#ƒ'#…54-[n\'#0JËd'#0J­#×VÃ#0J­#׀àIkL k#Uu[! †s!O€g?¸/<^ k#U|#! t.F|‰†s0Y4'*�D'#'#ž53?o'#ž5ÉQ*oÃ#ž5ÉQ*oY°>nLZ ul=K'e<^b t.F|‰†s0b11 -m¿¾$ 19~¿�J$9'!ß~-/}ï¦ß”<-m' 44<^ ¢¤vje<<ß X(¿Ø�8+Ù'#.J'#.JD'#.ä'Ž'#.ä'ÈŒ'#l'#l'#.­5…p'F|<9pžº\à5 j±[o „E k#Uu[! †s!O€g?¸/D' 5D' D'<9ƒÃ<9ƒ'ˆÍÈ͛ v‘gY./'3q# j$ „E!0”4Q1$R= ‘!DÃˆÍ t$$dQ ý'=�IÕl9b~3'¸e„.d k5AQ.ªÈÍpÂ*½'/>4Y./.3;l?p �½'/>4 †s!O€g?¸/DÃˆÍ ¢�d0×~JË$ž3ÃˆÍ ¢�d0×U�JË$ž3ÃˆÍ ¢jvÎY?¸/p ¢§gvg „.dQ-¦/>4 Šº=° '<'*ƒÃ<'*ƒµ.|4ŒÃn|4?U !E†ZpžºoÃn|4?U !E†Zpžºo^b ‘$· k# Õ.34<ü=….­‘!I b33½Ko ¾$'5#€�$ÉDOôwO(O(’OO8O-00ƒô-00ƒO-*-.ô-*-.OVž5±/ƒOV>n#ƒôV>n#ƒOVïOVïKoôVïKo›¤JlEo t.F|$A±19Z›*~lq# �K-p k1>�lq#I�d0×DOVïlŒôVïl?š~lq#~sÂÌ „Eb< <ˆÍ ¢ L3'>…šY°>nLZ'F|0q#<^ ‘!R ŠOï>… Õl9!=b< <ÐOV'ŽôV'!U§*žÎ5½\ I ¢ ø× u.L!~?0dOV'\OQôQ t5'A¦#ôQ �= u!.ôQ'3|¦#ôQYm-.cOQž#*E1ŽôQž#*E1ŽOQ#!O;O;ÌFdO;ÌFdDO;Ì×ô;Ìך ¢‘K'eš~lq#!”'eIÕl9 ¾$'5#VI§#*Y°>nLZY1!°Vn\O;Ì×DO;�4Œô;�4? ¦#=q#ÿéÿèÿî§ ![Â1e4q#šY9Q#JüI¤K9!/KZ€j9!E?š~‰/'#Zq#ß›v4Iv/1|0q#I„EY°>…O;ŒO”.dô”.d­Vô!V­l­l9ô!l9­3Â$1ôÈÂ$1­#*ED­#cK\9ô>cK\9­±ô=ƒ­5FEA9ô=FEA9­53-A­5<'D­5·}KŽ­5n0V­5ŒO.OÌOZc=ŒôZc=ŒOZ4EôZ4EOûþ604EôZ4Ebwôûþ604Eb¿t'å|ôZ4EYwOZ4EÌôZ4EÌOï!$Oï!$*0ôï!$*0 j!m#$AŒOï!$*0DO�RO.A.3ô.A.3O.¹-Œô.¹-? ôwO.¹­5F=Aô.¹­5F=AO[…#Ðô[…#ÐO[c>ô[c>O[?3O.ƒô.-bwO.5A.3ô.5A.3O.5A[Ìô.5A[ÌO.5A$ô.5A$O.5'DO.Jô.JOlO·ô·O'VO'V.ªOlV.ôlV.OlVôlVO.O$O3-*./.5ô3-*./.5O½-F'3;ŒO$AÐô$AÐO$.AÐO$c-0ô$c-0OO'/ŽO‰OJO$E9!\ô$E9!\O$$Dô$$DOE4/!?=ôE4/!?=O±#žþRþò.þRþqô±#žþRþò.þRþqODRÕwÕ¿t5'…Õ¿�-OïÕ¿�$'A3”Õ¿ŠwÕ¿¤wÕ¿²$F=ÐÕ¿gwÕ¿jwR(,,,(æ©Õ(,,,(æ©R()+)6]26Õ()+)6]26R`2�Æ8ÛÕ`2�Æ8ÛR`“N)‚(ŸÕ`“N)‚(ŸR`,¥7Ó2(Õ`,¥7Ó2(R`,,+)•XÕ`,,+)•XR`Ò86B2(6Õ`Ò86B2(6R`8âB(Û’Õ`8âB(Û’R‹�À(T7Õ‹�À(T7R‹N82X‹8Õ‹N82X‹8R‹,©Ò,),Õ‹,©Ò,),R¬‹XN¨¶Õ¬‹XN¨¶R¬+(ãN6’Õ¬+(ãN6’RÀzè8¯ÕÀzè8¯RÀ7B()á,’ÕÀ7B()á,’RÀ+B,)6((ÕÀ+B,)6((R©8)+8B“’Õ©8)+8B“’R©B+(+(¥8Õ©B+(+(¥8RN6(6Á¥ÕN6(6Á¥RN86((+)8áÕN86((+)8áRN86ÄGNTÕN86ÄGNTRN868Ó,8»ÕN868Ó,8»RN8)“BN6ÒÕN8)“BN6ÒRN8ÚN8Û)¶ÕN8ÚN8Û)¶RN8Ó8©)B(ÕN8Ó8©)B(RN)B+Ó‚8,ÕN)B+Ó‚8,RÖ+)B268+¶ÕÖ+)B268+¶RÖ6BÀ,)8ÕÖ6BÀ,)8RSzN)()SÕSzN)()SRSxB(6B,8ÕSxB(6B,8RSÀ((À6(ÕSÀ((À6(R+X](´26Õ+X](´26R+((`{¬ŸÕ+((`{¬ŸR+((,,,+8‹Õ+((,,,+8‹R+(¬6´N8’Õ+(¬6´N8’R+(Û,X»’Õ+(Û,X»’R+(+8)8,¨,Õ+(+8)8,¨,R+(,+(˜)ÓÕ+(,+(˜)ÓR+ÄÜ+,86Õ+ÄÜ+,86R+()7‚�,,Õ+()7‚�,,R+‹2)B+À’Õ+‹2)B+À’R+‹,S)™8Õ+‹,S)™8RT+Ö)Æ6ÕT+Ö)Æ6R“‹{X,Õ“‹{X,R“Ö‚xÄÕ“Ö‚xÄR“ÛB)((˜Õ“ÛB)((˜R“Å8B)6»Õ“Å8B)6»R“¥2¨+NÕ“¥2¨+NR“¯ÏB�¶Õ“¯ÏB�¶R“),Ä+`6Õ“),Ä+`6RÅx6ÏBÏÕÅx6ÏBÏR6(){8ÓÕ6(){8ÓR--A/!\ÂÕ--A/!\ÂR-93äOÐÕ-93äOÐR-RVž#ÕVž#RVc=ÕVc=RV3ÕV3RV3-…ÕV3-…RVÂÕVÂÕV �! î5'? î/F«ÕVÂwR-/… ØÕ$gÙ›*Y0$1'<^ ¢jlQIkL t.F|$A±19Zp j$*-?ÿéÿèÿïI§0-ž/Z ÕE3R!!c3ŒR!¦#=Õ!¦#=R!.A9·R!.A9nÍR!.3Õ!.3R!.é#Õ!.é#R![=ÐÕ![=ÐR!ŽÕ!ŽR!DRÈ3RÈ|AÕ>AR>¦5Õ>¦5R>R\4d5Õ\4d5R\41EÐR9KÕ9K � /[q#Y4'*�Iv/13?~J…5#o ¢�\.A#š k#Uu[! !L=>… †s!O€g?¸/DÕ9K vI„²t²ÿãb~J…14'€¤$ž3 „E ¢t.F|$A±19Z Ã#.­5 Õ9K-c\›bµ‰KZ ì!?RE*~3”ˆLZq# ŠLL!0n­ÿãR9KDR9>Õ9> vI§~9Q¦*Y4K! ‘$4b~9Q¦*Y4K!ÿã Õ9>b j9!E?š!mQZIÎ=ˆÉI ¢„-…šb j9!E?š ÈK.OlŒR9=ŽÕ9=! vIÎ'F|<9o î$oÿãb=<1!0n­ k#~9Q¦Õ9=! ¢§0× vI§#Õ”pY°>…R9Z9R9lŽÕ9lŽR9l!9!-Õ9l!9!-R9l#!ŒR9l·/EŽÕ9l·/EŽR9lRE R9$Õ9$~l Õ9Kÿãb~lq#›V?ˆIkL ¢„$'5 t”Z~KV$Ao j!º4DR9ŒR9?DRZ9é#ÕZ9é#RïŽR�#DÕ�#DR.cïKƒR.3ž/µ9Õ.3ž/µ9R.dŒÕ.dŒR.3LsR.3c\Õ.3c\R.3c[R$$Õ$$R$$*R;Õ$$*R;R$$¸5Õ$$¸5RERE*DREcREcL3$RDREcDRE3ÕE3Õï! ¾$'5#VDRE >ÕE >RE ŒR$DRsA9ÐÕsA9ÐRsnÍRs4·#Õs4·# !1e #4q#š j$1ZI§#¢Î *'0ך ý'=? j=/DR5JAR'Õ'RRRR?KÐÕ?KкºN*º)(º>$A±L4DºÌþÚ̺.ºŒÿìw?-A9/-.ÿì-A9/-.?VŽÿìV!w?-/-ª-c.ÿì-/-ª-c.?QAÿìQA?;'/?”=?”'9;ƒÿì”'9;ƒ?”'9.c$ÿì”'9.c$?”'9. ÿì”'9. ?”'c-ª'ÿì”'c-ª'?”'?'c.ÿì”'?'c.?!;?!;D?!K\ÿì!K\?!Ž?!9ÿì!9?=c!Œÿì=c!Œ?9¹0?.?�3?.9ÿì.9U�9>?.3/-ª3;ÿì.3/-ª3;?3ûþ!ÿì3ûþ!U«=44'Vƒ?Í­ÿìÍ­?$c$4ƒÿì$c$4ƒ?JAä'QÿìJAä'Q?Ec?$<9./'±ÿì$<9./'±?$'Íÿì$'Í?$OlDÿì$OlD?'ÿì'?'#<'Fÿì'#<'F?'?Qÿì'?Qªª-FE$R$*$ÿí>$*$ª9QAÿí9QAª9-$ÿí9-$ª9>A1oÿí9>A1oª9'QAÿí9'QAª.//=ÿí.//=ª.1Lª.1LÌ#ª.ä.ÿí.ä.ª/'ÿí/'ª$FÈÿí$FȪ'5ÿí'5ª'sQÿí'sQª'5c$R*oÎ-¦"à9441^ff1sV!º"à9441^ff1'53£EAf<1;f*K-°·fE°*"à9441^ff1'53£EAf<1;f*K-°·f1/ï"à9441^ff1'53£EAf<1;f*K-°·f' …vž#nL�5"à9441^ff1'53£EAf<1;fL-F.$f¾$'5#V"à9441^ff1'53£EAf<1;fL-F.$f¾$'5#V§5n0d"à9441^ff1'53£EAf<1;fL-F.$f¾$'5#Vv<<'!"à9441^ff1'53£EAf<1;fL-F.$f¾$'5#Vô'/!"à9441^ff1'53£EAf<1;fL-F.$f¤Q.L\4q#"à9441^ff1'53£EAf<1;fL-F.$fÎ5½!o<Î-1="à9441^ff1'53£EAf<1;fL-F.$f²!1E4�½'/>4"à9441^ff1'53£EAf<1;fL-F.$fÕ!F�J·#4"à9441^ff1'53£EAf<1;f1 f-µ9E"à9441^ff1'53£EAf<1;f1 flE"à9441^ff1'53£EAf<1;f1 f�½'/>4�J·º4„E"à9441^ff1'53£EAf<1;f1 f«È*t?"à9441^ff1'53£EAf<1;f1 f1'F|<9="à9441^ff1'53£EAf<1;f1 f²$d j./!"à9441^ff1'53£EAf<1;f1 fRl9²$d"à9441^ff1'53£EAfO½-FfL5}f0E!þa!/F$*./>4"à9441^ff1'53£EAfO½-FfL5}f0E!þa1;4kL"à9441^ffäd­5£0<£'#.ULe.F'5A£žfF'.3n#UL'#0×nL�5^*$.ÿê+§X£X(6ÿêN„¹£!0$d0J£`7)£‚£‚_à'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£X,8ÿêN„â)zSÖ)(©ÿæià'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£X)7ÿêN„z6)(ĺ£`‹£�N66,rà'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£X)7ÿêN„•+B(XN£ã8£(+)6´¡à'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£X¨ÿêN„7B,+UT8,ÿêN„28ÿêN„(2ÿêN„(Å7‚"à'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£(+,8ÿêN„7z¬TÚ8)¯)268ià'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£(2)2ÿêN„!=U!F"à'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£(,T8ÿêN„-c-ž/1=.$*?c-£�N£SWà'5#^½U-1.^·É^ï>nL�5^*$.ÿê+§X£+(,�ÿêN„0JL=>…;n0dÿæ,F(FB+)“,N-8+£)�Ó{aà'5#^½U-1.^·É^ï>nL�5^F#ÿê+§â)á6ê�¬"à'5#^½U-1.^·É^ï>nL�5^<#ÿê+§¬B,UB©Wà'5#^½U-1.^·É^ï>nL�5^<#ÿê+§¬B,UBN]"à'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§g‹(Ä6+rà'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§g“XÀÓÑ"à'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§Õ`“N)‚(¡à'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§Õ`Ò86B2(œà'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§Õ`8âB(Ûià'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§ÕÀ+B,)6((Pà'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§Õ©B+(+(¥_à'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§ÕN86((+)8á"à'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§ÕN8ÚN8Û)hà'5#^½U-1.^·É^ï>nL�5^$1>V!ºÿê+§Õ+()7‚�,aà'5#^½U-1.^·É^ï>nL�5^1/ïÿê+§N)âÏ,r \ No newline at end of file diff --git a/test/qlever-data/oc-test.vocabulary.words.external.offsets b/test/qlever-data/oc-test.vocabulary.words.external.offsets new file mode 100644 index 0000000..34a9e65 Binary files /dev/null and b/test/qlever-data/oc-test.vocabulary.words.external.offsets differ diff --git a/test/qlever-data/oc-test.vocabulary.words.internal b/test/qlever-data/oc-test.vocabulary.words.internal new file mode 100644 index 0000000..3154a8b Binary files /dev/null and b/test/qlever-data/oc-test.vocabulary.words.internal differ diff --git a/test/qlever-data/oc-test.vocabulary.words.internal.ids b/test/qlever-data/oc-test.vocabulary.words.internal.ids new file mode 100644 index 0000000..83b3efd Binary files /dev/null and b/test/qlever-data/oc-test.vocabulary.words.internal.ids differ diff --git a/test/qlever-index-data/oc-index-test.index-log.txt b/test/qlever-index-data/oc-index-test.index-log.txt deleted file mode 100644 index 408300a..0000000 --- a/test/qlever-index-data/oc-index-test.index-log.txt +++ /dev/null @@ -1,43 +0,0 @@ -2026-06-10 13:35:39.310 - INFO: QLever index builder, compiled on Sun Feb 22 15:49:56 UTC 2026 using git hash 36ed96 -2026-06-10 13:35:39.311 - INFO: Locale was not specified in settings file, default is en_US -2026-06-10 13:35:39.311 - INFO: You specified "locale = en_US" and "ignore-punctuation = 0" -2026-06-10 13:35:39.311 - INFO: By default, integers that cannot be represented by QLever will throw an exception -2026-06-10 13:35:39.311 - WARN: Implicitly using the parallel parser for a single input file for reasons of backward compatibility; this is deprecated, please use the command-line option --parse-parallel or -p -2026-06-10 13:35:39.311 - INFO: Processing triples from single input stream /dev/stdin (parallel = true) ... -2026-06-10 13:35:39.311 - INFO: Parsing input triples and creating partial vocabularies, one per batch ... -2026-06-10 13:35:39.336 - INFO: Triples parsed: 217 [average speed 0.2 M/s] -2026-06-10 13:35:39.340 - INFO: Number of triples created (including QLever-internal ones): 217 [may contain duplicates] -2026-06-10 13:35:39.340 - INFO: Number of partial vocabularies created: 1 -2026-06-10 13:35:39.340 - INFO: Merging partial vocabularies ... -2026-06-10 13:35:39.340 - INFO: Words merged: 123 [average speed 2.2 M/s] -2026-06-10 13:35:39.342 - INFO: Finished writing compressed internal vocabulary, size = 1262 B [uncompressed = 5890 B, ratio = 21%] -2026-06-10 13:35:39.342 - INFO: Number of words in external vocabulary: 123 -2026-06-10 13:35:39.344 - INFO: Converting triples from local IDs to global IDs ... -2026-06-10 13:35:39.345 - INFO: Triples converted: 217 [average speed 0.6 M/s] -2026-06-10 13:35:39.345 - INFO: Creating permutations SPO and SOP ... -2026-06-10 13:35:39.345 - INFO: Number of inputs to `uniqueView`: 217 -2026-06-10 13:35:39.345 - INFO: Number of unique elements: 217 -2026-06-10 13:35:39.345 - INFO: Triples sorted: 217 [average speed 8.7 M/s] -2026-06-10 13:35:39.346 - INFO: Statistics for SPO: #relations = 55, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.346 - INFO: Statistics for SOP: #relations = 55, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.346 - INFO: Number of distinct patterns: 2 -2026-06-10 13:35:39.346 - INFO: Number of subjects with pattern: 55 [all] -2026-06-10 13:35:39.346 - INFO: Total number of distinct subject-predicate pairs: 217 -2026-06-10 13:35:39.346 - INFO: Average number of predicates per subject: 3.9 -2026-06-10 13:35:39.346 - INFO: Average number of subjects per predicate: 54 -2026-06-10 13:35:39.346 - INFO: Creating permutations OSP and OPS ... -2026-06-10 13:35:39.346 - INFO: Triples sorted: 217 [average speed 9.9 M/s] -2026-06-10 13:35:39.347 - INFO: Statistics for OSP: #relations = 59, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.347 - INFO: Statistics for OPS: #relations = 59, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.347 - INFO: Adding 55 triples to the POS and PSO permutation for the internal `ql:has-pattern` ... -2026-06-10 13:35:39.347 - INFO: Creating permutations PSO and POS ... -2026-06-10 13:35:39.348 - INFO: Number of inputs to `uniqueView`: 55 -2026-06-10 13:35:39.348 - INFO: Number of unique elements: 55 -2026-06-10 13:35:39.348 - INFO: Triples sorted: 55 [average speed 3.2 M/s] -2026-06-10 13:35:39.348 - INFO: Statistics for PSO: #relations = 1, #blocks = 1, #triples = 55 -2026-06-10 13:35:39.348 - INFO: Statistics for POS: #relations = 1, #blocks = 1, #triples = 55 -2026-06-10 13:35:39.348 - INFO: Creating permutations PSO and POS ... -2026-06-10 13:35:39.349 - INFO: Triples sorted: 217 [average speed 10.8 M/s] -2026-06-10 13:35:39.349 - INFO: Statistics for PSO: #relations = 4, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.349 - INFO: Statistics for POS: #relations = 4, #blocks = 1, #triples = 217 -2026-06-10 13:35:39.349 - INFO: Index build completed diff --git a/test/qlever-index-data/oc-index-test.index.ops b/test/qlever-index-data/oc-index-test.index.ops deleted file mode 100644 index 7e002ab..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.ops and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.ops.meta b/test/qlever-index-data/oc-index-test.index.ops.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.ops.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.osp b/test/qlever-index-data/oc-index-test.index.osp deleted file mode 100644 index d51dc71..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.osp and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.osp.meta b/test/qlever-index-data/oc-index-test.index.osp.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.osp.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.patterns b/test/qlever-index-data/oc-index-test.index.patterns deleted file mode 100644 index 46b7468..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.patterns and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.pos b/test/qlever-index-data/oc-index-test.index.pos deleted file mode 100644 index 97d3d43..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.pos and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.pos.meta b/test/qlever-index-data/oc-index-test.index.pos.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.pos.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.pso b/test/qlever-index-data/oc-index-test.index.pso deleted file mode 100644 index 1556168..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.pso and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.pso.meta b/test/qlever-index-data/oc-index-test.index.pso.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.pso.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.sop b/test/qlever-index-data/oc-index-test.index.sop deleted file mode 100644 index f308111..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.sop and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.sop.meta b/test/qlever-index-data/oc-index-test.index.sop.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.sop.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.spo b/test/qlever-index-data/oc-index-test.index.spo deleted file mode 100644 index 6568a59..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.spo and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.index.spo.meta b/test/qlever-index-data/oc-index-test.index.spo.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.index.spo.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pos b/test/qlever-index-data/oc-index-test.internal.index.pos deleted file mode 100644 index 841e13a..0000000 Binary files a/test/qlever-index-data/oc-index-test.internal.index.pos and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pos.meta b/test/qlever-index-data/oc-index-test.internal.index.pos.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.internal.index.pos.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pso b/test/qlever-index-data/oc-index-test.internal.index.pso deleted file mode 100644 index b0c0736..0000000 Binary files a/test/qlever-index-data/oc-index-test.internal.index.pso and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pso.meta b/test/qlever-index-data/oc-index-test.internal.index.pso.meta deleted file mode 100644 index 259383a..0000000 Binary files a/test/qlever-index-data/oc-index-test.internal.index.pso.meta and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.meta-data.json b/test/qlever-index-data/oc-index-test.meta-data.json deleted file mode 100644 index b6a6c98..0000000 --- a/test/qlever-index-data/oc-index-test.meta-data.json +++ /dev/null @@ -1 +0,0 @@ -{"encoded-iri-prefixes":{"prefixes-with-leading-angle-brackets":[]},"git-hash":"36ed96","has-all-permutations":true,"index-format-version":{"date":"2024-10-22","pull-request-number":1572},"locale":{"country":"US","ignore-punctuation":false,"language":"en"},"num-blank-nodes-total":0,"num-objects":{"internal":0,"normal":59},"num-predicates":{"internal":1,"normal":4},"num-subjects":{"internal":0,"normal":55},"num-triples":{"internal":55,"normal":217},"vocabulary-type":"on-disk-compressed"} \ No newline at end of file diff --git a/test/qlever-index-data/oc-index-test.settings.json b/test/qlever-index-data/oc-index-test.settings.json deleted file mode 100644 index 0967ef4..0000000 --- a/test/qlever-index-data/oc-index-test.settings.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/test/qlever-index-data/oc-index-test.vocabulary.codebooks b/test/qlever-index-data/oc-index-test.vocabulary.codebooks deleted file mode 100644 index 8544eae..0000000 Binary files a/test/qlever-index-data/oc-index-test.vocabulary.codebooks and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.external b/test/qlever-index-data/oc-index-test.vocabulary.words.external deleted file mode 100644 index 3ad4477..0000000 Binary files a/test/qlever-index-data/oc-index-test.vocabulary.words.external and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets b/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets deleted file mode 100644 index d25d229..0000000 Binary files a/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.internal b/test/qlever-index-data/oc-index-test.vocabulary.words.internal deleted file mode 100644 index 77ad25f..0000000 Binary files a/test/qlever-index-data/oc-index-test.vocabulary.words.internal and /dev/null differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids b/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids deleted file mode 100644 index b1732a2..0000000 Binary files a/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids and /dev/null differ diff --git a/test/test_indexapi_v1.py b/test/test_indexapi_v1.py index d5de94d..b4d1e6c 100644 --- a/test/test_indexapi_v1.py +++ b/test/test_indexapi_v1.py @@ -1,27 +1,24 @@ import json -from unittest.mock import patch import pytest -from requests import RequestException from conftest import create_api_manager, execute_operation, normalize_citations from ramose import APIManager @pytest.fixture(scope="session") -def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: - return create_api_manager( +def api_manager(qlever_endpoint: str) -> APIManager: + manager = create_api_manager( "src/api/index_v1.hf", { "#base https://api.opencitations.net/index": f"#base {qlever_endpoint}", "#endpoint http://qlever-service.default.svc.cluster.local:7011": f"#endpoint {qlever_endpoint}", "#addon indexapi_v1": "#addon ../src/api/indexapi_v1", }, - env_vars={ - "SPARQL_ENDPOINT_INDEX": qlever_endpoint, - "SPARQL_ENDPOINT_META": virtuoso_endpoint, - }, ) + for config in manager.all_conf.values(): + config["sources_map"] = {"meta": qlever_endpoint, "index": qlever_endpoint} + return manager DOI_ERRORS_DOI = "10.1007/s11192-022-04367-w" @@ -78,7 +75,7 @@ def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: "cited": ZENODO_DMP_DOI, "creation": "2021-06-08", "timespan": "-P0Y0M1D", - "journal_sc": "yes", + "journal_sc": "no", "author_sc": "yes", }, { @@ -183,27 +180,3 @@ def test_reference_count_zero(api_manager: APIManager) -> None: execute_operation(api_manager, "/index/v1/reference-count/10.3233/sw-210434") ) assert result == [{"count": "0"}] - - -def test_citation_count_meta_sparql_failure(api_manager: APIManager) -> None: - with ( - patch("indexapi_v1.post", side_effect=RequestException), - patch("indexapi_common.post", side_effect=RequestException), - ): - result = json.loads( - execute_operation( - api_manager, f"/index/v1/citation-count/{QSS_ARTICLE_DOI}" - ) - ) - assert result == [{"count": "0"}] - - -def test_citations_meta_sparql_failure(api_manager: APIManager) -> None: - with ( - patch("indexapi_v1.post", side_effect=RequestException), - patch("indexapi_common.post", side_effect=RequestException), - ): - result = json.loads( - execute_operation(api_manager, f"/index/v1/citations/{QSS_ARTICLE_DOI}") - ) - assert result == [] diff --git a/test/test_indexapi_v2.py b/test/test_indexapi_v2.py index 2137eb7..849c34a 100644 --- a/test/test_indexapi_v2.py +++ b/test/test_indexapi_v2.py @@ -1,32 +1,37 @@ import json -from unittest.mock import patch +from pathlib import Path import pytest -from requests import RequestException from conftest import create_api_manager, execute_operation, normalize_citations from ramose import APIManager @pytest.fixture(scope="session") -def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: - return create_api_manager( +def api_manager(qlever_endpoint: str) -> APIManager: + manager = create_api_manager( "src/api/index_v2.hf", { "#base https://api.opencitations.net/index": f"#base {qlever_endpoint}", "#endpoint http://qlever-service.default.svc.cluster.local:7011": f"#endpoint {qlever_endpoint}", "#addon indexapi_v2": "#addon ../src/api/indexapi_v2", }, - env_vars={ - "SPARQL_ENDPOINT_INDEX": qlever_endpoint, - "SPARQL_ENDPOINT_META": virtuoso_endpoint, - }, ) + for config in manager.all_conf.values(): + config["sources_map"] = {"meta": qlever_endpoint, "index": qlever_endpoint} + return manager MAIN_PAPER_OMID = "omid:br/062104388184" MAIN_PAPER_DOI = "doi:10.1162/qss_a_00292" MAIN_PAPER_PIDS = f"{MAIN_PAPER_OMID} {MAIN_PAPER_DOI}" +ISBN_EXAMPLES = json.loads( + (Path(__file__).parent / "data" / "index_isbn.json").read_text(encoding="utf-8") +) +ISSN_EXAMPLES = json.loads( + (Path(__file__).parent / "data" / "index_issn.json").read_text(encoding="utf-8") +) + EXPECTED_CITATIONS = [ { @@ -513,7 +518,7 @@ def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: "cited": ZENODO_DMP_PIDS, "creation": "2021-06-08", "timespan": "-P0Y0M1D", - "journal_sc": "yes", + "journal_sc": "no", "author_sc": "yes", }, ] @@ -638,6 +643,59 @@ def test_reference_count_by_doi(api_manager: APIManager) -> None: assert result == [{"count": "45"}] +@pytest.mark.parametrize("isbn", ["9789048127108", "9781402096327"]) +@pytest.mark.parametrize( + ("operation", "expected"), + [ + ("citation-count", [{"count": "0"}]), + ("reference-count", [{"count": "0"}]), + ("citations", []), + ("references", []), + ], +) +def test_operations_by_isbn(api_manager, isbn, operation, expected): + result = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/isbn:{isbn}") + ) + result_by_omid = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/omid:br/0612058700") + ) + assert result == result_by_omid == expected + + +@pytest.mark.parametrize( + ("operation", "expected"), + [ + ("citation-count", [{"count": "1"}]), + ("reference-count", [{"count": "2"}]), + ], +) +@pytest.mark.parametrize("isbn", ["9789663601922", "978-966-360-192-2"]) +def test_nonzero_counts_by_isbn(api_manager, operation, expected, isbn): + result = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/isbn:{isbn}") + ) + result_by_omid = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/omid:br/06101786021") + ) + assert result == result_by_omid == expected + + +@pytest.mark.parametrize("operation", ["citations", "references"]) +@pytest.mark.parametrize("isbn", ["9789663601922", "978-966-360-192-2"]) +def test_citation_data_by_isbn(api_manager, operation, isbn): + result = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/isbn:{isbn}") + ) + result_by_omid = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/omid:br/06101786021") + ) + expected = normalize_citations(ISBN_EXAMPLES[operation]["selected_results"]) + assert ( + normalize_citations(result) == normalize_citations(result_by_omid) == expected + ) + + def test_citation_count_by_pmid(api_manager: APIManager) -> None: result = json.loads( execute_operation(api_manager, "/index/v2/citation-count/pmid:25378340") @@ -652,13 +710,63 @@ def test_reference_count_by_pmid(api_manager: APIManager) -> None: assert result == [{"count": "0"}] -def test_venue_citation_count(api_manager: APIManager) -> None: +@pytest.mark.parametrize("issn", ["2641-3337", "26413337"]) +def test_venue_citation_count(api_manager: APIManager, issn: str) -> None: result = json.loads( - execute_operation(api_manager, "/index/v2/venue-citation-count/issn:2641-3337") + execute_operation(api_manager, f"/index/v2/venue-citation-count/issn:{issn}") ) assert result == [{"count": "6"}] +@pytest.mark.parametrize( + ("operation", "expected"), + [ + ("citation-count", [{"count": "0"}]), + ("reference-count", [{"count": "0"}]), + ("citations", []), + ("references", []), + ], +) +def test_operations_by_issn(api_manager, operation, expected): + result = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/issn:2641-3337") + ) + result_by_omid = json.loads( + execute_operation(api_manager, f"/index/v2/{operation}/omid:br/062501778099") + ) + assert result == result_by_omid == expected + + +@pytest.mark.parametrize( + ("issn", "omid", "operation"), + [ + ("0192-8651", "0615019585", "citations"), + ("1096-987X", "0615019585", "citations"), + ("1096987x", "0615019585", "citations"), + ("2295-9254", "06101680950", "references"), + ("2295-9262", "06101680950", "references"), + ], +) +@pytest.mark.parametrize("count", [False, True]) +def test_nonzero_citations_by_issn(api_manager, issn, omid, operation, count): + endpoint = f"{operation[:-1]}-count" if count else operation + result = json.loads( + execute_operation(api_manager, f"/index/v2/{endpoint}/issn:{issn}") + ) + result_by_omid = json.loads( + execute_operation(api_manager, f"/index/v2/{endpoint}/omid:br/{omid}") + ) + if count: + assert result == result_by_omid == [{"count": "2"}] + else: + expected = normalize_citations(ISSN_EXAMPLES[operation]["selected_results"]) + assert ( + normalize_citations(result) + == normalize_citations(result_by_omid) + == expected + ) + + def test_citations_negative_timespan(api_manager: APIManager) -> None: result = json.loads( execute_operation(api_manager, f"/index/v2/citations/{ZENODO_DMP_OMID}") @@ -691,35 +799,3 @@ def test_citations_with_author_sc(api_manager: APIManager) -> None: assert normalize_citations(result) == normalize_citations( EXPECTED_QSS_ARTICLE_CITATIONS ) - - -def test_citation_count_meta_anyids_failure(api_manager: APIManager) -> None: - with patch("indexapi_common.post", side_effect=RequestException): - result = json.loads( - execute_operation( - api_manager, f"/index/v2/citation-count/{MAIN_PAPER_OMID}" - ) - ) - assert result == [{"count": "0"}] - - -def test_citation_count_meta_sparql_failure(api_manager: APIManager) -> None: - with ( - patch("indexapi_v2.post", side_effect=RequestException), - patch("indexapi_common.post", side_effect=RequestException), - ): - result = json.loads( - execute_operation(api_manager, f"/index/v2/citation-count/{MAIN_PAPER_DOI}") - ) - assert result == [{"count": "0"}] - - -def test_citations_meta_sparql_failure(api_manager: APIManager) -> None: - with ( - patch("indexapi_v2.post", side_effect=RequestException), - patch("indexapi_common.post", side_effect=RequestException), - ): - result = json.loads( - execute_operation(api_manager, f"/index/v2/citations/{MAIN_PAPER_OMID}") - ) - assert result == [] diff --git a/test/test_metaapi.py b/test/test_metaapi.py index f03c3eb..97848b3 100644 --- a/test/test_metaapi.py +++ b/test/test_metaapi.py @@ -7,13 +7,12 @@ @pytest.fixture(scope="session") -def api_manager(virtuoso_endpoint: str) -> APIManager: - virtuoso_base = virtuoso_endpoint.rsplit("/", 1)[0] +def api_manager(qlever_endpoint: str) -> APIManager: return create_api_manager( "src/api/meta_v1.hf", { - "#base https://api.opencitations.net/meta": f"#base {virtuoso_base}", - "#endpoint http://virtuoso-service.default.svc.cluster.local:8890/sparql": f"#endpoint {virtuoso_endpoint}", + "#base https://api.opencitations.net/meta": f"#base {qlever_endpoint}", + "#endpoint http://meta-qlever-service.default.svc.cluster.local:7011": f"#endpoint {qlever_endpoint}", "#addon metaapi": "#addon ../src/api/metaapi", }, ) diff --git a/test/test_skgif_filter.py b/test/test_skgif_filter.py index 0529c0d..ab99626 100644 --- a/test/test_skgif_filter.py +++ b/test/test_skgif_filter.py @@ -182,6 +182,14 @@ def _canonical_entities(entities: list[dict]) -> list[dict]: return sorted(canonical, key=lambda entity: entity["local_identifier"]) +def _has_word_clause(variable: str, word: str) -> str: + return ( + f"{{ SELECT DISTINCT ?{variable} WHERE {{ ?{variable} " + " ?_word . " + f'FILTER STRSTARTS(?_word, "{word}") }} }}' + ) + + def _filter_param_description(spec: dict, entity: str) -> str: op_spec = spec["paths"][f"/{entity}"]["get"] inline_params = [ @@ -208,9 +216,7 @@ def test_returns_all_products(self, skgif_api_manager: APIManager) -> None: class TestTitleFilter: - def test_title_search_uses_virtuoso_text_index( - self, skgif_api_manager: APIManager - ) -> None: + def test_title_search_uses_text_index(self, skgif_api_manager: APIManager) -> None: op = skgif_api_manager.get_op( "/skg-if/v1/products?filter=cf.search.title:Covid-19" ) @@ -218,11 +224,12 @@ def test_title_search_uses_virtuoso_text_index( params = op._prepare_params() filter_param = params["filter"] assert isinstance(filter_param, str) - assert ( - filter_param - == "?local_identifier dcterm:title ?title .\n?title bif:contains \"'Covid-19'\" ." + assert filter_param == ( + "?local_identifier dcterm:title ?title .\n" + f"{_has_word_clause('title', 'covid')}\n" + "?local_identifier dcterm:title ?title .\n" + f"{_has_word_clause('title', '19')}" ) - assert "CONTAINS" not in filter_param def test_title_search_matches_content(self, skgif_api_manager: APIManager) -> None: results = _exec( @@ -586,21 +593,21 @@ def test_filter_descriptions_keep_expected_order( class TestPersonsEndpoint: - def test_text_search_uses_virtuoso_index( - self, skgif_api_manager: APIManager - ) -> None: + def test_text_search_uses_text_index(self, skgif_api_manager: APIManager) -> None: expected_filters = { "cf.search.family_name:Peroni": ( "?local_identifier foaf:familyName ?familyName .\n" - "?familyName bif:contains \"'Peroni'\" ." + f"{_has_word_clause('familyName', 'peroni')}" ), "cf.search.given_name:Silvio": ( "?local_identifier foaf:givenName ?givenName .\n" - "?givenName bif:contains \"'Silvio'\" ." + f"{_has_word_clause('givenName', 'silvio')}" ), "cf.search.name:Peroni Silvio": ( "?local_identifier foaf:name ?name .\n" - "?name bif:contains \"'Peroni Silvio'\" ." + f"{_has_word_clause('name', 'peroni')}\n" + "?local_identifier foaf:name ?name .\n" + f"{_has_word_clause('name', 'silvio')}" ), } for filter_value, expected_filter in expected_filters.items(): @@ -609,7 +616,6 @@ def test_text_search_uses_virtuoso_index( filter_param = op._prepare_params()["filter"] assert isinstance(filter_param, str) assert filter_param == expected_filter - assert "FILTER(CONTAINS" not in filter_param def test_returns_person_by_identifier(self, skgif_api_manager: APIManager) -> None: results = _exec( @@ -651,9 +657,7 @@ def test_filters(self, skgif_api_manager: APIManager) -> None: class TestOrganisationsEndpoint: - def test_text_search_uses_virtuoso_index( - self, skgif_api_manager: APIManager - ) -> None: + def test_text_search_uses_text_index(self, skgif_api_manager: APIManager) -> None: op = skgif_api_manager.get_op( "/skg-if/v1/organisations?filter=cf.search.name:Mit Press" ) @@ -661,9 +665,8 @@ def test_text_search_uses_virtuoso_index( filter_param = op._prepare_params()["filter"] assert isinstance(filter_param, str) assert filter_param == ( - "?local_identifier foaf:name ?name .\n?name bif:contains \"'Mit Press'\" ." + f"{_has_word_clause('name', 'mit')}\n{_has_word_clause('name', 'press')}" ) - assert "FILTER(CONTAINS" not in filter_param def test_returns_organisation_by_identifier( self, skgif_api_manager: APIManager @@ -701,9 +704,7 @@ def test_filters(self, skgif_api_manager: APIManager) -> None: class TestVenuesEndpoint: - def test_text_search_uses_virtuoso_index( - self, skgif_api_manager: APIManager - ) -> None: + def test_text_search_uses_text_index(self, skgif_api_manager: APIManager) -> None: op = skgif_api_manager.get_op( "/skg-if/v1/venues?filter=cf.search.name:Digital Libraries" ) @@ -712,9 +713,10 @@ def test_text_search_uses_virtuoso_index( assert isinstance(filter_param, str) assert filter_param == ( "?local_identifier dcterms:title ?name .\n" - "?name bif:contains \"'Digital Libraries'\" ." + f"{_has_word_clause('name', 'digital')}\n" + "?local_identifier dcterms:title ?name .\n" + f"{_has_word_clause('name', 'libraries')}" ) - assert "FILTER(CONTAINS" not in filter_param def test_returns_venue_by_identifier(self, skgif_api_manager: APIManager) -> None: results = _exec( diff --git a/test/virtuoso-meta-data/database/virtuoso-temp.db b/test/virtuoso-meta-data/database/virtuoso-temp.db deleted file mode 100644 index 2fc18f5..0000000 Binary files a/test/virtuoso-meta-data/database/virtuoso-temp.db and /dev/null differ diff --git a/test/virtuoso-meta-data/database/virtuoso.db b/test/virtuoso-meta-data/database/virtuoso.db deleted file mode 100644 index 0abd91f..0000000 Binary files a/test/virtuoso-meta-data/database/virtuoso.db and /dev/null differ diff --git a/test/virtuoso-meta-data/database/virtuoso.ini b/test/virtuoso-meta-data/database/virtuoso.ini deleted file mode 100644 index 291be43..0000000 --- a/test/virtuoso-meta-data/database/virtuoso.ini +++ /dev/null @@ -1,241 +0,0 @@ -; -; virtuoso.ini -; -; Configuration file for the OpenLink Virtuoso VDBMS Server -; -; To learn more about this product, or any other product in our -; portfolio, please check out our web site at: -; -; http://virtuoso.openlinksw.com/ -; -; or contact us at: -; -; general.information@openlinksw.com -; -; If you have any technical questions, please contact our support -; staff at: -; -; technical.support@openlinksw.com -; -; -; Database setup -; -[Database] -DatabaseFile = ../database/virtuoso.db -ErrorLogFile = ../database/virtuoso.log -LockFile = ../database/virtuoso.lck -TransactionFile = ../database/virtuoso.trx -xa_persistent_file = ../database/virtuoso.pxa -ErrorLogLevel = 7 -FileExtend = 200 -MaxCheckpointRemap = 2000 -Striping = 0 -TempStorage = TempDatabase - -[TempDatabase] -DatabaseFile = ../database/virtuoso-temp.db -TransactionFile = ../database/virtuoso-temp.trx -MaxCheckpointRemap = 2000 -Striping = 0 -;MaxTempDBPages = 50G ; Limit size of the TempDatabase file to 50GB on disk - -; -; Server parameters -; -[Parameters] -ServerPort = 1111 -LiteMode = 0 -DisableUnixSocket = 1 -DisableTcpSocket = 0 -;SSLServerPort = 2111 -;SSLCertificate = cert.pem -;SSLPrivateKey = pk.pem -;X509ClientVerify = 0 -;X509ClientVerifyDepth = 0 -;X509ClientVerifyCAFile = ca.pem -MaxClientConnections = 10 -CheckpointInterval = 60 -SoftCheckpoint = 0 -O_DIRECT = 0 -CaseMode = 2 -MaxStaticCursorRows = 5000 -CheckpointAuditTrail = 0 -AllowOSCalls = 0 -SchedulerInterval = 10 -DirsAllowed = / -ThreadCleanupInterval = 1 -ThreadThreshold = 10 -ResourcesCleanupInterval = 1 -FreeTextBatchSize = 100000 -SingleCPU = 0 -VADInstallDir = ../vad/ -PrefixResultNames = 0 -RdfFreeTextRulesSize = 100 -IndexTreeMaps = 64 -MaxMemPoolSize = 400000000 -PrefixResultNames = 0 -MacSpotlight = 0 -MaxQueryMem = 2G ; memory allocated to query processor -VectorSize = 1000 ; initial parallel query vector (array of query operations) size -MaxVectorSize = 1000000 ; query vector size threshold. -AdjustVectorSize = 0 -ThreadsPerQuery = 4 -AsyncQueueMaxThreads = 10 -;; -;; When running with large data sets, one should configure the Virtuoso -;; process to use between 2/3 to 3/5 of free system memory and to stripe -;; storage on all available disks. -;; -;; Uncomment next two lines if there is 2 GB system memory free -;NumberOfBuffers = 170000 -;MaxDirtyBuffers = 130000 -;; Uncomment next two lines if there is 4 GB system memory free -;NumberOfBuffers = 340000 -; MaxDirtyBuffers = 250000 -;; Uncomment next two lines if there is 8 GB system memory free -;NumberOfBuffers = 680000 -;MaxDirtyBuffers = 500000 -;; Uncomment next two lines if there is 16 GB system memory free -;NumberOfBuffers = 1360000 -;MaxDirtyBuffers = 1000000 -;; Uncomment next two lines if there is 32 GB system memory free -;NumberOfBuffers = 2720000 -;MaxDirtyBuffers = 2000000 -;; Uncomment next two lines if there is 48 GB system memory free -;NumberOfBuffers = 4000000 -;MaxDirtyBuffers = 3000000 -;; Uncomment next two lines if there is 64 GB system memory free -;NumberOfBuffers = 5450000 -;MaxDirtyBuffers = 4000000 -;; -;; Note the default settings will take very little memory -;; but will not result in very good performance -;; -NumberOfBuffers = 10000 -MaxDirtyBuffers = 6000 -SSLServerPort = 1112 -SSLCertificate = virtuoso.crt -SSLPrivateKey = virtuoso.key - -[HTTPServer] -ServerPort = 8890 -ServerRoot = ../vsp -MaxClientConnections = 10 -DavRoot = DAV -EnabledDavVSP = 0 -HTTPProxyEnabled = 0 -TempASPXDir = 0 -DefaultMailServer = localhost:25 -MaxKeepAlives = 10 -KeepAliveTimeout = 10 -MaxCachedProxyConnections = 10 -ProxyConnectionCacheTimeout = 15 -HTTPThreadSize = 280000 -HttpPrintWarningsInOutput = 0 -Charset = UTF-8 -;HTTPLogFile = logs/http.log -MaintenancePage = atomic.html -EnabledGzipContent = 1 -SSLPort = 8891 -SSLCertificate = virtuoso.crt -SSLPrivateKey = virtuoso.key - -[AutoRepair] -BadParentLinks = 0 - -[Client] -SQL_PREFETCH_ROWS = 100 -SQL_PREFETCH_BYTES = 16000 -SQL_QUERY_TIMEOUT = 0 -SQL_TXN_TIMEOUT = 0 -;SQL_NO_CHAR_C_ESCAPE = 1 -;SQL_UTF8_EXECS = 0 -;SQL_NO_SYSTEM_TABLES = 0 -;SQL_BINARY_TIMESTAMP = 1 -;SQL_ENCRYPTION_ON_PASSWORD = -1 - -[VDB] -ArrayOptimization = 0 -NumArrayParameters = 10 -VDBDisconnectTimeout = 1000 -KeepConnectionOnFixedThread = 0 - -[Replication] -ServerName = db-NOBLE-PORT -ServerEnable = 1 -QueueMax = 50000 - -; -; Striping setup -; -; These parameters have only effect when Striping is set to 1 in the -; [Database] section, in which case the DatabaseFile parameter is ignored. -; -; With striping, the database is spawned across multiple segments -; where each segment can have multiple stripes. -; -; Format of the lines below: -; Segment = , [, .. ] -; -; must be ordered from 1 up. -; -; The is the total size of the segment which is equally divided -; across all stripes forming the segment. Its specification can be in -; gigabytes (g), megabytes (m), kilobytes (k) or in database blocks -; (b, the default) -; -; Note that the segment size must be a multiple of the database page size -; which is currently 8k. Also, the segment size must be divisible by the -; number of stripe files forming the segment. -; -; The example below creates a 200 meg database striped on two segments -; with two stripes of 50 meg and one of 100 meg. -; -; You can always add more segments to the configuration, but once -; added, do not change the setup. -; -[Striping] -Segment1 = 100M, db-seg1-1.db, db-seg1-2.db -Segment2 = 100M, db-seg2-1.db -;... -;[TempStriping] -;Segment1 = 100M, db-seg1-1.db, db-seg1-2.db -;Segment2 = 100M, db-seg2-1.db -;... -;[Ucms] -;UcmPath = -;Ucm1 = -;Ucm2 = -;... - -[Zero Config] -ServerName = virtuoso (NOBLE-PORT) -;ServerDSN = ZDSN -;SSLServerName = -;SSLServerDSN = - -[Mono] -;MONO_TRACE = Off -;MONO_PATH = -;MONO_ROOT = -;MONO_CFG_DIR = -;virtclr.dll = - -[URIQA] -DynamicLocal = 0 -DefaultHost = localhost:8890 - -[SPARQL] -DefaultGraph = -DefaultQuery = select distinct ?Concept where {[] a ?Concept} LIMIT 100 -;ResultSetMaxRows = 100000 -;MaxConstructTriples = 100000 -;MaxQueryExecutionTime = 120 ; in seconds -;LabelInferenceName = facets ; Only needed when using the Faceted Browser - -[Plugins] -LoadPath = ../hosting -Load1 = plain, geos -Load2 = plain, graphql -Load3 = plain, proj4 -Load4 = plain, shapefileio diff --git a/test/virtuoso-meta-data/database/virtuoso.pxa b/test/virtuoso-meta-data/database/virtuoso.pxa deleted file mode 100644 index e69de29..0000000 diff --git a/test/virtuoso-meta-data/database/virtuoso.trx b/test/virtuoso-meta-data/database/virtuoso.trx deleted file mode 100644 index e69de29..0000000 diff --git a/uv.lock b/uv.lock index 0ad7e53..4266954 100644 --- a/uv.lock +++ b/uv.lock @@ -156,14 +156,11 @@ wheels = [ [[package]] name = "click" -version = "8.3.1" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, ] [[package]] @@ -296,14 +293,14 @@ wheels = [ [[package]] name = "flask-swagger-ui" -version = "5.32.6" +version = "5.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flask" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c8/db/06cd2b77fff6c115c37dc8ec4db04ee6e5119799a27c7e19410f0f303c0e/flask_swagger_ui-5.32.6.tar.gz", hash = "sha256:38730cb566e5f1d70deb8bb1035ef1565b35dc50cdfd2a9e507779a751d46930", size = 613730, upload-time = "2026-05-18T10:31:09.328Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/9c/3b4ff2c907d5e4fe872bf593250bf3ef0725da24c26a7348a4df08b86eb1/flask_swagger_ui-5.33.0.tar.gz", hash = "sha256:96ec9bbb2ddc004123b722242111a08f074f04d2c93dfbd3682f7720cd5f80e2", size = 639836, upload-time = "2026-09-21T15:28:29.051Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/9f/a0510e3c648f2e6b58bbf5dc7db23668ec0ad5db90e1d84afb466a1f778f/flask_swagger_ui-5.32.6-py3-none-any.whl", hash = "sha256:83ec82f2b1da3628d89bc2eaa4836fdba7194353ff09d3d5c7d1e6892f345336", size = 618735, upload-time = "2026-05-18T10:31:07.034Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f9/c0900ac012e625f902ec3445e22ed6ab5c5325a05416db0c45356c996394/flask_swagger_ui-5.33.0-py3-none-any.whl", hash = "sha256:183a0234fa0e0e001fbb1a5f8a4aa762729f7eaf34ff288bd7a00514a6ab7381", size = 644885, upload-time = "2026-09-21T15:28:27.46Z" }, ] [[package]] @@ -565,11 +562,11 @@ wheels = [ [[package]] name = "markdown" -version = "3.10.2" +version = "3.10.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/6f/da4c6aea59b3001f2e8c0ec7497475aadaf3b021c10cab5b2858f0f32b26/markdown-3.10.3.tar.gz", hash = "sha256:3589362618f743188b4d955b874402bc814f4f83f544dc207719f4baa7d9c45f", size = 372596, upload-time = "2026-07-30T19:05:29.005Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl", hash = "sha256:fa6c92a00a4a3c98b22728c64a935ae1928250ae65058a6ded814d2cc29a4cea", size = 110757, upload-time = "2026-07-30T19:05:27.883Z" }, ] [[package]] @@ -686,7 +683,7 @@ wheels = [ [[package]] name = "oc-api" -version = "4.0.1" +version = "4.2.0" source = { editable = "." } dependencies = [ { name = "gevent" }, @@ -720,7 +717,7 @@ requires-dist = [ { name = "gunicorn", specifier = ">=22.0.0" }, { name = "idna", specifier = ">=3.15" }, { name = "python-dateutil", specifier = ">=2.9.0.post0" }, - { name = "ramose", specifier = ">=2.9.1" }, + { name = "ramose", specifier = ">=2.10.1" }, { name = "rdflib", specifier = ">=6.1.1" }, { name = "redis", specifier = ">=7.0.1" }, { name = "requests", specifier = ">=2.32.4" }, @@ -980,7 +977,7 @@ wheels = [ [[package]] name = "ramose" -version = "2.9.1" +version = "2.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flask" }, @@ -989,9 +986,9 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/bb/26d5fcc24bc3cfe31ba185ba1cfc174904afc8f39d3244363204fcfdcc1c/ramose-2.9.1.tar.gz", hash = "sha256:5dcf9856f5d79f509df02838b7d3957b04f865ce7cedb1a2baff280ed5c26c53", size = 1146976, upload-time = "2026-09-09T18:23:51.808Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/77/2bacb8c996bec68057ebb197eade2cfd115ab913b225b5897fbf6e549c4b/ramose-2.10.1.tar.gz", hash = "sha256:8a1b3aa384594298554f69683685161bdb817837875ea2d62b7945e4a25aefdf", size = 1370934, upload-time = "2026-09-24T21:59:58.02Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/80/9bf440d2bf194bc52ce73401936d97529e1f6df8a4b9dc9ab42f7e50d901/ramose-2.9.1-py3-none-any.whl", hash = "sha256:0652138f0ef17736a0d1f71be29966d3918a817a9d30d850dc0492d153369ca3", size = 66525, upload-time = "2026-09-09T18:23:50.388Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ed/61f973b673c47139bc01554f103d7b582d3c02efd4df0b3dfeabd5a1d5de/ramose-2.10.1-py3-none-any.whl", hash = "sha256:c3fda73f6c3adca93e3a9acc7859f8de02494d6613b1dcaaff9804fe91cfc799", size = 70432, upload-time = "2026-09-24T21:59:56.983Z" }, ] [[package]] @@ -1041,7 +1038,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.4" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1049,9 +1046,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]]