source: README @ 1427:5b6b65340693

Revision 1427:5b6b65340693, 22.6 KB checked in by Babis Nikolaou <charnik@…>, 3 years ago (diff)

merge with default branch

Line 
1                        Strabon
2                      -----------
3
4Introduction
5============
6Strabon is a fully implemented semantic geospatial database system that can be
7used to store linked geospatial data expressed in RDF and query them using an
8extension of SPARQL. Strabon supports spatial selections, spatial joins, a rich
9set of spatial functions similar to those offered by geospatial relational
10database systems, support for multiple Coordinate Reference Systems and widely
11used serializations for geometric objects such as WKT and GML. Strabon is built
12on top of the well-known RDF store Sesame and extends Sesame’s components to be
13able to manage thematic and spatial data that are stored in PostGIS.
14
15The development of Strabon started in the context of European FP7 project
16SemsorGrid4Env (Semantic Sensor Grids for Rapid Application Development for
17Environmental Management) [http://www.semsorgrid4env.eu/]. Starting September
182011, Strabon is being utilized and extended with new functionalities in the
19FP7 project TELEIOS (Virtual Observatory Infrastructure for Earth Observation
20Data) [http://www.earthobservatory.eu/] which our group leads.
21
22The query language of Strabon is called stSPARQL. stSPARQL can be used to query
23data represented in an extension of RDF called stRDF. stRDF and stSPARQL have
24been designed for representing and querying geospatial data that changes over
25time (e.g., the growth of a city over the years due to new developments).
26
27Given the very close relationship between stSPARQL and GeoSPARQL which is a
28recent OGC standard for an extension of SPARQL for querying geospatial metadata,
29we recently provided support for the Core, Geometry and Geometry Topology
30extension of GeoSPARQL.
31
32
33Conformance to GeoSPARQL
34========================
35Strabon implements the `Core', the `Topology Vocabulary Extension', the
36`Geometry Extension', the `Geometry Topology Extension', and the `RDFS Entailment
37Extension' except for Req. 25
38(http://www.opengis.net/spec/geosparql/1.0/req/rdfs-entailment-extension/bgp-rdfs-ent).
39
40With respect to GML, Strabon supports the GML Profile corresponding to Simple
41Features, that is, GML Simple Features Profile 2.0.
42
43
44Strabon Homepage
45================
46The homepage of Strabon is at http://www.strabon.di.uoa.gr/.
47
48
49Demo
50====
51You can find a demo of the system Strabon at http://test.strabon.di.uoa.gr/NOA/.
52
53
54How to build and run Strabon from command line
55==============================================
56Assuming you have already downloaded Strabon and you are in the top-level
57directory of Strabon, issue the following command to build it from command line:
58
59        $ mvn clean package
60
61In order to run automatically the JUnit tests, pass the option `-DskipTests=false'
62to the above command. The complete command is the following:
63
64        $ mvn -DskipTests=false clean package
65
66Alternatively, it is possible to run a specific test. Supposing that the name of
67the corresponding class is `TestName', then you can run only this
68test using the following command:
69
70        $ mvn test -DfailIfNoTests=false -DskipTests=false -Dtest=TestName
71
72In case of an error during building of Strabon and assuming that the error does
73not come from the JUnit tests, please have a look at the `Known Issues' section
74below. If none of the known issues of that section applies, please contact the
75developers through the Strabon mailing-list or submit a corresponding bug
76(see `Bugs' section below).
77
78After you have successfully built Strabon, you have access to the following
79components:
80
81  * Strabon Endpoint
82
83    This is a SPARQL endpoint for Strabon. It is distributed as a war file so
84    you may deploy it in a Tomcat container. You may find the war file under
85    directory `endpoint/target'.
86
87  * Strabon Endpoint (standalone)
88
89    This is a SPARQL endpoint for Strabon like the above one, but it differs
90    only in that it does not require the user to have already set up a Tomcat
91    container. The standalone Strabon Endpoint may be run by issuing the
92    following command:
93
94        $ java -jar endpoint-exec/target/strabon-endpoint-executable-${version}.jar
95
96    After issuing the above command, you may access the Strabon Endpoint at
97    the following URL: <http://localhost:8080/>.
98
99    Please see the page at <http://hg.strabon.di.uoa.gr/Strabon/rev/674f8f91162b>
100    to find out other options that you may pass to the Tomcat container that
101    will run by the above command.
102
103    SPECIAL NOTE: if you need to configure the connection details to the
104    underlying database, you may do so in two ways:
105      1. By modifying file `endpoint/WebContent/WEB-INF/connection.properties'
106         before building Strabon and executing the above command.
107      2. After executing the above command, by visiting the following page by a
108         browser: <http://localhost:8080/ChangeConnection>
109
110  * Strabon Endpoint Client
111
112    This is a Java client for interacting with Strabon Endpoint or any other
113    SPARQL endpoint. It is packaged as a jar file and may be found under
114    directory `endpoint-client/target/' with name
115    `strabon-endpoint-client-${version}.jar'. This jar contains any dependencies
116    to other code, so may copy and paste it to your project and start playing
117    with the code immediately.
118
119  * Strabon script
120
121    The `strabon' script is located under the `scripts/' directory and it is the
122    main command-line tool for interacting with Strabon. You may use it to store
123    RDF data with geospatial information or query/update it using one of
124    stSPARQL or GeoSPARQL query languages.
125
126  * Endpoint script
127
128    The `endpoint' script is located under the `scripts' directory and it is the
129    main command-line tool for interacting with a `Strabon Endpoint'. You may
130    use it to do any operation you would like to do with the `strabon' script
131    above, but in contrast to the `strabon' script you need to have access to a
132    Strabon endpoint. Of course, the `Strabon Endpoint Client' component above
133    can be used as well as a command-line tool. At the time of writing, the
134    `Strabon Endpoint Client' component supports only querying of RDF data with
135    geospatial information.
136
137
138Getting Started
139===============
140To get started  with Strabon please have a look at the tutorial for the stRDF
141data model and stSPARQL query language, the User Guide, and the Developer Guide.
142
143stRDF and stSPARQL tutorial
144        http://www.strabon.di.uoa.gr/files/stSPARQL_tutorial.pdf
145
146
147stSPARQL Reference
148~~~~~~~~~~~~~~~~~~
149The reference for the spatial and temporal extension functions defined in
150stSPARQL can be found at http://www.strabon.di.uoa.gr/stSPARQL.
151
152
153User Guide
154~~~~~~~~~~
155Assuming that you are familiar with Maven, the following steps need to be
156followed in order to use Strabon using Eclipse:
157
1581. Install PostgreSQL from http://www.postgresql.org/download/. At the time of
159   this writing the latest PostgreSQL version is 9.1.
1602. Install PostGIS from http://postgis.refractions.net/download/. At the time of
161   this writing we have tested Strabon with PostGIS 1.5.3. For the
162   temporal features of stSPARQL download the PostgreSQL temporal extension
163   from here: https://github.com/jeff-davis/PostgreSQL-Temporal and follow
164   the installation guide.
1653. Install Maven from http://maven.apache.org/download.html. At the time of this
166   writing the latest Maven version is 3.0.4.
1674. Install Eclipse from http://www.eclipse.org/downloads/. At the time of this
168   writing the latest Eclipse version is 3.7.2.
1695. Install the m2e plugin for Eclipse from http://www.eclipse.org/m2e/.
1706. Install the MercurialEclipse plugin for Eclipse from
171   http://javaforge.com/project/HGE .
1727. From Eclipse, go to File --> Import --> Mercurial --> Clone Existing
173   Mercurial Repository --> Next. In the URL textarea paste the following
174   URL: http://hg.strabon.di.uoa.gr/StrabonUser and then press Next --> Next -->
175   Finish. If you used the default settings, you should have a new project named
176   StrabonMain. Right click on the project and select Configure --> Convert to
177   Maven project. Eclipse will enable Maven dependency management for the
178   project, download any dependencies and build the project.
179
180
181        Storing stRDF graphs and evaluating stSPARQL queries
182        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183You can see some examples in the classes gr.uoa.di.strabon.example.PostgisExample
184and gr.uoa.di.strabon.example.PostgisExample2.
185
186        Tuning PostgreSQL
187        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188The default settings of Postgres are rather conservative. As a result, parameter
189tuning is neccessary for speeding up Postgres, therefore Strabon. If you are
190using Strabon to compare its performance against your implementation of
191stSPARQL/GeoSPARQL, you are *strongly* encouraged to contact us using the Strabon
192Users mailing list for assistance on tuning Postgres.
193
194You can follow the instructions below for tuning a Postgres server running on an
195Ubuntu machine that is dedicated to PostgreSQL and Strabon.
196
1971. Append the following text at the end of postgresql.conf.
198*Uncomment* the appropriate lines.
199
200### RAM
201## 4 GB of RAM
202#shared_buffers       =  3GB
203#effective_cache_size =  3GB
204#maintenance_work_mem =  1GB
205#work_mem             =  2GB
206## 8 GB of RAM
207#shared_buffers       =  5GB
208#effective_cache_size =  6GB
209#maintenance_work_mem =  2GB
210#work_mem             =  5GB
211## 16 GB of RAM
212#shared_buffers       = 10GB
213#effective_cache_size = 14GB
214#maintenance_work_mem =  4GB
215#work_mem             = 10GB
216## 24 GB of RAM
217#shared_buffers       = 16GB
218#effective_cache_size = 22GB
219#maintenance_work_mem =  6GB
220#work_mem             = 15GB
221## 48 GB of RAM
222#shared_buffers       = 32GB
223#effective_cache_size = 46GB
224#maintenance_work_mem =  8GB
225#work_mem             = 30GB
226## 64 GB of RAM
227# contact us to find out!
228### HD
229## RAID with ordinary 7.200 disks
230#random_page_cost = 3.5 #3.0-3.5
231## High-End NAS/SAN
232#random_page_cost = 2 #1.5-2.5
233## Amazon EBS/Heroku
234#random_page_cost = 1.3 #1.1-2.0
235## SSD array
236#random_page_cost = 2.0 #1.5-2.5
237### Planner options
238# Increase the following values in order to avoid using the GEQO planner.
239# Small values (<8) reduce planning time but may produce inferior query plans
240#
241geqo_threshold = 15 # keep this value larger that the following two parameters
242from_collapse_limit = 14
243join_collapse_limit = 14
244### Misc
245default_statistics_target    = 10000
246constraint_exclusion         = on
247checkpoint_completion_target = 0.9
248wal_buffers                  = 32MB
249checkpoint_segments          = 64
250### Connections
251max_connections              = 10
252
2532. Append the following lines at the end of /etc/sysctl.conf
254*Uncomment* the appropriate lines.
255
256## 4 GB of RAM
257#kernel.shmmax = 3758096384
258#kernel.shmall = 3758096384
259#kernel.shmmni = 4096
260## 8 GB of RAM
261#kernel.shmmax = 5905580032
262#kernel.shmall = 5905580032
263#kernel.shmmni = 4096
264## 16 GB of RAM
265#kernel.shmmax = 11274289152
266#kernel.shmall = 11274289152
267#kernel.shmmni = 4096
268## 24 GB of RAM
269#kernel.shmmax = 17716740096
270#kernel.shmall = 17716740096
271#kernel.shmmni = 4096
272## 48 GB of RAM
273#kernel.shmmax = 35433480192
274#kernel.shmall = 35433480192
275#kernel.shmmni = 4224
276## 64 GB of RAM
277# contact us to find out!
278
2793. Apply all changes by executing
280
281$ sudo sysctl -p
282$ sudo /etc/init.d/postgresql restart
283
2844. Prepare for the next run by issuing the command
285
286$ sudo -u postgres psql -c 'VACUUM ANALYZE;' db
287
288or
289
290$ psql -c 'VACUUM ANALYZE;' db
291
292where db is the name of the Postgres database that Strabon will use.
293
294
295Developer Guide
296~~~~~~~~~~~~~~~
297Assuming that you are familiar with Maven, the following steps need to be
298followed in order to use Strabon using Eclipse:
299
3001. Install PostgreSQL from http://www.postgresql.org/download/. At the time of
301   this writing the latest PostgreSQL version is 9.1.
3022. Install PostGIS from http://postgis.refractions.net/download/. At the time of
303   this writing we have tested Strabon with PostGIS 1.5.3. For the
304   temporal features of stSPARQL download the PostgreSQL temporal extension
305   from here: https://github.com/jeff-davis/PostgreSQL-Temporal and follow
306   the installation guide.
3073. Install Maven from http://maven.apache.org/download.html. At the time of this
308   writing the latest Maven version is 3.0.4.
3094. Install Eclipse from http://www.eclipse.org/downloads/. At the time of this
310   writing the latest Eclipse version is 3.7.2.
3115. Install the m2e plugin for Eclipse from http://www.eclipse.org/m2e/.
3126. Install the MercurialEclipse plugin for Eclipse from
313   http://javaforge.com/project/HGE.
3147. From Eclipse, go to File --> Import --> Mercurial --> Clone Existing
315   Mercurial Repository --> Next. In the URL textarea paste the following
316   URL: http://hg.strabon.di.uoa.gr/Strabon and then press Next --> Next -->
317   Finish. If you used the default settings, you should have a new project named
318   StrabonMain. Right click on the project and select Configure --> Convert to
319   Maven project. Eclipse will enable Maven dependency management for the
320   project, download any dependencies and build the project.
321
322
323Tester Guide
324~~~~~~~~~~~~
325Assuming again that you are familiar with Maven and Junit these are the steps
326you need to follow to test the functionality of Strabon:
327
328
329* Using Eclipse
330
331        If you want to create a new test:
332
333        1. Import Strabon into Eclipse as explained in the Developer Guide.
334        2. Go to strabon-testsuite project.
335        3. Create a new folder (Recommended folder name: <test's name>) and place inside the following files:
336                3.1. An ntriples or nquads file with the test dataset (with .nt or .nq extension).
337                3.2. Pairs of files with sparql test queries and expected test results in xml format.
338                         Notice that each pair must have the same name and .rq extension for the queryFile and .srx extension for the resultsFile.
339        4. Create a test class that extends TemplateTest class.
340        5. If you have followed the recommendations the test is ready. If you have different names or location for your
341        files, insert them explicitly in the constructor of the class. WARNING: All prefixes must be placed in file "prefixes" so that
342        every time a namespace changes, we have to change it just once.
343       
344        If you want to run a test:
345       
346        1. Right-click on the test class.
347        2. Select "Run as JUnit Test".
348        3. Database properties are retrieved from database.properties file. If you want, you can change a property
349        "on the fly" with an environment variable.
350
351       
352* Command Line
353       
354        If you want to run all the tests:
355       
356        1. Go to Strabon directory (root directory of all the subprojects).
357        2. Run "mvn test -DskipTests=false".
358        3. Optionally you can pass an environment variable with "-DvariableName=variableValue".
359
360
361Storing stRDF graphs and evaluating stSPARQL queries
362~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
363You can see some examples in the classes
364eu.earthobservatory.runtime.postgis.StoreOp and
365eu.earthobservatory.runtime.postgis.QueryOp.
366
367
368Download
369========
370You can download the source code of the latest version of Strabon by accessing
371our public mercurial repository located at http://hg.strabon.di.uoa.gr/Strabon.
372You can find more information on how to use and extend Strabon at the Getting
373Started section.
374
375
376Publications
377============
378You can learn about stRDF data model and stSPARQL query language employed in
379Strabon by reading our tutorial under the Getting Started section and/or the
380publications given on this page.
381
382The current versions of stRDF and stSPARQL which are based on OGC standards are
383presented in the following documents:
384  * K. Kyzirakos, M. Karpathiotakis, and M. Koubarakis. Strabon: A Semantic
385    Geospatial DBMS. In Internatioanl Semantic Web Conference (ISWC'12). Boston,
386    USA, November 11-15, 2012.
387    [pdf: http://strabon.di.uoa.gr/files/strabon-iswc.pdf]
388
389  * Manolis Koubarakis, Kostis Kyzirakos, Babis Nikolaou, Michael Sioutis, and
390    Stavros Vassos. A data model and query language for an extension of RDF with
391    time and space. Deliverable D2.1, European ICT project TELEIOS, 2011.
392    [pdf: http://strabon.di.uoa.gr/files/deliv2-1-re-revised.pdf]
393   
394The temporal features of stRDF and stSPARQL are presented in the following
395document:
396  * K. Bereta, P. Smeros and M. Koubarakis. Representing and Querying the
397    Valid Time of Triples for Linked Geospatial Data. In the 10th Extended
398    Semantic Web Conference (ESWC 2013). Montpellier, France. May 26-30, 2013.
399    [pdf: http://www.strabon.di.uoa.gr/files/eswc2013.pdf]
400
401The initial versions of stRDF and stSPARQL that are based on constraint
402databases are presented in the following publications:
403  * Manolis Koubarakis and Kostis Kyzirakos. Modeling and Querying Metadata in
404    the Semantic Sensor Web: the Model stRDF and the Query Language stSPARQL.
405    In 7th Extended Semantic Web Conference (ESWC 2010). Heraklion, Crete,
406    30 May - 03 June, 2010.
407    [pdf: http://strabon.di.uoa.gr/files/stSPARQL.pdf]
408 
409  * Kostis Kyzirakos, Manos Karpathiotakis and Manolis Koubarakis. Developing
410    Registries for the Semantic Sensor Web using stRDF and stSPARQL (short
411    paper).
412    In Proceedings of 3rd International workshop on Semantic Sensor Networks
413    2010, in conjunction with ISWC 2010, November 2010, Shanghai, China.
414    [pdf: http://strabon.di.uoa.gr/files/strabon.pdf]
415
416Applications of stRDF, stSPARQL, and the system Strabon are described here:
417  * Alasdair J. G. Gray, Raúl García-Castro, Kostis Kyzirakos, Manos
418    Karpathiotakis, Jean-Paul Calbimonte, Kevin Page, Jason Sadler, Alex
419    Frazer, Ixent Galpin, Alvaro A. A. Fernandes, Norman W. Paton, Oscar
420    Corcho, Manolis Koubarakis, David De Roure, Kirk Martinez and Asunción
421    Gómez-Pérez. A Semantically Enabled Service Architecture for Mashups over
422    Streaming and Stored Data. In 8th Extended Semantic Web Conference (ESWC
423    2011). Heraklion, Crete, May 20 - June 2, 2011.
424    [pdf: http://strabon.di.uoa.gr/files/Gray2011Architecture.pdf]
425
426  * A.J.G. Gray, J. Sadler, O. Kit, K. Kyzirakos, M. Karpathiotakis, J.-P.
427    Calbimonte, K. Page, R. García-Castro, A. Frazer, I. Galpin, A.A.A.
428    Fernandes, N.W. Paton, O. Corcho, M. Koubarakis, D.D. Roure, K. Martinez,
429    A. Gómez-Pérez. A Semantic Sensor Web for Environmental Decision Support
430    Applications. Sensors. 11, 8855-8887.
431    [pdf: http://strabon.di.uoa.gr/files/sensors-11-08855.pdf]
432
433Coming up soon:
434Strabon will soon support an extension of RDF for incomplete geospatial
435information. The following publication gives a preview of the relevant research
436problems:
437  * M. Koubarakis, K. Kyzirakos, M. Karpathiotakis, C. Nikolaou, M. Sioutis,
438    S. Vassos, D. Michail, T. Herekakis, C. Kontoes and I. Papoutsis. Challenges
439    for Qualitative Spatial Reasoning in Linked Geospatial Data. In Proceedings
440    of IJCAI 2011 Workshop on Benchmarks and Applications of Spatial Reasoning,
441    Barcelona, Spain.
442    [pdf: http://www.earthobservatory.eu/publications/SciQL_ADASS2011.pdf]
443
444  * C. Nikolaou and M. Koubarakis: "Querying Linked Geospatial Data with
445    Incomplete Information". In 5th International Terra Cognita Workshop -
446    Foundations, Technologies and Applications of the Geospatial Web. In
447    conjunction with the 11th International Semantic Web Conference, Boston,
448    USA, November, 2012.
449    [http://www.earthobservatory.eu/publications/iswc-workshop.pdf]
450
451
452Contributors
453============
454The system Strabon has been developed by the following members of our team:
455
456* Manos Karpathiotakis  <mk@di.uoa.gr>
457* Kostis Kyzirakos      <Kostis.Kyzirakos@cwi.nl>
458* Manolis Koubarakis    <koubarak@di.uoa.gr>
459* Giorgos Garbis        <ggarbis@di.uoa.gr>
460* Konstantina Bereta    <konstantina.bereta@di.uoa.gr>
461* Charalampos Nikolaou  <charnik@di.uoa.gr>
462* Stella Gianakopoulou  <sgian@di.uoa.gr>
463* Panayiotis Smeros     <psmeros@di.uoa.gr>
464* Kallirroi Dogani      <kallirroi@di.uoa.gr>
465
466
467Mailing-list
468============
469Currently, we maintain the following mailing lists:
470
471* Strabon-users, is used as a communication channel for Strabon users.
472To subscribe to the mailing-list, please visit page
473http://cgi.di.uoa.gr/~mailman/listinfo/strabon-users. To post e-mails
474to Strabon-users mailing-list, write to strabon-users@di.uoa.gr.
475
476* Strabon-devel, is used as a communication channel with the developers
477of Strabon. To subscribe to the mailing-list, please visit page
478http://cgi.di.uoa.gr/~mailman/listinfo/strabon-devel. To post e-mails
479to Strabon-devel mailing-list, write to strabon-devel@di.uoa.gr.
480
481
482Bugs
483====
484Please report bugs to http://bug.strabon.di.uoa.gr/report or
485the Strabon-devel mailing-list Strabon-devel@di.uoa.gr.
486
487
488Known Issues
489============
490 * By default, Tomcat uses ISO-8859-1 character encoding when decoding URLs received
491   from a browser. This can cause problems when encoding is UTF-8, and you are using
492   international characters. In order to fix this, edit conf/server.xml and find the
493   line where the Connector is defined. Add the parameter URIEncoding and set it to
494   UTF-8. For example:
495
496   <Connector port="8080" protocol="HTTP/1.1"
497                  connectionTimeout="20000"
498                  URIEncoding="UTF-8"
499                  redirectPort="8443" />
500
501 * Building and executing any maven goals fails for maven versions <3.0 due to a
502   dependency to the `shade' plugin that is available only for maven version 3.0
503   (http://maven.apache.org/plugins/maven-shade-plugin/). In such systems, you may
504   disable execution of this plugin by setting the environmental variable
505   `shade.skip'. For example, to build Strabon using maven version 2.0 you may
506   execute the following command:
507
508        $ mvn clean package -Dshade.skip
509
510 * When using MonetDB as a backend, the following source code of MonetDB must be
511   used:
512        https://hg.strabon.di.uoa.gr/MonetDB/   
513
514
515License
516=======
517This Source Code Form is subject to the terms of the Mozilla Public
518License, v. 2.0. If a copy of the MPL was not distributed with this
519file, You can obtain one at http://mozilla.org/MPL/2.0/.
520
521Copyright (C) 2010, 2011, 2012, 2013 Pyravlos Team
522
523http://www.strabon.di.uoa.gr/
524
525
526How to apply the license
527========================
528 * In the beginning of script files (after the shell directive) paste the
529   following statement:
530#
531# This Source Code Form is subject to the terms of the Mozilla Public
532# License, v. 2.0. If a copy of the MPL was not distributed with this
533# file, You can obtain one at http://mozilla.org/MPL/2.0/.
534#
535# Copyright (C) 2010, 2011, 2012, 2013 Pyravlos Team
536#
537# http://www.strabon.di.uoa.gr/
538#
539
540 * In the beginning of Java source code files paste the following statement:
541/**
542 * This Source Code Form is subject to the terms of the Mozilla Public
543 * License, v. 2.0. If a copy of the MPL was not distributed with this
544 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
545 *
546 * Copyright (C) 2010, 2011, 2012, 2013 Pyravlos Team
547 *
548 * http://www.strabon.di.uoa.gr/
549 */
550
551 * In the beginning of HTML/XML files paste the following statement:
552<!-- This Source Code Form is subject to the terms of the Mozilla Public
553   - License, v. 2.0. If a copy of the MPL was not distributed with this
554   - file, You can obtain one at http://mozilla.org/MPL/2.0/.
555   -
556   - Copyright (C) 2010, 2011, 2012, 2013 Pyravlos Team
557   -
558   - http://www.strabon.di.uoa.gr/
559-->
Note: See TracBrowser for help on using the repository browser.