Commit 6a225b08 by Tom Laudeman

Merge branch 'master', remote branch 'origin' into tom

parents 69a69749 ea79f79c
# Technical Discussion
This directory contains technical discussions and related notes between developers on the project.
# Discussion on Relational Databases
#### What is "normal form" and what informs the database schema design?
Edgar F. "Ted" Codd created 12 rules (revised with a 13th rule) to clarify the Relational Database Management
System (RDBMS).
https://en.wikipedia.org/wiki/Edgar_F._Codd
Breaking any of these rules weakens data integrity and the ability of the system to manage the data. An RDBMS
is not merely a bucket of data, but an entire eco-system for the management of data and data related
activities. Before Codd's work, databases were managed on an ad-hoc basis as collections of files with
links. It was a mess. Data was lost. Only the DBA knew how to find the data, and access methods could be very
different for data in different locations. Accessing data could also be extremely slow. In addition to
assuring the integrity of data, as well as managing it, relational database systems are very fast.
https://en.wikipedia.org/wiki/Codd%27s_12_rules
The "R" in RDBMS is "relational" and Codd invented the relational model of data. Key to relational data
modeling is "normal form".
https://en.wikipedia.org/wiki/Database_normalization
The RDBMS world generally uses third normal form. Lower levels of normalization create additional work for
data operations. Higher forms rarely show any improvements. The key concept of normalization is that a datum
only exists in one place. In the RDBMS world where SQL implements relational algebra, normal form is both
convenient and natural. In other venues such as paper ledgers, data stored in flat files, or in spreadsheets,
normal form can seem awkward.
# Staffing Model (Brian's draft suggestions)
Production of a cooperatively maintained high profile web site requires
different types of Technical and non-technical work.
Operations Team
- Communications and interactions with end users and content owners,
from marketing to user support, assessment
- Manages help desk
- Support production web application infrastructure, including
monitoring, "on call" for first tier response to system monitors
- batch ingest of new data sources
- signs up and on-boards new pilot members
- Proactive content QA and remediation
- work organized around issue queue / customer relationship management
system
Main Artifact: Ticketing Issue tracker that automatically generates a
ticket for an email to help@example.edu
Development Team
- Create new features that deliver customer value
- Maintain tests for new features
- second tier support of deployed features, developers on call for
their deployed code
- deploy code to test, stage, and production environments
- work organized around sprints
Main Artifact: User story backlog that supports scoring stories by
points,
Research Team
- Conduct experiments with new algorithms and technologies
- interoperation (and participation in the development) of relevant
domain specific standards and practices
Main Artifact: Research Agenda, schemas and specifications (esp. merge
spec)
### Info about Markdown
Markdown is a markup language that is used in Gitlab for documentation text files. Markdown files have a .md extension and can be edited locally or online. However, for best results, we recommend editing files locally and then uploading them. There are good guides to the syntax [here](https://confluence.atlassian.com/stash/using-stash/markdown-syntax-guide) and [here](https://en.wikipedia.org/wiki/Markdown).
### Editing
You can also edit markdown files locally, using a text editing application (such as TextEdit) or a word processing program (such as Word). However, be aware that some word processing programs may affect line breaks and formatting, which may change how information is displayed.
You can edit markdown files from the Gitlab web site. From the Gitlab home page, click a project on the right
side. On the project home page, click "Files" in the left navigation bar. Click a .md file. Click the "Edit"
button on the right side. Update the text and when finished, enter a commit message below, and click the
"Commit Changes" button.
#### Markdown, local complete reference
http://gitlab.iath.virginia.edu/help/markdown/markdown.md
#### Markdown, same info, somewhat different format
https://help.github.com/articles/markdown-basics/
#### Github extensions to standard markdown:
https://help.github.com/articles/github-flavored-markdown/
#### Standard markdown notes:
https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
### Working locally and version control ### Working locally and version control
The Git technology was created to track revisions to many files. Gitlab provides a web site with some ability The Git technology was created to track revisions to many files. Gitlab provides a web site with some ability
...@@ -86,4 +62,4 @@ http://doc.gitlab.com/ce/ssh/README.html ...@@ -86,4 +62,4 @@ http://doc.gitlab.com/ce/ssh/README.html
https://confluence.atlassian.com/display/STASH/Creating+SSH+keys#CreatingSSHkeys-CreatinganSSHkeyonWindows https://confluence.atlassian.com/display/STASH/Creating+SSH+keys#CreatingSSHkeys-CreatinganSSHkeyonWindows
#### Mac github, requires 10.9, probably github only. #### Mac github, requires 10.9, probably github only.
https://mac.github.com/ https://mac.github.com/
\ No newline at end of file
### Info about Markdown
Markdown is a markup language that is used in Gitlab for documentation text files. Markdown files have a .md extension and can be edited locally or online. However, for best results, we recommend editing files locally and then uploading them. There are good guides to the syntax [here](https://confluence.atlassian.com/stash/using-stash/markdown-syntax-guide) and [here](https://en.wikipedia.org/wiki/Markdown).
### Editing
You can edit markdown files locally, rather than on the website. One full-featured cross-platform Markdown editor is [Atom](http://atom.io). After opening a file, pressing `Ctrl-Shift-M` for Win/Linux and `Cmd-Shift-M` for Mac will open a real-time preview of the markdown file.
![Atom Screenshot](http://gitlab.iath.virginia.edu/snac/Documentation/raw/b39387646432816488537cce327f00e41aa79452/images/atom-screenshot.png "Screenshot of Atom editing Interface")
You can also edit markdown files using a text editing application (such as TextEdit or Notepad). However, be aware that some word processing programs may affect line breaks and formatting, which may change how information is displayed.
You can edit markdown files from the Gitlab web site. From the Gitlab home page, click a project on the right
side. On the project home page, click "Files" in the left navigation bar. Click a .md file. Click the "Edit"
button on the right side. Update the text and when finished, enter a commit message below, and click the
"Commit Changes" button.
### Resources
* [Gitlab markdown reference (local)](http://gitlab.iath.virginia.edu/help/markdown/markdown.md)
* [Github markdown reference](https://help.github.com/articles/markdown-basics/)
* [Github extensions to standard markdown](https://help.github.com/articles/github-flavored-markdown/)
* [Alternate markdown cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
* [Official Markdown documentation](http://daringfireball.net/projects/markdown/)
# SNAC Help
This directory contains helpful links and documentation on how to use various pieces of the subsystem. Specifically, it contains help files for Git, Gitlab, and the Markdown syntax.
# Historical Documentation
This directory catalogs documentation related to previous iterations of the SNAC project.
CC0 1.0 Universal
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator and
subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the
purpose of contributing to a commons of creative, cultural and scientific
works ("Commons") that the public can reliably and without fear of later
claims of infringement build upon, modify, incorporate in other works, reuse
and redistribute as freely as possible in any form whatsoever and for any
purposes, including without limitation commercial purposes. These owners may
contribute to the Commons to promote the ideal of a free culture and the
further production of creative, cultural and scientific works, or to gain
reputation or greater distribution for their Work in part through the use and
efforts of others.
For these and/or other purposes and motivations, and without any expectation
of additional consideration or compensation, the person associating CC0 with a
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
and publicly distribute the Work under its terms, with knowledge of his or her
Copyright and Related Rights in the Work and the meaning and intended legal
effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not limited
to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate,
and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness
depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data in
a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation thereof,
including any amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world
based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of,
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
and Related Rights and associated claims and causes of action, whether now
known or unknown (including existing as well as future claims and causes of
action), in the Work (i) in all territories worldwide, (ii) for the maximum
duration provided by applicable law or treaty (including future time
extensions), (iii) in any current or future medium and for any number of
copies, and (iv) for any purpose whatsoever, including without limitation
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
the Waiver for the benefit of each member of the public at large and to the
detriment of Affirmer's heirs and successors, fully intending that such Waiver
shall not be subject to revocation, rescission, cancellation, termination, or
any other legal or equitable action to disrupt the quiet enjoyment of the Work
by the public as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be
judged legally invalid or ineffective under applicable law, then the Waiver
shall be preserved to the maximum extent permitted taking into account
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
is so judged Affirmer hereby grants to each affected person a royalty-free,
non transferable, non sublicensable, non exclusive, irrevocable and
unconditional license to exercise Affirmer's Copyright and Related Rights in
the Work (i) in all territories worldwide, (ii) for the maximum duration
provided by applicable law or treaty (including future time extensions), (iii)
in any current or future medium and for any number of copies, and (iv) for any
purpose whatsoever, including without limitation commercial, advertising or
promotional purposes (the "License"). The License shall be deemed effective as
of the date CC0 was applied by Affirmer to the Work. Should any part of the
License for any reason be judged legally invalid or ineffective under
applicable law, such partial invalidity or ineffectiveness shall not
invalidate the remainder of the License, and in such case Affirmer hereby
affirms that he or she will not (i) exercise any of his or her remaining
Copyright and Related Rights in the Work or (ii) assert any associated claims
and causes of action with respect to the Work, in either case contrary to
Affirmer's express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties
of any kind concerning the Work, express, implied, statutory or otherwise,
including without limitation warranties of title, merchantability, fitness
for a particular purpose, non infringement, or the absence of latent or
other defects, accuracy, or the present or absence of errors, whether or not
discoverable, all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without limitation
any person's Copyright and Related Rights in the Work. Further, Affirmer
disclaims responsibility for obtaining any necessary consents, permissions
or other rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to this
CC0 or use of the Work.
For more information, please see
<http://creativecommons.org/publicdomain/zero/1.0/>
Notes to merge with other requirements
---
Note for TAT functional requirements: need to have UI widget for search of very long fields, such as the Joseph Henry cpfRelations
that contain some 22K entries. Also need to list all fields which migh have large numbers of values. In fact, part of the meta data for
every field is "number of possible entries/reapeat values" or whatever that's called.This wiki serves as the documentation of the SNAC technical team as relates to Postgres and storage of data. Currently, we are documenting:
* the schema and reasons behind the schema,
* methods for handling versioning of eac-cpf documents, and
* elastic search for postgres.
* Need a data constraint and business logic API for validating data in the UI. This layer checks user inputs against some set of rules and when there is an issue it informs the user of problems and suggests solutions. Data should be saved regardless. We could allow "bad" data to go into the database (assumes text fields) and flag for later cleaning. That's ugly. Probably better to save inputs in some agnostic repo which could be json, frozen data structures, or name-value pairs, or even portable source format. The problem is that most often data validation is hard coded into UI JavaScript or host code. Validation really should be configurable separate from the display of data, workflow automation, and data storage. While our database needs to do certain rudimentary sanity checks, the database can't be expected to send messages all the way back up to the UI layer. Nor should the database be burdened with validation rules which are certain to be mutable. Ideally, the validation rules would work in the same state machine framework as the workflow automation API, and might even share some code.
* Need a mechanism to lock records. Even mark-as-deleted records won't necessarily solve all our problems, so we might want records that are "live", but not editable for whatever reason. The ability to lock records and having the lock integrated across all the data-aware APIs is a good idea.
* On the topic of data, we will have user/group/other and r/w permissions, and all data-aware APIs should be designed with that in mind.
* "Literate programming" Using MCV and the state machine workflow automation probably meets (and exceeds) Knuth's ideas of Literate programming. Look at his idea and make sure we aren't missing any key concepts.
* QA and testing needs to be several layers, one of which is simple documentation. We should have code that examines data for various qualities, which when done in a comprehensive manner will test the data for all properties described in the requirements. As bugs are discovered and features added, this data testing code would expand. Code should be tested on several levels as well, and the tests plus comments in the tests constitute our full understanding of both data and code.
* Entities (names) have ID values, ARKs and various kinds of persistent ids. Some subsystem needs to know how to gather various ID values, and how to generate URIs and URLs from those id values. All discovered ids need to be attached to the cpf identity in a table related_id. We will need to track the authority that issued the id, so we need an authority table. Perhaps it is best (as previously discussed) to create a CPF record for each authority, and use the CPF persistent ID as the authority identifier in the related_id table.
```
create table related_id (
ri_id auto primary key,
id_value text,
uri text,
url text,
authority_id int -- fk to cpf.id?
);
```
* Allow config of CPF output formats via web interface. For example, in the CPF generator, we can offer some format and config options such as name formats in <part> and/or <relationEntry>
- include 4 digit fromDate-toDate for person
- include dates for corporateBody
- use "fl." for active dates
- use "active" for active dates
- use explicit "b." and "d."
- only use "b." or "d." for single 4 digit dates
- enclose date in parentheses
- add comma between name and dates (applies only if there is a date)
and so on. In theory that could be done for all kinds of CPF variations. We should have a single checkbox for "use most portable CPF formats" although I suspect the best data exchange format is not XML, but SQlite, SQL INSERT statements, or json.
* Does our schema track who edited a record? If not, we should add user_id to the version table.
* We should review the schema and create rules that human beings follow for primary key names, and foreign key names. Two options are table_id and table_id_fk. There may be a better option
* Option 1 is nice for people doing "join on", but I find "join on" syntax confusing, especially when combined with a where clause
* Option 2 seems more natural, especially when there is a where clause. Having different field names means that field names are more likely to be unique, thus not requiring explicit table.field syntax. Option 2a will be used most of the time. Option 2b shows a three table join where table.field syntax is required.
```
-- 1
select * from foo as a, bar as b where a.table_id=b.table_id;
-- 2a
select * from foo as a, bar as b where table_id=table_id_fk;
-- or 2b
select * from foo as a, bar as b, baz as c where a.table_id=b.table_id_fk and a.table_id=c.table_id_fk;
```
* Identity Reconciliation has a planned "why" feature to report on why a match matches. It would be nice to also report the negative: why didn't this match X? I'm not even sure that is possible, but something to think about.
# Technical Notes
This directory contains technical notes related to the SNAC project by developers.
# Introduction to Documentation # SNAC Documentation
The currently-being-revised TAT requirements are found in the [tat_requirements](tat_requirements). This repository contains all the documentation for the SNAC Web Application and related frameworks, engines, and pieces. Specifically:
The best place to start is the big, overall [plan](tat_requirements/plan.md). * The currently-being-revised Technical Requirements are found in the [Requirements Directory](Requirements).
* Formal Specifications for those requirements are in the [Specifications Directory](Specifications).
* [Help](Help) on using Gitlab, Git, and the Markdown text format
* [Documentation](Third Party Documentation) on third-party software and applications being used
* [Historical Documentation](Historical Documentation) on previous iterations of SNAC
* Technical [Discussions](Discussion) related to the SNAC project
* [Notes](Notes) from the technical team.
This is Gitlab, a work-alike clone of the Github web site, but installed locally on a SNAC server. Gitlab is a The best place to start is the big, overall [plan](plan.md) document, which describes the process forward with defining requirements and specifications.
This repository is stored in Gitlab, a work-alike clone of the Github web site, but installed locally on a SNAC server. Gitlab is a
version control system with a suite of project management tools. version control system with a suite of project management tools.
Ideally we will all create documentation in markdown format (.md files). You may create and edit files from Ideally we will all create documentation in [markdown format](http://daringfireball.net/projects/markdown/) (.md files). You may create and edit files from
the web interface here on gitlab, or download files and edit locally. You can also upload any file type using the web interface here on Gitlab, or download files and edit locally. You can also upload any file type using
standard git commands, or use a Git graphical client (see below). Choose a relevant directory for your docs, standard git commands, or use a Git graphical client (see below). Choose a relevant directory for your docs,
or create a new directory as necessary. or create a new directory as necessary.
Markdown files are simple text files, which makes them easy to edit and universally portable. Markdown has a Markdown files are simple text files, which makes them easy to edit and universally portable. Markdown has a
limited set of conventions to denote headers, lists, URLs and so on. When uploaded to gitlab or github, limited set of conventions to denote headers, lists, URLs and so on. When uploaded to gitlab or github,
markdown files are rendered into nicely styled HTML. Tools are available to convert markdown into .doc, .pdf, markdown files are rendered into nicely styled HTML. Tools are available to convert markdown into .doc, .pdf,
LaTex and other formats. LaTex and other formats. For more information on Markdown, see [this guide](Help/Markdown.md).
#### How to use gitlab and markdown #### Help Links
[Help using gitlab](Help-using-gitlab.md) * [Git and Gitlab](Help/Git-and-Gitlab.md)
* [Markdown](Help/Markdown.md)
--- <p xmlns:dct="http://purl.org/dc/terms/" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#" align="center">
<a rel="license"
href="http://creativecommons.org/publicdomain/zero/1.0/">
Notes to merge with other requirements <img src="http://i.creativecommons.org/p/zero/1.0/88x31.png" style="border-style: none;" alt="CC0" />
--- </a>
<br />
Note for TAT functional requirements: need to have UI widget for search of very long fields, such as the Joseph Henry cpfRelations To the extent possible under law,
that contain some 22K entries. Also need to list all fields which migh have large numbers of values. In fact, part of the meta data for <span resource="[_:publisher]" rel="dct:publisher">
every field is "number of possible entries/reapeat values" or whatever that's called.This wiki serves as the documentation of the SNAC technical team as relates to Postgres and storage of data. Currently, we are documenting: <span property="dct:title">SNAC Cooperative</span></span>
* the schema and reasons behind the schema, has waived all copyright and related or neighboring rights to
* methods for handling versioning of eac-cpf documents, and <span property="dct:title">SNAC Documentation</span>.
* elastic search for postgres. This work is published from:
<span property="vcard:Country" datatype="dct:ISO3166"
* Need a data constraint and business logic API for validating data in the UI. This layer checks user inputs against some set of rules and when there is an issue it informs the user of problems and suggests solutions. Data should be saved regardless. We could allow "bad" data to go into the database (assumes text fields) and flag for later cleaning. That's ugly. Probably better to save inputs in some agnostic repo which could be json, frozen data structures, or name-value pairs, or even portable source format. The problem is that most often data validation is hard coded into UI JavaScript or host code. Validation really should be configurable separate from the display of data, workflow automation, and data storage. While our database needs to do certain rudimentary sanity checks, the database can't be expected to send messages all the way back up to the UI layer. Nor should the database be burdened with validation rules which are certain to be mutable. Ideally, the validation rules would work in the same state machine framework as the workflow automation API, and might even share some code. content="US" about="[_:publisher]">
United States</span>.
* Need a mechanism to lock records. Even mark-as-deleted records won't necessarily solve all our problems, so we might want records that are "live", but not editable for whatever reason. The ability to lock records and having the lock integrated across all the data-aware APIs is a good idea. </p>
\ No newline at end of file
* On the topic of data, we will have user/group/other and r/w permissions, and all data-aware APIs should be designed with that in mind.
* "Literate programming" Using MCV and the state machine workflow automation probably meets (and exceeds) Knuth's ideas of Literate programming. Look at his idea and make sure we aren't missing any key concepts.
* QA and testing needs to be several layers, one of which is simple documentation. We should have code that examines data for various qualities, which when done in a comprehensive manner will test the data for all properties described in the requirements. As bugs are discovered and features added, this data testing code would expand. Code should be tested on several levels as well, and the tests plus comments in the tests constitute our full understanding of both data and code.
* Entities (names) have ID values, ARKs and various kinds of persistent ids. Some subsystem needs to know how to gather various ID values, and how to generate URIs and URLs from those id values. All discovered ids need to be attached to the cpf identity in a table related_id. We will need to track the authority that issued the id, so we need an authority table. Perhaps it is best (as previously discussed) to create a CPF record for each authority, and use the CPF persistent ID as the authority identifier in the related_id table.
```
create table related_id (
ri_id auto primary key,
id_value text,
uri text,
url text,
authority_id int -- fk to cpf.id?
);
```
* Allow config of CPF output formats via web interface. For example, in the CPF generator, we can offer some format and config options such as name formats in <part> and/or <relationEntry>
- include 4 digit fromDate-toDate for person
- include dates for corporateBody
- use "fl." for active dates
- use "active" for active dates
- use explicit "b." and "d."
- only use "b." or "d." for single 4 digit dates
- enclose date in parentheses
- add comma between name and dates (applies only if there is a date)
and so on. In theory that could be done for all kinds of CPF variations. We should have a single checkbox for "use most portable CPF formats" although I suspect the best data exchange format is not XML, but SQlite, SQL INSERT statements, or json.
* Does our schema track who edited a record? If not, we should add user_id to the version table.
* We should review the schema and create rules that human beings follow for primary key names, and foreign key names. Two options are table_id and table_id_fk. There may be a better option
* Option 1 is nice for people doing "join on", but I find "join on" syntax confusing, especially when combined with a where clause
* Option 2 seems more natural, especially when there is a where clause. Having different field names means that field names are more likely to be unique, thus not requiring explicit table.field syntax. Option 2a will be used most of the time. Option 2b shows a three table join where table.field syntax is required.
```
-- 1
select * from foo as a, bar as b where a.table_id=b.table_id;
-- 2a
select * from foo as a, bar as b where table_id=table_id_fk;
-- or 2b
select * from foo as a, bar as b, baz as c where a.table_id=b.table_id_fk and a.table_id=c.table_id_fk;
```
* Identity Reconciliation has a planned "why" feature to report on why a match matches. It would be nice to also report the negative: why didn't this match X? I'm not even sure that is possible, but something to think about.
# System-Generated Documents
The following documents and data should be generated from the completed system.
## Data Interoperability
Data should be available to be downloaded in the following formats:
* EAC-CPF XML
* Individual identity constellations should be download-able as fully-formed EAC-CPF XML documents
* Turtle Triples
* Subsets of the data, including the entire database, should be exportable as well-formed Turtle triples
* RDF Triples
* Subsets of the data, including the entire database, should be exportable as well-formed RDF triples
* JSON-LD
* Subsets of the data, not including the entire database, should be exportable as well-formed JSON-LD
## System Reports
While the web interface is the primary public face of SNAC, many other views of the data and meta data are
necessary, especially for admins and governance. Those "views" are reports and will primary be generated via
integration of a third-party reporting package such as Jaspersoft Business Intelligence Suite, which is free,
open source, and includes a full range of tools.
For each user of the system, the following reports should be available for download:
* List of records the user has edited
* Number of records the user has edited
For each holding institution, the following reports should be available for download:
* Number of records the institution has edited
* Number of records the institution has contributed
* List of records the institution has contributed
* List of records the institution has edited
* List of individuals within the institution and the records edited by each person
* List of records the institution has contributed with individuals who contributed to each record
General reporting:
* Number of participating holding institutions
* Number of records edited per hour, day, month, year
* Number of identity constellations available in the database
# Internal Data Storage
The data should be stored in a SQL database. Every piece of data is in a separate field to the extent that is practical.
Data is organized into fields (columns) records (rows) and tables. Fields related to each other are in the
same table. Every record has a unique, permanent, numerical id often called a "key" or "primary key". For
the SNAC Co-op we have decided that records are never overwritten during update. An update operation creates a new record identical to the old record except for updated
fields. All old records are available for viewing via special interface. The old records are invisible to
operations that are intellectually acting on "current" data.
Version history, including past versions of a field and record, users that made changes to that data, institution history, and timestamps must be kept in the internal data storage.
Provenance of each element must be captured as well, including across merges and splits of identity constellations.
The application must avoid storing mixed markup as much as possible. (Brad Westbrook sugests we avoid mixed markup).
## Captured actions on data
Prior to human edits, merged records can be algorithmically split by the computer, assuming we write code to
perform such a split. After human edit, a split must be performed by a human. It is a requirement that all
previous versions can be viewed (read-only) during the human-mediated split operation so the human can refer
back to previous information.
After human edits, rollback only applies to human edited versions. There is a fire-break where rollback cannot
cross from human edits back to machine-merged descriptions. The policy group needs to supply policy
requirements for the tech folks to implement.
The broad requirements for the application are: edit data, split records, merge records. Secondary features to
make the system useful include: work flow enforcement, search, reporting (including "watch" features),
administration, authorization (data privileges).
# Licensing and Copyright
The documentation and code generated by the SNAC Cooperative must have license files and text associated with them.
* [Documentation](#documentation)
* [Code](#code)
## Documentation
All documentation must be assigned the Creative Commons Zero (CC0) license. It's text is below:
```
CC0 1.0 Universal
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator and
subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the
purpose of contributing to a commons of creative, cultural and scientific
works ("Commons") that the public can reliably and without fear of later
claims of infringement build upon, modify, incorporate in other works, reuse
and redistribute as freely as possible in any form whatsoever and for any
purposes, including without limitation commercial purposes. These owners may
contribute to the Commons to promote the ideal of a free culture and the
further production of creative, cultural and scientific works, or to gain
reputation or greater distribution for their Work in part through the use and
efforts of others.
For these and/or other purposes and motivations, and without any expectation
of additional consideration or compensation, the person associating CC0 with a
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
and publicly distribute the Work under its terms, with knowledge of his or her
Copyright and Related Rights in the Work and the meaning and intended legal
effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not limited
to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate,
and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness
depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data in
a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation thereof,
including any amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world
based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of,
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
and Related Rights and associated claims and causes of action, whether now
known or unknown (including existing as well as future claims and causes of
action), in the Work (i) in all territories worldwide, (ii) for the maximum
duration provided by applicable law or treaty (including future time
extensions), (iii) in any current or future medium and for any number of
copies, and (iv) for any purpose whatsoever, including without limitation
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
the Waiver for the benefit of each member of the public at large and to the
detriment of Affirmer's heirs and successors, fully intending that such Waiver
shall not be subject to revocation, rescission, cancellation, termination, or
any other legal or equitable action to disrupt the quiet enjoyment of the Work
by the public as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be
judged legally invalid or ineffective under applicable law, then the Waiver
shall be preserved to the maximum extent permitted taking into account
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
is so judged Affirmer hereby grants to each affected person a royalty-free,
non transferable, non sublicensable, non exclusive, irrevocable and
unconditional license to exercise Affirmer's Copyright and Related Rights in
the Work (i) in all territories worldwide, (ii) for the maximum duration
provided by applicable law or treaty (including future time extensions), (iii)
in any current or future medium and for any number of copies, and (iv) for any
purpose whatsoever, including without limitation commercial, advertising or
promotional purposes (the "License"). The License shall be deemed effective as
of the date CC0 was applied by Affirmer to the Work. Should any part of the
License for any reason be judged legally invalid or ineffective under
applicable law, such partial invalidity or ineffectiveness shall not
invalidate the remainder of the License, and in such case Affirmer hereby
affirms that he or she will not (i) exercise any of his or her remaining
Copyright and Related Rights in the Work or (ii) assert any associated claims
and causes of action with respect to the Work, in either case contrary to
Affirmer's express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties
of any kind concerning the Work, express, implied, statutory or otherwise,
including without limitation warranties of title, merchantability, fitness
for a particular purpose, non infringement, or the absence of latent or
other defects, accuracy, or the present or absence of errors, whether or not
discoverable, all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without limitation
any person's Copyright and Related Rights in the Work. Further, Affirmer
disclaims responsibility for obtaining any necessary consents, permissions
or other rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to this
CC0 or use of the Work.
For more information, please see
<http://creativecommons.org/publicdomain/zero/1.0/>
```
## Code
All code must be assigned the BSD 3-Clause license, including the copyright header for the Rector and Visitors of the University of Virginia, and
the Regents of the University of California, as printed in the text below:
```
Copyright (c) 2015, the Rector and Visitors of the University of Virginia, and
the Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
```
## Technology
The long-term technological objective for the Cooperative is a platform that will support a continuously expanding, curated corpus of reliable biographical descriptions of people linked to and providing contextual understanding of the historical records that are the primary evidence for understanding their lives and work. Building and curating a reliable social-document corpus will involve a balanced combination of computer processing and human identity verification and editing. The next step towards realizing the long-term objective is to transition from a research and demonstration project to a production web service. From a technical perspective, this means transitioning from a multistep human-mediated batch process to an integrated transaction-based platform. Instead of the data being passed along from one programmer to another, the architecture will automate the flow of data in and out of the different processing steps by interconnecting the processing components, with events taking place in one component triggering related events in another. For example, the addition of a new descriptive record will lead to automatic updating of graph data in Neo4J and updating the indexed data in the History Research Tool. The coordinated architecture will support both the batch ingest of data and human editing of the data to verify identities and refine and augment the descriptions over time.
Using techniques developed in the research and demonstration phase of SNAC, computer processing will be used to extract and ingest existing name authority and biographical data from existing archival descriptions. Identity reconciliation, i.e. matching and combining two or more descriptions for the same person, organization, or family, has relied solely on algorithms in the research phase. While identity reconciliation techniques will continue to inform the reconciliation process, Cooperative professional editors, beginning with librarians and archivists though expanding over time to include allied scholars, will verify identities and curate the data. This two faceted approach, combining intelligent computer processing and professional editing, will enable building a large corpus of networked social-document data that is not constrained geographically or by historical period, and over time establishes an expanding core of reliable identities within the overall corpus. (See Appendix 4 for a diagram showing the relationship between certain/uncertain data and dense/sparse evidence for identity resolution.)
### Current SNAC R&D Technology Platform
Current SNAC processing employs a complex sequence of steps that produces a collection of biographical descriptions used to produce the History Research Tool.
* Acquire source data from archives, libraries, and OCLC WorldCat (EAD-encoded finding aids; MARC21; and ad hoc authority and biographical data sets).
* Extract data essential to assembling descriptions of persons, organizations, and families into standardized descriptions (EAC-CPF).
* Load the name and, when available, the existence dates of the entity described in each EAC-CPF instance into the PostgreSQL database the multi-component platform that attempts to match and combine different descriptions of the same identity into a single description.
* Names in the PostgreSQL database are matched against more than 25 million identities in the Virtual International Authority File (VIAF), maintained by OCLC. Cheshire, an XML-based indexing tool developed at the University of California, Berkeley is a key component of this step. Based on a sequence of matching attempts, additional data is associated with each identity in the PostgreSQL database.
* Based on an evaluation of the match processing results, a final set of EAC-CPF instances is produced to serve as the basis for the History Research Tool. For instances that are deemed to be for the same identity, the different instances are combined based on complex merge algorithms; instances deemed to be possibly for the same identity but lacking sufficient confidence to be merged are related to one another as "maybe the same as;" and finally instances that do not match or weakly match are passed into the results as is.
* A subset of the EAC-CPF data is extracted and loaded into Neo4J, a graph database. The graph database serves two primary functions: support of graphical representations of the SNAC social-document network, and exposing a subset of the SNAC data as Resource Description Framework (RDF) Linked Open Data (LOD).1
* The resulting set of EAC-CPF instances is used to produce the History Research Tool. The key underlying platform is XTF, an open-source XML-based publishing tool developed at the California Digital Library.
Transforming the existing platform into a platform that supports both ingesting of large batches of data but also manual maintenance of the data will require a reconfiguration of major components of the current underlying technology. Two major existing components will be retained with minimal modification during the pilot: the "back end," the processing used to extract data from existing descriptive sources and assemble it into EAC-CPF instances; and the "front end," the History Research Tool. While the code and technology for these two components of the SNAC infrastructure would benefit from additional development and refinement, each is sufficiently robust and functionally complete to remain largely unchanged during the pilot. The intermediate technologies used in loading and matching of the EAC-CPF will need to be thoroughly revised, retaining existing functionality but in a configuration that will support both batch and manual maintenance. One component, the processes used to merge or combine matching EAC-CPF instances will be deferred to a later stage of development (to be described below). Finally, two components that will be developed in the pilot are entirely new: an API to support both batch processing and an Editing User Interface, and development of the Editing User Interface itself. While the transformation of the underlying technology is underway, there will be a one-year pause in batch ingesting new data in order to focus programming resources on the essential development work needed to go forward. No large batches of new source data have been solicited for the pilot, although pilot member institutions will contribute batches of data for use in first testing and then bringing online the batch ingest function of the Cooperative. During the pilot, new sources of batch data will be solicited for the second two-year phase of establishing the Cooperative.
### Data Maintenance Store
In the current processing stream, the EAC-CPF instances are placed in a read-only directory as the primary data store. A small number of select components (name strings) of each EAC-CPF XML-encoded instance are loaded into a PostgreSQL database. In order to support dynamic manual editing of the EAC-CPF instances, it will be necessary to parse the entirety of each EAC-CPF instance into PostgreSQL tables.2 Parsing all (or most) components of the EAC-CPF instances into SQL tables is necessary because no open source native XML database will efficiently support the essential maintenance functionality required, in particular effectively managing editing transactions at the component-level of each EAC-CPF instance.3 MarkLogic would enable maintaining the data in XML, but it is an expensive commercial platform. The most robust of the open source native XML databases, eXist, does not support transaction management. Further, EAC-CPF was not designed as a maintenance format, but rather as a communication format and, with this in mind, was intentionally designed to facilitate the serialization of the data into and out of SQL environments.4
The PostgreSQL Data Maintenance Store (DMS) will represent the core foundation of the SNAC technology platform. It will hold the crucial SNAC data, including: the parsed EAC-CPF instances, version control for modified data fields, editor authorization privileges, editor work histories (e.g., edit status on individual EAC-CPF instances), local controlled vocabularies (e.g., occupations, functions, subjects, and geographic names), and workflow management data. An open source authentication system will mediate editor/user access to the DMS. All other component subsystems will rely in large part on the DMS, with several of the DMS functions being generalized to be effective through the component APIs. Additionally, nearly all reporting for editors and administrators will be based on the DMS. We will use an open source reporting package, but the reports themselves will need to be generated by the DMS. With the DMS as the core foundation of the SNAC technology platform, evolving features of the component subsystems will often require further development of corresponding functions in the DMS.
### Identity Reconciliation
A major focus of the SNAC R&D has been on identity reconciliation. A fundamental human activity in the development of knowledge involves the identification of unique "real world" entities (for example, a particular person or a specific book) and recording facts about the observed entity that when taken together uniquely distinguishes the entity from all others. Establishing the identity of a person, for example, involves examining available evidence, including the existing knowledge base, and recording facts associated with him or her. For a person, the facts would include names used by and for them, dates and places of birth and death, occupation, and so on. Establishing identities is an ongoing, cumulative activity that both leverages existing established identities and establishes new identities. Identity reconciliation is the process by which an encountered identity is compared against established identities, and if not found, is itself contributed to the established base of identities. The networked computing environment presents opportunities for using algorithm-based inference methods for comparing newly encountered entities with established identities to determine the probability that a new entity represents the same person or thing as an established identity. In this way, the ongoing expansion of the base of reliable identities is an interplay of human research, knowledge recording, and computational methods.
With the emergence of Linked Open Data (LOD) and the opportunity it presents to interconnect distributed sets of information, new names for entities are introduced, namely the URI's used to provide globally unique identifiers to entities. In order to exploit the opportunity presented by LOD, it necessary to include these URI's in the reconciliation process. SNAC assigns its own identifiers (ARKS) because doing so is essential to effectively managing the identities throughout the processing and maintenance. Even if this were not essential for managing the workflow, the majority of the identities in SNAC will not be found in other sources such as VIAF, and thus the SNAC identifiers and associated data that establish the identity are likely to be unique, at least in the near term.5 For those identities that do overlap with VIAF, SNAC processing takes advantage of the VIAF reconciliation to associate the VIAF identifier as well as identifiers for Wikipedia and WorldCat Identity.
SNAC identity reconciliation processing, while sufficiently reliable for the research and demonstration purposes of SNAC, is inadequate for meeting the long-term objective of building a large corpus of networked social-document data that, over time, establishes an expanding core of reliable identities within the overall corpus. This objective will require a calibrated balance of computational methods and human verification of identities, and it must be possible to refine the balance over time as new understandings and insights into the processing arise, and as new data patterns are encountered in new sources data. To inform the refinement of the match processing in balanced relation with the human verification, an ongoing quality review regimen needs to be put in place that supports efficient evaluation of match algorithms that employs both benchmark data used in testing and revising algorithms, and feedback for revision of algorithms. Revision of the match processing will require the following:
* Developing an Identity reconciliation services module with API that supports batch match evaluation processing, evaluation of identities that are manually added through the Editing User Interface, and OpenRefine users interested in reconciling names against SNAC identities.6
* Establishing a quality review process that employs benchmark or "ground truth" data to be used in evaluating and refining match algorithms and a regimen of ongoing human review that is performed collaboratively by Cooperative staff and members. The benchmark data will be initially based on the in-depth match quality evaluation that was performed by an outside consultant during the SNAC research phase. The consultant’s report, describing in detail both methods employed and results will also serve as the basis for training Cooperative staff and members.
The major components of the current match or identity reconciliation processing are Cheshire and PostgreSQL. For each EAC-CPF instance, Cheshire is used to perform a series of queries of the Virtual International Authority File (VIAF), with the results of the queries (positive matches, possible matches, and non-matches) being stored in the PostgreSQL database for use in later processing. The Cheshire index may be replaced because it has proven to be problematic to maintain, though the final decision will be based on ongoing testing of alternatives, such as ElasticSearch, to ensure that that any replacement for Cheshire will provide the performance and functionality required.
There are three major reconciliation results: reliable match; possible match; and no match. These determinations are based on string matching combined with the relative "identity strength" of each name string, that is, the extent to which the name string is likely to uniquely identify a person, organization, or family in a large population. Factors considered in determining the "identity strength" of a name string are the following: length of the string, the number and length of name components, the order of the name components, the presence or absence of life dates, how common the surname is, and others. Another way of understanding "identity strength" is as a determination of the quantity and quality of available evidence.7 If two matching strings contain sufficient evidence, then two strings are deemed a reliable match; if the strings do not contain sufficient evidence, then the strings are flagged as a possible match.
The reconfiguration will enable the identity reconciliation processing to be integrated with the extraction/assembling processing, the data maintenance platform, and the editing user interface.8 EAC-CPF extracted and assembled using existing archival descriptions (EAD-encoded finding aids, MARC21, or existing non-standard archival authority records) will be batch ingested into the SNAC Cooperative PostgreSQL database; when ingested, the Identity Reconciliation module will be invoked to flag reliable matches, possible matches, non-matches. The results of the identity reconciliation evaluation will be available to editors through the Editing User Interface to assist them in verifying identities. When editors create new identity descriptions or revise existing descriptions, the Identity reconciliation module will be invoked to provide the editors with feedback on likely and potential matches that may be otherwise overlooked when employing human-only authority control techniques.
Merge processing, that is the automatic merging or combining of EAC-CPF instances deemed reliably to be for the same identity, will be deferred until after the revision of the match processing and developing an effective quality evaluation regimen. The current merge processing combines two or more EAC-CPF instances into one. The combining is primarily cumulative, though redundant data fields are combined as a further step. Once human verification and editing is introduced, any automatic merging of records will necessarily need to respect the integrity of the judgment of the human editors. The merge algorithms will need to be based on policies developed in consultation with the Cooperative community, taking into account quality evaluation findings and the nature of the components of each description. The engagement of the archivists and librarians thus will be essential in developing an appropriate balance of computer and human maintenance of the data. An informed understanding of the issues will not be possible until the editing platform and editing interface are functional, and the community knowledgeably engaged.
### Editing User Interface
Developing the Editing User Interface (EUI) is a primary objective of the two-year pilot. The SNAC developers have identified the essential functional requirements for the interface, and extensive user studies with archivist and librarians have been used to refine and substantially extend the requirement list. Because the EUI is dependent on the reconfiguration and development of the data maintenance and identity reconciliation modules, and the development of the Edit API, the development will first focus on engaging the pilot participants by means of wireframes of the EUI, in conjunction with rehearsing established research and description tasks, the order or orders in which such task are performed, and walk-throughs of the steps involved in manually adding, revising, merging, and splitting identity descriptions. These activities and the findings that result from them will inform the parallel development of the maintenance platform. When the underlying data maintenance platform is in place, development of the EUI will commence, informed by the activities described above. As the EUI becomes functional, the pilot participants will transition to iteratively testing and using it to perform editing tasks to ensure that the essential functions are supported and that this support makes the performance of the tasks logical and efficient. Those functions of the EUI that overlap with the History Research Tool will employ a common interface. The bulk of the EUI will be based on JavaScript running in modern web browsers.
### Graph Data Store – Visualizations and Exposure of RDF/LOD
Neo4J, an open source graph database, is currently used to generate social-document network data as GraphML. The generated GraphML supports the graphic representations of the social-document network in the History Research Tool. In addition, it supports exposure of the SNAC data for third-party use through Resource Description Framework (RDF) Linked Open Data (LOD). The Neo4J component will not require major reconfiguration during the pilot, but will be used as an active source of the social-document network data in place of static GraphML representation. In this capacity, the Neo4J database will provide a number of services: serving graph data to drive social-document network graphs in the HRT; and serving and providing LOD through a SPARQL endpoint and RDF exports for third-party consumption. It will, however, be necessary to integrate both the data ingest and data serving functionality of Neo4J into the coordinated system architecture in order to ensure that the graph data and dependent services remain current with the evolving SNAC data.
While the initial focus of the Cooperative is on the curation of data, it is interested in using the social-document network data in public graphical displays of the networks and exposing the data as LOD in RDF syntaxes (RDF/XML and RDF compatible JSON-LD) for use by third parties. By exposing the data for use in a variety ways (including making available full EAC-CPF XML-encoded instances) the Cooperative will contribute to global open data initiatives that are intended, among other objectives, to promote use and reuse of data in innovative ways, and to interconnect and interrelate complementary resources that currently exist in isolation from one another.
Currently there is no existing ontology for archival description, and thus the classes and properties used in exposing graph data expressed in RDF is based on classes and attributes selected from existing, well-known and widely used ontologies and vocabularies: Friend of a Friend, OWL, SKOS, Europeana Data Model (EDM), RDA Group 2 Element Vocabulary, Schema.org, and Dublin Core elements and terms.9 In the long term, it should be noted that the International Council on Archives' Expert Group on Archival Description (EGAD; chaired by the PI) is developing an ontology for archival entities and the description thereof. While the initial focus of EGAD necessarily is focused on developing a clear model of the world based on archival curatorial principles, once this work is completed, the group intends to collaborate in mapping the archival ontology to CIDOC CRM, which incorporates both museum and library description.10
### Component Subsystem Integration
In order to integrate the component subsystems of the Cooperative technological platform we will develop a thin middleware component that routes each request from a client or from an intra-server process to the appropriate individual subsystem based on SNAC workflows we will establish. The middleware component invokes the required functions via calls to the subsystems: Identity Reconciliation, PostgreSQL database, Neo4J graph database, History Research Tool, and Editing User Interface. These subsystems deal with the variety of automated and semi-automated transactions required by the Cooperative platform.
We will develop the Cooperative middleware component as a LAMP application rather then using an open source Enterprise Service Bus (ESB).11 We will use LAMP (with PostgreSQL) for efficiency of coding; flexibility enabled by a very large number of available software modules; ease of maintenance; and clarity of software architecture (that is, the model-view-controller).12 The result will be a lightweight and easy to administer software stack. (See Appendix 11 for diagrams illustrating the basic system architecture.) ESBs contain far more features than required by the Cooperative architecture, and because of the complexity these unwanted features present, it would be less efficient to configure and maintain the middleware using an ESB than simply selecting only the components needed by the architecture from a large library of existing open source LAMP modules.
The thin middleware component will be available via a RESTful API, allowing appropriate third party access to services. A simple example might be a dedicated MARC21-to-EAC converter where a MARC21 record is uploaded, data extracted and transformed into EAC-CPF, and returned in a single transaction. Another example is saving an identity record where the data is written to PostgreSQL, EAC-CPF is exported to and indexed by XTF, and the Neo4j database is updated. The three steps are sequenced by the thin middleware component. 
With respect to potential third party applications, Brad Westbrook from Lyrasis has participated in the technical planning for the Cooperative, in anticipation of extending ArchivesSpace to include a SNAC editing interface. Adding this capacity will enable archives, libraries, and museums using ArchivesSpace to benefit from the Cooperative data, and to link the description of local holdings to SNAC descriptions of organizations, persons, and families. The PI has also had discussions with Susan Perdue at the Virginia Foundation for the Humanities and Director of Document Compass. Perdue is currently in the planning stages of developing an open source platform to support documentary editing. Incorporating a SNAC editing interface into this platform would be of significant benefit to documentary editors (as a reference resource), and would expand the range of professionals participating in the SNAC Cooperative. Finally, the Staatsbibliothek zu Berlin is keenly interested in interrelating Kalliope with SNAC, contributing 600,000 person and organization descriptions linked to 2.5 million descriptions of archival holdings.
# Required New Features
The majority of new features will be in two areas: the maintenance
system, and the administration system. None of this code exists. The
maintenance system has a web UI and a server-based back end that
interacts with the same database used by the match-merge. The
maintenance system also requires an authentication system (login) that
allows us to manage the extensive collaborative efforts. The current
processing of data is accomplished only on servers at the command line,
and is handled directly by project programmers. In the new maintenance
system, that will be driven by content experts via a web site, and
therefore must expect the issues of authentication and authorization
inherent in collaborative data manipulation web applications.
The system will require reports. These will cover broad classes of
issues related to managing resources, usage statistics, administration,
maintenance, and some reports for end user researchers.
- Web application (architect: Robbie)
The web application is a wrapper for all the APIs. It can have an API of it own, or not. It handles all http
requests, validating the data, deciding what needs to be done, doing real work, and handing some output back
to the user. Typically the output is HTML, but we are already planning for file downloads, and JSON data as
output from REST API calls.
- Data validation API
Data from the web browser needs sanity checking and untainting before being handed to the rest of the
application. Initially the data validation API can consist of nothing more than untaining input from the
browser. We can add various checks and tests. We need to decide if the validation API can reject data, and if
it can, then it needs to interact with the work flow engine, the actual work flow, and whatever messaging
system we use to display messages to end users.
- Identitiy Reconciliation (aka IR) (architect: Robbie)
This API uses many aspects of identity, testing each against a target population of other identities. The
final anwser is a floating point number giving a match strength. IR has two modes of operation. Mode one
compares two identities and returns a match strength. Mode two compares a single identity againast the entire
database returning match strength. Mode two is somewhat unclear.
- workflow manager (Tom)
Every action the application can perform is part of the work flow. The names of these actions along with names
of their requisites are organized into a work flow table. The work flow engine does not know how to do real
work, but it does know the names of the functions which do the real work. A new feature (aka function, task)
is added to the application, by adding its name to the work flow, and creating a function of the same name in
the application. Likewise, requistes are determined by boolean functions, and every requisite must have a
matching function known to the work flow engine. The work flow enforces role-based behavior by testing the
requisites. The workflow engine exists, but needs to be ported from Perl to PHP, and the work flow data should
be stored in the SQL database.
- Support for work history and task staging.
Editing consists of several stages of work that may be performed by different people and/or different
roles. We need database tables to support saving of work state data. Create a prototype table schema so we can
think about this problem and create a functional spec.
For an edit we need the CPF id, user id, timedate stamp, bitfield or work flow tags, optional user notes. For
search we need: user id, search string, timedate stamp.
- SQL schema (Robbie, Tom)
All data is stored in a SQL database. Details are given elsewhere.
- Controlled vocabulary subsystem or API [Tag system](#controlled-vocabularies-and-tag-system)
We need controlled vocabulary for several data fields. This system handles all aspects of all controlled vocabularies.
- CPF to SQL parser (Robbie)
The input for the application is CPF files. These files need to be parsed into data fields and input into the
SQL database. This application exists, but needs some additional functionality.
- Name serialization tool, selectable pre-configured formats
Outputting name strings based on name data fields in the database is a tricky problem. There are several
output formats. The name serialization deals with this issue.
- Name string parser
Names in CPF files are currently strings. The CPF <part> element has been imported into the SQL database as a
string, but data needs require individual name components. Parsing names is a tricky problem, but several
parsers exist. We need to integrate one or more parsers, and perhaps tweak those parsers to handle the SNAC names.
- Date parser
We have several date parsers, but none are fully comprehensive. We can use the existing parsers, but they need
to be integrated into a single, comprehensive parser.
- CPF record edit, edit each field
Record editing on the server is handled by a collection of functions. The specifications for this may evolve
in parallel to the code. We know that each field needs to be changed, but the details of work flow and data
validation have not been determined. Work flow and validation are both likely to change as the SNAC policies
evolve. There are UI requirements for editing.
- CPF record split, split data into separate cpf identities, deprecate old ARK, mint new ARKs
Record splitting requires a set of functions and UI requirements documented elsewhere.
- CPF record merge, combine fields, deprecate old ARKs, mint new ARK
Record merge requires a set of functions and UI requirements documented elsewhere.
- Object architecture, coding style, class template (architect Robbie)
We will have a specific architecture of the web application, and of the classes and objects involved.
- UI widgets, mostly off the shelf, some custom written. We need to have UI edit/chooser widget for search and
select of large numbers of options, such as the Joseph Henry cpfRelations that contain some 22K
entries. Also need to list all fields which might have large numbers of values. In fact, part of the meta
data for every field is "number of possible entries/reapeat values" or whatever that's called. From a
software architecture perspective, the answer is 0, 1, infinite.
One important aspect of the project is long-term viability and preservation. We should be able to export all
data and metadata in standard formats. Part of the API should cover export facilities so that over time we can
easily add new export features to support emerging standards.
The ability to export all the data for preservation purposes also gives us the ability to offer bulk data
downloads to researchers and collaborating peer institutions.
# Requirements Documents
These documents describe the functionality desired of the system. These should be high-level requirements, geared toward the policy side, of the form "The system should do X."
# Software Development Process
Development on the SNAC web application should use agile development practices, with the shortest-possible-but-reasonable sprint size possible. See [scrum documentation](http://scrummethodology.com/scrum-sprint/) for more detailed information about agile development methods. Test-driven development should also be employed to automate testing and interconnect testing with the development process.
The git version control system should be used as the repository for code in the application. It allows distributed editing with highly-configurable branching of development, a "blame" system that allows viewing which developer added a specific line of code, and is cross-platform. It is also supported by [gitlab](http://gitlab.iath.virginia.edu), which should be used for internal development timelines, milestones, bug- and issue-tracking, and project management. Final versions of the repositories may then be pushed to the public-facing [github](https://github.com/snac-cooperative) repositories.
## General Discussion Notes
Choices for programming languages, operating system, databases, version
control, and various related tools and practices are based on extensive
experience of the developer community, and a complex set of requirements
for the coding process. Current best practices are agile development
using practices that allow programmers wide leeway for implementation
while still keeping the processes manageable.
Test-driven development ideally means automated testing, with careful
attention to regression testing. It takes some extra time up front to
write the tests. Each test is small, and corresponds to small sections
of code where both code and text can be quickly created. In this way,
the software is kept in a working state with only brief downtimes during
feature creation or bug fixes. Large programs are made up of
intentionally small functions each of which is tested by a small
automated test.
Regression testing refers to verifying that old bugs do not reappear.
Every bug fix has a corresponding test, even if the function in question
did not originally have a test for the bug. Each new bug needs a new
test. Bugs frequently reappear, especially in complex sections of code.
Source code version control is vital to both development process, and to
the release process. During development, frequent small changes are
checked-in to the version control, along with a meaningful comment. The
history of the code can be tracked. This occasionally helps to
understand how bugs come into existence. In the Git system, the history
command is “blame”, a bit of programmer dark humor where the history is
used to know who to blame for a bug (or any undesirable feature).
Moving code into Quality Assurance (QA) and then into the production
environment are both integral with source code management. Many version
control systems allow tagging a release with a name. The collected
source code files are marked as a named (virtual) collection, and can be
used to update a QA area. Human testing and review happens in QA. After
QA we have release. Depending on the nature of the system release can be
quite complex with many parties needing to be notified, and coordination
across groups of developers, sysadmin, managers, support staff, and
customers. Agile development tends towards small, seamless releases on a
frequent (weekly or monthly) basis where communication is primarily via
update of electronic documentation. The process needs to assure that
fixes and new features are documented. The system must have tools to see
the current version of the system with its change log, as well as
comparing that to previous releases. All of these are integrated with
change management.
Bug reporting and feature requests fall (broadly speaking) into the
category of change management. Typically a small group of senior
developers and stakeholders review the bug/feature tracking system to
assign priorities, clarify, and investigate. There are good
off-the-shelf systems for tracking bugs and feature requests, so we have
several choices. This process happens almost as frequently as the
features/bug fix coding work of the developers. That means on-going,
more or less continuous review of fix/features requests every few days,
depending on how independent the developers are. Agile applies to
everyone on the project. Ideal change management is not onerous. As
tasks are completed, someone (developers) update feature status with "in
progress", "completed” and so on. There might be additional status
updates from QA and release, but SNAC probably isn't large enough to
justify anything too complex.
#### QA and Related Tests for Test-driven Development
The data extraction pipelines manage massive amounts of data, and
visually checking descriptions for bugs would be inefficient if not
infeasible. The MARC extraction process is verified by just over 100
quality assurance descriptions. The output produced from each
description is checked for some specific value that confirms that the
code is working correctly and historical bugs have not reappeared. The
EAD extraction has a set of QA files, but the output verification is not
yet automated. A variety of file counts and measures of various sorts
are performed to verify that descriptions have all been processed. All
CPF output is validated against the Relax NG schema. Processing log
files are checked for a variety of error messages. Settings used for
each run are recorded in documentation maintained with the output files.
The source code is stored in a Subversion repository.
Our disaster recovery processes must be carefully documented.
# User Documentation
Every aspect of the system requires documentation. Most visible to the public is the user interface for
discovery. Maintenance will be complicated, and our processes are somewhat novel, so this will need to be
extensive, well illustrated with screenshots, and carefully tested.
Documentation intended for developers might be somewhat sparse by comparison, but will be critical to the
on-going software development process. All the databases, operating system, httpd and other servers need
complete documentation of installation, configuration, deployment, starting, stopping, and emergency
procedures.
# User Interface Requirements
## Web Application
Some aspects of the web app aren't yet clear, so there are details to be worked out, and some large-ish
concepts to clarify. I'm guessing we will agree on most things, and one of us or the other will just concede
on stuff where we don't agree.
Requirements:
- expose an http accessible API that is viable for `wget` or `curl`, browser `<form>`, and Ajax calls.
- Supported input format depends on the complexity of the requested operation.
- Public functions require no authentication. Everything else must include authentication data.
- Sandbox functionality to for training and testing, which doesn't modify actual SNAC data
### Web application output via template
A well known, easy, powerful method of creating presntation output is to use an template module. Templating
separates business logic from presentation logic, thus following an MVC model. Our business logic is our work
flow and related function calls. Presentation is our UI, and the work flow engine has no idea that a UI exists,
let alone how to create it. Curiously, the presentation logic knows how to create the presentation rendering,
but has no idea what it does or what it interacts with. This is another example of strong separation of
concerns.
A simple hello world text template with a single variable world = "world" would be:
```
Hello [% world %]!
```
Or a simple HTML version:
```
<html><body>Hello [% world %]!</body></html>
```
That example is based on the Template Tookit http://www.template-toolkit.org/ for which there is a Perl
module, and a Python module. Template modules are fairly common, so I'm almost certain we will have several to
choose from in PHP.
Choosing our own select software modules, including a template module, is better than being locked into a
large, cumbersome web framework. In general, web frameworks have issues:
- difficult to work with
- no useful functionality that isn't more easily found in another software module
- the often break MVC
- generally make debugging nearly impossible
We can do much better by selecting a few modules to create a lightweight quasi-framework that is perfectly matched to our
needs.
Once the internal API completes its work, we will have output data. Output data is passed to a rendering
layer that relies on the template module. The only code that knows anything about rendering is the rendering
layer. To all the non-rendering code, there is only "output data" which does conform to a standard structure
(almost certainly an output data object). The rendering layer takes the output object, and the requested format
of the output (text, html, pdf, xml, etc.) to create the output. Happily, "rendering" is generally a single
function call. We create a template object, call its "render" method with two arguments:
1. template file name,
2. the output data object.
Default behavior is to write the output to stdout, but the render method can also
return the output in a variable so we can create an http download.
Templates are human created static files containing placeholders. The template engine fills in the placeholders with
values from relevant parts of the output data. Clearly, the output data object and the template must share a
object/property naming convention. The template engine functionality has single value fields, looping over
input lists, and if statement branching based on input. But that's pretty much it. No work is done in the
template that is not directly concerned with filling in placeholders, not even formatting (in the sense of
rounding numbers, capitalizing strings, or adding html tags). Templates are valid documents of the output
type, except in rare cases. The attached template is well-formed XML.
The web app needs a file download output option as well as output to stdout.
### Watching records
Users may "watch" an identity constellation. If a constellation is being watched, and that constellation is part of an description (merged or
single) then the watch will apply to the results of human edits, regardless of which part of the description
was modified. It is possible for someone to wish to track a biogHist, but that biogHist could be completely
removed in lieu of an improved and updated description. We will not track individual elements in CPF.
The watcher should have the ability to disable their watch. After each edit, all
watchers will get a notification. The watch does not apply to any single field, but to the entire description, and therefore also to future descriptions which result from merging.
When an identity constellation is split, the watch propagates to both resulting records. The user will be informed of the change, and then may choose to disable one of the watchers.
### Ability to Open/Close the Site during Maintenance
If the web application has a "closed for maintenance" feature, this feature would be available to web admins,
even though it is the Linux sysadmins who will do the maintenance. A common major failure of web applications
is the assumption that the product is always up. This creates havoc when the site simply fails to load due to
an outage, planned or otherwise. With a little work we should be able to have an orderly "site is closed" web
page and status message for planned outages. We might be able to failover to some kind of system status
message. This is a low priority feature since downtime is probably only a few hours per year. At the same
time, if it isn't too difficult to implement, it sets our project apart from the majority who either ignore
the problem, or let their help desk folks spend an hour apologizing to customers.
When the product is closed, web admins should be able to login (assuming login is possible).
comment: Do we want an architecture where the login is essentially a separate product so that we can have a
"lobby" and other front end features that continue to work even when the backend is down for maintenance?
Most sites simply return a server error or site not available (404) when the site is down for whatever
reason. We can avoid this a couple of ways. The simplest is to use some Apache server features and a few
simple scripts so that users see a nice message when the site is down for maintenance. This very simple
approach requires little or no change to our software architecture. The more elegant approach is to use one of
several system architectures that  keep a small system front end always running.
# User Management
Authentication is validating user logins to the system. Authorization is the related aspect of controlling
which parts of the system users may access (or even which parts they may know exist).
We can use OpenID for authentication, but we will need a user profile for SNAC roles and authorization. There
are examples of PHP code to implement OpenID at stackexchange:
http://stackoverflow.com/questions/4459509/how-to-use-open-id-as-login-system
OpenID seems to constantly be changing, and sites using change frequently. Google has (apparently) deprecated
OpenID 2.0 in favor of Open Connect. Facebook is using something else, but apparently FB still works with
OpenID. Stackexchange supports several authentication schemes. If they can do it, so can we. Or we can support
one scheme for starters and add others as necessary. The SE code is not open source, so we can't see how much
work it was to support the various OpenID partners.
Authorization involves controlling what users can do once they are in the system. That function is sort of
more solved by OAuth or OpenID by sharing the user profile. However, SNAC has specific requirements,
especially our roles, and those will not be found in other system. There is not anything we must have from
user profiles. We might want their social networking profile, but social networking is not a core function of
SNAC.
By default users can't do anything that isn't exposed to the non-authenticated public users. Privileges are
added and users are given roles (aka groups) from which they inherit privileges. The authorization system is
involved in every transaction with the server to the extent that every request to the server is checked for
authorization before being passed to the code doing the real work.
The Linux model of three privilege types "user", "group", and "other" works well for authorization permissions
and we should use this model. "User" is an authenticated user. "Group" is a set of users, and a user may
belong to several groups. In SNAC and the non-Linux world "group" is known as "role", so SNAC will call them
"roles". "Other" privileges apply to SNAC as public, non-authenticated users, although we don't really have
"other", and the "researcher" role applies to public users.
Users can have several roles, and will have all the privileges of all their roles. Role membership is managed
by an administrative UI (part of the dashboard) and related API code. User information such as name, phone
number, and even password can also change. User ID values cannot be changed, and a user ID is never reused,
even after account deletion.
We expect to create additional roles as necessary for application functions.
Roles include a large number "is instution member" roles. These should be roles like any other, but we may
want to flag these role records to make them easy to manage and easy to display in the UI. Any user can have
zero or more roles that define their instutional affiliation. This primarily effects reporting and admin. In
the case of reports, membership in an institution constrains the reporting. When setting up a report, users
may only choose from institutions of which they are members. Some reports may auto-detect the user's
membership.
By and large when we refer to "accounts" we mean web accounts managed by the Manager/Web admin. The general
public can use the discovery interface without an account, but saving search history, and other
session related discovery tools requires an account. It is technically possible to have a single session
dashboard. Although that has not been mentioned as a requirement and is probably a low priority, it might be
almost trivial to implement.
Every account will be in the "Researcher" role which has the same privileges as the general public, but with a
TBD set of basic privileges including: search history, certain researcher reports.
| User type | Role | Description |
|----------------------------+---------------------+-----------------------------------------------------------------------|
| Sysadmin | Server admin | Maintain server, backups, etc. |
| Database Administrator | DBA | Schema maintenance, data dumps, etc. |
| Software engineer | Developer | Coding, testing, QA, release management, data loading, etc. |
| Manager | Web admin | Web accounts: create, manage, assign roles, run reports |
| Peer vetting | Vetting | Approve moderators, reviewers, content experts |
| Moderator | Moderator | Approve maintenance changes, posting those changes |
| Reviewer/editor | Maintenance | Maintainer privileges, interacts with moderators |
| Content expert | Maintenance | Domain expert, may have zero institutional roles |
| Documentary editor | Maintenance | Distinguished by? |
| Maintenance | Maintenance | Distinguished by? |
| Researcher | Researcher | Use the discovery interface and history dashboard |
| Archival description donor | Block upload | Bulk uploads of CPF or finding aids |
| Name authority manager | Name authority | Donates name authority data perhaps via bulk upload |
| Institutional admins | Institutional admin | Instutional role admin dashboard, institutional reports |
| Public | Researcher | No account, researcher role, no dashboard or single session dashboard |
Remember: institutional affiliation roles aren't in the table above. There will be many of those roles, and
users may have zero, one, or several institutional roles that define which insitutions that user is a member
of.
It is possible for an institutional admin to be a member of more than one institution. Institutional Admins
have abilities:
- view membership lists of their institution(s)
- add or remove their instutional role for users.
Roles which require one or more instutitutional roles (affiliation):
- Block upload
- Name authority
- Institutional admin
Roles which may have zero or more institutional roles:
- Web admin
- Vetting
- Moderator
- Maintenance (likely to have one or more)
- Researcher
There are several dashboard sections:
- Standard researcher history
- Standard user account management (password, email, etc.)
- Web admin account creation, deletion, role assignments
- Vetting admin (if we have vetting)
- Available reports.
# Coding Style
All code generated by the SNAC project will be written in one of the following languages.
* PHP 7 (preferred)
* PHP 5
* Java
* XSLT
## Coding Style Specifications
Source code must match the following style guidelines:
* 4-space tabs with literal spaces
* Maximum line-length of 100 characters
* Variables and Class names follow standard camel casing syntax, with descriptive names
* Class names start with upper-case letters
* Variable and field names start with lower-clase letters
* No underscores allowed in variable names
## Internal Documentation of Code
All code will be internally-documented using [Javadoc](http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html) style documentation, which has been ported to PHP as [phpdoc](http://www.phpdoc.org/docs/latest/guides/docblocks.html) and XSLT as [XSLTdoc](http://www.pnp-software.com/XSLTdoc/). Tools to generate documentation from the code is also available for [Java](http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html), [PHP](http://www.phpdoc.org/), and [XSLT](http://www.pnp-software.com/XSLTdoc/).
* All files, regardless of language, must have javadoc-style documentation with author attribution, definition of the file, and short-text of the code license, as defined below (in PHP):
```php
<?php
/**
* File Description Headline
*
* Paragraphs describing the file
*
* License:
* ....
*
* @author Robbie Hott
* @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause
* @copyright 2015 the Rector and Visitors of the University of Virginia, and the Regents of the University of California
*/
?>
```
* All classes, fields, methods, and function definitions must include documentation, as shown below:
```php
<?php
/**
* Name Reconciliation Engine Main Class
*
* This class provides the meat of the reconciliation engine. To run the
* reconciliation engine, create an instance of this class and call the
* reconcile method.
*
* @author Robbie Hott
*/
class ReconciliationEngine {
/**
* Main reconciliation function
*
* This function does the reconciliation and returns the top identity from
* the engine. Other top identities and their corresponding score vectors
* may be obtained by other functions within this class.
*
* @param identity $identity The identity to be searched. This identity
* must be in the proper form
* @return identity The top identity by the reconciliation
* engine
*/
public function reconcile($identity) {
return $identity;
}
}
?>
```
## Licensing in Github/Gitlab
Each code repository must contain the full BSD 3-Clause license below. It must be saved in the document root as a text file titled `LICENSE`.
```
Copyright (c) 2015, the Rector and Visitors of the University of Virginia, and
the Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
```
Copyright (c) 2015, the Rector and Visitors of the University of Virginia, and
the Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.2" baseProfile="tiny" width="215.9mm" height="279.4mm" viewBox="0 0 21590 27940" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<defs class="ClipPathGroup">
<clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
<rect x="0" y="0" width="21590" height="27940"/>
</clipPath>
</defs>
<defs>
<font id="EmbeddedFont_1" horiz-adv-x="2048">
<font-face font-family="Arial embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1865" descent="437"/>
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/>
<glyph unicode="z" horiz-adv-x="914" d="M 49,0 L 49,137 710,943 89,943 89,1082 913,1082 913,945 251,139 950,139 950,0 49,0 Z"/>
<glyph unicode="y" horiz-adv-x="1033" d="M 604,1 C 579,-64 553,-123 527,-175 500,-227 471,-272 438,-309 405,-346 369,-374 329,-394 289,-413 243,-423 191,-423 168,-423 147,-423 128,-423 109,-423 88,-420 67,-414 L 67,-279 C 80,-282 94,-284 110,-284 126,-284 140,-284 151,-284 204,-284 253,-264 298,-225 343,-186 383,-123 417,-37 L 434,6 5,1082 197,1082 425,484 C 432,466 440,442 451,412 461,382 471,352 482,322 492,292 501,265 509,241 517,217 522,202 523,196 525,203 530,218 538,240 545,261 554,285 564,312 573,339 583,366 593,393 603,420 611,444 618,464 L 830,1082 1020,1082 604,1 Z"/>
<glyph unicode="x" horiz-adv-x="993" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 801,0 Z"/>
<glyph unicode="w" horiz-adv-x="1509" d="M 1174,0 L 965,0 792,698 C 787,716 781,738 776,765 770,792 764,818 759,843 752,872 746,903 740,934 734,904 728,874 721,845 716,820 710,793 704,766 697,739 691,715 686,694 L 508,0 300,0 -3,1082 175,1082 358,347 C 363,332 367,313 372,291 377,268 381,246 386,225 391,200 396,175 401,149 406,174 412,199 418,223 423,244 429,265 434,286 439,307 444,325 448,339 L 644,1082 837,1082 1026,339 C 1031,322 1036,302 1041,280 1046,258 1051,237 1056,218 1061,195 1067,172 1072,149 1077,174 1083,199 1088,223 1093,244 1098,265 1103,288 1108,310 1112,330 1117,347 L 1308,1082 1484,1082 1174,0 Z"/>
<glyph unicode="v" horiz-adv-x="1020" d="M 613,0 L 400,0 7,1082 199,1082 437,378 C 442,363 447,346 454,325 460,304 466,282 473,259 480,236 486,215 492,194 497,173 502,155 506,141 510,155 515,173 522,194 528,215 534,236 541,258 548,280 555,302 562,323 569,344 575,361 580,376 L 826,1082 1017,1082 613,0 Z"/>
<glyph unicode="u" horiz-adv-x="874" d="M 314,1082 L 314,396 C 314,343 318,299 326,264 333,229 346,200 363,179 380,157 403,142 432,133 460,124 495,119 537,119 580,119 618,127 653,142 687,157 716,178 741,207 765,235 784,270 797,312 810,353 817,401 817,455 L 817,1082 997,1082 997,231 C 997,208 997,185 998,160 998,135 998,111 999,89 1000,66 1000,47 1001,31 1002,15 1002,5 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 827,116 826,136 825,155 825,172 825,185 L 822,185 C 805,154 786,125 765,100 744,75 720,53 693,36 666,18 634,4 599,-6 564,-15 523,-20 476,-20 416,-20 364,-13 321,2 278,17 242,39 214,70 186,101 166,140 153,188 140,236 133,294 133,361 L 133,1082 314,1082 Z"/>
<glyph unicode="t" horiz-adv-x="531" d="M 554,8 C 527,1 499,-5 471,-10 442,-14 409,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 467,127 484,128 501,131 517,134 535,137 554,141 L 554,8 Z"/>
<glyph unicode="s" horiz-adv-x="901" d="M 950,299 C 950,248 940,203 921,164 901,124 872,91 835,64 798,37 752,16 698,2 643,-13 581,-20 511,-20 448,-20 392,-15 342,-6 291,4 247,20 209,41 171,62 139,91 114,126 88,161 69,203 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 550,117 585,120 618,125 650,130 678,140 701,153 724,166 743,183 756,205 769,226 775,253 775,285 775,318 767,345 752,366 737,387 715,404 688,418 661,432 628,444 589,455 550,465 507,476 460,489 417,500 374,513 331,527 288,541 250,560 216,583 181,606 153,634 132,668 111,702 100,745 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 763,842 752,866 736,885 720,904 701,919 678,931 655,942 630,951 602,956 573,961 544,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,785 282,761 297,742 311,723 331,707 357,694 382,681 413,669 449,660 485,650 525,640 568,629 597,622 626,614 656,606 686,597 715,587 744,576 772,564 799,550 824,535 849,519 870,500 889,478 908,456 923,430 934,401 945,372 950,338 950,299 Z"/>
<glyph unicode="r" horiz-adv-x="530" d="M 142,0 L 142,830 C 142,853 142,876 142,900 141,923 141,946 140,968 139,990 139,1011 138,1030 137,1049 137,1067 136,1082 L 306,1082 C 307,1067 308,1049 309,1030 310,1010 311,990 312,969 313,948 313,929 314,910 314,891 314,874 314,861 L 318,861 C 331,902 344,938 359,969 373,999 390,1024 409,1044 428,1063 451,1078 478,1088 505,1097 537,1102 575,1102 590,1102 604,1101 617,1099 630,1096 641,1094 648,1092 L 648,927 C 636,930 622,933 606,935 590,936 572,937 552,937 511,937 476,928 447,909 418,890 394,865 376,832 357,799 344,759 335,714 326,668 322,618 322,564 L 322,0 142,0 Z"/>
<glyph unicode="p" horiz-adv-x="940" d="M 1053,546 C 1053,464 1046,388 1033,319 1020,250 998,190 967,140 936,90 895,51 844,23 793,-6 730,-20 655,-20 578,-20 510,-5 452,24 394,53 350,101 319,168 L 314,168 C 315,167 315,161 316,150 316,139 316,126 317,110 317,94 317,76 318,57 318,37 318,17 318,-2 L 318,-425 138,-425 138,861 C 138,887 138,912 138,936 137,960 137,982 136,1002 135,1021 135,1038 134,1052 133,1066 133,1076 132,1082 L 306,1082 C 307,1080 308,1073 309,1061 310,1049 311,1035 312,1018 313,1001 314,982 315,963 316,944 316,925 316,908 L 320,908 C 337,943 356,972 377,997 398,1021 423,1041 450,1057 477,1072 508,1084 542,1091 575,1098 613,1101 655,1101 730,1101 793,1088 844,1061 895,1034 936,997 967,949 998,900 1020,842 1033,774 1046,705 1053,629 1053,546 Z M 864,542 C 864,609 860,668 852,720 844,772 830,816 811,852 791,888 765,915 732,934 699,953 658,962 609,962 569,962 531,956 496,945 461,934 430,912 404,880 377,848 356,804 341,748 326,691 318,618 318,528 318,451 324,387 337,334 350,281 368,238 393,205 417,172 447,149 483,135 519,120 560,113 607,113 657,113 699,123 732,142 765,161 791,189 811,226 830,263 844,308 852,361 860,414 864,474 864,542 Z"/>
<glyph unicode="o" horiz-adv-x="980" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 490,-20 422,-9 363,14 304,37 254,71 213,118 172,165 140,223 119,294 97,364 86,447 86,542 86,915 248,1102 571,1102 655,1102 728,1090 789,1067 850,1044 900,1009 939,962 978,915 1006,857 1025,787 1044,717 1053,635 1053,542 Z M 864,542 C 864,626 858,695 845,750 832,805 813,848 788,881 763,914 732,937 696,950 660,963 619,969 574,969 528,969 487,962 450,949 413,935 381,912 355,879 329,846 309,802 296,747 282,692 275,624 275,542 275,458 282,389 297,334 312,279 332,235 358,202 383,169 414,146 449,133 484,120 522,113 563,113 609,113 651,120 688,133 725,146 757,168 783,201 809,234 829,278 843,333 857,388 864,458 864,542 Z"/>
<glyph unicode="n" horiz-adv-x="888" d="M 825,0 L 825,686 C 825,739 821,783 814,818 806,853 793,882 776,904 759,925 736,941 708,950 679,959 644,963 602,963 559,963 521,956 487,941 452,926 423,904 399,876 374,847 355,812 342,771 329,729 322,681 322,627 L 322,0 142,0 142,851 C 142,874 142,898 142,923 141,948 141,971 140,994 139,1016 139,1035 138,1051 137,1067 137,1077 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 312,966 313,947 314,927 314,910 314,897 L 317,897 C 334,928 353,957 374,982 395,1007 419,1029 446,1047 473,1064 505,1078 540,1088 575,1097 616,1102 663,1102 723,1102 775,1095 818,1080 861,1065 897,1043 925,1012 953,981 974,942 987,894 1000,845 1006,788 1006,721 L 1006,0 825,0 Z"/>
<glyph unicode="m" horiz-adv-x="1443" d="M 768,0 L 768,686 C 768,739 765,783 758,818 751,853 740,882 725,904 709,925 688,941 663,950 638,959 607,963 570,963 532,963 498,956 467,941 436,926 410,904 389,876 367,847 350,812 339,771 327,729 321,681 321,627 L 321,0 142,0 142,851 C 142,874 142,898 142,923 141,948 141,971 140,994 139,1016 139,1035 138,1051 137,1067 137,1077 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 312,966 313,947 314,927 314,910 314,897 L 317,897 C 333,928 350,957 369,982 388,1007 410,1029 435,1047 460,1064 488,1078 521,1088 553,1097 590,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 946,928 964,957 984,982 1004,1007 1027,1029 1054,1047 1081,1064 1111,1078 1144,1088 1177,1097 1215,1102 1258,1102 1313,1102 1360,1095 1400,1080 1439,1065 1472,1043 1497,1012 1522,981 1541,942 1553,894 1565,845 1571,788 1571,721 L 1571,0 1393,0 1393,686 C 1393,739 1390,783 1383,818 1376,853 1365,882 1350,904 1334,925 1313,941 1288,950 1263,959 1232,963 1195,963 1157,963 1123,956 1092,942 1061,927 1035,906 1014,878 992,850 975,815 964,773 952,731 946,682 946,627 L 946,0 768,0 Z"/>
<glyph unicode="l" horiz-adv-x="200" d="M 138,0 L 138,1484 318,1484 318,0 138,0 Z"/>
<glyph unicode="k" horiz-adv-x="901" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 816,0 Z"/>
<glyph unicode="i" horiz-adv-x="187" d="M 137,1312 L 137,1484 317,1484 317,1312 137,1312 Z M 137,0 L 137,1082 317,1082 317,0 137,0 Z"/>
<glyph unicode="h" horiz-adv-x="888" d="M 317,897 C 337,934 359,965 382,991 405,1016 431,1037 459,1054 487,1071 518,1083 551,1091 584,1098 622,1102 663,1102 732,1102 789,1093 834,1074 878,1055 913,1029 939,996 964,962 982,922 992,875 1001,828 1006,777 1006,721 L 1006,0 825,0 825,686 C 825,732 822,772 817,807 811,842 800,871 784,894 768,917 745,934 716,946 687,957 649,963 602,963 559,963 521,955 487,940 452,925 423,903 399,875 374,847 355,813 342,773 329,733 322,688 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1076 322,1054 321,1032 320,1010 320,990 319,971 318,952 317,937 316,924 315,911 315,902 314,897 L 317,897 Z"/>
<glyph unicode="g" horiz-adv-x="941" d="M 548,-425 C 486,-425 431,-419 383,-406 335,-393 294,-375 260,-352 226,-328 198,-300 177,-267 156,-234 140,-198 131,-158 L 312,-132 C 324,-182 351,-220 392,-248 433,-274 486,-288 553,-288 594,-288 631,-282 664,-271 697,-260 726,-241 749,-217 772,-191 790,-159 803,-119 816,-79 822,-30 822,27 L 822,201 820,201 C 807,174 790,148 771,123 751,98 727,75 699,56 670,37 637,21 600,10 563,-2 520,-8 472,-8 403,-8 345,4 296,27 247,50 207,84 176,130 145,176 122,233 108,302 93,370 86,449 86,539 86,626 93,704 108,773 122,842 145,901 178,950 210,998 252,1035 304,1061 355,1086 418,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,914 825,932 826,953 827,974 828,993 829,1012 830,1030 831,1046 832,1059 833,1072 835,1080 836,1082 L 1007,1082 C 1006,1076 1006,1066 1005,1052 1004,1037 1004,1020 1003,1000 1002,980 1002,958 1002,934 1001,909 1001,884 1001,858 L 1001,31 C 1001,-120 964,-234 890,-311 815,-387 701,-425 548,-425 Z M 822,541 C 822,616 814,681 798,735 781,788 760,832 733,866 706,900 676,925 642,941 607,957 572,965 536,965 490,965 451,957 418,941 385,925 357,900 336,866 314,831 298,787 288,734 277,680 272,616 272,541 272,463 277,398 288,345 298,292 314,249 335,216 356,183 383,160 416,146 449,132 488,125 533,125 569,125 604,133 639,148 673,163 704,188 731,221 758,254 780,297 797,350 814,403 822,466 822,541 Z"/>
<glyph unicode="f" horiz-adv-x="557" d="M 361,951 L 361,0 181,0 181,951 29,951 29,1082 181,1082 181,1204 C 181,1243 185,1280 192,1314 199,1347 213,1377 233,1402 252,1427 279,1446 313,1461 347,1475 391,1482 445,1482 466,1482 489,1481 512,1479 535,1477 555,1474 572,1470 L 572,1333 C 561,1335 548,1337 533,1339 518,1340 504,1341 492,1341 465,1341 444,1337 427,1330 410,1323 396,1312 387,1299 377,1285 370,1268 367,1248 363,1228 361,1205 361,1179 L 361,1082 572,1082 572,951 361,951 Z"/>
<glyph unicode="e" horiz-adv-x="980" d="M 276,503 C 276,446 282,394 294,347 305,299 323,258 348,224 372,189 403,163 441,144 479,125 525,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 1008,206 992,176 972,146 951,115 924,88 890,64 856,39 814,19 763,4 712,-12 650,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,649 100,735 125,806 150,876 185,933 229,977 273,1021 324,1053 383,1073 442,1092 504,1102 571,1102 662,1102 738,1087 799,1058 860,1029 909,988 946,937 983,885 1009,824 1025,754 1040,684 1048,608 1048,527 L 1048,503 276,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 538,969 507,964 474,955 441,945 410,928 382,903 354,878 330,845 311,803 292,760 281,706 278,641 L 862,641 Z"/>
<glyph unicode="d" horiz-adv-x="941" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 C 823,921 823,931 823,946 822,960 822,975 822,991 821,1006 821,1021 821,1035 821,1049 821,1059 821,1065 L 821,1484 1001,1484 1001,223 C 1001,197 1001,172 1002,148 1002,124 1002,102 1003,82 1004,62 1004,45 1005,31 1006,16 1006,6 1007,0 L 835,0 C 834,7 833,16 832,29 831,41 830,55 829,71 828,87 827,104 826,122 825,139 825,157 825,174 L 821,174 Z M 275,542 C 275,467 280,403 289,350 298,297 313,253 334,219 355,184 381,159 413,143 445,127 484,119 530,119 577,119 619,127 656,142 692,157 722,182 747,217 771,251 789,296 802,351 815,406 821,474 821,554 821,631 815,696 802,749 789,802 771,844 746,877 721,910 691,933 656,948 620,962 579,969 532,969 488,969 450,961 418,946 386,931 359,906 338,872 317,838 301,794 291,740 280,685 275,619 275,542 Z"/>
<glyph unicode="c" horiz-adv-x="901" d="M 275,546 C 275,484 280,427 289,375 298,323 313,278 334,241 355,203 384,174 419,153 454,132 497,122 548,122 612,122 666,139 709,173 752,206 778,258 788,328 L 970,328 C 964,283 951,239 931,197 911,155 884,118 850,86 815,54 773,28 724,9 675,-10 618,-20 553,-20 468,-20 396,-6 337,23 278,52 230,91 193,142 156,192 129,251 112,320 95,388 87,462 87,542 87,615 93,679 105,735 117,790 134,839 156,881 177,922 203,957 232,986 261,1014 293,1037 328,1054 362,1071 398,1083 436,1091 474,1098 512,1102 551,1102 612,1102 666,1094 713,1077 760,1060 801,1038 836,1009 870,980 898,945 919,906 940,867 955,824 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 495,961 452,953 418,936 383,919 355,893 334,859 313,824 298,781 289,729 280,677 275,616 275,546 Z"/>
<glyph unicode="b" horiz-adv-x="940" d="M 1053,546 C 1053,169 920,-20 655,-20 573,-20 505,-5 451,25 396,54 352,102 318,168 L 316,168 C 316,151 316,133 315,114 314,95 313,78 312,62 311,46 310,32 309,21 308,10 307,3 306,0 L 132,0 C 133,6 133,16 134,31 135,45 135,62 136,82 137,102 137,124 138,148 138,172 138,197 138,223 L 138,1484 318,1484 318,1061 C 318,1041 318,1022 318,1004 317,985 317,969 316,955 315,938 315,923 314,908 L 318,908 C 351,977 396,1027 451,1057 506,1087 574,1102 655,1102 792,1102 892,1056 957,964 1021,872 1053,733 1053,546 Z M 864,540 C 864,615 859,679 850,732 841,785 826,829 805,864 784,898 758,923 726,939 694,955 655,963 609,963 562,963 520,955 484,940 447,925 417,900 393,866 368,832 350,787 337,732 324,677 318,609 318,529 318,452 324,387 337,334 350,281 368,239 393,206 417,173 447,149 483,135 519,120 560,113 607,113 651,113 689,121 721,136 753,151 780,176 801,210 822,244 838,288 849,343 859,397 864,463 864,540 Z"/>
<glyph unicode="a" horiz-adv-x="1073" d="M 414,-20 C 305,-20 224,9 169,66 114,124 87,203 87,303 87,375 101,434 128,480 155,526 190,562 234,588 277,614 327,632 383,642 439,652 496,657 554,657 L 797,657 797,717 C 797,762 792,800 783,832 774,863 759,889 740,908 721,928 697,942 668,951 639,960 604,965 565,965 530,965 499,963 471,958 443,953 419,944 398,931 377,918 361,900 348,878 335,855 327,827 323,793 L 135,810 C 142,853 154,892 173,928 192,963 218,994 253,1020 287,1046 330,1066 382,1081 433,1095 496,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1090,111 1100,112 1110,113 1120,114 1130,116 1139,118 L 1139,6 C 1116,1 1094,-3 1072,-6 1049,-9 1025,-10 1000,-10 966,-10 937,-5 913,4 888,13 868,26 853,45 838,63 826,86 818,113 810,140 805,171 803,207 L 797,207 C 778,172 757,141 734,113 711,85 684,61 653,42 622,22 588,7 549,-4 510,-15 465,-20 414,-20 Z M 455,115 C 512,115 563,125 606,146 649,167 684,194 713,226 741,259 762,294 776,332 790,371 797,408 797,443 L 797,531 600,531 C 556,531 514,528 475,522 435,517 400,506 370,489 340,472 316,449 299,418 281,388 272,349 272,300 272,241 288,195 320,163 351,131 396,115 455,115 Z"/>
<glyph unicode="W" horiz-adv-x="1932" d="M 1511,0 L 1283,0 1039,895 C 1032,920 1024,950 1016,985 1007,1020 1000,1053 993,1084 985,1121 977,1158 969,1196 960,1157 952,1120 944,1083 937,1051 929,1018 921,984 913,950 905,920 898,895 L 652,0 424,0 9,1409 208,1409 461,514 C 472,472 483,430 494,389 504,348 513,311 520,278 529,239 537,203 544,168 554,214 564,259 575,304 580,323 584,342 589,363 594,384 599,404 604,424 609,444 614,463 619,482 624,500 628,517 632,532 L 877,1409 1060,1409 1305,532 C 1309,517 1314,500 1319,482 1324,463 1329,444 1334,425 1339,405 1343,385 1348,364 1353,343 1357,324 1362,305 1373,260 1383,215 1393,168 1394,168 1397,180 1402,203 1407,226 1414,254 1422,289 1430,324 1439,361 1449,402 1458,442 1468,479 1478,514 L 1727,1409 1926,1409 1511,0 Z"/>
<glyph unicode="V" horiz-adv-x="1364" d="M 782,0 L 584,0 9,1409 210,1409 600,417 C 610,387 620,357 630,328 640,298 649,271 657,248 666,221 675,194 684,168 692,193 701,219 710,246 718,269 727,296 737,325 746,354 757,385 768,417 L 1156,1409 1357,1409 782,0 Z"/>
<glyph unicode="U" horiz-adv-x="1178" d="M 731,-20 C 654,-20 580,-10 511,11 442,32 381,64 329,108 276,151 235,207 204,274 173,341 158,420 158,512 L 158,1409 349,1409 349,528 C 349,457 359,396 378,347 397,297 423,256 457,225 491,194 531,171 578,157 624,142 675,135 730,135 785,135 836,142 885,157 934,172 976,195 1013,227 1050,259 1079,301 1100,353 1121,404 1131,467 1131,541 L 1131,1409 1321,1409 1321,530 C 1321,436 1306,355 1275,286 1244,217 1201,159 1148,114 1095,69 1032,35 961,13 889,-9 812,-20 731,-20 Z"/>
<glyph unicode="T" horiz-adv-x="1178" d="M 720,1253 L 720,0 530,0 530,1253 46,1253 46,1409 1204,1409 1204,1253 720,1253 Z"/>
<glyph unicode="S" horiz-adv-x="1191" d="M 1272,389 C 1272,330 1261,275 1238,225 1215,175 1179,132 1131,96 1083,59 1023,31 950,11 877,-10 790,-20 690,-20 515,-20 378,11 280,72 182,133 120,222 93,338 L 278,375 C 287,338 302,305 321,275 340,245 367,219 400,198 433,176 473,159 522,147 571,135 629,129 697,129 754,129 806,134 853,144 900,153 941,168 975,188 1009,208 1036,234 1055,266 1074,297 1083,335 1083,379 1083,425 1073,462 1052,491 1031,520 1001,543 963,562 925,581 880,596 827,609 774,622 716,635 652,650 613,659 573,668 534,679 494,689 456,701 420,716 383,730 349,747 317,766 285,785 257,809 234,836 211,863 192,894 179,930 166,965 159,1006 159,1053 159,1120 173,1177 200,1225 227,1272 264,1311 312,1342 360,1373 417,1395 482,1409 547,1423 618,1430 694,1430 781,1430 856,1423 918,1410 980,1396 1032,1375 1075,1348 1118,1321 1152,1287 1178,1247 1203,1206 1224,1159 1239,1106 L 1051,1073 C 1042,1107 1028,1137 1011,1164 993,1191 970,1213 941,1231 912,1249 878,1263 837,1272 796,1281 747,1286 692,1286 627,1286 572,1280 528,1269 483,1257 448,1241 421,1221 394,1201 374,1178 363,1151 351,1124 345,1094 345,1063 345,1021 356,987 377,960 398,933 426,910 462,892 498,874 540,859 587,847 634,835 685,823 738,811 781,801 825,791 868,781 911,770 952,758 991,744 1030,729 1067,712 1102,693 1136,674 1166,650 1191,622 1216,594 1236,561 1251,523 1265,485 1272,440 1272,389 Z"/>
<glyph unicode="R" horiz-adv-x="1231" d="M 1164,0 L 798,585 359,585 359,0 168,0 168,1409 831,1409 C 911,1409 982,1400 1044,1382 1105,1363 1157,1337 1199,1302 1241,1267 1273,1225 1295,1175 1317,1125 1328,1069 1328,1006 1328,961 1322,917 1309,874 1296,831 1275,791 1247,755 1219,719 1183,688 1140,662 1097,636 1045,618 984,607 L 1384,0 1164,0 Z M 1136,1004 C 1136,1047 1129,1084 1114,1115 1099,1146 1078,1173 1050,1194 1022,1215 988,1230 948,1241 908,1251 863,1256 812,1256 L 359,1256 359,736 820,736 C 875,736 922,743 962,757 1002,770 1035,789 1061,813 1086,837 1105,865 1118,898 1130,931 1136,966 1136,1004 Z"/>
<glyph unicode="Q" horiz-adv-x="1416" d="M 1495,711 C 1495,612 1482,521 1457,439 1431,356 1394,284 1346,222 1297,160 1238,110 1168,71 1097,32 1017,6 928,-6 942,-49 958,-85 976,-115 993,-145 1013,-169 1036,-189 1059,-207 1084,-221 1112,-231 1139,-239 1170,-244 1204,-244 1223,-244 1243,-243 1264,-240 1285,-237 1304,-234 1319,-231 L 1319,-365 C 1294,-371 1266,-376 1236,-381 1205,-385 1174,-387 1141,-387 1084,-387 1034,-378 991,-361 948,-344 911,-319 879,-287 846,-255 818,-216 795,-170 772,-123 751,-71 733,-12 628,-12 535,7 456,46 376,84 310,136 257,200 204,265 164,340 137,427 110,513 97,607 97,709 97,819 112,919 143,1008 174,1097 219,1172 278,1235 337,1297 411,1346 498,1379 585,1413 684,1430 797,1430 909,1430 1009,1413 1096,1379 1183,1345 1256,1297 1315,1234 1374,1171 1418,1096 1449,1007 1480,918 1495,820 1495,711 Z M 1300,711 C 1300,796 1289,873 1268,942 1246,1011 1214,1071 1172,1120 1129,1169 1077,1207 1014,1234 951,1261 879,1274 797,1274 713,1274 639,1261 576,1234 513,1207 460,1169 418,1120 375,1071 344,1011 323,942 302,873 291,796 291,711 291,626 302,549 324,479 345,408 377,348 420,297 462,246 515,206 578,178 641,149 713,135 795,135 883,135 959,149 1023,178 1086,207 1139,247 1180,298 1221,349 1251,409 1271,480 1290,551 1300,628 1300,711 Z"/>
<glyph unicode="P" horiz-adv-x="1112" d="M 1258,985 C 1258,924 1248,867 1228,814 1207,761 1177,715 1137,676 1096,637 1046,606 985,583 924,560 854,549 773,549 L 359,549 359,0 168,0 168,1409 761,1409 C 844,1409 917,1399 979,1379 1041,1358 1093,1330 1134,1293 1175,1256 1206,1211 1227,1159 1248,1106 1258,1048 1258,985 Z M 1066,983 C 1066,1072 1039,1140 984,1187 929,1233 847,1256 738,1256 L 359,1256 359,700 746,700 C 856,700 937,724 989,773 1040,822 1066,892 1066,983 Z"/>
<glyph unicode="O" horiz-adv-x="1416" d="M 1495,711 C 1495,601 1479,501 1448,411 1416,321 1370,244 1310,180 1250,116 1177,67 1090,32 1003,-3 905,-20 795,-20 679,-20 577,-2 490,35 403,71 330,122 272,187 214,252 170,329 141,418 112,507 97,605 97,711 97,821 112,920 143,1009 174,1098 219,1173 278,1236 337,1298 411,1346 498,1380 585,1413 684,1430 797,1430 909,1430 1009,1413 1096,1379 1183,1345 1256,1297 1315,1234 1374,1171 1418,1096 1449,1007 1480,918 1495,820 1495,711 Z M 1300,711 C 1300,796 1289,873 1268,942 1246,1011 1214,1071 1172,1120 1129,1169 1077,1207 1014,1234 951,1261 879,1274 797,1274 713,1274 639,1261 576,1234 513,1207 460,1169 418,1120 375,1071 344,1011 323,942 302,873 291,796 291,711 291,626 302,549 324,479 345,408 377,348 420,297 462,246 515,206 578,178 641,149 713,135 795,135 883,135 959,149 1023,178 1086,207 1139,247 1180,298 1221,349 1251,409 1271,480 1290,551 1300,628 1300,711 Z"/>
<glyph unicode="N" horiz-adv-x="1165" d="M 1082,0 L 328,1200 C 329,1167 331,1135 333,1103 334,1076 336,1047 337,1017 338,986 338,959 338,936 L 338,0 168,0 168,1409 390,1409 1152,201 C 1150,234 1148,266 1146,299 1145,327 1143,358 1142,391 1141,424 1140,455 1140,485 L 1140,1409 1312,1409 1312,0 1082,0 Z"/>
<glyph unicode="M" horiz-adv-x="1390" d="M 1366,0 L 1366,940 C 1366,974 1366,1009 1367,1044 1368,1079 1369,1112 1370,1141 1371,1175 1373,1208 1375,1240 1366,1206 1356,1172 1346,1139 1337,1110 1328,1080 1318,1048 1307,1015 1297,986 1287,960 L 923,0 789,0 420,960 C 416,970 412,982 408,995 403,1008 399,1023 394,1038 389,1053 384,1068 379,1084 374,1099 369,1115 364,1130 353,1165 342,1202 331,1240 332,1203 333,1166 334,1129 335,1098 336,1065 337,1031 338,996 338,966 338,940 L 338,0 168,0 168,1409 419,1409 794,432 C 799,419 804,402 811,381 818,360 824,338 830,316 836,294 842,273 847,254 852,234 855,219 857,208 859,219 863,234 868,254 873,274 880,295 887,317 894,339 900,360 907,381 914,402 920,419 925,432 L 1293,1409 1538,1409 1538,0 1366,0 Z"/>
<glyph unicode="L" horiz-adv-x="927" d="M 168,0 L 168,1409 359,1409 359,156 1071,156 1071,0 168,0 Z"/>
<glyph unicode="K" horiz-adv-x="1191" d="M 1106,0 L 543,680 359,540 359,0 168,0 168,1409 359,1409 359,703 1038,1409 1263,1409 663,797 1343,0 1106,0 Z"/>
<glyph unicode="J" horiz-adv-x="848" d="M 457,-20 C 343,-20 250,10 177,69 104,128 55,222 32,350 L 219,381 C 226,338 237,301 252,270 267,239 286,213 307,193 328,173 352,158 378,149 404,140 431,135 458,135 527,135 582,159 622,207 662,254 682,324 682,416 L 682,1253 411,1253 411,1409 872,1409 872,420 C 872,353 863,292 844,238 825,184 798,138 763,100 727,61 683,32 632,11 581,-10 522,-20 457,-20 Z"/>
<glyph unicode="I" horiz-adv-x="200" d="M 189,0 L 189,1409 380,1409 380,0 189,0 Z"/>
<glyph unicode="H" horiz-adv-x="1165" d="M 1121,0 L 1121,653 359,653 359,0 168,0 168,1409 359,1409 359,813 1121,813 1121,1409 1312,1409 1312,0 1121,0 Z"/>
<glyph unicode="G" horiz-adv-x="1350" d="M 103,711 C 103,821 118,920 148,1009 177,1098 222,1173 281,1236 340,1298 413,1346 500,1380 587,1413 689,1430 804,1430 891,1430 967,1422 1032,1407 1097,1392 1154,1370 1202,1341 1250,1312 1291,1278 1324,1237 1357,1196 1386,1149 1409,1098 L 1227,1044 C 1210,1079 1189,1110 1165,1139 1140,1167 1111,1191 1076,1211 1041,1231 1001,1247 956,1258 910,1269 858,1274 799,1274 714,1274 640,1261 577,1234 514,1207 461,1169 420,1120 379,1071 348,1011 328,942 307,873 297,796 297,711 297,626 308,549 330,479 352,408 385,348 428,297 471,246 525,206 590,178 654,149 728,135 813,135 868,135 919,140 966,149 1013,158 1055,171 1093,186 1130,201 1163,217 1192,236 1221,254 1245,272 1264,291 L 1264,545 843,545 843,705 1440,705 1440,219 C 1409,187 1372,157 1330,128 1287,99 1240,73 1187,51 1134,29 1077,12 1014,-1 951,-14 884,-20 813,-20 694,-20 591,-2 502,35 413,71 340,122 281,187 222,252 177,329 148,418 118,507 103,605 103,711 Z"/>
<glyph unicode="F" horiz-adv-x="1019" d="M 359,1253 L 359,729 1145,729 1145,571 359,571 359,0 168,0 168,1409 1169,1409 1169,1253 359,1253 Z"/>
<glyph unicode="E" horiz-adv-x="1125" d="M 168,0 L 168,1409 1237,1409 1237,1253 359,1253 359,801 1177,801 1177,647 359,647 359,156 1278,156 1278,0 168,0 Z"/>
<glyph unicode="D" horiz-adv-x="1231" d="M 1381,719 C 1381,602 1363,498 1328,409 1293,319 1244,244 1183,184 1122,123 1049,78 966,47 882,16 792,0 695,0 L 168,0 168,1409 634,1409 C 743,1409 843,1396 935,1369 1026,1342 1105,1300 1171,1244 1237,1187 1289,1116 1326,1029 1363,942 1381,839 1381,719 Z M 1189,719 C 1189,814 1175,896 1148,964 1121,1031 1082,1087 1033,1130 984,1173 925,1205 856,1226 787,1246 712,1256 630,1256 L 359,1256 359,153 673,153 C 747,153 816,165 879,189 942,213 996,249 1042,296 1088,343 1124,402 1150,473 1176,544 1189,626 1189,719 Z"/>
<glyph unicode="C" horiz-adv-x="1324" d="M 792,1274 C 712,1274 641,1261 580,1234 518,1207 466,1169 425,1120 383,1071 351,1011 330,942 309,873 298,796 298,711 298,626 310,549 333,479 356,408 389,348 432,297 475,246 527,207 590,179 652,151 722,137 800,137 855,137 905,144 950,159 995,173 1035,193 1072,219 1108,245 1140,276 1169,312 1198,347 1223,387 1245,430 L 1401,352 C 1376,299 1344,250 1307,205 1270,160 1226,120 1176,87 1125,54 1068,28 1005,9 941,-10 870,-20 791,-20 677,-20 577,-2 492,35 406,71 334,122 277,187 219,252 176,329 147,418 118,507 104,605 104,711 104,821 119,920 150,1009 180,1098 224,1173 283,1236 341,1298 413,1346 498,1380 583,1413 681,1430 790,1430 940,1430 1065,1401 1166,1342 1267,1283 1341,1196 1388,1081 L 1207,1021 C 1194,1054 1176,1086 1153,1117 1130,1147 1102,1174 1068,1197 1034,1220 994,1239 949,1253 903,1267 851,1274 792,1274 Z"/>
<glyph unicode="B" horiz-adv-x="1112" d="M 1258,397 C 1258,326 1244,265 1216,215 1188,164 1150,123 1103,92 1056,60 1001,37 938,22 875,7 809,0 740,0 L 168,0 168,1409 680,1409 C 758,1409 828,1403 889,1390 950,1377 1002,1356 1045,1328 1088,1300 1120,1265 1143,1222 1165,1179 1176,1127 1176,1067 1176,1028 1171,991 1160,956 1149,921 1132,890 1110,862 1087,833 1059,809 1026,789 992,768 953,753 908,743 965,736 1015,723 1059,704 1102,685 1139,660 1168,630 1197,600 1220,565 1235,526 1250,486 1258,443 1258,397 Z M 984,1044 C 984,1120 958,1174 906,1207 854,1240 779,1256 680,1256 L 359,1256 359,810 680,810 C 736,810 783,816 822,827 861,838 892,853 916,874 940,894 957,918 968,947 979,976 984,1008 984,1044 Z M 1065,412 C 1065,457 1057,495 1041,526 1024,557 1001,583 970,603 939,623 903,638 860,647 817,656 768,661 715,661 L 359,661 359,153 730,153 C 779,153 824,157 865,165 906,173 941,187 971,207 1000,227 1023,254 1040,287 1057,320 1065,362 1065,412 Z"/>
<glyph unicode="A" horiz-adv-x="1377" d="M 1167,0 L 1006,412 364,412 202,0 4,0 579,1409 796,1409 1362,0 1167,0 Z M 768,1026 C 757,1053 747,1080 738,1107 728,1134 719,1159 712,1182 705,1204 699,1223 694,1238 689,1253 686,1262 685,1265 684,1262 681,1252 676,1237 671,1222 665,1203 658,1180 650,1157 641,1132 632,1105 622,1078 612,1051 602,1024 L 422,561 949,561 768,1026 Z"/>
<glyph unicode="4" horiz-adv-x="1046" d="M 881,319 L 881,0 711,0 711,319 47,319 47,459 692,1409 881,1409 881,461 1079,461 1079,319 881,319 Z M 711,1206 C 710,1203 706,1196 701,1187 696,1177 690,1166 683,1154 676,1142 670,1130 663,1118 656,1105 649,1095 644,1087 L 283,555 C 280,550 275,543 269,534 262,525 256,517 249,508 242,499 236,490 229,481 222,472 217,466 213,461 L 711,461 711,1206 Z"/>
<glyph unicode="/" horiz-adv-x="583" d="M 0,-20 L 411,1484 569,1484 162,-20 0,-20 Z"/>
<glyph unicode="-" horiz-adv-x="517" d="M 91,464 L 91,624 591,624 591,464 91,464 Z"/>
<glyph unicode="," horiz-adv-x="226" d="M 385,219 L 385,51 C 385,16 384,-16 381,-46 378,-74 373,-101 366,-127 359,-151 351,-175 342,-197 332,-219 320,-241 307,-262 L 184,-262 C 214,-219 237,-175 254,-131 270,-87 278,-43 278,0 L 190,0 190,219 385,219 Z"/>
<glyph unicode=")" horiz-adv-x="557" d="M 555,528 C 555,435 548,346 534,262 520,177 498,96 468,18 438,-60 400,-136 353,-209 306,-282 251,-354 186,-424 L 12,-424 C 75,-354 129,-282 175,-209 220,-136 258,-60 287,19 316,98 338,179 353,264 367,349 374,437 374,530 374,623 367,711 353,796 338,881 316,962 287,1041 258,1119 220,1195 175,1269 129,1342 75,1414 12,1484 L 186,1484 C 251,1414 306,1342 353,1269 400,1196 438,1120 468,1042 498,964 520,883 534,798 548,713 555,625 555,532 L 555,528 Z"/>
<glyph unicode="(" horiz-adv-x="557" d="M 127,532 C 127,625 134,713 148,798 162,883 184,964 214,1042 244,1120 282,1196 329,1269 376,1342 431,1414 496,1484 L 670,1484 C 607,1414 553,1342 508,1269 462,1195 424,1119 395,1041 366,962 344,881 330,796 315,711 308,623 308,530 308,437 315,349 330,264 344,179 366,98 395,19 424,-60 462,-136 508,-209 553,-282 607,-354 670,-424 L 496,-424 C 431,-354 376,-282 329,-209 282,-136 244,-60 214,18 184,96 162,177 148,262 134,346 127,435 127,528 L 127,532 Z"/>
<glyph unicode=" " horiz-adv-x="569"/>
</font>
</defs>
<defs class="TextShapeIndex">
<g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49 id50 id51 id52 id53 id54 id55 id56"/>
</defs>
<defs class="EmbeddedBulletChars">
<g id="bullet-char-template(57356)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
</g>
<g id="bullet-char-template(57354)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
</g>
<g id="bullet-char-template(10146)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
</g>
<g id="bullet-char-template(10132)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
</g>
<g id="bullet-char-template(10007)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
</g>
<g id="bullet-char-template(10004)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
</g>
<g id="bullet-char-template(9679)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
</g>
<g id="bullet-char-template(8226)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
</g>
<g id="bullet-char-template(8211)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
</g>
</defs>
<defs class="TextEmbeddedBitmaps"/>
<g>
<g id="id2" class="Master_Slide">
<g id="bg-id2" class="Background"/>
<g id="bo-id2" class="BackgroundObjects"/>
</g>
</g>
<g class="SlideGroup">
<g>
<g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
<g class="Page">
<g class="com.sun.star.drawing.CustomShape">
<g id="id3">
<path fill="rgb(178,178,178)" stroke="none" d="M 10795,26939 L 1000,26939 1000,2142 20590,2142 20590,26939 10795,26939 Z"/>
<path fill="none" stroke="rgb(128,128,128)" stroke-width="28" stroke-linejoin="round" d="M 10795,26939 L 1000,26939 1000,2142 20590,2142 20590,26939 10795,26939 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id4">
<path fill="none" stroke="rgb(28,28,28)" stroke-width="106" stroke-linejoin="round" d="M 1000,2143 L 20590,2143"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id5">
<path fill="rgb(238,238,238)" stroke="none" d="M 10795,26939 L 1000,26939 1000,8646 20590,8646 20590,26939 10795,26939 Z"/>
<path fill="none" stroke="rgb(128,128,128)" stroke-width="28" stroke-linejoin="round" d="M 10795,26939 L 1000,26939 1000,8646 20590,8646 20590,26939 10795,26939 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id6">
<path fill="rgb(128,128,128)" stroke="none" d="M 17070,23329 L 13636,23329 13636,19915 20504,19915 20504,23329 17070,23329 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 17070,23329 L 13636,23329 13636,19915 20504,19915 20504,23329 17070,23329 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15343" y="20890"/><tspan class="TextPosition" x="15343" y="20890"><tspan fill="rgb(128,128,128)" stroke="none">PostgreSQL</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="15121" y="22219"/><tspan class="TextPosition" x="15121" y="22219"><tspan fill="rgb(128,128,128)" stroke="none">CPF record data</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="15917" y="22816"/><tspan class="TextPosition" x="15917" y="22816"><tspan fill="rgb(128,128,128)" stroke="none">User data</tspan></tspan></tspan></text>
<path fill="rgb(153,153,255)" stroke="none" d="M 16870,23129 L 13436,23129 13436,19715 20304,19715 20304,23129 16870,23129 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 16870,23129 L 13436,23129 13436,19715 20304,19715 20304,23129 16870,23129 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15143" y="20690"/><tspan class="TextPosition" x="15143" y="20690"><tspan fill="rgb(0,0,0)" stroke="none">PostgreSQL</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="14921" y="22019"/><tspan class="TextPosition" x="14921" y="22019"><tspan fill="rgb(0,0,0)" stroke="none">CPF record data</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="15717" y="22616"/><tspan class="TextPosition" x="15717" y="22616"><tspan fill="rgb(0,0,0)" stroke="none">User data</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id7">
<path fill="rgb(128,128,128)" stroke="none" d="M 10493,26812 L 6741,26812 6741,24414 14244,24414 14244,26812 10493,26812 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10493,26812 L 6741,26812 6741,24414 14244,24414 14244,26812 10493,26812 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8467" y="25038"/><tspan class="TextPosition" x="8467" y="25038"><tspan fill="rgb(128,128,128)" stroke="none">Elastic Search</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="7366" y="26054"/><tspan class="TextPosition" x="7366" y="26054"><tspan fill="rgb(128,128,128)" stroke="none">Indexing tool for searching</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="7093" y="26651"/><tspan class="TextPosition" x="7093" y="26651"><tspan fill="rgb(128,128,128)" stroke="none">and matching in PostgreSQL</tspan></tspan></tspan></text>
<path fill="rgb(153,153,255)" stroke="none" d="M 10293,26612 L 6541,26612 6541,24214 14044,24214 14044,26612 10293,26612 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10293,26612 L 6541,26612 6541,24214 14044,24214 14044,26612 10293,26612 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8267" y="24838"/><tspan class="TextPosition" x="8267" y="24838"><tspan fill="rgb(0,0,0)" stroke="none">Elastic Search</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="7166" y="25854"/><tspan class="TextPosition" x="7166" y="25854"><tspan fill="rgb(0,0,0)" stroke="none">Indexing tool for searching</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="6893" y="26451"/><tspan class="TextPosition" x="6893" y="26451"><tspan fill="rgb(0,0,0)" stroke="none">and matching in PostgreSQL</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id8">
<path fill="rgb(128,128,128)" stroke="none" d="M 9731,23351 L 7340,23351 7340,19922 12121,19922 12121,23351 9731,23351 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 9731,23351 L 7340,23351 7340,19922 12121,19922 12121,23351 9731,23351 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8708" y="21146"/><tspan class="TextPosition" x="8708" y="21146"><tspan fill="rgb(128,128,128)" stroke="none">Identity</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="7762" y="21857"/><tspan class="TextPosition" x="7762" y="21857"><tspan fill="rgb(128,128,128)" stroke="none">Reconciliation</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8746" y="22568"/><tspan class="TextPosition" x="8746" y="22568"><tspan fill="rgb(128,128,128)" stroke="none">Engine</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 9531,23151 L 7140,23151 7140,19722 11921,19722 11921,23151 9531,23151 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 9531,23151 L 7140,23151 7140,19722 11921,19722 11921,23151 9531,23151 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8508" y="20946"/><tspan class="TextPosition" x="8508" y="20946"><tspan fill="rgb(0,0,0)" stroke="none">Identity</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="7562" y="21657"/><tspan class="TextPosition" x="7562" y="21657"><tspan fill="rgb(0,0,0)" stroke="none">Reconciliation</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8546" y="22368"/><tspan class="TextPosition" x="8546" y="22368"><tspan fill="rgb(0,0,0)" stroke="none">Engine</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id9">
<path fill="rgb(128,128,128)" stroke="none" d="M 4819,7295 L 2342,7295 2342,4120 7295,4120 7295,7295 4819,7295 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4819,7295 L 2342,7295 2342,4120 7295,4120 7295,7295 4819,7295 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3767" y="5046"/><tspan class="TextPosition" x="3767" y="5046"><tspan fill="rgb(128,128,128)" stroke="none">Web UI</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="3322" y="6419"/><tspan class="TextPosition" x="3322" y="6419"><tspan fill="rgb(128,128,128)" stroke="none">User interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="3168" y="6860"/><tspan class="TextPosition" x="3168" y="6860"><tspan fill="rgb(128,128,128)" stroke="none">editing and viewing</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 4619,7095 L 2142,7095 2142,3920 7095,3920 7095,7095 4619,7095 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4619,7095 L 2142,7095 2142,3920 7095,3920 7095,7095 4619,7095 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3567" y="4846"/><tspan class="TextPosition" x="3567" y="4846"><tspan fill="rgb(0,0,0)" stroke="none">Web UI</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="3122" y="6219"/><tspan class="TextPosition" x="3122" y="6219"><tspan fill="rgb(0,0,0)" stroke="none">User interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="2968" y="6660"/><tspan class="TextPosition" x="2968" y="6660"><tspan fill="rgb(0,0,0)" stroke="none">editing and viewing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id10">
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1679" y="1664"/><tspan class="TextPosition" x="1679" y="1664"><tspan fill="rgb(0,0,0)" stroke="none">Outside Clients (Web Browsers, cURL, wget, ArchivesSpace)</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id11">
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15188" y="3026"/><tspan class="TextPosition" x="15188" y="3026"><tspan fill="rgb(0,0,0)" stroke="none">Server-side Clients</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id12">
<path fill="rgb(128,128,128)" stroke="none" d="M 10915,7294 L 8438,7294 8438,4119 13391,4119 13391,7294 10915,7294 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10915,7294 L 8438,7294 8438,4119 13391,4119 13391,7294 10915,7294 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8887" y="5045"/><tspan class="TextPosition" x="8887" y="5045"><tspan fill="rgb(128,128,128)" stroke="none">Rest API Filter</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="9215" y="5977"/><tspan class="TextPosition" x="9215" y="5977"><tspan fill="rgb(128,128,128)" stroke="none">Textual interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="9410" y="6418"/><tspan class="TextPosition" x="9410" y="6418"><tspan fill="rgb(128,128,128)" stroke="none">machine access, </tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="8891" y="6859"/><tspan class="TextPosition" x="8891" y="6859"><tspan fill="rgb(128,128,128)" stroke="none">Exposes portion of API </tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 10715,7094 L 8238,7094 8238,3919 13191,3919 13191,7094 10715,7094 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10715,7094 L 8238,7094 8238,3919 13191,3919 13191,7094 10715,7094 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8687" y="4845"/><tspan class="TextPosition" x="8687" y="4845"><tspan fill="rgb(0,0,0)" stroke="none">Rest API Filter</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="9015" y="5777"/><tspan class="TextPosition" x="9015" y="5777"><tspan fill="rgb(0,0,0)" stroke="none">Textual interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="9210" y="6218"/><tspan class="TextPosition" x="9210" y="6218"><tspan fill="rgb(0,0,0)" stroke="none">machine access, </tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="8691" y="6659"/><tspan class="TextPosition" x="8691" y="6659"><tspan fill="rgb(0,0,0)" stroke="none">Exposes portion of API </tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id13">
<path fill="rgb(128,128,128)" stroke="none" d="M 17011,7294 L 14534,7294 14534,4119 19487,4119 19487,7294 17011,7294 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 17011,7294 L 14534,7294 14534,4119 19487,4119 19487,7294 17011,7294 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15777" y="5045"/><tspan class="TextPosition" x="15777" y="5045"><tspan fill="rgb(128,128,128)" stroke="none">Dev/Test</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="15275" y="5977"/><tspan class="TextPosition" x="15275" y="5977"><tspan fill="rgb(128,128,128)" stroke="none">Internal interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="15514" y="6418"/><tspan class="TextPosition" x="15514" y="6418"><tspan fill="rgb(128,128,128)" stroke="none">testing the server</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 16811,7094 L 14334,7094 14334,3919 19287,3919 19287,7094 16811,7094 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 16811,7094 L 14334,7094 14334,3919 19287,3919 19287,7094 16811,7094 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15577" y="4845"/><tspan class="TextPosition" x="15577" y="4845"><tspan fill="rgb(0,0,0)" stroke="none">Dev/Test</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="15075" y="5777"/><tspan class="TextPosition" x="15075" y="5777"><tspan fill="rgb(0,0,0)" stroke="none">Internal interface for</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="15314" y="6218"/><tspan class="TextPosition" x="15314" y="6218"><tspan fill="rgb(0,0,0)" stroke="none">testing the server</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id14">
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="17224" y="9513"/><tspan class="TextPosition" x="17224" y="9513"><tspan fill="rgb(0,0,0)" stroke="none">Server-side</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id15">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 4048,1735 L 4048,3455"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 4048,3894 L 4201,3435 3895,3435 4048,3894 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id16">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 5191,3894 L 5191,2174"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5191,1735 L 5038,2194 5344,2194 5191,1735 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id17">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 10096,1742 L 10096,3462"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 10096,3901 L 10249,3442 9943,3442 10096,3901 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id18">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 11239,3901 L 11239,2181"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11239,1742 L 11086,2201 11392,2201 11239,1742 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id19">
<path fill="rgb(128,128,128)" stroke="none" d="M 8883,14026 L 1453,14026 1453,11359 16312,11359 16312,14026 8883,14026 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 8883,14026 L 1453,14026 1453,11359 16312,11359 16312,14026 8883,14026 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8716" y="12131"/><tspan class="TextPosition" x="8716" y="12131"><tspan fill="rgb(128,128,128)" stroke="none">Workflow Controller</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="7945" y="12864"/><tspan class="TextPosition" x="7945" y="12864"><tspan fill="rgb(128,128,128)" stroke="none">Parses and interprets internal Server API</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="7194" y="13305"/><tspan class="TextPosition" x="7194" y="13305"><tspan fill="rgb(128,128,128)" stroke="none">Interacts directly with internal server components,</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="7549" y="13746"/><tspan class="TextPosition" x="7549" y="13746"><tspan fill="rgb(128,128,128)" stroke="none">based on logic defined in the workflow engine</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 8683,13826 L 1253,13826 1253,11159 16112,11159 16112,13826 8683,13826 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 8683,13826 L 1253,13826 1253,11159 16112,11159 16112,13826 8683,13826 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8516" y="11931"/><tspan class="TextPosition" x="8516" y="11931"><tspan fill="rgb(0,0,0)" stroke="none">Workflow Controller</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="7745" y="12664"/><tspan class="TextPosition" x="7745" y="12664"><tspan fill="rgb(0,0,0)" stroke="none">Parses and interprets internal Server API</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="6994" y="13105"/><tspan class="TextPosition" x="6994" y="13105"><tspan fill="rgb(0,0,0)" stroke="none">Interacts directly with internal server components,</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="7349" y="13546"/><tspan class="TextPosition" x="7349" y="13546"><tspan fill="rgb(0,0,0)" stroke="none">based on logic defined in the workflow engine</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id20">
<path fill="rgb(128,128,128)" stroke="none" d="M 10915,3185 L 8438,3185 8438,2296 13391,2296 13391,3185 10915,3185 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10915,3185 L 8438,3185 8438,2296 13391,2296 13391,3185 10915,3185 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="8802" y="2935"/><tspan class="TextPosition" x="8802" y="2935"><tspan fill="rgb(128,128,128)" stroke="none">Rest API (JSON)</tspan></tspan></tspan></text>
<path fill="rgb(255,255,204)" stroke="none" d="M 10715,2985 L 8238,2985 8238,2096 13191,2096 13191,2985 10715,2985 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 10715,2985 L 8238,2985 8238,2096 13191,2096 13191,2985 10715,2985 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="8602" y="2735"/><tspan class="TextPosition" x="8602" y="2735"><tspan fill="rgb(0,0,0)" stroke="none">Rest API (JSON)</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id21">
<path fill="rgb(102,102,102)" stroke="none" d="M 17780,26939 L 14970,26939 14970,23732 20590,23732 20590,26939 17780,26939 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 17780,26939 L 14970,26939 14970,23732 20590,23732 20590,26939 17780,26939 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="17234" y="24563"/><tspan class="TextPosition" x="17234" y="24563"><tspan fill="rgb(255,255,255)" stroke="none">Key</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="16417" y="25469"/><tspan class="TextPosition" x="16417" y="25469"><tspan fill="rgb(255,255,255)" stroke="none">API Interface</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="16417" y="26024"/><tspan class="TextPosition" x="16417" y="26024"><tspan fill="rgb(255,255,255)" stroke="none">Custom Designs</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="16417" y="26579"/><tspan class="TextPosition" x="16417" y="26579"><tspan fill="rgb(255,255,255)" stroke="none">OTC Components</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id22">
<path fill="rgb(153,153,255)" stroke="none" d="M 15840,26527 L 15586,26527 15586,26273 16094,26273 16094,26527 15840,26527 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 15840,26527 L 15586,26527 15586,26273 16094,26273 16094,26527 15840,26527 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id23">
<path fill="rgb(207,231,245)" stroke="none" d="M 15840,26019 L 15586,26019 15586,25765 16094,25765 16094,26019 15840,26019 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 15840,26019 L 15586,26019 15586,25765 16094,25765 16094,26019 15840,26019 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id24">
<path fill="rgb(255,255,204)" stroke="none" d="M 15840,25411 L 15586,25411 15586,25157 16094,25157 16094,25411 15840,25411 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 15840,25411 L 15586,25411 15586,25157 16094,25157 16094,25411 15840,25411 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id25">
<path fill="rgb(128,128,128)" stroke="none" d="M 18962,18725 L 17501,18725 17501,13264 20422,13264 20422,18725 18962,18725 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 18962,18725 L 17501,18725 17501,13264 20422,13264 20422,18725 18962,18725 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="17590" y="15860"/><tspan class="TextPosition" x="17590" y="15860"><tspan fill="rgb(128,128,128)" stroke="none">Reporting</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="18382" y="16571"/><tspan class="TextPosition" x="18382" y="16571"><tspan fill="rgb(128,128,128)" stroke="none">Tool</tspan></tspan></tspan></text>
<path fill="rgb(153,153,255)" stroke="none" d="M 18762,18525 L 17301,18525 17301,13064 20222,13064 20222,18525 18762,18525 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 18762,18525 L 17301,18525 17301,13064 20222,13064 20222,18525 18762,18525 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="17390" y="15660"/><tspan class="TextPosition" x="17390" y="15660"><tspan fill="rgb(0,0,0)" stroke="none">Reporting</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="18182" y="16371"/><tspan class="TextPosition" x="18182" y="16371"><tspan fill="rgb(0,0,0)" stroke="none">Tool</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id26">
<path fill="none" stroke="rgb(0,0,0)" d="M 16113,12493 L 18762,12493 18762,12844"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18762,13065 L 18839,12834 18685,12834 18762,13065 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id27">
<path fill="none" stroke="rgb(0,0,0)" d="M 18762,18526 L 18762,19220 16870,19220 16870,19494"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16870,19715 L 16947,19484 16793,19484 16870,19715 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id28">
<path fill="rgb(128,128,128)" stroke="none" d="M 4357,22817 L 1880,22817 1880,20631 6833,20631 6833,22817 4357,22817 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4357,22817 L 1880,22817 1880,20631 6833,20631 6833,22817 4357,22817 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2771" y="21589"/><tspan class="TextPosition" x="2771" y="21589"><tspan fill="rgb(128,128,128)" stroke="none">NameEntry</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2507" y="22300"/><tspan class="TextPosition" x="2507" y="22300"><tspan fill="rgb(128,128,128)" stroke="none">String Parser</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 4157,22617 L 1680,22617 1680,20431 6633,20431 6633,22617 4157,22617 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4157,22617 L 1680,22617 1680,20431 6633,20431 6633,22617 4157,22617 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2571" y="21389"/><tspan class="TextPosition" x="2571" y="21389"><tspan fill="rgb(0,0,0)" stroke="none">NameEntry</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2307" y="22100"/><tspan class="TextPosition" x="2307" y="22100"><tspan fill="rgb(0,0,0)" stroke="none">String Parser</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id29">
<path fill="rgb(128,128,128)" stroke="none" d="M 4357,20122 L 1880,20122 1880,17963 6833,17963 6833,20122 4357,20122 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4357,20122 L 1880,20122 1880,17963 6833,17963 6833,20122 4357,20122 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2666" y="19263"/><tspan class="TextPosition" x="2666" y="19263"><tspan fill="rgb(128,128,128)" stroke="none">Date Parser</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 4157,19922 L 1680,19922 1680,17763 6633,17763 6633,19922 4157,19922 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4157,19922 L 1680,19922 1680,17763 6633,17763 6633,19922 4157,19922 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2466" y="19063"/><tspan class="TextPosition" x="2466" y="19063"><tspan fill="rgb(0,0,0)" stroke="none">Date Parser</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id30">
<path fill="rgb(128,128,128)" stroke="none" d="M 4357,17455 L 1880,17455 1880,15042 6833,15042 6833,17455 4357,17455 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4357,17455 L 1880,17455 1880,15042 6833,15042 6833,17455 4357,17455 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2236" y="16114"/><tspan class="TextPosition" x="2236" y="16114"><tspan fill="rgb(128,128,128)" stroke="none">Data Validation</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3372" y="16825"/><tspan class="TextPosition" x="3372" y="16825"><tspan fill="rgb(128,128,128)" stroke="none">Engine</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 4157,17255 L 1680,17255 1680,14842 6633,14842 6633,17255 4157,17255 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4157,17255 L 1680,17255 1680,14842 6633,14842 6633,17255 4157,17255 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2036" y="15914"/><tspan class="TextPosition" x="2036" y="15914"><tspan fill="rgb(0,0,0)" stroke="none">Data Validation</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3172" y="16625"/><tspan class="TextPosition" x="3172" y="16625"><tspan fill="rgb(0,0,0)" stroke="none">Engine</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id31">
<path fill="rgb(128,128,128)" stroke="none" d="M 14344,16801 L 11740,16801 11740,15150 16947,15150 16947,16801 14344,16801 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 14344,16801 L 11740,16801 11740,15150 16947,15150 16947,16801 14344,16801 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="12337" y="16196"/><tspan class="TextPosition" x="12337" y="16196"><tspan fill="rgb(128,128,128)" stroke="none">Authentication</tspan></tspan></tspan></text>
<path fill="rgb(153,153,255)" stroke="none" d="M 14144,16601 L 11540,16601 11540,14950 16747,14950 16747,16601 14144,16601 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 14144,16601 L 11540,16601 11540,14950 16747,14950 16747,16601 14144,16601 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="12137" y="15996"/><tspan class="TextPosition" x="12137" y="15996"><tspan fill="rgb(0,0,0)" stroke="none">Authentication</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id32">
<path fill="rgb(128,128,128)" stroke="none" d="M 14344,18726 L 11740,18726 11740,17456 16947,17456 16947,18726 14344,18726 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 14344,18726 L 11740,18726 11740,17456 16947,17456 16947,18726 14344,18726 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="12496" y="18312"/><tspan class="TextPosition" x="12496" y="18312"><tspan fill="rgb(128,128,128)" stroke="none">Authorization</tspan></tspan></tspan></text>
<path fill="rgb(207,231,245)" stroke="none" d="M 14144,18526 L 11540,18526 11540,17256 16747,17256 16747,18526 14144,18526 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 14144,18526 L 11540,18526 11540,17256 16747,17256 16747,18526 14144,18526 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="12296" y="18112"/><tspan class="TextPosition" x="12296" y="18112"><tspan fill="rgb(0,0,0)" stroke="none">Authorization</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id33">
<path fill="none" stroke="rgb(0,0,0)" d="M 8683,13827 L 8683,14208 14144,14208 14144,14730"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14144,14951 L 14221,14720 14067,14720 14144,14951 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id34">
<path fill="none" stroke="rgb(0,0,0)" d="M 14144,16602 L 14144,17035"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14144,17256 L 14221,17025 14067,17025 14144,17256 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id35">
<path fill="none" stroke="rgb(0,0,0)" d="M 14144,18747 L 14144,19011 16870,19011 16870,19494"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14144,18526 L 14067,18757 14221,18757 14144,18526 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16870,19715 L 16947,19484 16793,19484 16870,19715 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id36">
<path fill="none" stroke="rgb(0,0,0)" d="M 14266,25413 L 14745,25413 14745,23833 12638,23833 12638,21422 13215,21422"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14045,25413 L 14276,25490 14276,25336 14045,25413 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13436,21422 L 13205,21345 13205,21499 13436,21422 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id37">
<path fill="none" stroke="rgb(0,0,0)" d="M 12143,21437 L 12779,21437 12779,21422 13215,21422"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11922,21437 L 12153,21514 12153,21360 11922,21437 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13436,21422 L 13205,21345 13205,21499 13436,21422 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id38">
<path fill="none" stroke="rgb(0,0,0)" d="M 9531,23152 L 9531,23783 10293,23783 10293,23993"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 10293,24214 L 10370,23983 10216,23983 10293,24214 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id39">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 3921,7096 L 3921,8308"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 3921,8747 L 4074,8288 3768,8288 3921,8747 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id40">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 5064,8747 L 5064,7535"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5064,7096 L 4911,7555 5217,7555 5064,7096 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id41">
<path fill="rgb(128,128,128)" stroke="none" d="M 9201,10344 L 1581,10344 1581,8820 16821,8820 16821,10344 9201,10344 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 9201,10344 L 1581,10344 1581,8820 16821,8820 16821,10344 9201,10344 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="6839" y="9417"/><tspan class="TextPosition" x="6839" y="9417"><tspan fill="rgb(128,128,128)" stroke="none">Server API (JSON)</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="6583" y="10175"/><tspan class="TextPosition" x="6583" y="10175"><tspan fill="rgb(128,128,128)" stroke="none">API exposed to internal clients</tspan></tspan></tspan></text>
<path fill="rgb(255,255,204)" stroke="none" d="M 9001,10144 L 1381,10144 1381,8620 16621,8620 16621,10144 9001,10144 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 9001,10144 L 1381,10144 1381,8620 16621,8620 16621,10144 9001,10144 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="6639" y="9217"/><tspan class="TextPosition" x="6639" y="9217"><tspan fill="rgb(0,0,0)" stroke="none">Server API (JSON)</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="6383" y="9975"/><tspan class="TextPosition" x="6383" y="9975"><tspan fill="rgb(0,0,0)" stroke="none">API exposed to internal clients</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id42">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 10144,7096 L 10144,8181"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 10144,8620 L 10297,8161 9991,8161 10144,8620 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id43">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 11287,8620 L 11287,7535"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11287,7096 L 11134,7555 11440,7555 11287,7096 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id44">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 14970,7096 L 14970,8181"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14970,8620 L 15123,8161 14817,8161 14970,8620 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id45">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 16113,8620 L 16113,7535"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16113,7096 L 15960,7555 16266,7555 16113,7096 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id46">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 7858,10144 L 7858,10721"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 7858,11160 L 8011,10701 7705,10701 7858,11160 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id47">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="102" stroke-linejoin="round" d="M 9001,11160 L 9001,10583"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9001,10144 L 8848,10603 9154,10603 9001,10144 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id48">
<path fill="none" stroke="rgb(0,0,0)" stroke-width="18" stroke-linejoin="round" d="M 8683,14296 L 8683,16874 9531,16874 9531,19254"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8683,13827 L 8520,14318 8847,14318 8683,13827 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9531,19723 L 9695,19233 9368,19233 9531,19723 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id49">
<path fill="none" stroke="rgb(0,0,0)" d="M 4157,23047 L 4157,23852 9531,23852 9531,23582"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 4157,22617 L 4007,23067 4307,23067 4157,22617 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9531,23152 L 9381,23602 9681,23602 9531,23152 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id50">
<path fill="none" stroke="rgb(0,0,0)" d="M 8683,14257 L 8683,14589 1127,14589 1127,16049 1251,16049"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8683,13827 L 8533,14277 8833,14277 8683,13827 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 1681,16049 L 1231,15899 1231,16199 1681,16049 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id51">
<path fill="none" stroke="rgb(0,0,0)" d="M 1251,18843 L 1179,18843 1179,14589 8683,14589 8683,14257"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 1681,18843 L 1231,18693 1231,18993 1681,18843 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8683,13827 L 8533,14277 8833,14277 8683,13827 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id52">
<path fill="none" stroke="rgb(0,0,0)" d="M 1251,21524 L 1179,21524 1179,14589 8683,14589 8683,14257"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 1681,21524 L 1231,21374 1231,21674 1681,21524 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8683,13827 L 8533,14277 8833,14277 8683,13827 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id53">
<path fill="rgb(128,128,128)" stroke="none" d="M 3798,26727 L 1570,26727 1570,24329 6025,24329 6025,26727 3798,26727 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 3798,26727 L 1570,26727 1570,24329 6025,24329 6025,26727 3798,26727 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2883" y="25251"/><tspan class="TextPosition" x="2883" y="25251"><tspan fill="rgb(128,128,128)" stroke="none">Neo4J</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="1846" y="26267"/><tspan class="TextPosition" x="1846" y="26267"><tspan fill="rgb(128,128,128)" stroke="none">Graph Database</tspan></tspan></tspan></text>
<path fill="rgb(153,153,255)" stroke="none" d="M 3598,26527 L 1370,26527 1370,24129 5825,24129 5825,26527 3598,26527 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 3598,26527 L 1370,26527 1370,24129 5825,24129 5825,26527 3598,26527 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="2683" y="25051"/><tspan class="TextPosition" x="2683" y="25051"><tspan fill="rgb(0,0,0)" stroke="none">Neo4J</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="529px" font-weight="400"><tspan class="TextPosition" x="1646" y="26067"/><tspan class="TextPosition" x="1646" y="26067"><tspan fill="rgb(0,0,0)" stroke="none">Graph Database</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id54">
<path fill="rgb(204,255,204)" stroke="none" d="M 4619,5726 L 2523,5726 2523,4964 6714,4964 6714,5726 4619,5726 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4619,5726 L 2523,5726 2523,4964 6714,4964 6714,5726 4619,5726 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="2720" y="5491"/><tspan class="TextPosition" x="2720" y="5491"><tspan fill="rgb(0,0,0)" stroke="none">Front-end Controller</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id55">
<path fill="rgb(204,255,204)" stroke="none" d="M 3857,13572 L 1761,13572 1761,11413 5952,11413 5952,13572 3857,13572 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 3857,13572 L 1761,13572 1761,11413 5952,11413 5952,13572 3857,13572 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="2269" y="12042"/><tspan class="TextPosition" x="2269" y="12042"><tspan fill="rgb(0,0,0)" stroke="none">Workflow Engine</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="2094" y="12855"/><tspan class="TextPosition" x="2094" y="12855"><tspan fill="rgb(0,0,0)" stroke="none">State-table policy-level</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="2923" y="13253"/><tspan class="TextPosition" x="2923" y="13253"><tspan fill="rgb(0,0,0)" stroke="none">logic engine</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id56">
<path fill="rgb(128,128,128)" stroke="none" d="M 4819,3185 L 2342,3185 2342,2296 7295,2296 7295,3185 4819,3185 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4819,3185 L 2342,3185 2342,2296 7295,2296 7295,3185 4819,3185 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="2814" y="2935"/><tspan class="TextPosition" x="2814" y="2935"><tspan fill="rgb(128,128,128)" stroke="none">HTML/JSON/JS</tspan></tspan></tspan></text>
<path fill="rgb(255,255,204)" stroke="none" d="M 4619,2985 L 2142,2985 2142,2096 7095,2096 7095,2985 4619,2985 Z"/>
<path fill="none" stroke="rgb(128,128,128)" d="M 4619,2985 L 2142,2985 2142,2096 7095,2096 7095,2985 4619,2985 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Arial, sans-serif" font-size="564px" font-weight="400"><tspan class="TextPosition" x="2614" y="2735"/><tspan class="TextPosition" x="2614" y="2735"><tspan fill="rgb(0,0,0)" stroke="none">HTML/JSON/JS</tspan></tspan></tspan></text>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
# Formal Specification Documents
These documents describe the specifications of the system. They include specific decisions for each component and the system as a whole, in order to meet the requirements listed in the [Requirements](/Requirements) section.
\ No newline at end of file
# SNAC Server Architecture
The system will be architected as a LAMP system, with the following components:
* Linux: CentOS 7
* Apache: Apache 2 web server
* PHP: PHP 7
* PostgreSQL: Postgres
Each component of the architecture will run on this platform. Any sub-component must either produce it's own http server on an available port, such as Elastic Search, or utilize the main Apache web server running a virtual host.
The following diagrams describe the architecture of internal components:
* ![Overall Server Architecture](http://gitlab.iath.virginia.edu/snac/Documentation/raw/master/Specifications/Originals/SNAC%20Server%20Architecture.svg)
# Third-Party Documentation
This directory contains documentation and links to off-the-shelf components used by the SNAC project.
- check into Apache httpd and http/2 as well as supporting Opportunistic encryption:
* [ArsTechnica: new firefox version says might as well to encrypting all web traffic](http://arstechnica.com/security/2015/04/new-firefox-version-says-might-as-well-to-encrypting-all-web-traffic/)
#### Brian's API docs need to be merged in or otherwise referred to:
[https://gist.github.com/tingletech/4a3fc5f59e5af3054286](https://www.google.com/url?q=https%3A%2F%2Fgist.github.com%2Ftingletech%2F4a3fc5f59e5af3054286&sa=D&sntz=1&usg=AFQjCNEJeJexryBtHbvLw-WtFYjxP4VwlQ)
#### Not sure where to fit these topics into the requirements. Some of them may not be part of technical requirements:
Discuss. What is "as it is configured now"? Consider implementing linked data standard for relationship links
instead of having to download an entire document of links (as it is configured now.)
Discuss. This seems to be the controlled vocabulary issue. Sort by common subject headings across all of SNAC - right now SNAC has
subject headings that have been applied locally without common practice
across the entire corpus.
We probably need to build our own holdings authority.
We need to write code to get accurate holdings info from WorldCat records. All the other repositories will
have be handled on a case-by-case basis. Sort by holdings location. Sort by identity's activity location. Sort
and visualize a person through time (show dates for events in a person or organization's lifetime). Sort and
visualize an agency or organization as it changes over time.
Continue to develop and refine context widget.
Sort collection links. Add weighting to understand which collections have more material directly related to
identity. (How is this best handled programmatically or as an input by contributors- maybe both?).
Increase exposure of SNAC to general public by leveraging partnerships. Suggested agreement with Wikipedia to
display Wikipedia content in SNAC biographical area and work with Wikipedia to allow for links to SNAC at the
bottom of all applicable identities. This would serve to escalate and drive traffic to SNAC.
#### Expanded Database Schema
The database schema has been rewritten to capture all the data in CPF files, as well as meet the various data requirements.
Each field within CPF may (will?) need provenance meta data. Likewise many fields in the database may need
data for provenance. This has not been done, and the developers need policy on provenance, as well as
examples. There seems to be little or no mention of provenance in Rachael's UI requirements.
The new schema has full versions of all records for all time. If not implemented, this is planned. The version
table records each table name, record id, user id who modified, and time datestamp. No changes were made to
existing tables, although existing tables may have gotten a field to distinguish old from current
records. The implementation may change.
Every record has a unique id. The watch system is a query run on some schedule (daily, hourly, ?) that checks
to see if a watched record has changed. CPF record has links to a “watch” table so users can watch each
record, and can watch for certain types of changes. Need UI for the watch system. Need an API for the watch
system.
Need a user table, group (role) table, probably a group permission table so that permissions are hard code
with groups. We also want to allow several permissions per group. Need UI for user, group, and
group-permission management.
We have created a generalized workflow system (as opposed to an ad-hoc linked set of reports). There is a work
flow state table which needs to be moved into the database.
Need fields to deal with delete/embargo. This may be best implemented via a trigger or perhaps a view. By
making what appear to be simple SELECTs through a view, the view can exclude deleted records. We must think
about how using a view (or trigger) will effect UPDATE and INSERT. Ideally the view is transparent. Is there
some clever way we can restrict access to the original table only via the view?
Need record lock on some types of records. This lock needs to be honored by several modules, so like “delete”,
lock might best be implemented via a view and we \*only\* access the table in question via the view.
If there are different levels of review for different elements in the record, then we need extra granularity
in the workflow or the edited record info to know the type of record edited apropos of workflow variations.
If there different reviewers for different parts of the record, then workflow data (and workflow
configuration) needs to be able to notify multiple people, and would have to get multiple reviewer approvals
before moving to the next phase of the workflow.
Institutional affiliation is probably common enough to want a field in the user table, as opposed to creating
a group for each institution. The group is perhaps more generalized and could behave identical (or almost
identical) to a field (with controlled vocabulary) in the user table.
Make sure we can write a query (report) to count numbers of records based type of edit, institution of the
editor, and number of holdings.
If we want to be able to quickly count some CPF element such as outgoing links from CPF to a given
institution, then we should put those CPF values into the SQL database, as meta data for the CPF record.
What is: How many referral links to EAC records that they created?
Be able to count record views, record downloads. Institutional dashboard reports need the ability to group-by
user, or even filter to a specific user.
Reporting needs to help managers verify performance metrics. This assumes that all changes have a
date/timestamp. Once workflow and process decisions are set, performance requirements for users such as
load/performance (how many updates and changes to records can be handled at once), search response time, edit
time (outside of review workflow), and update times need to be set.
Effort reporting to allow SNAC and participants to communicate to others the actual level of effort
involved. This sounds like a report with time span and numbers of records handled in various ways. SNAC might
use this when going from pilot into production so that everyone knows what effort will be required for X
number of records/actions (of whatever action type).
Time/activity reporting could allow us to assess viability, utility, and efficiency of maintenance system
processes.
Similar reports might be generated to evaluate the discovery interface. Something akin to how much time was
required to access a certain number of records. Rachael said: Assess viability of access funtionality-
performance time, available features, and ease of use.
We could try to report on the amount of training necessary before a new user was able to work independently in
each of various areas (content input, review, etc.)
# Unsorted Documents
This is a temporary-holding facility for documents as they are parsed and placed into the appropriate sections of the documentation.
Internal flow:
1. validate the inputs.
1. Somehow slice and dice the CGI params of the REST call into an abstracted request we can pass to the
internal API. I suppose that the external and internal APIs are very similar, but we almost certainly need
some level of symbolic reference aka abstraction. Each REST call has its requisite data. Some data is as
simple as a record id, and some will be fairly interesting json data structures.
1. The web app API does the tasks specified by the REST request and the work flow engine's directions.
1. Every http request must go through the work flow engine so that the work flow is validated and managed.
1. Every web app has a work flow, but people mostly just cobble that together with a bunch of implied
functionality using conditionals and side-effect-full function calls. In our code, the internal API is
100% work flow agnostic.
1. I can explain this in more detail, but it makes a huge improvement in the structure of the application.
1. Create the output data object if it wasn't created by the functions doing the work.
1. Pass the output data to a rendering function (or module) to be rendered into the appropriate output format:
html, text, xml, etc. and sent to stdout, or returned as an http file download. JSON probably doesn't need to
be rendered since JSON is "data" and not "presentation".
The work flow engine relies on functions that read application data and return booleans so that the
work flow engine can detect the application's relevant state. I guess that sounds confusing because the work
flow engine has state, and the application has state. Those two types of state are vastly different and only
related to each other in that the work flow engine can detect the application's state. The internal API of the
web app has no idea that the work flow engine even exists. And the work flow engine knows what work needs to
be done, but has no idea how it will be done. This is a very lovely separation of concerns.
...@@ -21,54 +21,44 @@ This is the definitive list of all requirements, briefly. Anything the applicati ...@@ -21,54 +21,44 @@ This is the definitive list of all requirements, briefly. Anything the applicati
list. Each item and group of items is explained in detail later in the document. Being a "list", this includes list. Each item and group of items is explained in detail later in the document. Being a "list", this includes
only sufficient detail to disambiguate items. only sufficient detail to disambiguate items.
- authentication * User Management
- authentication
- user creation
- authentication
- account maintenance
- authorization
- user/group/other (ugo) with read/write (rw) privilege system, typical for Linux
- admin tool for group privs
- create/edit/delete groups
- create privs matched to API functionality
* User Interface
- search/discover cpf data; need a list of filters/facets
- dashboard
- dashboard content/tabs
- search history
- clear history
- search history
- work status
- change sort order (maybe version 2)
- system/work flow messages
- account settings
- social media
- web admin (for admins only)
- institutional admin (for institutional admins only)
- moderator admin (for moderators only)
- edit cpf data
- edit UI
- per field data validation
- record validation
- user message system in UI
- work flow
- dashboard for workspace, task list
* Generated Documents
- available reports
- EAC-CPF export
- RDF/Turtle triples
- JSON-LD
- user creation
- authentication
- account maintenance
- authorization
- user/group/other (ugo) with read/write (rw) privilege system, typical for Linux
- admin tool for group privs
- create/edit/delete groups
- create privs matched to API functionality
- search/discover cpf data; need a list of filters/facets
- dashboard
- dashboard content/tabs
- search history
- clear history
- search history
- work status
- change sort order (maybe version 2)
- system/work flow messages
- account settings
- social media
- web admin (for admins only)
- institutional admin (for institutional admins only)
- moderator admin (for moderators only)
- available reports
- links to the rest of the web site, especially search and edit
- edit cpf data
- edit UI
- per field data validation
- record validation
- user message system in UI
- work flow
- dashboard for workspace, task list
- split merged records, know that some record consists of merged records - split merged records, know that some record consists of merged records
...@@ -93,12 +83,6 @@ only sufficient detail to disambiguate items. ...@@ -93,12 +83,6 @@ only sufficient detail to disambiguate items.
- architecture of identity, expandable design - architecture of identity, expandable design
- authority and controlled vocabulary management - authority and controlled vocabulary management
- web UI/web application
- Linux, Apache httpd, PostgreSQL (aka Postgres)
- HTML, CSS, JavaScript
- work flow
- work flows - work flows
- may want wild-west non-locking edits - may want wild-west non-locking edits
...@@ -106,7 +90,7 @@ only sufficient detail to disambiguate items. ...@@ -106,7 +90,7 @@ only sufficient detail to disambiguate items.
- ability to issue reminders - ability to issue reminders
- integrated email notification - integrated email notification
- "watched" records (might be reporting, and not specifically work flow) - "watched" records (might be reporting, and not specifically work flow)
- reporting - reporting
- help desk - help desk
...@@ -129,33 +113,37 @@ only sufficient detail to disambiguate items. ...@@ -129,33 +113,37 @@ only sufficient detail to disambiguate items.
format string and be done with it. However, some URLs have interesting issues that require code and thus format string and be done with it. However, some URLs have interesting issues that require code and thus
exceed the abilities of normal format strings. We can certainly roll out an early version with format exceed the abilities of normal format strings. We can certainly roll out an early version with format
strings, and add some clever functions later as necessary. strings, and add some clever functions later as necessary.
* **RH: I don't understand this. If we're generating persistant IDs, then we don't need to write "clever functions"**
- Do we need any additional requirements for related name linking, or more accurately identity linking? Each - Do we need any additional requirements for related name linking, or more accurately identity linking? Each
identity has and ARK which is a persistent ID with an assciated URL. Use cases for identity links: identity has and ARK which is a persistent ID with an assciated URL. Use cases for identity links:
1. SNAC links one identity to another internally based on relations between identities 1. SNAC links one identity to another internally based on relations between identities
1. SNAC links to itself as a name authority 1. SNAC links to itself as a name authority
1. SNAC links to external identities 1. SNAC links to external identities
1. SNAC links to external archival resources 1. SNAC links to external archival resources
2. External resources link to SNAC as an authority. (Tom comment: is SNAC also an archival resource?) 2. External resources link to SNAC as an authority. (Tom comment: is SNAC also an archival resource?)
- Clarify: the co-op version 1 is not going to support bulk data ingest - Clarify: the co-op version 1 is not going to support bulk data ingest
* This may be a simple bi-product of the Rest API being available
- Clarify: the co-op version 1 is not going to support bi-directional data exchange and update - Clarify: the co-op version 1 is not going to support bi-directional data exchange and update
- Do we need full delete? For example, a CPF contains something illegal and must be fully deleted. How do we - Do we need full delete? For example, a CPF contains something illegal and must be fully deleted. How do we
delete from backups? Are either of these even required by policy? delete from backups? Are either of these even required by policy?
- Are we assuming that data from the web browser has been sanity checked before hitting the server? (Yes, by - Are we assuming that data from the web browser has been sanity checked before hitting the server? (Yes, by
the data validation API) the data validation engine)
* **Todo: Where will the engine live, in the browser (Javascript) or on the server?**
- Does the server need to save temporary edit data prior to writing the data to the cpf database? For example, what if - Does the server need to save temporary edit data prior to writing the data to the cpf database? For example, what if
someone enters "19th century" in a date field? It isn't valid, but we need to save their work. (Yes, we need to save invalid user input, and give the user a useful message for each type of data validation failure.) someone enters "19th century" in a date field? It isn't valid, but we need to save their work. (Yes, we need to save invalid user input, and give the user a useful message for each type of data validation failure.)
* **Todo: Where does the data validation engine live? If we make that part of the UI, it may live on the browser as a downloaded JS engine**
- We need to sanity check any links we create, especially links back into SNAC. - We need to sanity check any links we create, especially links back into SNAC.
- Don't forget (to create) the X-to-CPF field mapping documentation, and this ties in to the "CPF data contributor's" - Don't forget (to create) the X-to-CPF field mapping documentation, and this ties in to the "CPF data contributor's"
...@@ -163,11 +151,11 @@ only sufficient detail to disambiguate items. ...@@ -163,11 +151,11 @@ only sufficient detail to disambiguate items.
- We need the "CPF data contributor's" guide. - We need the "CPF data contributor's" guide.
- What authority work will we be doing? - What authority work will we be doing?
- For example, holding institution ISIL identifier, name, address, contact person, etc. - For example, holding institution ISIL identifier, name, address, contact person, etc.
- What authority data from other sources do we cache locally? - What authority data from other sources do we cache locally?
- We need examples of this, as well as a process to manage those resources. It is important to know where - We need examples of this, as well as a process to manage those resources. It is important to know where
the data came from, technically how it was acquired, the date we acquired it, and some methods of the data came from, technically how it was acquired, the date we acquired it, and some methods of
...@@ -176,17 +164,17 @@ only sufficient detail to disambiguate items. ...@@ -176,17 +164,17 @@ only sufficient detail to disambiguate items.
- Create detailed functional requirements for controlled vocabularies, and a detailed implementation - Create detailed functional requirements for controlled vocabularies, and a detailed implementation
specification. specification.
- Clarify: versioning is per-record, not per-field. - Clarify: versioning is per-record, not per-field.
- Need a watch/notification API. It needs a canonical name. Is there an off-the-shelf event monitor that will - Need a watch/notification API. It needs a canonical name. Is there an off-the-shelf event monitor that will
easily integrate with the web REST API and work flow manager? easily integrate with the web REST API and work flow manager?
- We can write our own status and staging API. It only requires modest SQL schema work. Most of the - We can write our own status and staging API. It only requires modest SQL schema work. Most of the
necessary data is already planned for other features. For example, records can be locked by a user, we necessary data is already planned for other features. For example, records can be locked by a user, we
know who has the lock, we need administrative functions for unlocking and transfering locks, the work know who has the lock, we need administrative functions for unlocking and transfering locks, the work
flow explicitly lays out the process for each user interaction with the application. flow explicitly lays out the process for each user interaction with the application.
- Clarify: Are we integrating SNAC and ArchiveSpace in co-op version 1? Will ArchiveSpace have to use our REST API? - Clarify: Are we integrating SNAC and ArchiveSpace in co-op version 1? Will ArchiveSpace have to use our REST API?
- How is embargo implemented at the database level? What are the requirements for embargo? - How is embargo implemented at the database level? What are the requirements for embargo?
...@@ -194,20 +182,20 @@ only sufficient detail to disambiguate items. ...@@ -194,20 +182,20 @@ only sufficient detail to disambiguate items.
- comment: Clarify and/or verify: Technical review vs content review is handled by a combination of roles and - comment: Clarify and/or verify: Technical review vs content review is handled by a combination of roles and
work flow. work flow.
- comment: Reports: Where are we keeping the Big List of All Reports? - comment: Reports: Where are we keeping the Big List of All Reports?
- comment: Clarify: row 43, (unclear) Consider implementing inked data standard for relationship links - comment: Clarify: row 43, (unclear) Consider implementing inked data standard for relationship links
instead of having to download an entire document of links, as it is configured now. instead of having to download an entire document of links, as it is configured now.
- Search: need the Big List of Search Facets, and someone needs to verify that Elastic Search can do facets. - Search: need the Big List of Search Facets, and someone needs to verify that Elastic Search can do facets.
- Does co-op version 1 have a timeline visualization? Does it have a "sort by timeline"? - Does co-op version 1 have a timeline visualization? Does it have a "sort by timeline"?
- What does it mean to sort by timeline? - What does it mean to sort by timeline?
- comment: Clarify: What is a context widget? - row 52, Continue to develop and refine context widget. (technical - comment: Clarify: What is a context widget? - row 52, Continue to develop and refine context widget. (technical
requirements unclear) requirements unclear)
- comment: Clarify: we need requirements for citations, and details about where they integrate with the rest of the - comment: Clarify: we need requirements for citations, and details about where they integrate with the rest of the
system. system.
...@@ -302,7 +290,7 @@ Users will have individual accounts, so we can enable a search history, ...@@ -302,7 +290,7 @@ Users will have individual accounts, so we can enable a search history,
internal bookmarks, and various saved reports (assuming faceted search internal bookmarks, and various saved reports (assuming faceted search
where it could take many mouse clicks to accrete a specific search). where it could take many mouse clicks to accrete a specific search).
#### User interface for Discovery #### User interface for Discovery
#### Functionality for Splitting #### Functionality for Splitting
...@@ -316,7 +304,7 @@ ARK server will note the new ARKs of the resulting descriptions in both human re ...@@ -316,7 +304,7 @@ ARK server will note the new ARKs of the resulting descriptions in both human re
formats. Outside parties with an invalid ARK will probably have to manually update their descriptions, since formats. Outside parties with an invalid ARK will probably have to manually update their descriptions, since
the entity name is too confusing for a computer to disambiguate. (Although we can easily create a report of the entity name is too confusing for a computer to disambiguate. (Although we can easily create a report of
deprecated ARKs on a per-institution basis.) When merging descriptions, the main ARK will be retained, and deprecated ARKs on a per-institution basis.) When merging descriptions, the main ARK will be retained, and
merged ARKs can simply redirect to it. merged ARKs can simply redirect to it.
Note: determine which operations require a new ARK, either due to the old ARK being so much changed as the Note: determine which operations require a new ARK, either due to the old ARK being so much changed as the
original reference is meaningless, or other causes TBD. original reference is meaningless, or other causes TBD.
...@@ -494,138 +482,6 @@ also needs to support bulk data edits of several types. ...@@ -494,138 +482,6 @@ also needs to support bulk data edits of several types.
Does this mean the admin dashboard? Does this mean the admin dashboard?
#### User Management
Authentication is validating user logins to the system. Authorization is the related aspect of controlling
which parts of the system users may access (or even which parts they may know exist).
We can use OpenID for authentication, but we will need a user profile for SNAC roles and authorization. There
are examples of PHP code to implement OpenID at stackexchange:
http://stackoverflow.com/questions/4459509/how-to-use-open-id-as-login-system
OpenID seems to constantly be changing, and sites using change frequently. Google has (apparently) deprecated
OpenID 2.0 in favor of Open Connect. Facebook is using something else, but apparently FB still works with
OpenID. Stackexchange supports several authentication schemes. If they can do it, so can we. Or we can support
one scheme for starters and add others as necessary. The SE code is not open source, so we can't see how much
work it was to support the various OpenID partners.
Authorization involves controlling what users can do once they are in the system. That function is sort of
more solved by OAuth or OpenID by sharing the user profile. However, SNAC has specific requirements,
especially our roles, and those will not be found in other system. There is not anything we must have from
user profiles. We might want their social networking profile, but social networking is not a core function of
SNAC.
By default users can't do anything that isn't exposed to the non-authenticated public users. Privileges are
added and users are given roles (aka groups) from which they inherit privileges. The authorization system is
involved in every transaction with the server to the extent that every request to the server is checked for
authorization before being passed to the code doing the real work.
The Linux model of three privilege types "user", "group", and "other" works well for authorization permissions
and we should use this model. "User" is an authenticated user. "Group" is a set of users, and a user may
belong to several groups. In SNAC and the non-Linux world "group" is known as "role", so SNAC will call them
"roles". "Other" privileges apply to SNAC as public, non-authenticated users, although we don't really have
"other", and the "researcher" role applies to public users.
Users can have several roles, and will have all the privileges of all their roles. Role membership is managed
by an administrative UI (part of the dashboard) and related API code. User information such as name, phone
number, and even password can also change. User ID values cannot be changed, and a user ID is never reused,
even after account deletion.
We expect to create additional roles as necessary for application functions.
Roles include a large number "is instution member" roles. These should be roles like any other, but we may
want to flag these role records to make them easy to manage and easy to display in the UI. Any user can have
zero or more roles that define their instutional affiliation. This primarily effects reporting and admin. In
the case of reports, membership in an institution constrains the reporting. When setting up a report, users
may only choose from institutions of which they are members. Some reports may auto-detect the user's
membership.
By and large when we refer to "accounts" we mean web accounts managed by the Manager/Web admin. The general
public can use the discovery interface without an account, but saving search history, and other
session related discovery tools requires an account. It is technically possible to have a single session
dashboard. Although that has not been mentioned as a requirement and is probably a low priority, it might be
almost trivial to implement.
Every account will be in the "Researcher" role which has the same privileges as the general public, but with a
TBD set of basic privileges including: search history, certain researcher reports.
| User type | Role | Description |
|----------------------------+---------------------+-----------------------------------------------------------------------|
| Sysadmin | Server admin | Maintain server, backups, etc. |
| Database Administrator | DBA | Schema maintenance, data dumps, etc. |
| Software engineer | Developer | Coding, testing, QA, release management, data loading, etc. |
| Manager | Web admin | Web accounts: create, manage, assign roles, run reports |
| Peer vetting | Vetting | Approve moderators, reviewers, content experts |
| Moderator | Moderator | Approve maintenance changes, posting those changes |
| Reviewer/editor | Maintenance | Maintainer privileges, interacts with moderators |
| Content expert | Maintenance | Domain expert, may have zero institutional roles |
| Documentary editor | Maintenance | Distinguished by? |
| Maintenance | Maintenance | Distinguished by? |
| Researcher | Researcher | Use the discovery interface and history dashboard |
| Archival description donor | Block upload | Bulk uploads of CPF or finding aids |
| Name authority manager | Name authority | Donates name authority data perhaps via bulk upload |
| Institutional admins | Institutional admin | Instutional role admin dashboard, institutional reports |
| Public | Researcher | No account, researcher role, no dashboard or single session dashboard |
Remember: institutional affiliation roles aren't in the table above. There will be many of those roles, and
users may have zero, one, or several institutional roles that define which insitutions that user is a member
of.
It is possible for an institutional admin to be a member of more than one institution. Institutional Admins
have abilities:
- view membership lists of their institution(s)
- add or remove their instutional role for users.
Roles which require one or more instutitutional roles (affiliation):
- Block upload
- Name authority
- Institutional admin
Roles which may have zero or more institutional roles:
- Web admin
- Vetting
- Moderator
- Maintenance (likely to have one or more)
- Researcher
There are several dashboard sections:
- Standard researcher history
- Standard user account management (password, email, etc.)
- Web admin account creation, deletion, role assignments
- Vetting admin (if we have vetting)
- Available reports.
#### Web Application Administration
System administration will be required for the web application and the
server hosting the web site. This is well understood from a technical
point of view. We should have more than usual documentation of the
command line accounts involved, and server configuration. This aspect of
administration integrates with versioning, backup, and software
releases.
#### Reports
While the web interface is the primary public face of SNAC, many other views of the data and meta data are
necessary, especially for admins and governance. Those "views" are reports and will primary be generated via
integration of a third-party reporting package such as Jaspersoft Business Intelligence Suite, which is free,
open source, and includes a full range of tools. All SNAC data resides in PostgreSQL, the standard SQL
relational database management system (RDBMS) which simplifies the process of adding reporting and business
intelligence.
(How much detail do we want about reports? Maybe just half a dozen
examples?)
#### System Administration #### System Administration
...@@ -687,79 +543,9 @@ logic that we will support with UI, code, and database tables/fields. ...@@ -687,79 +543,9 @@ logic that we will support with UI, code, and database tables/fields.
Many reports will be limited certain roles. Admin users will likely be Many reports will be limited certain roles. Admin users will likely be
heavy report users. heavy report users.
#### Ability to Open/Close the Site during Maintenance
If the web application has a "closed for maintenance" feature, this feature would be available to web admins,
even though it is the Linux sysadmins who will do the maintenance. A common major failure of web applications
is the assumption that the product is always up. This creates havoc when the site simply fails to load due to
an outage, planned or otherwise. With a little work we should be able to have an orderly "site is closed" web
page and status message for planned outages. We might be able to failover to some kind of system status
message. This is a low priority feature since downtime is probably only a few hours per year. At the same
time, if it isn't too difficult to implement, it sets our project apart from the majority who either ignore
the problem, or let their help desk folks spend an hour apologizing to customers.
When the product is closed, web admins should be able to login (assuming login is possible).
comment: Do we want an architecture where the login is essentially a separate product so that we can have a
"lobby" and other front end features that continue to work even when the backend is down for maintenance?
Most sites simply return a server error or site not available (404) when the site is down for whatever
reason. We can avoid this a couple of ways. The simplest is to use some Apache server features and a few
simple scripts so that users see a nice message when the site is down for maintenance. This very simple
approach requires little or no change to our software architecture. The more elegant approach is to use one of
several system architectures that  keep a small system front end always running.
#### Sandbox for Training, perhaps as a clone of the QA system?
#### ArchiveSpace Feature Planning via Brad #### ArchiveSpace Feature Planning via Brad
This section will require some discussion (conference calls) with Brad This section will require some discussion (conference calls) with Brad
and others. and others.
#### Staffing Model (Brian's draft suggestions)
Production of a cooperatively maintained high profile web site requires
different types of Technical and non-technical work.
Operations Team
- Communications and interactions with end users and content owners,
from marketing to user support, assessment
- Manages help desk
- Support production web application infrastructure, including
monitoring, "on call" for first tier response to system monitors
- batch ingest of new data sources
- signs up and on-boards new pilot members
- Proactive content QA and remediation
- work organized around issue queue / customer relationship management
system
Main Artifact: Ticketing Issue tracker that automatically generates a
ticket for an email to help@example.edu
Development Team
- Create new features that deliver customer value
- Maintain tests for new features
- second tier support of deployed features, developers on call for
their deployed code
- deploy code to test, stage, and production environments
- work organized around sprints
Main Artifact: User story backlog that supports scoring stories by
points,
Research Team
- Conduct experiments with new algorithms and technologies
- interoperation (and participation in the development) of relevant
domain specific standards and practices
Main Artifact: Research Agenda, schemas and specifications (esp. merge
spec)
# Overall Plan
### Table of Contents
* [Big questions](#big-questions)
* [Documents we need to create](#documents-we-need-to-create)
* [Governance and Policies, etc.](#governance-and-policies-etc)
* [Overview and order of work](#overview-and-order-of-work)
* [Non-component notes to be worked into requirements](#non-component-notes-to-be-worked-into-requirements)
* [System Design](#system-design)
* [Developed Components](#developed-components)
* [Off-the-shelf Components](#off-the-shelf-components)
* [Controlled vocabularies and tag system](#controlled-vocabularies-and-tag-system)
### Big questions
- (solved) how is gitlab backed up?
- Shayne backs up the whole gitlab VM.
- We need a complete understanding of our requirements for controlled vocabulary, ontology, and/or tagging as
well as how this relates to search facets. This also impacts our future ability to make assertions about the
data, and is somewhat related to semantic net. See [Tag system](#controlled-vocabularies-and-tag-system).
### Documents we need to create
- Operations and Procedure Manual
- Formal Requirements Document
- Formal Specification Document
- Research Agenda
- User Story Backlog
- Design Documents (UI/UX/Graphic Design)
- ideally someone writes a (possibly brief) style guide
- a set of .psd or other images is not a style guide
### Governance and Policies, etc.
- Data curation, preservation, graceful retirement
- Data expulsion vs. embargo
- Duplicates, backups, restore, related policy and technical issues
- Broad pieces that are missing or underdeveloped [Laura]
- Refresh relationship with OCLC [John, Daniel]
### Overview and order of work
1. List requirements of the overall application. (done)
2. Organize requirements by component, clean up, flesh out, and vet. (requires team meetings)
3. Create formal specifications for each component based on the official, clean, requirements document. Prototypes will help ensure the formal spec is written correctly.
4. Define a timeline for development and prototyping based on the formal specifications document.
5. Create tests for test-driven development based on the formal specification. This includes creating and mining ground-truth data.
6. Develop software based on formal specification that passes the given tests.
### Non-component notes to be worked into requirements
- CPF record edit, edit each field
- CPF record split, split data into separate cpf identities, deprecate old ARK, mint new ARKs
- CPF record merge, combine fields, deprecate old ARKs, mint new ARK
### System Design
#### Developed Components
- Data validation engine
- **API:** Custom JSON (needs formal spec)
- The data validation engine applies a written system of rules to the incoming data. The rules must be written in a human-readble form, such that non-technical individuals are able to write and understand the rules. A rule-writing guide must be supplied to give hints and help for writing rules properly. The engine will be pluggable and written as an MVC application. The model will read the user-written rules (stored in a postgres database or flat-file system, depending on the model) and apply them to any input given on the view. The initial view will be a JSON API, which accepts individual fields and returns the input with either validation suggestions or valid flags.
- rule based system abstracted out of the code
- rules are data
- change the rules, not the actual application code
- rules for broad classes of data type, or granular rules for individual fields
- probably used this to untaint data as well (remove things that are potential security problems)
- send all data through this API
- every rule includes a message describing what when wrong and suggesting fixes
- rules potentially editable by non-programmers
- rules are based on co-op data policies, which implies a data policy document, or the rules **can** be the
policy documentation.
- Identitiy Reconciliation (aka IR) (architect Robbie)
- **API:** Custom JSON (needs formal spec)
- needs docs wrangled
- workflow manager (architect Tom)
- **API:** Custom JSON? (needs formal spec)
- exists, needs tests, needs requirements
* **We need to stop now, write requirements, then apply those requirements to the existant system to ensure we meet the requirements**
- needs to be integrated into an index.php script that also checks authentication
- can the workflow also support the login.php authentication? (Yes).
- PostgreSQL Storage: schema definition (Robbie, Tom)
- **API:** SQL
- exists, needs tests, needs requirements
* **We need to stop now, write requirements, then apply those requirements moving forward to ensure we meet the requirements**
- should we re-architect tables become normal tables, the views go away, and versioned records are moved to shadow tables.
- add features for delete-via-mark (as opposed to actual delete)
- add features to support embargo
- *maybe, discuss* change vocabulary.sql from insert to copy. It would be smaller and faster, although in reality as soon as
it is in the database, the text file will never be touched again.
- discuss; Can/should we create a tag system to deal with ad-hoc requirements later in the project? [Tag system](#controlled-vocabularies-and-tag-system)
- CPF to SQL parser (Robbie)
- **API:** EAC-CPF XML input, JSON output? (needs formal spec)
- exists, needs tests, needs requirements
* **We need to stop now, write requirements, then apply those requirements moving forward to ensure we meet the requirements**
- NameEntity serialization tool, selectable pre-configured formats
- NameEntity string parser
- **API:** subroutine? JSON?
- Can we find a grammar-based parser for PHP? Should we use a standalone parser?
- Can we expose this as a JSON API such that it's given a name-string and returns an identity object of that identity's information? Possibly a score as well as to how well we thought we could parse it?
- Name parser (only a portion of the NameEntity string)
- **API:** subroutine? JSON?
- Can this use the same parser engine as the name string parser?
- Date parser
- **API:** subroutine? JSON?
- Can this use the same parser engine as the name string parser?
- **This should be distinct, or may be a subroutine of the nameEntry-string parser**
- Can we expose this as a JSON API such that given a set of dates, it returns a date object that lists out the individual dates? Then, it could be called from the name-string parser to parse out dates.
- Editing User interface
- **API:** HTML front-end, makes calls to internal JSON API
- Must have ajax-backed interaction for displaying and searching large lists, such as cpfRelations for an identity.
- We need to have UI edit/chooser widget for search and select of large numbers of options, such as the Joseph
Henry cpfRelations that contain some 22K entries. Also need to list all fields which might have large numbers
of values. In fact, part of the meta data for every field is "number of possible entries/reapeat values" or
whatever that's called. From a software architecture perspective, the answer is 0, 1, infinite.
- History Research Tool (redefined)
- **API:** HTML front-end, makes calls to internal JSON API
- Needs to be reworked to support the Postgres backend
#### Off-the-shelf Components
- gitlab for developer documentation, code version management, internal issue tracking and milestone keeping
- github public code repository
- test framework, need to choose one
- authentication
- session management, especially as applies to authentication tokens, cookies and something which prevents
XSS (cross-site scripting) attacks
- JavaScript UI component tools, JQuery; what others?
- Suggestions: bootstrap, angular JS, JQueryUI
- reports, probably Jasper
- PHP, Postgres, Linux, Apache httpd, etc.
- language modules ?
#### Controlled vocabularies and tag system
Tags are simply terms. When inplemented as fixed terms with persistent IDs and some modify/add policy, tags
become a flat (non-hierarchal) controlled vocabulary.
The difference being a weaker moderation of tags and more readiness to create new tags (types). The tag table
would consist of tag term and an ID value. Tag systems lack data type, and generally have no policy or less
restrictive policies about creating new tags
Below are some subject examples. It is unclear if these are each topics, or if "--" is used to join granular
topics into a topic list. Likewise it is unclear if this list relies on some explicit hierarchy.
```
American literature--19th century--Periodicals
American literature--20th century--Periodicals
Periodicals
Periodicals--19th century
World politics--Periodicals
World politics--Pictorial works
World politics--Societies, etc.
World politics--Study and teaching
```
**RH: I agree, this is super tricky. We need to distinguish between types of controlled vocab, so that we don't mix Occupation and Subject. A tagging system might be very nice for at least subjects.**
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.2" baseProfile="tiny" width="279.4mm" height="215.9mm" viewBox="0 0 27940 21590" preserveAspectRatio="xMidYMid" fill-rule="evenodd" clip-path="url(#presentation_clip_path)" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<defs class="ClipPathGroup">
<clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
<rect x="0" y="0" width="27940" height="21590"/>
</clipPath>
</defs>
<defs>
<font id="EmbeddedFont_1" horiz-adv-x="2048">
<font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1855" descent="428"/>
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/>
<glyph unicode="z" horiz-adv-x="886" d="M 83,0 L 83,137 688,943 117,943 117,1082 901,1082 901,945 295,139 922,139 922,0 Z"/>
<glyph unicode="y" horiz-adv-x="1028" d="M 191,-425 C 142,-425 100,-421 67,-414 L 67,-279 C 92,-283 120,-285 151,-285 263,-285 352,-203 417,-38 L 434,5 5,1082 197,1082 425,484 C 428,475 432,464 437,451 442,438 457,394 482,320 507,246 521,205 523,196 L 593,393 830,1082 1020,1082 604,0 C 559,-115 518,-201 479,-258 440,-314 398,-356 351,-384 304,-411 250,-425 191,-425 Z"/>
<glyph unicode="x" horiz-adv-x="1028" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 Z"/>
<glyph unicode="w" horiz-adv-x="1514" d="M 1174,0 L 965,0 776,765 740,934 C 734,904 725,861 712,805 699,748 631,480 508,0 L 300,0 -3,1082 175,1082 358,347 C 363,331 377,265 401,149 L 418,223 644,1082 837,1082 1026,339 1072,149 1103,288 1308,1082 1484,1082 Z"/>
<glyph unicode="v" horiz-adv-x="1028" d="M 613,0 L 400,0 7,1082 199,1082 437,378 C 446,351 469,272 506,141 L 541,258 580,376 826,1082 1017,1082 Z"/>
<glyph unicode="u" horiz-adv-x="914" d="M 314,1082 L 314,396 C 314,325 321,269 335,230 349,191 371,162 402,145 433,128 478,119 537,119 624,119 692,149 742,208 792,267 817,350 817,455 L 817,1082 997,1082 997,231 C 997,105 999,28 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 826,132 825,185 L 822,185 C 781,110 733,58 679,27 624,-5 557,-20 476,-20 357,-20 271,10 216,69 161,128 133,225 133,361 L 133,1082 Z"/>
<glyph unicode="t" horiz-adv-x="543" d="M 554,8 C 495,-8 434,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 474,127 509,132 554,141 Z"/>
<glyph unicode="s" horiz-adv-x="942" d="M 950,299 C 950,197 912,118 835,63 758,8 650,-20 511,-20 376,-20 273,2 200,47 127,91 79,160 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 602,117 669,131 712,159 754,187 775,229 775,285 775,328 760,362 731,389 702,416 654,438 589,455 L 460,489 C 357,516 283,542 240,568 196,593 162,624 137,661 112,698 100,743 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 759,862 732,899 689,925 645,950 586,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,783 283,758 299,738 315,718 339,701 370,687 401,673 467,654 568,629 663,605 732,583 774,563 816,542 849,520 874,495 898,470 917,442 930,410 943,377 950,340 950,299 Z"/>
<glyph unicode="r" horiz-adv-x="543" d="M 142,0 L 142,830 C 142,906 140,990 136,1082 L 306,1082 C 311,959 314,886 314,861 L 318,861 C 347,954 380,1017 417,1051 454,1085 507,1102 575,1102 599,1102 623,1099 648,1092 L 648,927 C 624,934 592,937 552,937 477,937 420,905 381,841 342,776 322,684 322,564 L 322,0 Z"/>
<glyph unicode="p" horiz-adv-x="943" d="M 1053,546 C 1053,169 920,-20 655,-20 488,-20 376,43 319,168 L 314,168 C 317,163 318,106 318,-2 L 318,-425 138,-425 138,861 C 138,972 136,1046 132,1082 L 306,1082 C 307,1079 308,1070 309,1054 310,1037 312,1012 314,978 315,944 316,921 316,908 L 320,908 C 352,975 394,1024 447,1055 500,1086 569,1101 655,1101 788,1101 888,1056 954,967 1020,878 1053,737 1053,546 Z M 864,542 C 864,693 844,800 803,865 762,930 698,962 609,962 538,962 482,947 442,917 401,887 371,840 350,777 329,713 318,630 318,528 318,386 341,281 386,214 431,147 505,113 607,113 696,113 762,146 803,212 844,277 864,387 864,542 Z"/>
<glyph unicode="o" horiz-adv-x="971" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 407,-20 288,28 207,125 126,221 86,360 86,542 86,915 248,1102 571,1102 736,1102 858,1057 936,966 1014,875 1053,733 1053,542 Z M 864,542 C 864,691 842,800 798,868 753,935 679,969 574,969 469,969 393,935 346,866 299,797 275,689 275,542 275,399 298,292 345,221 391,149 464,113 563,113 671,113 748,148 795,217 841,286 864,395 864,542 Z"/>
<glyph unicode="n" horiz-adv-x="914" d="M 825,0 L 825,686 C 825,757 818,813 804,852 790,891 768,920 737,937 706,954 661,963 602,963 515,963 447,933 397,874 347,815 322,732 322,627 L 322,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 358,972 406,1025 461,1056 515,1087 582,1102 663,1102 782,1102 869,1073 924,1014 979,955 1006,857 1006,721 L 1006,0 Z"/>
<glyph unicode="m" horiz-adv-x="1485" d="M 768,0 L 768,686 C 768,791 754,863 725,903 696,943 645,963 570,963 493,963 433,934 388,875 343,816 321,734 321,627 L 321,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 356,974 400,1027 450,1057 500,1087 561,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 967,970 1013,1022 1066,1054 1119,1086 1183,1102 1258,1102 1367,1102 1447,1072 1497,1013 1546,954 1571,856 1571,721 L 1571,0 1393,0 1393,686 C 1393,791 1379,863 1350,903 1321,943 1270,963 1195,963 1116,963 1055,934 1012,876 968,817 946,734 946,627 L 946,0 Z"/>
<glyph unicode="l" horiz-adv-x="229" d="M 138,0 L 138,1484 318,1484 318,0 Z"/>
<glyph unicode="k" horiz-adv-x="914" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 Z"/>
<glyph unicode="i" horiz-adv-x="229" d="M 137,1312 L 137,1484 317,1484 317,1312 Z M 137,0 L 137,1082 317,1082 317,0 Z"/>
<glyph unicode="h" horiz-adv-x="914" d="M 317,897 C 356,968 402,1020 457,1053 511,1086 580,1102 663,1102 780,1102 867,1073 923,1015 978,956 1006,858 1006,721 L 1006,0 825,0 825,686 C 825,762 818,819 804,856 790,893 767,920 735,937 703,954 659,963 602,963 517,963 450,934 399,875 348,816 322,737 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1057 321,1015 319,972 316,929 315,904 314,897 Z"/>
<glyph unicode="g" horiz-adv-x="942" d="M 548,-425 C 430,-425 336,-402 266,-356 196,-309 151,-243 131,-158 L 312,-132 C 324,-182 351,-221 392,-248 433,-275 486,-288 553,-288 732,-288 822,-183 822,27 L 822,201 820,201 C 786,132 739,80 680,45 621,10 551,-8 472,-8 339,-8 242,36 180,124 117,212 86,350 86,539 86,730 120,872 187,963 254,1054 355,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,917 825,952 828,1001 831,1050 833,1077 836,1082 L 1007,1082 C 1003,1046 1001,971 1001,858 L 1001,31 C 1001,-273 850,-425 548,-425 Z M 822,541 C 822,629 810,705 786,769 762,832 728,881 685,915 641,948 591,965 536,965 444,965 377,932 335,865 293,798 272,690 272,541 272,393 292,287 331,222 370,157 438,125 533,125 590,125 640,142 684,175 728,208 762,256 786,319 810,381 822,455 822,541 Z"/>
<glyph unicode="f" horiz-adv-x="571" d="M 361,951 L 361,0 181,0 181,951 29,951 29,1082 181,1082 181,1204 C 181,1303 203,1374 246,1417 289,1460 356,1482 445,1482 495,1482 537,1478 572,1470 L 572,1333 C 542,1338 515,1341 492,1341 446,1341 413,1329 392,1306 371,1283 361,1240 361,1179 L 361,1082 572,1082 572,951 Z"/>
<glyph unicode="e" horiz-adv-x="971" d="M 276,503 C 276,379 302,283 353,216 404,149 479,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 954,65 807,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,727 129,864 213,959 296,1054 416,1102 571,1102 889,1102 1048,910 1048,527 L 1048,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 481,969 412,940 361,882 310,823 282,743 278,641 Z"/>
<glyph unicode="d" horiz-adv-x="942" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 821,1035 821,1484 1001,1484 1001,223 C 1001,110 1003,36 1007,0 L 835,0 C 833,11 831,35 829,74 826,113 825,146 825,174 Z M 275,542 C 275,391 295,282 335,217 375,152 440,119 530,119 632,119 706,154 752,225 798,296 821,405 821,554 821,697 798,802 752,869 706,936 633,969 532,969 441,969 376,936 336,869 295,802 275,693 275,542 Z"/>
<glyph unicode="c" horiz-adv-x="885" d="M 275,546 C 275,402 298,295 343,226 388,157 457,122 548,122 612,122 666,139 709,174 752,209 778,262 788,334 L 970,322 C 956,218 912,135 837,73 762,11 668,-20 553,-20 402,-20 286,28 207,124 127,219 87,359 87,542 87,724 127,863 207,959 287,1054 402,1102 551,1102 662,1102 754,1073 827,1016 900,959 945,880 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 451,961 382,929 339,866 296,803 275,696 275,546 Z"/>
<glyph unicode="b" horiz-adv-x="943" d="M 1053,546 C 1053,169 920,-20 655,-20 573,-20 505,-5 451,25 396,54 352,102 318,168 L 316,168 C 316,147 315,116 312,74 309,31 307,7 306,0 L 132,0 C 136,36 138,110 138,223 L 138,1484 318,1484 318,1061 C 318,1018 317,967 314,908 L 318,908 C 351,977 396,1027 451,1057 506,1087 574,1102 655,1102 792,1102 892,1056 957,964 1021,872 1053,733 1053,546 Z M 864,540 C 864,691 844,800 804,865 764,930 699,963 609,963 508,963 434,928 388,859 341,790 318,680 318,529 318,387 341,282 386,215 431,147 505,113 607,113 698,113 763,147 804,214 844,281 864,389 864,540 Z"/>
<glyph unicode="a" horiz-adv-x="1057" d="M 414,-20 C 305,-20 224,9 169,66 114,123 87,202 87,302 87,414 124,500 198,560 271,620 390,652 554,656 L 797,660 797,719 C 797,807 778,870 741,908 704,946 645,965 565,965 484,965 426,951 389,924 352,897 330,853 323,793 L 135,810 C 166,1005 310,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1097,111 1117,113 1139,118 L 1139,6 C 1094,-5 1047,-10 1000,-10 933,-10 885,8 855,43 824,78 807,132 803,207 L 797,207 C 751,124 698,66 637,32 576,-3 501,-20 414,-20 Z M 455,115 C 521,115 580,130 631,160 682,190 723,231 753,284 782,336 797,390 797,445 L 797,534 600,530 C 515,529 451,520 408,504 364,488 330,463 307,430 284,397 272,353 272,299 272,240 288,195 320,163 351,131 396,115 455,115 Z"/>
<glyph unicode="W" horiz-adv-x="1942" d="M 1511,0 L 1283,0 1039,895 C 1023,951 1000,1051 969,1196 952,1119 937,1054 925,1002 913,950 822,616 652,0 L 424,0 9,1409 208,1409 461,514 C 491,402 519,287 544,168 560,241 579,321 600,408 621,495 713,828 877,1409 L 1060,1409 1305,532 C 1342,389 1372,267 1393,168 L 1402,203 C 1420,280 1435,342 1446,391 1457,439 1551,778 1727,1409 L 1926,1409 Z"/>
<glyph unicode="U" horiz-adv-x="1199" d="M 731,-20 C 616,-20 515,1 429,43 343,85 276,146 229,226 182,306 158,401 158,512 L 158,1409 349,1409 349,528 C 349,399 382,302 447,235 512,168 607,135 730,135 857,135 955,170 1026,239 1096,308 1131,408 1131,541 L 1131,1409 1321,1409 1321,530 C 1321,416 1297,318 1249,235 1200,152 1132,89 1044,46 955,2 851,-20 731,-20 Z"/>
<glyph unicode="T" horiz-adv-x="1199" d="M 720,1253 L 720,0 530,0 530,1253 46,1253 46,1409 1204,1409 1204,1253 Z"/>
<glyph unicode="S" horiz-adv-x="1199" d="M 1272,389 C 1272,259 1221,158 1120,87 1018,16 875,-20 690,-20 347,-20 148,99 93,338 L 278,375 C 299,290 345,228 414,189 483,149 578,129 697,129 820,129 916,150 983,193 1050,235 1083,297 1083,379 1083,425 1073,462 1052,491 1031,520 1001,543 963,562 925,581 880,596 827,609 774,622 716,635 652,650 541,675 456,699 399,724 341,749 295,776 262,807 229,837 203,872 186,913 168,954 159,1000 159,1053 159,1174 205,1267 298,1332 390,1397 522,1430 694,1430 854,1430 976,1406 1061,1357 1146,1308 1205,1224 1239,1106 L 1051,1073 C 1030,1148 991,1202 933,1236 875,1269 795,1286 692,1286 579,1286 493,1267 434,1230 375,1193 345,1137 345,1063 345,1020 357,984 380,956 403,927 436,903 479,884 522,864 609,840 738,811 781,801 825,791 868,781 911,770 952,758 991,744 1030,729 1067,712 1102,693 1136,674 1166,650 1191,622 1216,594 1236,561 1251,523 1265,485 1272,440 1272,389 Z"/>
<glyph unicode="R" horiz-adv-x="1256" d="M 1164,0 L 798,585 359,585 359,0 168,0 168,1409 831,1409 C 990,1409 1112,1374 1199,1303 1285,1232 1328,1133 1328,1006 1328,901 1298,813 1237,742 1176,671 1091,626 984,607 L 1384,0 Z M 1136,1004 C 1136,1086 1108,1149 1053,1192 997,1235 917,1256 812,1256 L 359,1256 359,736 820,736 C 921,736 999,760 1054,807 1109,854 1136,919 1136,1004 Z"/>
<glyph unicode="Q" horiz-adv-x="1428" d="M 1495,711 C 1495,512 1445,349 1345,221 1245,93 1106,17 928,-6 955,-90 991,-151 1036,-188 1080,-225 1136,-244 1204,-244 1241,-244 1279,-240 1319,-231 L 1319,-365 C 1257,-380 1198,-387 1141,-387 1040,-387 958,-359 893,-302 828,-245 774,-149 733,-16 601,-9 487,24 392,85 296,145 223,229 173,337 122,444 97,569 97,711 97,936 159,1113 282,1240 405,1367 577,1430 797,1430 940,1430 1065,1402 1170,1345 1275,1288 1356,1205 1412,1096 1467,987 1495,859 1495,711 Z M 1300,711 C 1300,886 1256,1024 1169,1124 1081,1224 957,1274 797,1274 636,1274 511,1225 423,1126 335,1027 291,889 291,711 291,534 336,394 425,291 514,187 637,135 795,135 958,135 1083,185 1170,286 1257,386 1300,528 1300,711 Z"/>
<glyph unicode="P" horiz-adv-x="1142" d="M 1258,985 C 1258,852 1215,746 1128,667 1041,588 922,549 773,549 L 359,549 359,0 168,0 168,1409 761,1409 C 919,1409 1041,1372 1128,1298 1215,1224 1258,1120 1258,985 Z M 1066,983 C 1066,1165 957,1256 738,1256 L 359,1256 359,700 746,700 C 959,700 1066,794 1066,983 Z"/>
<glyph unicode="N" horiz-adv-x="1171" d="M 1082,0 L 328,1200 333,1103 338,936 338,0 168,0 168,1409 390,1409 1152,201 C 1144,332 1140,426 1140,485 L 1140,1409 1312,1409 1312,0 Z"/>
<glyph unicode="M" horiz-adv-x="1399" d="M 1366,0 L 1366,940 C 1366,1044 1369,1144 1375,1240 1342,1121 1313,1027 1287,960 L 923,0 789,0 420,960 364,1130 331,1240 334,1129 338,940 338,0 168,0 168,1409 419,1409 794,432 C 807,393 820,351 833,306 845,261 853,228 857,208 862,235 874,275 891,330 908,384 919,418 925,432 L 1293,1409 1538,1409 1538,0 Z"/>
<glyph unicode="L" horiz-adv-x="942" d="M 168,0 L 168,1409 359,1409 359,156 1071,156 1071,0 Z"/>
<glyph unicode="I" horiz-adv-x="230" d="M 189,0 L 189,1409 380,1409 380,0 Z"/>
<glyph unicode="H" horiz-adv-x="1171" d="M 1121,0 L 1121,653 359,653 359,0 168,0 168,1409 359,1409 359,813 1121,813 1121,1409 1312,1409 1312,0 Z"/>
<glyph unicode="G" horiz-adv-x="1371" d="M 103,711 C 103,940 164,1117 287,1242 410,1367 582,1430 804,1430 960,1430 1087,1404 1184,1351 1281,1298 1356,1214 1409,1098 L 1227,1044 C 1187,1124 1132,1182 1062,1219 991,1256 904,1274 799,1274 636,1274 512,1225 426,1127 340,1028 297,890 297,711 297,533 343,393 434,290 525,187 652,135 813,135 905,135 991,149 1071,177 1150,205 1215,243 1264,291 L 1264,545 843,545 843,705 1440,705 1440,219 C 1365,143 1274,84 1166,43 1057,1 940,-20 813,-20 666,-20 539,9 432,68 325,127 244,211 188,322 131,432 103,562 103,711 Z"/>
<glyph unicode="F" horiz-adv-x="1028" d="M 359,1253 L 359,729 1145,729 1145,571 359,571 359,0 168,0 168,1409 1169,1409 1169,1253 Z"/>
<glyph unicode="E" horiz-adv-x="1142" d="M 168,0 L 168,1409 1237,1409 1237,1253 359,1253 359,801 1177,801 1177,647 359,647 359,156 1278,156 1278,0 Z"/>
<glyph unicode="D" horiz-adv-x="1256" d="M 1381,719 C 1381,574 1353,447 1296,338 1239,229 1159,145 1055,87 951,29 831,0 695,0 L 168,0 168,1409 634,1409 C 873,1409 1057,1349 1187,1230 1316,1110 1381,940 1381,719 Z M 1189,719 C 1189,894 1141,1027 1046,1119 950,1210 811,1256 630,1256 L 359,1256 359,153 673,153 C 776,153 867,176 946,221 1024,266 1084,332 1126,417 1168,502 1189,603 1189,719 Z"/>
<glyph unicode="C" horiz-adv-x="1342" d="M 792,1274 C 636,1274 515,1224 428,1124 341,1023 298,886 298,711 298,538 343,400 434,295 524,190 646,137 800,137 997,137 1146,235 1245,430 L 1401,352 C 1343,231 1262,138 1157,75 1052,12 930,-20 791,-20 649,-20 526,10 423,69 319,128 240,212 186,322 131,431 104,561 104,711 104,936 165,1112 286,1239 407,1366 575,1430 790,1430 940,1430 1065,1401 1166,1342 1267,1283 1341,1196 1388,1081 L 1207,1021 C 1174,1103 1122,1166 1050,1209 977,1252 891,1274 792,1274 Z"/>
<glyph unicode="A" horiz-adv-x="1371" d="M 1167,0 L 1006,412 364,412 202,0 4,0 579,1409 796,1409 1362,0 Z M 685,1265 L 676,1237 C 659,1182 635,1111 602,1024 L 422,561 949,561 768,1026 C 749,1072 731,1124 712,1182 Z"/>
<glyph unicode="/" horiz-adv-x="572" d="M 0,-20 L 411,1484 569,1484 162,-20 Z"/>
<glyph unicode=" " horiz-adv-x="571"/>
</font>
</defs>
<defs class="TextShapeIndex">
<g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41"/>
</defs>
<defs class="EmbeddedBulletChars">
<g id="bullet-char-template(57356)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
</g>
<g id="bullet-char-template(57354)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
</g>
<g id="bullet-char-template(10146)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
</g>
<g id="bullet-char-template(10132)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
</g>
<g id="bullet-char-template(10007)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
</g>
<g id="bullet-char-template(10004)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
</g>
<g id="bullet-char-template(9679)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
</g>
<g id="bullet-char-template(8226)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
</g>
<g id="bullet-char-template(8211)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
</g>
</defs>
<defs class="TextEmbeddedBitmaps"/>
<g>
<g id="id2" class="Master_Slide">
<g id="bg-id2" class="Background"/>
<g id="bo-id2" class="BackgroundObjects"/>
</g>
</g>
<g class="SlideGroup">
<g>
<g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
<g class="Page">
<g class="com.sun.star.drawing.CustomShape">
<g id="id3">
<path fill="rgb(255,255,204)" stroke="none" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z M 2270,10802 L 2270,10802 Z M 3541,12454 L 3541,12454 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2270,10802 L 2270,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 3541,12454 L 3541,12454 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id4">
<path fill="rgb(255,255,204)" stroke="none" d="M 2012,20477 L 1119,20477 1119,3413 2905,3413 2905,20477 2012,20477 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2012,20477 L 1119,20477 1119,3413 2905,3413 2905,20477 2012,20477 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="1424" y="11013"><tspan fill="rgb(0,0,0)" stroke="none">Linux</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="1176" y="11564"><tspan fill="rgb(0,0,0)" stroke="none">Apache</tspan></tspan><tspan class="TextPosition" x="1506" y="12115"><tspan fill="rgb(0,0,0)" stroke="none">PHP</tspan></tspan><tspan class="TextPosition" x="1697" y="12666"><tspan fill="rgb(0,0,0)" stroke="none">Git</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id5">
<path fill="rgb(230,230,255)" stroke="none" d="M 14117,3216 L 5681,3216 5681,2524 22553,2524 22553,3216 14117,3216 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 14117,3216 L 5681,3216 5681,2524 22553,2524 22553,3216 14117,3216 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13012" y="3040"><tspan fill="rgb(0,0,0)" stroke="none">REST API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id6">
<path fill="rgb(230,230,255)" stroke="none" d="M 6810,6151 L 3412,6151 3412,4821 10207,4821 10207,6151 6810,6151 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6810,6151 L 3412,6151 3412,4821 10207,4821 10207,6151 6810,6151 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="4727" y="5380"><tspan fill="rgb(0,0,0)" stroke="none">Data validation API</tspan></tspan><tspan class="TextPosition" x="6069" y="5931"><tspan fill="rgb(0,0,0)" stroke="none">untaint</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id7">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15286" y="11760"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan><tspan fill="rgb(0,0,0)" stroke="none">IR API</tspan></tspan><tspan class="TextPosition" x="15188" y="12311"><tspan fill="rgb(0,0,0)" stroke="none">Identity </tspan></tspan><tspan class="TextPosition" x="14612" y="12862"><tspan fill="rgb(0,0,0)" stroke="none">reconciliation</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id8">
<path fill="rgb(230,230,255)" stroke="none" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="4326" y="7568"><tspan fill="rgb(0,0,0)" stroke="none">Work flow engine API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id9">
<path fill="none" stroke="rgb(0,0,0)" d="M 6810,6151 L 6738,6563"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6665,6987 L 6890,6569 6594,6518 6665,6987 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id10">
<path fill="rgb(153,102,204)" stroke="none" d="M 24209,20335 L 22558,20335 22558,3758 25860,3758 25860,20335 24209,20335 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 24209,20335 L 22558,20335 22558,3758 25860,3758 25860,20335 24209,20335 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="22867" y="11115"><tspan fill="rgb(0,0,0)" stroke="none">PostgreSQL</tspan></tspan><tspan class="TextPosition" x="23168" y="12216"><tspan fill="rgb(0,0,0)" stroke="none">CPF data</tspan></tspan><tspan class="TextPosition" x="23181" y="12767"><tspan fill="rgb(0,0,0)" stroke="none">user data</tspan></tspan><tspan class="TextPosition" x="23113" y="13318"><tspan fill="rgb(0,0,0)" stroke="none">meta data</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id11">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="14861" y="14309"><tspan fill="rgb(0,0,0)" stroke="none">Controlled </tspan></tspan><tspan class="TextPosition" x="14408" y="14860"><tspan fill="rgb(0,0,0)" stroke="none">vocabulary API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id12">
<path fill="rgb(114,159,207)" stroke="none" d="M 9059,18653 L 7212,18653 7212,17503 10905,17503 10905,18653 9059,18653 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 9059,18653 L 7212,18653 7212,17503 10905,17503 10905,18653 9059,18653 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="8333" y="17972"><tspan fill="rgb(0,0,0)" stroke="none">Name </tspan></tspan><tspan class="TextPosition" x="7579" y="18523"><tspan fill="rgb(0,0,0)" stroke="none">string parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id13">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15117" y="16503"><tspan fill="rgb(0,0,0)" stroke="none">SQL API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id14">
<path fill="rgb(114,159,207)" stroke="none" d="M 5186,20176 L 3403,20176 3403,19025 6969,19025 6969,20176 5186,20176 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 5186,20176 L 3403,20176 3403,19025 6969,19025 6969,20176 5186,20176 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="3995" y="19495"><tspan fill="rgb(0,0,0)" stroke="none">Date string</tspan></tspan><tspan class="TextPosition" x="4378" y="20046"><tspan fill="rgb(0,0,0)" stroke="none">parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id15">
<path fill="rgb(204,255,204)" stroke="none" d="M 15184,9843 L 12512,9843 12512,8692 17856,8692 17856,9843 15184,9843 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 15184,9843 L 12512,9843 12512,8692 17856,8692 17856,9843 15184,9843 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13527" y="9437"><tspan fill="rgb(0,0,0)" stroke="none">Reporting tools</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id16">
<path fill="rgb(230,230,255)" stroke="none" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="5307" y="10423"><tspan fill="rgb(0,0,0)" stroke="none">Application API</tspan></tspan><tspan class="TextPosition" x="6897" y="10974"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan></tspan><tspan class="TextPosition" x="5129" y="11525"><tspan fill="rgb(0,0,0)" stroke="none">CPF data editing</tspan></tspan><tspan class="TextPosition" x="5097" y="12076"><tspan fill="rgb(0,0,0)" stroke="none">HTML templating</tspan></tspan><tspan class="TextPosition" x="5074" y="12627"><tspan fill="rgb(0,0,0)" stroke="none">Data serialization</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="5567" y="13178"><tspan fill="rgb(0,0,0)" stroke="none">Data exports</tspan></tspan><tspan class="TextPosition" x="5758" y="13729"><tspan fill="rgb(0,0,0)" stroke="none">Dashboard</tspan></tspan><tspan class="TextPosition" x="5540" y="14280"><tspan fill="rgb(0,0,0)" stroke="none">User session</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id17">
<path fill="rgb(230,230,255)" stroke="none" d="M 16035,5606 L 13363,5606 13363,4455 18707,4455 18707,5606 16035,5606 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16035,5606 L 13363,5606 13363,4455 18707,4455 18707,5606 16035,5606 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13450" y="5200"><tspan fill="rgb(0,0,0)" stroke="none">History Search Tool API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id18">
<path fill="none" stroke="rgb(0,0,0)" d="M 6665,7809 L 6869,8709"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,9128 L 7011,8656 6718,8722 6964,9128 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id19">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7398 L 13005,5268"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13363,5031 L 12905,5154 13071,5405 13363,5031 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id20">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7399 L 12158,9025"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 12512,9268 L 12226,8890 12056,9137 12512,9268 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id21">
<path fill="none" stroke="rgb(0,0,0)" d="M 16253,5977 L 16577,6526"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16035,5607 L 16134,6071 16393,5918 16035,5607 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16795,6896 L 16696,6432 16437,6585 16795,6896 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id22">
<path fill="none" stroke="rgb(0,0,0)" d="M 18283,9218 L 22132,8764"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 17856,9268 L 18320,9364 18285,9066 17856,9268 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,8714 L 22095,8618 22130,8916 22559,8714 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id23">
<path fill="none" stroke="rgb(0,0,0)" d="M 19098,11973 L 22163,10660"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18703,12142 L 19176,12103 19058,11827 18703,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,10491 L 22085,10530 22203,10806 22558,10491 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id24">
<path fill="none" stroke="rgb(0,0,0)" d="M 19090,14189 L 22192,12273"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,14415 L 19186,14306 19028,14051 18724,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,12047 L 22096,12156 22254,12411 22558,12047 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id25">
<path fill="none" stroke="rgb(0,0,0)" d="M 13002,16129 L 10014,14511"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,16334 L 13056,15988 12913,16252 13380,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,14306 L 9960,14652 10103,14388 9636,14306 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id26">
<path fill="none" stroke="rgb(0,0,0)" d="M 19071,16081 L 22211,13790"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,16334 L 19176,16190 18999,15948 18724,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,13537 L 22106,13681 22283,13923 22558,13537 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id27">
<path fill="none" stroke="rgb(0,0,0)" d="M 6727,16698 L 5423,18667"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,16339 L 6591,16632 6841,16797 6964,16339 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5186,19026 L 5559,18733 5309,18568 5186,19026 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id28">
<path fill="none" stroke="rgb(0,0,0)" d="M 8680,16725 L 8871,17116"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8492,16338 L 8554,16808 8824,16677 8492,16338 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9059,17503 L 8997,17033 8727,17164 9059,17503 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id29">
<path fill="none" stroke="rgb(0,0,0)" d="M 12921,14397 C 10781,14218 12239,12926 10087,12750"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,14415 L 12936,14247 12924,14547 13380,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,12733 L 10080,12901 10092,12601 9636,12733 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id30">
<path fill="none" stroke="rgb(0,0,0)" d="M 12977,12075 L 10061,11616"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13402,12142 L 12981,11924 12934,12220 13402,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,11549 L 10057,11767 10104,11471 9636,11549 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id31">
<path fill="rgb(114,159,207)" stroke="none" d="M 16795,7644 L 14764,7644 14764,6896 18825,6896 18825,7644 16795,7644 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16795,7644 L 14764,7644 14764,6896 18825,6896 18825,7644 16795,7644 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15220" y="7440"><tspan fill="rgb(0,0,0)" stroke="none">Elastic Search</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id32">
<path fill="none" stroke="rgb(0,0,0)" d="M 22100,5933 C 19968,6078 21419,7114 19279,7256"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,5919 L 22104,5784 22114,6084 22559,5919 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18826,7270 L 19281,7405 19271,7106 18826,7270 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id33">
<path fill="none" stroke="rgb(0,0,0)" d="M 7060,3216 L 6876,4396"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6810,4821 L 7027,4399 6731,4353 6810,4821 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id34">
<path fill="none" stroke="rgb(0,0,0)" d="M 16035,4456 L 15217,3537"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14931,3216 L 15118,3652 15342,3452 14931,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id35">
<path fill="none" stroke="rgb(0,0,0)" d="M 13131,8767 C 13131,4548 12570,7106 12524,3690"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 12521,3216 L 12374,3667 12674,3665 12521,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id36">
<path fill="none" stroke="rgb(0,0,0)" d="M 9636,10371 C 10374,10371 10720,8132 10742,3654"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 10743,3216 L 10592,3666 10892,3666 10743,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id37">
<path fill="rgb(204,153,153)" stroke="none" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="10623" y="1613"><tspan fill="rgb(0,0,0)" stroke="none">User/web browser</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id38">
<path fill="none" stroke="rgb(0,0,0)" d="M 11339,2007 C 12136,2219 13023,2065 13808,2284"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11012,1761 L 11288,2147 11464,1904 11012,1761 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14117,2524 L 13846,2135 13666,2376 14117,2524 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id39">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="14613" y="18446"><tspan fill="rgb(0,0,0)" stroke="none">Authorization</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id40">
<path fill="none" stroke="rgb(0,0,0)" d="M 13035,18020 L 9982,15745"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,18277 L 13109,17888 12930,18128 13380,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9637,15488 L 9908,15877 10087,15637 9637,15488 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id41">
<path fill="none" stroke="rgb(0,0,0)" d="M 19053,18001 L 22230,15336"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,18277 L 19165,18103 18972,17873 18724,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,15060 L 22118,15234 22311,15464 22559,15060 Z"/>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.2" baseProfile="tiny" width="279.4mm" height="215.9mm" viewBox="0 0 27940 21590" preserveAspectRatio="xMidYMid" fill-rule="evenodd" clip-path="url(#presentation_clip_path)" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<defs class="ClipPathGroup">
<clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
<rect x="0" y="0" width="27940" height="21590"/>
</clipPath>
</defs>
<defs>
<font id="EmbeddedFont_1" horiz-adv-x="2048">
<font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1855" descent="428"/>
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/>
<glyph unicode="z" horiz-adv-x="886" d="M 83,0 L 83,137 688,943 117,943 117,1082 901,1082 901,945 295,139 922,139 922,0 Z"/>
<glyph unicode="y" horiz-adv-x="1028" d="M 191,-425 C 142,-425 100,-421 67,-414 L 67,-279 C 92,-283 120,-285 151,-285 263,-285 352,-203 417,-38 L 434,5 5,1082 197,1082 425,484 C 428,475 432,464 437,451 442,438 457,394 482,320 507,246 521,205 523,196 L 593,393 830,1082 1020,1082 604,0 C 559,-115 518,-201 479,-258 440,-314 398,-356 351,-384 304,-411 250,-425 191,-425 Z"/>
<glyph unicode="x" horiz-adv-x="1028" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 Z"/>
<glyph unicode="w" horiz-adv-x="1514" d="M 1174,0 L 965,0 776,765 740,934 C 734,904 725,861 712,805 699,748 631,480 508,0 L 300,0 -3,1082 175,1082 358,347 C 363,331 377,265 401,149 L 418,223 644,1082 837,1082 1026,339 1072,149 1103,288 1308,1082 1484,1082 Z"/>
<glyph unicode="v" horiz-adv-x="1028" d="M 613,0 L 400,0 7,1082 199,1082 437,378 C 446,351 469,272 506,141 L 541,258 580,376 826,1082 1017,1082 Z"/>
<glyph unicode="u" horiz-adv-x="914" d="M 314,1082 L 314,396 C 314,325 321,269 335,230 349,191 371,162 402,145 433,128 478,119 537,119 624,119 692,149 742,208 792,267 817,350 817,455 L 817,1082 997,1082 997,231 C 997,105 999,28 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 826,132 825,185 L 822,185 C 781,110 733,58 679,27 624,-5 557,-20 476,-20 357,-20 271,10 216,69 161,128 133,225 133,361 L 133,1082 Z"/>
<glyph unicode="t" horiz-adv-x="543" d="M 554,8 C 495,-8 434,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 474,127 509,132 554,141 Z"/>
<glyph unicode="s" horiz-adv-x="942" d="M 950,299 C 950,197 912,118 835,63 758,8 650,-20 511,-20 376,-20 273,2 200,47 127,91 79,160 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 602,117 669,131 712,159 754,187 775,229 775,285 775,328 760,362 731,389 702,416 654,438 589,455 L 460,489 C 357,516 283,542 240,568 196,593 162,624 137,661 112,698 100,743 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 759,862 732,899 689,925 645,950 586,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,783 283,758 299,738 315,718 339,701 370,687 401,673 467,654 568,629 663,605 732,583 774,563 816,542 849,520 874,495 898,470 917,442 930,410 943,377 950,340 950,299 Z"/>
<glyph unicode="r" horiz-adv-x="543" d="M 142,0 L 142,830 C 142,906 140,990 136,1082 L 306,1082 C 311,959 314,886 314,861 L 318,861 C 347,954 380,1017 417,1051 454,1085 507,1102 575,1102 599,1102 623,1099 648,1092 L 648,927 C 624,934 592,937 552,937 477,937 420,905 381,841 342,776 322,684 322,564 L 322,0 Z"/>
<glyph unicode="p" horiz-adv-x="943" d="M 1053,546 C 1053,169 920,-20 655,-20 488,-20 376,43 319,168 L 314,168 C 317,163 318,106 318,-2 L 318,-425 138,-425 138,861 C 138,972 136,1046 132,1082 L 306,1082 C 307,1079 308,1070 309,1054 310,1037 312,1012 314,978 315,944 316,921 316,908 L 320,908 C 352,975 394,1024 447,1055 500,1086 569,1101 655,1101 788,1101 888,1056 954,967 1020,878 1053,737 1053,546 Z M 864,542 C 864,693 844,800 803,865 762,930 698,962 609,962 538,962 482,947 442,917 401,887 371,840 350,777 329,713 318,630 318,528 318,386 341,281 386,214 431,147 505,113 607,113 696,113 762,146 803,212 844,277 864,387 864,542 Z"/>
<glyph unicode="o" horiz-adv-x="971" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 407,-20 288,28 207,125 126,221 86,360 86,542 86,915 248,1102 571,1102 736,1102 858,1057 936,966 1014,875 1053,733 1053,542 Z M 864,542 C 864,691 842,800 798,868 753,935 679,969 574,969 469,969 393,935 346,866 299,797 275,689 275,542 275,399 298,292 345,221 391,149 464,113 563,113 671,113 748,148 795,217 841,286 864,395 864,542 Z"/>
<glyph unicode="n" horiz-adv-x="914" d="M 825,0 L 825,686 C 825,757 818,813 804,852 790,891 768,920 737,937 706,954 661,963 602,963 515,963 447,933 397,874 347,815 322,732 322,627 L 322,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 358,972 406,1025 461,1056 515,1087 582,1102 663,1102 782,1102 869,1073 924,1014 979,955 1006,857 1006,721 L 1006,0 Z"/>
<glyph unicode="m" horiz-adv-x="1485" d="M 768,0 L 768,686 C 768,791 754,863 725,903 696,943 645,963 570,963 493,963 433,934 388,875 343,816 321,734 321,627 L 321,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 356,974 400,1027 450,1057 500,1087 561,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 967,970 1013,1022 1066,1054 1119,1086 1183,1102 1258,1102 1367,1102 1447,1072 1497,1013 1546,954 1571,856 1571,721 L 1571,0 1393,0 1393,686 C 1393,791 1379,863 1350,903 1321,943 1270,963 1195,963 1116,963 1055,934 1012,876 968,817 946,734 946,627 L 946,0 Z"/>
<glyph unicode="l" horiz-adv-x="229" d="M 138,0 L 138,1484 318,1484 318,0 Z"/>
<glyph unicode="k" horiz-adv-x="914" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 Z"/>
<glyph unicode="i" horiz-adv-x="229" d="M 137,1312 L 137,1484 317,1484 317,1312 Z M 137,0 L 137,1082 317,1082 317,0 Z"/>
<glyph unicode="h" horiz-adv-x="914" d="M 317,897 C 356,968 402,1020 457,1053 511,1086 580,1102 663,1102 780,1102 867,1073 923,1015 978,956 1006,858 1006,721 L 1006,0 825,0 825,686 C 825,762 818,819 804,856 790,893 767,920 735,937 703,954 659,963 602,963 517,963 450,934 399,875 348,816 322,737 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1057 321,1015 319,972 316,929 315,904 314,897 Z"/>
<glyph unicode="g" horiz-adv-x="942" d="M 548,-425 C 430,-425 336,-402 266,-356 196,-309 151,-243 131,-158 L 312,-132 C 324,-182 351,-221 392,-248 433,-275 486,-288 553,-288 732,-288 822,-183 822,27 L 822,201 820,201 C 786,132 739,80 680,45 621,10 551,-8 472,-8 339,-8 242,36 180,124 117,212 86,350 86,539 86,730 120,872 187,963 254,1054 355,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,917 825,952 828,1001 831,1050 833,1077 836,1082 L 1007,1082 C 1003,1046 1001,971 1001,858 L 1001,31 C 1001,-273 850,-425 548,-425 Z M 822,541 C 822,629 810,705 786,769 762,832 728,881 685,915 641,948 591,965 536,965 444,965 377,932 335,865 293,798 272,690 272,541 272,393 292,287 331,222 370,157 438,125 533,125 590,125 640,142 684,175 728,208 762,256 786,319 810,381 822,455 822,541 Z"/>
<glyph unicode="f" horiz-adv-x="571" d="M 361,951 L 361,0 181,0 181,951 29,951 29,1082 181,1082 181,1204 C 181,1303 203,1374 246,1417 289,1460 356,1482 445,1482 495,1482 537,1478 572,1470 L 572,1333 C 542,1338 515,1341 492,1341 446,1341 413,1329 392,1306 371,1283 361,1240 361,1179 L 361,1082 572,1082 572,951 Z"/>
<glyph unicode="e" horiz-adv-x="971" d="M 276,503 C 276,379 302,283 353,216 404,149 479,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 954,65 807,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,727 129,864 213,959 296,1054 416,1102 571,1102 889,1102 1048,910 1048,527 L 1048,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 481,969 412,940 361,882 310,823 282,743 278,641 Z"/>
<glyph unicode="d" horiz-adv-x="942" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 821,1035 821,1484 1001,1484 1001,223 C 1001,110 1003,36 1007,0 L 835,0 C 833,11 831,35 829,74 826,113 825,146 825,174 Z M 275,542 C 275,391 295,282 335,217 375,152 440,119 530,119 632,119 706,154 752,225 798,296 821,405 821,554 821,697 798,802 752,869 706,936 633,969 532,969 441,969 376,936 336,869 295,802 275,693 275,542 Z"/>
<glyph unicode="c" horiz-adv-x="885" d="M 275,546 C 275,402 298,295 343,226 388,157 457,122 548,122 612,122 666,139 709,174 752,209 778,262 788,334 L 970,322 C 956,218 912,135 837,73 762,11 668,-20 553,-20 402,-20 286,28 207,124 127,219 87,359 87,542 87,724 127,863 207,959 287,1054 402,1102 551,1102 662,1102 754,1073 827,1016 900,959 945,880 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 451,961 382,929 339,866 296,803 275,696 275,546 Z"/>
<glyph unicode="b" horiz-adv-x="943" d="M 1053,546 C 1053,169 920,-20 655,-20 573,-20 505,-5 451,25 396,54 352,102 318,168 L 316,168 C 316,147 315,116 312,74 309,31 307,7 306,0 L 132,0 C 136,36 138,110 138,223 L 138,1484 318,1484 318,1061 C 318,1018 317,967 314,908 L 318,908 C 351,977 396,1027 451,1057 506,1087 574,1102 655,1102 792,1102 892,1056 957,964 1021,872 1053,733 1053,546 Z M 864,540 C 864,691 844,800 804,865 764,930 699,963 609,963 508,963 434,928 388,859 341,790 318,680 318,529 318,387 341,282 386,215 431,147 505,113 607,113 698,113 763,147 804,214 844,281 864,389 864,540 Z"/>
<glyph unicode="a" horiz-adv-x="1057" d="M 414,-20 C 305,-20 224,9 169,66 114,123 87,202 87,302 87,414 124,500 198,560 271,620 390,652 554,656 L 797,660 797,719 C 797,807 778,870 741,908 704,946 645,965 565,965 484,965 426,951 389,924 352,897 330,853 323,793 L 135,810 C 166,1005 310,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1097,111 1117,113 1139,118 L 1139,6 C 1094,-5 1047,-10 1000,-10 933,-10 885,8 855,43 824,78 807,132 803,207 L 797,207 C 751,124 698,66 637,32 576,-3 501,-20 414,-20 Z M 455,115 C 521,115 580,130 631,160 682,190 723,231 753,284 782,336 797,390 797,445 L 797,534 600,530 C 515,529 451,520 408,504 364,488 330,463 307,430 284,397 272,353 272,299 272,240 288,195 320,163 351,131 396,115 455,115 Z"/>
<glyph unicode="W" horiz-adv-x="1942" d="M 1511,0 L 1283,0 1039,895 C 1023,951 1000,1051 969,1196 952,1119 937,1054 925,1002 913,950 822,616 652,0 L 424,0 9,1409 208,1409 461,514 C 491,402 519,287 544,168 560,241 579,321 600,408 621,495 713,828 877,1409 L 1060,1409 1305,532 C 1342,389 1372,267 1393,168 L 1402,203 C 1420,280 1435,342 1446,391 1457,439 1551,778 1727,1409 L 1926,1409 Z"/>
<glyph unicode="U" horiz-adv-x="1199" d="M 731,-20 C 616,-20 515,1 429,43 343,85 276,146 229,226 182,306 158,401 158,512 L 158,1409 349,1409 349,528 C 349,399 382,302 447,235 512,168 607,135 730,135 857,135 955,170 1026,239 1096,308 1131,408 1131,541 L 1131,1409 1321,1409 1321,530 C 1321,416 1297,318 1249,235 1200,152 1132,89 1044,46 955,2 851,-20 731,-20 Z"/>
<glyph unicode="T" horiz-adv-x="1199" d="M 720,1253 L 720,0 530,0 530,1253 46,1253 46,1409 1204,1409 1204,1253 Z"/>
<glyph unicode="S" horiz-adv-x="1199" d="M 1272,389 C 1272,259 1221,158 1120,87 1018,16 875,-20 690,-20 347,-20 148,99 93,338 L 278,375 C 299,290 345,228 414,189 483,149 578,129 697,129 820,129 916,150 983,193 1050,235 1083,297 1083,379 1083,425 1073,462 1052,491 1031,520 1001,543 963,562 925,581 880,596 827,609 774,622 716,635 652,650 541,675 456,699 399,724 341,749 295,776 262,807 229,837 203,872 186,913 168,954 159,1000 159,1053 159,1174 205,1267 298,1332 390,1397 522,1430 694,1430 854,1430 976,1406 1061,1357 1146,1308 1205,1224 1239,1106 L 1051,1073 C 1030,1148 991,1202 933,1236 875,1269 795,1286 692,1286 579,1286 493,1267 434,1230 375,1193 345,1137 345,1063 345,1020 357,984 380,956 403,927 436,903 479,884 522,864 609,840 738,811 781,801 825,791 868,781 911,770 952,758 991,744 1030,729 1067,712 1102,693 1136,674 1166,650 1191,622 1216,594 1236,561 1251,523 1265,485 1272,440 1272,389 Z"/>
<glyph unicode="R" horiz-adv-x="1256" d="M 1164,0 L 798,585 359,585 359,0 168,0 168,1409 831,1409 C 990,1409 1112,1374 1199,1303 1285,1232 1328,1133 1328,1006 1328,901 1298,813 1237,742 1176,671 1091,626 984,607 L 1384,0 Z M 1136,1004 C 1136,1086 1108,1149 1053,1192 997,1235 917,1256 812,1256 L 359,1256 359,736 820,736 C 921,736 999,760 1054,807 1109,854 1136,919 1136,1004 Z"/>
<glyph unicode="Q" horiz-adv-x="1428" d="M 1495,711 C 1495,512 1445,349 1345,221 1245,93 1106,17 928,-6 955,-90 991,-151 1036,-188 1080,-225 1136,-244 1204,-244 1241,-244 1279,-240 1319,-231 L 1319,-365 C 1257,-380 1198,-387 1141,-387 1040,-387 958,-359 893,-302 828,-245 774,-149 733,-16 601,-9 487,24 392,85 296,145 223,229 173,337 122,444 97,569 97,711 97,936 159,1113 282,1240 405,1367 577,1430 797,1430 940,1430 1065,1402 1170,1345 1275,1288 1356,1205 1412,1096 1467,987 1495,859 1495,711 Z M 1300,711 C 1300,886 1256,1024 1169,1124 1081,1224 957,1274 797,1274 636,1274 511,1225 423,1126 335,1027 291,889 291,711 291,534 336,394 425,291 514,187 637,135 795,135 958,135 1083,185 1170,286 1257,386 1300,528 1300,711 Z"/>
<glyph unicode="P" horiz-adv-x="1142" d="M 1258,985 C 1258,852 1215,746 1128,667 1041,588 922,549 773,549 L 359,549 359,0 168,0 168,1409 761,1409 C 919,1409 1041,1372 1128,1298 1215,1224 1258,1120 1258,985 Z M 1066,983 C 1066,1165 957,1256 738,1256 L 359,1256 359,700 746,700 C 959,700 1066,794 1066,983 Z"/>
<glyph unicode="N" horiz-adv-x="1171" d="M 1082,0 L 328,1200 333,1103 338,936 338,0 168,0 168,1409 390,1409 1152,201 C 1144,332 1140,426 1140,485 L 1140,1409 1312,1409 1312,0 Z"/>
<glyph unicode="M" horiz-adv-x="1399" d="M 1366,0 L 1366,940 C 1366,1044 1369,1144 1375,1240 1342,1121 1313,1027 1287,960 L 923,0 789,0 420,960 364,1130 331,1240 334,1129 338,940 338,0 168,0 168,1409 419,1409 794,432 C 807,393 820,351 833,306 845,261 853,228 857,208 862,235 874,275 891,330 908,384 919,418 925,432 L 1293,1409 1538,1409 1538,0 Z"/>
<glyph unicode="L" horiz-adv-x="942" d="M 168,0 L 168,1409 359,1409 359,156 1071,156 1071,0 Z"/>
<glyph unicode="I" horiz-adv-x="230" d="M 189,0 L 189,1409 380,1409 380,0 Z"/>
<glyph unicode="H" horiz-adv-x="1171" d="M 1121,0 L 1121,653 359,653 359,0 168,0 168,1409 359,1409 359,813 1121,813 1121,1409 1312,1409 1312,0 Z"/>
<glyph unicode="G" horiz-adv-x="1371" d="M 103,711 C 103,940 164,1117 287,1242 410,1367 582,1430 804,1430 960,1430 1087,1404 1184,1351 1281,1298 1356,1214 1409,1098 L 1227,1044 C 1187,1124 1132,1182 1062,1219 991,1256 904,1274 799,1274 636,1274 512,1225 426,1127 340,1028 297,890 297,711 297,533 343,393 434,290 525,187 652,135 813,135 905,135 991,149 1071,177 1150,205 1215,243 1264,291 L 1264,545 843,545 843,705 1440,705 1440,219 C 1365,143 1274,84 1166,43 1057,1 940,-20 813,-20 666,-20 539,9 432,68 325,127 244,211 188,322 131,432 103,562 103,711 Z"/>
<glyph unicode="F" horiz-adv-x="1028" d="M 359,1253 L 359,729 1145,729 1145,571 359,571 359,0 168,0 168,1409 1169,1409 1169,1253 Z"/>
<glyph unicode="E" horiz-adv-x="1142" d="M 168,0 L 168,1409 1237,1409 1237,1253 359,1253 359,801 1177,801 1177,647 359,647 359,156 1278,156 1278,0 Z"/>
<glyph unicode="D" horiz-adv-x="1256" d="M 1381,719 C 1381,574 1353,447 1296,338 1239,229 1159,145 1055,87 951,29 831,0 695,0 L 168,0 168,1409 634,1409 C 873,1409 1057,1349 1187,1230 1316,1110 1381,940 1381,719 Z M 1189,719 C 1189,894 1141,1027 1046,1119 950,1210 811,1256 630,1256 L 359,1256 359,153 673,153 C 776,153 867,176 946,221 1024,266 1084,332 1126,417 1168,502 1189,603 1189,719 Z"/>
<glyph unicode="C" horiz-adv-x="1342" d="M 792,1274 C 636,1274 515,1224 428,1124 341,1023 298,886 298,711 298,538 343,400 434,295 524,190 646,137 800,137 997,137 1146,235 1245,430 L 1401,352 C 1343,231 1262,138 1157,75 1052,12 930,-20 791,-20 649,-20 526,10 423,69 319,128 240,212 186,322 131,431 104,561 104,711 104,936 165,1112 286,1239 407,1366 575,1430 790,1430 940,1430 1065,1401 1166,1342 1267,1283 1341,1196 1388,1081 L 1207,1021 C 1174,1103 1122,1166 1050,1209 977,1252 891,1274 792,1274 Z"/>
<glyph unicode="A" horiz-adv-x="1371" d="M 1167,0 L 1006,412 364,412 202,0 4,0 579,1409 796,1409 1362,0 Z M 685,1265 L 676,1237 C 659,1182 635,1111 602,1024 L 422,561 949,561 768,1026 C 749,1072 731,1124 712,1182 Z"/>
<glyph unicode="/" horiz-adv-x="572" d="M 0,-20 L 411,1484 569,1484 162,-20 Z"/>
<glyph unicode=" " horiz-adv-x="571"/>
</font>
</defs>
<defs class="TextShapeIndex">
<g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41"/>
</defs>
<defs class="EmbeddedBulletChars">
<g id="bullet-char-template(57356)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
</g>
<g id="bullet-char-template(57354)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
</g>
<g id="bullet-char-template(10146)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
</g>
<g id="bullet-char-template(10132)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
</g>
<g id="bullet-char-template(10007)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
</g>
<g id="bullet-char-template(10004)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
</g>
<g id="bullet-char-template(9679)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
</g>
<g id="bullet-char-template(8226)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
</g>
<g id="bullet-char-template(8211)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
</g>
</defs>
<defs class="TextEmbeddedBitmaps"/>
<g>
<g id="id2" class="Master_Slide">
<g id="bg-id2" class="Background"/>
<g id="bo-id2" class="BackgroundObjects"/>
</g>
</g>
<g class="SlideGroup">
<g>
<g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
<g class="Page">
<g class="com.sun.star.drawing.CustomShape">
<g id="id3">
<path fill="rgb(255,255,204)" stroke="none" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z M 2270,10802 L 2270,10802 Z M 3541,12454 L 3541,12454 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2270,10802 L 2270,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 3541,12454 L 3541,12454 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id4">
<path fill="rgb(255,255,204)" stroke="none" d="M 2012,20477 L 1119,20477 1119,3413 2905,3413 2905,20477 2012,20477 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2012,20477 L 1119,20477 1119,3413 2905,3413 2905,20477 2012,20477 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="1424" y="11013"><tspan fill="rgb(0,0,0)" stroke="none">Linux</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="1176" y="11564"><tspan fill="rgb(0,0,0)" stroke="none">Apache</tspan></tspan><tspan class="TextPosition" x="1506" y="12115"><tspan fill="rgb(0,0,0)" stroke="none">PHP</tspan></tspan><tspan class="TextPosition" x="1697" y="12666"><tspan fill="rgb(0,0,0)" stroke="none">Git</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id5">
<path fill="rgb(230,230,255)" stroke="none" d="M 14117,3216 L 5681,3216 5681,2524 22553,2524 22553,3216 14117,3216 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 14117,3216 L 5681,3216 5681,2524 22553,2524 22553,3216 14117,3216 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13012" y="3040"><tspan fill="rgb(0,0,0)" stroke="none">REST API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id6">
<path fill="rgb(230,230,255)" stroke="none" d="M 6810,6151 L 3412,6151 3412,4821 10207,4821 10207,6151 6810,6151 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6810,6151 L 3412,6151 3412,4821 10207,4821 10207,6151 6810,6151 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="4727" y="5380"><tspan fill="rgb(0,0,0)" stroke="none">Data validation API</tspan></tspan><tspan class="TextPosition" x="6069" y="5931"><tspan fill="rgb(0,0,0)" stroke="none">untaint</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id7">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15286" y="11760"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan><tspan fill="rgb(0,0,0)" stroke="none">IR API</tspan></tspan><tspan class="TextPosition" x="15188" y="12311"><tspan fill="rgb(0,0,0)" stroke="none">Identity </tspan></tspan><tspan class="TextPosition" x="14612" y="12862"><tspan fill="rgb(0,0,0)" stroke="none">reconciliation</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id8">
<path fill="rgb(230,230,255)" stroke="none" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="4326" y="7568"><tspan fill="rgb(0,0,0)" stroke="none">Work flow engine API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id9">
<path fill="none" stroke="rgb(0,0,0)" d="M 6810,6151 L 6738,6563"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6665,6987 L 6890,6569 6594,6518 6665,6987 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id10">
<path fill="rgb(153,102,204)" stroke="none" d="M 24209,20335 L 22558,20335 22558,3758 25860,3758 25860,20335 24209,20335 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 24209,20335 L 22558,20335 22558,3758 25860,3758 25860,20335 24209,20335 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="22867" y="11115"><tspan fill="rgb(0,0,0)" stroke="none">PostgreSQL</tspan></tspan><tspan class="TextPosition" x="23168" y="12216"><tspan fill="rgb(0,0,0)" stroke="none">CPF data</tspan></tspan><tspan class="TextPosition" x="23181" y="12767"><tspan fill="rgb(0,0,0)" stroke="none">user data</tspan></tspan><tspan class="TextPosition" x="23113" y="13318"><tspan fill="rgb(0,0,0)" stroke="none">meta data</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id11">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="14861" y="14309"><tspan fill="rgb(0,0,0)" stroke="none">Controlled </tspan></tspan><tspan class="TextPosition" x="14408" y="14860"><tspan fill="rgb(0,0,0)" stroke="none">vocabulary API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id12">
<path fill="rgb(114,159,207)" stroke="none" d="M 9059,18653 L 7212,18653 7212,17503 10905,17503 10905,18653 9059,18653 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 9059,18653 L 7212,18653 7212,17503 10905,17503 10905,18653 9059,18653 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="8333" y="17972"><tspan fill="rgb(0,0,0)" stroke="none">Name </tspan></tspan><tspan class="TextPosition" x="7579" y="18523"><tspan fill="rgb(0,0,0)" stroke="none">string parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id13">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15117" y="16503"><tspan fill="rgb(0,0,0)" stroke="none">SQL API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id14">
<path fill="rgb(114,159,207)" stroke="none" d="M 5186,20176 L 3403,20176 3403,19025 6969,19025 6969,20176 5186,20176 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 5186,20176 L 3403,20176 3403,19025 6969,19025 6969,20176 5186,20176 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="3995" y="19495"><tspan fill="rgb(0,0,0)" stroke="none">Date string</tspan></tspan><tspan class="TextPosition" x="4378" y="20046"><tspan fill="rgb(0,0,0)" stroke="none">parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id15">
<path fill="rgb(204,255,204)" stroke="none" d="M 15184,9843 L 12512,9843 12512,8692 17856,8692 17856,9843 15184,9843 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 15184,9843 L 12512,9843 12512,8692 17856,8692 17856,9843 15184,9843 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13527" y="9437"><tspan fill="rgb(0,0,0)" stroke="none">Reporting tools</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id16">
<path fill="rgb(230,230,255)" stroke="none" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="5307" y="10423"><tspan fill="rgb(0,0,0)" stroke="none">Application API</tspan></tspan><tspan class="TextPosition" x="6897" y="10974"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan></tspan><tspan class="TextPosition" x="5129" y="11525"><tspan fill="rgb(0,0,0)" stroke="none">CPF data editing</tspan></tspan><tspan class="TextPosition" x="5097" y="12076"><tspan fill="rgb(0,0,0)" stroke="none">HTML templating</tspan></tspan><tspan class="TextPosition" x="5074" y="12627"><tspan fill="rgb(0,0,0)" stroke="none">Data serialization</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="5567" y="13178"><tspan fill="rgb(0,0,0)" stroke="none">Data exports</tspan></tspan><tspan class="TextPosition" x="5758" y="13729"><tspan fill="rgb(0,0,0)" stroke="none">Dashboard</tspan></tspan><tspan class="TextPosition" x="5540" y="14280"><tspan fill="rgb(0,0,0)" stroke="none">User session</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id17">
<path fill="rgb(230,230,255)" stroke="none" d="M 16035,5606 L 13363,5606 13363,4455 18707,4455 18707,5606 16035,5606 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16035,5606 L 13363,5606 13363,4455 18707,4455 18707,5606 16035,5606 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13450" y="5200"><tspan fill="rgb(0,0,0)" stroke="none">History Search Tool API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id18">
<path fill="none" stroke="rgb(0,0,0)" d="M 6665,7809 L 6869,8709"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,9128 L 7011,8656 6718,8722 6964,9128 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id19">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7398 L 13005,5268"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13363,5031 L 12905,5154 13071,5405 13363,5031 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id20">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7399 L 12158,9025"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 12512,9268 L 12226,8890 12056,9137 12512,9268 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id21">
<path fill="none" stroke="rgb(0,0,0)" d="M 16253,5977 L 16577,6526"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16035,5607 L 16134,6071 16393,5918 16035,5607 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 16795,6896 L 16696,6432 16437,6585 16795,6896 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id22">
<path fill="none" stroke="rgb(0,0,0)" d="M 18283,9218 L 22132,8764"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 17856,9268 L 18320,9364 18285,9066 17856,9268 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,8714 L 22095,8618 22130,8916 22559,8714 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id23">
<path fill="none" stroke="rgb(0,0,0)" d="M 19098,11973 L 22163,10660"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18703,12142 L 19176,12103 19058,11827 18703,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,10491 L 22085,10530 22203,10806 22558,10491 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id24">
<path fill="none" stroke="rgb(0,0,0)" d="M 19090,14189 L 22192,12273"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,14415 L 19186,14306 19028,14051 18724,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,12047 L 22096,12156 22254,12411 22558,12047 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id25">
<path fill="none" stroke="rgb(0,0,0)" d="M 13002,16129 L 10014,14511"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,16334 L 13056,15988 12913,16252 13380,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,14306 L 9960,14652 10103,14388 9636,14306 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id26">
<path fill="none" stroke="rgb(0,0,0)" d="M 19071,16081 L 22211,13790"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,16334 L 19176,16190 18999,15948 18724,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,13537 L 22106,13681 22283,13923 22558,13537 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id27">
<path fill="none" stroke="rgb(0,0,0)" d="M 6727,16698 L 5423,18667"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,16339 L 6591,16632 6841,16797 6964,16339 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5186,19026 L 5559,18733 5309,18568 5186,19026 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id28">
<path fill="none" stroke="rgb(0,0,0)" d="M 8680,16725 L 8871,17116"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8492,16338 L 8554,16808 8824,16677 8492,16338 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9059,17503 L 8997,17033 8727,17164 9059,17503 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id29">
<path fill="none" stroke="rgb(0,0,0)" d="M 12921,14397 C 10781,14218 12239,12926 10087,12750"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,14415 L 12936,14247 12924,14547 13380,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,12733 L 10080,12901 10092,12601 9636,12733 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id30">
<path fill="none" stroke="rgb(0,0,0)" d="M 12977,12075 L 10061,11616"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13402,12142 L 12981,11924 12934,12220 13402,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,11549 L 10057,11767 10104,11471 9636,11549 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id31">
<path fill="rgb(114,159,207)" stroke="none" d="M 16795,7644 L 14764,7644 14764,6896 18825,6896 18825,7644 16795,7644 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16795,7644 L 14764,7644 14764,6896 18825,6896 18825,7644 16795,7644 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="15220" y="7440"><tspan fill="rgb(0,0,0)" stroke="none">Elastic Search</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id32">
<path fill="none" stroke="rgb(0,0,0)" d="M 22100,5933 C 19968,6078 21419,7114 19279,7256"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,5919 L 22104,5784 22114,6084 22559,5919 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18826,7270 L 19281,7405 19271,7106 18826,7270 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id33">
<path fill="none" stroke="rgb(0,0,0)" d="M 7060,3216 L 6876,4396"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6810,4821 L 7027,4399 6731,4353 6810,4821 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id34">
<path fill="none" stroke="rgb(0,0,0)" d="M 16035,4456 L 15217,3537"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14931,3216 L 15118,3652 15342,3452 14931,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id35">
<path fill="none" stroke="rgb(0,0,0)" d="M 13131,8767 C 13131,4548 12570,7106 12524,3690"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 12521,3216 L 12374,3667 12674,3665 12521,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id36">
<path fill="none" stroke="rgb(0,0,0)" d="M 9636,10371 C 10374,10371 10720,8132 10742,3654"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 10743,3216 L 10592,3666 10892,3666 10743,3216 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id37">
<path fill="rgb(204,153,153)" stroke="none" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="10623" y="1613"><tspan fill="rgb(0,0,0)" stroke="none">User/web browser</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id38">
<path fill="none" stroke="rgb(0,0,0)" d="M 11339,2007 C 12136,2219 13023,2065 13808,2284"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11012,1761 L 11288,2147 11464,1904 11012,1761 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14117,2524 L 13846,2135 13666,2376 14117,2524 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id39">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="14613" y="18446"><tspan fill="rgb(0,0,0)" stroke="none">Authorization</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id40">
<path fill="none" stroke="rgb(0,0,0)" d="M 13035,18020 L 9982,15745"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,18277 L 13109,17888 12930,18128 13380,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9637,15488 L 9908,15877 10087,15637 9637,15488 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id41">
<path fill="none" stroke="rgb(0,0,0)" d="M 19053,18001 L 22230,15336"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,18277 L 19165,18103 18972,17873 18724,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,15060 L 22118,15234 22311,15464 22559,15060 Z"/>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
#### All reports
- what records have I edited
- how many records has my institution edited
- how many records has my institution contributed
- list of number of records contributed by institution
plan.md
--------
plan.md Big questions
plan.md Overview and order of work
plan.md Code we write
plan.md Controlled vocabularies and tag system
plan.md Code we use off the shelf
co-op_background.md
-----
Authors
Organization of documenatation
Introduction to SNAC
Evaluation of Existing Technical Architecture
Overview
Current State of the System
Processing Pipeline
Extraction
Match/Merge
Discovery/Dissemination
Prototype research tool
Gap analysis
Data maintenance
Pilot phase architecture
Current State Conclusion
introduction.md
--------
TAT Functional Requirements
Introduction to Planned Functionality
Software development, processes, and project management
QA and Related Tests for Test-driven Development
Documentation
Required new features
Web application overview
Web application output via template
Data background
What is "normal form" and what informs the database schema design?
Edit architecture requirements
Expanded CPF schema requirements
Expanded Database Schema
Merge and watch
Brian’s API docs need to be merged in or otherwise referred to:
Not sure where to fit these topics into the requirements. Some of them may not be part of technical requirements:
requirements.md
----
List of requirements
Requirements from Rachael's spreadsheet
List of Application Programmer Interfaces (APIs)
Work flow engine
Maintenance Functionality
Functionality for Discovery
User interface for Discovery
Functionality for Splitting
User interface for Splitting
Functionality for Merging
User interface for Merging
Functionality for Editing
User interface for Editing
Admin Client for Maintenance System
User Management
Web Application Administration
Reports
System Administration
Community Contributions
Ability to Open/Close the Site during Maintenance
Sandbox for Training, perhaps as a clone of the QA system?
ArchiveSpace Feature Planning via Brad
Staffing Model (Brian's draft suggestions)
#### Big questions
- (solved) how is gitlab backed up?
- Shayne backs up the whole gitlab VM.
- We need a complete understanding of our requirements for controlled vocabulary, ontology, and/or tagging as
well as how this relates to search facets. This also impacts our future ability to make assertions about the
data, and is somewhat related to semantic net. See [Tag system](#controlled-vocabularies-and-tag-system).
#### Documents we need to create
- Operations and Procedure Manual
- Research Agenda
- User Story Backlog
- Design Documents (UI/UX/Graphic Design)
- ideally someone writes a (possibly brief) style guide
- a set of .psd or other images is not a style guide
#### Governance and Policies, etc.
- Data curation, preservation, graceful retirement
- Data expulsion vs. embargo
- Duplicates, backups, restore, related policy and technical issues
- Broad pieces that are missing or underdeveloped [Laura]
- Refresh relationship with OCLC [John, Daniel]
#### Overview and order of work
1. create tech documents, filling in as much prose as possible
- currenly on-going
1. create prototype software to test tech requirements, iterate updating requirements and prototype
- Work flow engine is working and has both a command-line and web interface
- We have a SQL database schema
1. create tests for test driven development, and validate prototype
1. refactor or rewrite prototype to match requirements
1. create version 1 of software
#### Code we write
- Data validation API
- rule based system abstracted out of the code
- rules are data
- change the rules, not the actual application code
- rules for broad classes of data type, or granular rules for individual fields
- probably used this to untaint data as well (remove things that are potential security problems)
- send all data through this API
- every rule includes a message describing what when wrong and suggesting fixes
- rules potentially editable by non-programmers
- rules are based on co-op data policies, which implies a data policy document, or the rules **can** be the
policy documentation.
- Identitiy Reconciliation (aka IR) (architect Robbie)
- needs docs wrangled
- workflow manager (architect Tom)
- exists, needs tests, needs requirements
- needs to be integrated into an index.php script that also checks authentication
- can the workflow also support the login.php authentication? (Yes).
- SQL schema (Robbie, Tom)
- exists, needs tests, needs requirements
- should we re-architect tables become normal tables, the views go away, and versioned records are moved to shadow tables.
- add features for delete-via-mark (as opposed to actual delete)
- add features to support embargo
- *maybe, discuss* change vocabulary.sql from insert to copy. It would be smaller and faster, although in reality as soon as
it is in the database, the text file will never be touched again.
- discuss; Can/should we create a tag system to deal with ad-hoc requirements later in the project? [Tag system](#controlled-vocabularies-and-tag-system)
- CPF to SQL parser (Robbie)
- exists, needs tests, needs requirements
- Name serialization tool, selectable pre-configured formats
- Name string parser
- Can we find a grammar-based parser for PHP? Should we use a standalone parser?
- Date parser
- Can this use the same parser engine as the name string parser?
- CPF record edit, edit each field
- CPF record split, split data into separate cpf identities, deprecate old ARK, mint new ARKs
- CPF record merge, combine fields, deprecate old ARKs, mint new ARK
- coding style, class template (architect Robbie)
- We need to have UI edit/chooser widget for search and select of large numbers of options, such as the Joseph
Henry cpfRelations that contain some 22K entries. Also need to list all fields which might have large numbers
of values. In fact, part of the meta data for every field is "number of possible entries/reapeat values" or
whatever that's called. From a software architecture perspective, the answer is 0, 1, infinite.
#### Controlled vocabularies and tag system
Tags are simply terms. When inplemented as fixed terms with persistent IDs and some modify/add policy, tags
become a flat (non-hierarchal) controlled vocabulary.
The difference being a weaker moderation of tags and more readiness to create new tags (types). The tag table
would consist of tag term and an ID value. Tag systems lack data type, and generally have no policy or less
restrictive policies about creating new tags
Below are some subject examples. It is unclear if these are each topics, or if "--" is used to join granular
topics into a topic list. Likewise it is unclear if this list relies on some explicit hierarchy.
```
American literature--19th century--Periodicals
American literature--20th century--Periodicals
Periodicals
Periodicals--19th century
World politics--Periodicals
World politics--Pictorial works
World politics--Societies, etc.
World politics--Study and teaching
```
#### Code we use off the shelf
- gitlab for docs, code version management, issue tracking(?)
- github public code repository?
- test framework, need to choose one
- authentication
- session management, especially as applies to authentication tokens, cookies and something which prevents
XSS (cross-site scripting) attacks
- JavaScript UI component tools, JQuery; what others?
- reports, probably Jasper
- PHP, Postgres, Linux, Apache httpd, etc.
- language modules
These documents are organized in the following order:
[plan.md](plan.md) Big overview.
[outline.md](outline.md) An outline of sections in the documents
[co-op_background.md](co-op_background.md) Broad expectations for the co-op software.
[introduction.md](introduction.md) Requirements part one
[requirements.md](requirements.md) Requirements part two, includes tech requirements from Rachael's spreadsheets
![SNAC web app API data flow](images/image02.png)
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.2" baseProfile="tiny" width="279.4mm" height="215.9mm" viewBox="0 0 27940 21590" preserveAspectRatio="xMidYMid" fill-rule="evenodd" clip-path="url(#presentation_clip_path)" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<defs class="ClipPathGroup">
<clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
<rect x="0" y="0" width="27940" height="21590"/>
</clipPath>
</defs>
<defs>
<font id="EmbeddedFont_1" horiz-adv-x="2048">
<font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1847" descent="411"/>
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/>
<glyph unicode="z" horiz-adv-x="848" d="M 83,0 L 83,137 688,943 117,943 117,1082 901,1082 901,945 295,139 922,139 922,0 Z"/>
<glyph unicode="y" horiz-adv-x="1027" d="M 191,-425 C 142,-425 100,-421 67,-414 L 67,-279 C 92,-283 120,-285 151,-285 263,-285 352,-203 417,-38 L 434,5 5,1082 197,1082 425,484 C 428,475 432,464 437,451 442,438 457,394 482,320 507,246 521,205 523,196 L 593,393 830,1082 1020,1082 604,0 C 559,-115 518,-201 479,-258 440,-314 398,-356 351,-384 304,-411 250,-425 191,-425 Z"/>
<glyph unicode="x" horiz-adv-x="1027" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 Z"/>
<glyph unicode="w" horiz-adv-x="1515" d="M 1174,0 L 965,0 776,765 740,934 C 734,904 725,861 712,805 699,748 631,480 508,0 L 300,0 -3,1082 175,1082 358,347 C 363,331 377,265 401,149 L 418,223 644,1082 837,1082 1026,339 1072,149 1103,288 1308,1082 1484,1082 Z"/>
<glyph unicode="v" horiz-adv-x="1027" d="M 613,0 L 400,0 7,1082 199,1082 437,378 C 446,351 469,272 506,141 L 541,258 580,376 826,1082 1017,1082 Z"/>
<glyph unicode="u" horiz-adv-x="899" d="M 314,1082 L 314,396 C 314,325 321,269 335,230 349,191 371,162 402,145 433,128 478,119 537,119 624,119 692,149 742,208 792,267 817,350 817,455 L 817,1082 997,1082 997,231 C 997,105 999,28 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 826,132 825,185 L 822,185 C 781,110 733,58 679,27 624,-5 557,-20 476,-20 357,-20 271,10 216,69 161,128 133,225 133,361 L 133,1082 Z"/>
<glyph unicode="t" horiz-adv-x="539" d="M 554,8 C 495,-8 434,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 474,127 509,132 554,141 Z"/>
<glyph unicode="s" horiz-adv-x="925" d="M 950,299 C 950,197 912,118 835,63 758,8 650,-20 511,-20 376,-20 273,2 200,47 127,91 79,160 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 602,117 669,131 712,159 754,187 775,229 775,285 775,328 760,362 731,389 702,416 654,438 589,455 L 460,489 C 357,516 283,542 240,568 196,593 162,624 137,661 112,698 100,743 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 759,862 732,899 689,925 645,950 586,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,783 283,758 299,738 315,718 339,701 370,687 401,673 467,654 568,629 663,605 732,583 774,563 816,542 849,520 874,495 898,470 917,442 930,410 943,377 950,340 950,299 Z"/>
<glyph unicode="r" horiz-adv-x="540" d="M 142,0 L 142,830 C 142,906 140,990 136,1082 L 306,1082 C 311,959 314,886 314,861 L 318,861 C 347,954 380,1017 417,1051 454,1085 507,1102 575,1102 599,1102 623,1099 648,1092 L 648,927 C 624,934 592,937 552,937 477,937 420,905 381,841 342,776 322,684 322,564 L 322,0 Z"/>
<glyph unicode="p" horiz-adv-x="951" d="M 1053,546 C 1053,169 920,-20 655,-20 488,-20 376,43 319,168 L 314,168 C 317,163 318,106 318,-2 L 318,-425 138,-425 138,861 C 138,972 136,1046 132,1082 L 306,1082 C 307,1079 308,1070 309,1054 310,1037 312,1012 314,978 315,944 316,921 316,908 L 320,908 C 352,975 394,1024 447,1055 500,1086 569,1101 655,1101 788,1101 888,1056 954,967 1020,878 1053,737 1053,546 Z M 864,542 C 864,693 844,800 803,865 762,930 698,962 609,962 538,962 482,947 442,917 401,887 371,840 350,777 329,713 318,630 318,528 318,386 341,281 386,214 431,147 505,113 607,113 696,113 762,146 803,212 844,277 864,387 864,542 Z"/>
<glyph unicode="o" horiz-adv-x="1002" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 407,-20 288,28 207,125 126,221 86,360 86,542 86,915 248,1102 571,1102 736,1102 858,1057 936,966 1014,875 1053,733 1053,542 Z M 864,542 C 864,691 842,800 798,868 753,935 679,969 574,969 469,969 393,935 346,866 299,797 275,689 275,542 275,399 298,292 345,221 391,149 464,113 563,113 671,113 748,148 795,217 841,286 864,395 864,542 Z"/>
<glyph unicode="n" horiz-adv-x="899" d="M 825,0 L 825,686 C 825,757 818,813 804,852 790,891 768,920 737,937 706,954 661,963 602,963 515,963 447,933 397,874 347,815 322,732 322,627 L 322,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 358,972 406,1025 461,1056 515,1087 582,1102 663,1102 782,1102 869,1073 924,1014 979,955 1006,857 1006,721 L 1006,0 Z"/>
<glyph unicode="m" horiz-adv-x="1464" d="M 768,0 L 768,686 C 768,791 754,863 725,903 696,943 645,963 570,963 493,963 433,934 388,875 343,816 321,734 321,627 L 321,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 356,974 400,1027 450,1057 500,1087 561,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 967,970 1013,1022 1066,1054 1119,1086 1183,1102 1258,1102 1367,1102 1447,1072 1497,1013 1546,954 1571,856 1571,721 L 1571,0 1393,0 1393,686 C 1393,791 1379,863 1350,903 1321,943 1270,963 1195,963 1116,963 1055,934 1012,876 968,817 946,734 946,627 L 946,0 Z"/>
<glyph unicode="l" horiz-adv-x="207" d="M 138,0 L 138,1484 318,1484 318,0 Z"/>
<glyph unicode="k" horiz-adv-x="925" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 Z"/>
<glyph unicode="i" horiz-adv-x="207" d="M 137,1312 L 137,1484 317,1484 317,1312 Z M 137,0 L 137,1082 317,1082 317,0 Z"/>
<glyph unicode="h" horiz-adv-x="899" d="M 317,897 C 356,968 402,1020 457,1053 511,1086 580,1102 663,1102 780,1102 867,1073 923,1015 978,956 1006,858 1006,721 L 1006,0 825,0 825,686 C 825,762 818,819 804,856 790,893 767,920 735,937 703,954 659,963 602,963 517,963 450,934 399,875 348,816 322,737 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1057 321,1015 319,972 316,929 315,904 314,897 Z"/>
<glyph unicode="g" horiz-adv-x="950" d="M 548,-425 C 430,-425 336,-402 266,-356 196,-309 151,-243 131,-158 L 312,-132 C 324,-182 351,-221 392,-248 433,-275 486,-288 553,-288 732,-288 822,-183 822,27 L 822,201 820,201 C 786,132 739,80 680,45 621,10 551,-8 472,-8 339,-8 242,36 180,124 117,212 86,350 86,539 86,730 120,872 187,963 254,1054 355,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,917 825,952 828,1001 831,1050 833,1077 836,1082 L 1007,1082 C 1003,1046 1001,971 1001,858 L 1001,31 C 1001,-273 850,-425 548,-425 Z M 822,541 C 822,629 810,705 786,769 762,832 728,881 685,915 641,948 591,965 536,965 444,965 377,932 335,865 293,798 272,690 272,541 272,393 292,287 331,222 370,157 438,125 533,125 590,125 640,142 684,175 728,208 762,256 786,319 810,381 822,455 822,541 Z"/>
<glyph unicode="f" horiz-adv-x="565" d="M 361,951 L 361,0 181,0 181,951 29,951 29,1082 181,1082 181,1204 C 181,1303 203,1374 246,1417 289,1460 356,1482 445,1482 495,1482 537,1478 572,1470 L 572,1333 C 542,1338 515,1341 492,1341 446,1341 413,1329 392,1306 371,1283 361,1240 361,1179 L 361,1082 572,1082 572,951 Z"/>
<glyph unicode="e" horiz-adv-x="976" d="M 276,503 C 276,379 302,283 353,216 404,149 479,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 954,65 807,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,727 129,864 213,959 296,1054 416,1102 571,1102 889,1102 1048,910 1048,527 L 1048,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 481,969 412,940 361,882 310,823 282,743 278,641 Z"/>
<glyph unicode="d" horiz-adv-x="950" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 821,1035 821,1484 1001,1484 1001,223 C 1001,110 1003,36 1007,0 L 835,0 C 833,11 831,35 829,74 826,113 825,146 825,174 Z M 275,542 C 275,391 295,282 335,217 375,152 440,119 530,119 632,119 706,154 752,225 798,296 821,405 821,554 821,697 798,802 752,869 706,936 633,969 532,969 441,969 376,936 336,869 295,802 275,693 275,542 Z"/>
<glyph unicode="c" horiz-adv-x="899" d="M 275,546 C 275,402 298,295 343,226 388,157 457,122 548,122 612,122 666,139 709,174 752,209 778,262 788,334 L 970,322 C 956,218 912,135 837,73 762,11 668,-20 553,-20 402,-20 286,28 207,124 127,219 87,359 87,542 87,724 127,863 207,959 287,1054 402,1102 551,1102 662,1102 754,1073 827,1016 900,959 945,880 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 451,961 382,929 339,866 296,803 275,696 275,546 Z"/>
<glyph unicode="b" horiz-adv-x="951" d="M 1053,546 C 1053,169 920,-20 655,-20 573,-20 505,-5 451,25 396,54 352,102 318,168 L 316,168 C 316,147 315,116 312,74 309,31 307,7 306,0 L 132,0 C 136,36 138,110 138,223 L 138,1484 318,1484 318,1061 C 318,1018 317,967 314,908 L 318,908 C 351,977 396,1027 451,1057 506,1087 574,1102 655,1102 792,1102 892,1056 957,964 1021,872 1053,733 1053,546 Z M 864,540 C 864,691 844,800 804,865 764,930 699,963 609,963 508,963 434,928 388,859 341,790 318,680 318,529 318,387 341,282 386,215 431,147 505,113 607,113 698,113 763,147 804,214 844,281 864,389 864,540 Z"/>
<glyph unicode="a" horiz-adv-x="1079" d="M 414,-20 C 305,-20 224,9 169,66 114,123 87,202 87,302 87,414 124,500 198,560 271,620 390,652 554,656 L 797,660 797,719 C 797,807 778,870 741,908 704,946 645,965 565,965 484,965 426,951 389,924 352,897 330,853 323,793 L 135,810 C 166,1005 310,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1097,111 1117,113 1139,118 L 1139,6 C 1094,-5 1047,-10 1000,-10 933,-10 885,8 855,43 824,78 807,132 803,207 L 797,207 C 751,124 698,66 637,32 576,-3 501,-20 414,-20 Z M 455,115 C 521,115 580,130 631,160 682,190 723,231 753,284 782,336 797,390 797,445 L 797,534 600,530 C 515,529 451,520 408,504 364,488 330,463 307,430 284,397 272,353 272,299 272,240 288,195 320,163 351,131 396,115 455,115 Z"/>
<glyph unicode="W" horiz-adv-x="1951" d="M 1511,0 L 1283,0 1039,895 C 1023,951 1000,1051 969,1196 952,1119 937,1054 925,1002 913,950 822,616 652,0 L 424,0 9,1409 208,1409 461,514 C 491,402 519,287 544,168 560,241 579,321 600,408 621,495 713,828 877,1409 L 1060,1409 1305,532 C 1342,389 1372,267 1393,168 L 1402,203 C 1420,280 1435,342 1446,391 1457,439 1551,778 1727,1409 L 1926,1409 Z"/>
<glyph unicode="U" horiz-adv-x="1181" d="M 731,-20 C 616,-20 515,1 429,43 343,85 276,146 229,226 182,306 158,401 158,512 L 158,1409 349,1409 349,528 C 349,399 382,302 447,235 512,168 607,135 730,135 857,135 955,170 1026,239 1096,308 1131,408 1131,541 L 1131,1409 1321,1409 1321,530 C 1321,416 1297,318 1249,235 1200,152 1132,89 1044,46 955,2 851,-20 731,-20 Z"/>
<glyph unicode="T" horiz-adv-x="1181" d="M 720,1253 L 720,0 530,0 530,1253 46,1253 46,1409 1204,1409 1204,1253 Z"/>
<glyph unicode="S" horiz-adv-x="1207" d="M 1272,389 C 1272,259 1221,158 1120,87 1018,16 875,-20 690,-20 347,-20 148,99 93,338 L 278,375 C 299,290 345,228 414,189 483,149 578,129 697,129 820,129 916,150 983,193 1050,235 1083,297 1083,379 1083,425 1073,462 1052,491 1031,520 1001,543 963,562 925,581 880,596 827,609 774,622 716,635 652,650 541,675 456,699 399,724 341,749 295,776 262,807 229,837 203,872 186,913 168,954 159,1000 159,1053 159,1174 205,1267 298,1332 390,1397 522,1430 694,1430 854,1430 976,1406 1061,1357 1146,1308 1205,1224 1239,1106 L 1051,1073 C 1030,1148 991,1202 933,1236 875,1269 795,1286 692,1286 579,1286 493,1267 434,1230 375,1193 345,1137 345,1063 345,1020 357,984 380,956 403,927 436,903 479,884 522,864 609,840 738,811 781,801 825,791 868,781 911,770 952,758 991,744 1030,729 1067,712 1102,693 1136,674 1166,650 1191,622 1216,594 1236,561 1251,523 1265,485 1272,440 1272,389 Z"/>
<glyph unicode="R" horiz-adv-x="1232" d="M 1164,0 L 798,585 359,585 359,0 168,0 168,1409 831,1409 C 990,1409 1112,1374 1199,1303 1285,1232 1328,1133 1328,1006 1328,901 1298,813 1237,742 1176,671 1091,626 984,607 L 1384,0 Z M 1136,1004 C 1136,1086 1108,1149 1053,1192 997,1235 917,1256 812,1256 L 359,1256 359,736 820,736 C 921,736 999,760 1054,807 1109,854 1136,919 1136,1004 Z"/>
<glyph unicode="Q" horiz-adv-x="1438" d="M 1495,711 C 1495,512 1445,349 1345,221 1245,93 1106,17 928,-6 955,-90 991,-151 1036,-188 1080,-225 1136,-244 1204,-244 1241,-244 1279,-240 1319,-231 L 1319,-365 C 1257,-380 1198,-387 1141,-387 1040,-387 958,-359 893,-302 828,-245 774,-149 733,-16 601,-9 487,24 392,85 296,145 223,229 173,337 122,444 97,569 97,711 97,936 159,1113 282,1240 405,1367 577,1430 797,1430 940,1430 1065,1402 1170,1345 1275,1288 1356,1205 1412,1096 1467,987 1495,859 1495,711 Z M 1300,711 C 1300,886 1256,1024 1169,1124 1081,1224 957,1274 797,1274 636,1274 511,1225 423,1126 335,1027 291,889 291,711 291,534 336,394 425,291 514,187 637,135 795,135 958,135 1083,185 1170,286 1257,386 1300,528 1300,711 Z"/>
<glyph unicode="P" horiz-adv-x="1130" d="M 1258,985 C 1258,852 1215,746 1128,667 1041,588 922,549 773,549 L 359,549 359,0 168,0 168,1409 761,1409 C 919,1409 1041,1372 1128,1298 1215,1224 1258,1120 1258,985 Z M 1066,983 C 1066,1165 957,1256 738,1256 L 359,1256 359,700 746,700 C 959,700 1066,794 1066,983 Z"/>
<glyph unicode="N" horiz-adv-x="1181" d="M 1082,0 L 328,1200 333,1103 338,936 338,0 168,0 168,1409 390,1409 1152,201 C 1144,332 1140,426 1140,485 L 1140,1409 1312,1409 1312,0 Z"/>
<glyph unicode="M" horiz-adv-x="1386" d="M 1366,0 L 1366,940 C 1366,1044 1369,1144 1375,1240 1342,1121 1313,1027 1287,960 L 923,0 789,0 420,960 364,1130 331,1240 334,1129 338,940 338,0 168,0 168,1409 419,1409 794,432 C 807,393 820,351 833,306 845,261 853,228 857,208 862,235 874,275 891,330 908,384 919,418 925,432 L 1293,1409 1538,1409 1538,0 Z"/>
<glyph unicode="L" horiz-adv-x="925" d="M 168,0 L 168,1409 359,1409 359,156 1071,156 1071,0 Z"/>
<glyph unicode="I" horiz-adv-x="206" d="M 189,0 L 189,1409 380,1409 380,0 Z"/>
<glyph unicode="H" horiz-adv-x="1181" d="M 1121,0 L 1121,653 359,653 359,0 168,0 168,1409 359,1409 359,813 1121,813 1121,1409 1312,1409 1312,0 Z"/>
<glyph unicode="G" horiz-adv-x="1360" d="M 103,711 C 103,940 164,1117 287,1242 410,1367 582,1430 804,1430 960,1430 1087,1404 1184,1351 1281,1298 1356,1214 1409,1098 L 1227,1044 C 1187,1124 1132,1182 1062,1219 991,1256 904,1274 799,1274 636,1274 512,1225 426,1127 340,1028 297,890 297,711 297,533 343,393 434,290 525,187 652,135 813,135 905,135 991,149 1071,177 1150,205 1215,243 1264,291 L 1264,545 843,545 843,705 1440,705 1440,219 C 1365,143 1274,84 1166,43 1057,1 940,-20 813,-20 666,-20 539,9 432,68 325,127 244,211 188,322 131,432 103,562 103,711 Z"/>
<glyph unicode="F" horiz-adv-x="1027" d="M 359,1253 L 359,729 1145,729 1145,571 359,571 359,0 168,0 168,1409 1169,1409 1169,1253 Z"/>
<glyph unicode="E" horiz-adv-x="1130" d="M 168,0 L 168,1409 1237,1409 1237,1253 359,1253 359,801 1177,801 1177,647 359,647 359,156 1278,156 1278,0 Z"/>
<glyph unicode="D" horiz-adv-x="1232" d="M 1381,719 C 1381,574 1353,447 1296,338 1239,229 1159,145 1055,87 951,29 831,0 695,0 L 168,0 168,1409 634,1409 C 873,1409 1057,1349 1187,1230 1316,1110 1381,940 1381,719 Z M 1189,719 C 1189,894 1141,1027 1046,1119 950,1210 811,1256 630,1256 L 359,1256 359,153 673,153 C 776,153 867,176 946,221 1024,266 1084,332 1126,417 1168,502 1189,603 1189,719 Z"/>
<glyph unicode="C" horiz-adv-x="1309" d="M 792,1274 C 636,1274 515,1224 428,1124 341,1023 298,886 298,711 298,538 343,400 434,295 524,190 646,137 800,137 997,137 1146,235 1245,430 L 1401,352 C 1343,231 1262,138 1157,75 1052,12 930,-20 791,-20 649,-20 526,10 423,69 319,128 240,212 186,322 131,431 104,561 104,711 104,936 165,1112 286,1239 407,1366 575,1430 790,1430 940,1430 1065,1401 1166,1342 1267,1283 1341,1196 1388,1081 L 1207,1021 C 1174,1103 1122,1166 1050,1209 977,1252 891,1274 792,1274 Z"/>
<glyph unicode="A" horiz-adv-x="1386" d="M 1167,0 L 1006,412 364,412 202,0 4,0 579,1409 796,1409 1362,0 Z M 685,1265 L 676,1237 C 659,1182 635,1111 602,1024 L 422,561 949,561 768,1026 C 749,1072 731,1124 712,1182 Z"/>
<glyph unicode="/" horiz-adv-x="591" d="M 0,-20 L 411,1484 569,1484 162,-20 Z"/>
<glyph unicode="." horiz-adv-x="206" d="M 187,0 L 187,219 382,219 382,0 Z"/>
<glyph unicode=" " horiz-adv-x="564"/>
</font>
</defs>
<defs class="TextShapeIndex">
<g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49"/>
</defs>
<defs class="EmbeddedBulletChars">
<g id="bullet-char-template(57356)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
</g>
<g id="bullet-char-template(57354)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
</g>
<g id="bullet-char-template(10146)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
</g>
<g id="bullet-char-template(10132)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
</g>
<g id="bullet-char-template(10007)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
</g>
<g id="bullet-char-template(10004)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
</g>
<g id="bullet-char-template(9679)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
</g>
<g id="bullet-char-template(8226)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
</g>
<g id="bullet-char-template(8211)" transform="scale(0.00048828125,-0.00048828125)">
<path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
</g>
</defs>
<defs class="TextEmbeddedBitmaps"/>
<g>
<g id="id2" class="Master_Slide">
<g id="bg-id2" class="Background">
<path fill="rgb(255,255,255)" stroke="none" d="M 13970,21589 L 0,21589 0,0 27939,0 27939,21589 13970,21589 Z"/>
</g>
<g id="bo-id2" class="BackgroundObjects"/>
</g>
</g>
<g class="SlideGroup">
<g>
<g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
<g class="Page">
<g class="com.sun.star.drawing.CustomShape">
<g id="id3">
<path fill="rgb(255,255,204)" stroke="none" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z M 2270,10802 L 2270,10802 Z M 3541,12454 L 3541,12454 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2587,10802 L 3223,10802 3223,11421 3382,11421 3382,11222 3541,11628 3382,12033 3382,11834 3223,11834 3223,12454 2587,12454 2587,11834 2428,11834 2428,12033 2270,11628 2428,11222 2428,11421 2587,11421 2587,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2270,10802 L 2270,10802 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 3541,12454 L 3541,12454 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id4">
<path fill="rgb(255,255,204)" stroke="none" d="M 2012,19415 L 1119,19415 1119,3413 2905,3413 2905,19415 2012,19415 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 2012,19415 L 1119,19415 1119,3413 2905,3413 2905,19415 2012,19415 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="1422" y="10218"><tspan fill="rgb(0,0,0)" stroke="none">Linux</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="1174" y="10765"><tspan fill="rgb(0,0,0)" stroke="none">Apache</tspan></tspan><tspan class="TextPosition" x="1504" y="11312"><tspan fill="rgb(0,0,0)" stroke="none">PHP</tspan></tspan><tspan class="TextPosition" x="1697" y="11859"><tspan fill="rgb(0,0,0)" stroke="none">Git</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="1614" y="12406"><tspan fill="rgb(0,0,0)" stroke="none">etc.</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id5">
<path fill="rgb(230,230,255)" stroke="none" d="M 5898,3470 L 3920,3470 3920,2778 7875,2778 7875,3470 5898,3470 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 5898,3470 L 3920,3470 3920,2778 7875,2778 7875,3470 5898,3470 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="4791" y="3296"><tspan fill="rgb(0,0,0)" stroke="none">REST API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id6">
<path fill="rgb(230,230,255)" stroke="none" d="M 5826,5826 L 3286,5826 3286,4496 8366,4496 8366,5826 5826,5826 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 5826,5826 L 3286,5826 3286,4496 8366,4496 8366,5826 5826,5826 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="3739" y="5059"><tspan fill="rgb(0,0,0)" stroke="none">Data validation API</tspan></tspan><tspan class="TextPosition" x="5085" y="5606"><tspan fill="rgb(0,0,0)" stroke="none">untaint</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id7">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,13121 L 13401,13121 13401,11162 18702,11162 18702,13121 16052,13121 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="15284" y="11766"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan><tspan fill="rgb(0,0,0)" stroke="none">IR API</tspan></tspan><tspan class="TextPosition" x="15186" y="12313"><tspan fill="rgb(0,0,0)" stroke="none">Identity </tspan></tspan><tspan class="TextPosition" x="14610" y="12860"><tspan fill="rgb(0,0,0)" stroke="none">reconciliation</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id8">
<path fill="rgb(230,230,255)" stroke="none" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6665,7809 L 3540,7809 3540,6987 9790,6987 9790,7809 6665,7809 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="4322" y="7570"><tspan fill="rgb(0,0,0)" stroke="none">Work flow engine API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id9">
<path fill="none" stroke="rgb(0,0,0)" d="M 5826,5826 L 6413,6638"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6665,6987 L 6523,6534 6280,6710 6665,6987 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id10">
<path fill="rgb(153,102,204)" stroke="none" d="M 24209,19669 L 22558,19669 22558,3759 25860,3759 25860,19669 24209,19669 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 24209,19669 L 22558,19669 22558,3759 25860,3759 25860,19669 24209,19669 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="22863" y="10792"><tspan fill="rgb(0,0,0)" stroke="none">PostgreSQL</tspan></tspan><tspan class="TextPosition" x="23166" y="11885"><tspan fill="rgb(0,0,0)" stroke="none">CPF data</tspan></tspan><tspan class="TextPosition" x="23178" y="12432"><tspan fill="rgb(0,0,0)" stroke="none">user data</tspan></tspan><tspan class="TextPosition" x="23111" y="12979"><tspan fill="rgb(0,0,0)" stroke="none">meta data</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id11">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,14990 L 13380,14990 13380,13839 18724,13839 18724,14990 16052,14990 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="14858" y="14313"><tspan fill="rgb(0,0,0)" stroke="none">Controlled </tspan></tspan><tspan class="TextPosition" x="14405" y="14860"><tspan fill="rgb(0,0,0)" stroke="none">vocabulary API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id12">
<path fill="rgb(114,159,207)" stroke="none" d="M 9359,18653 L 7512,18653 7512,17503 11205,17503 11205,18653 9359,18653 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 9359,18653 L 7512,18653 7512,17503 11205,17503 11205,18653 9359,18653 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="8631" y="17976"><tspan fill="rgb(0,0,0)" stroke="none">Name </tspan></tspan><tspan class="TextPosition" x="7877" y="18523"><tspan fill="rgb(0,0,0)" stroke="none">string parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id13">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,16909 L 13380,16909 13380,15758 18724,15758 18724,16909 16052,16909 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="15115" y="16505"><tspan fill="rgb(0,0,0)" stroke="none">SQL API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id14">
<path fill="rgb(114,159,207)" stroke="none" d="M 5086,19276 L 3303,19276 3303,18125 6869,18125 6869,19276 5086,19276 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 5086,19276 L 3303,19276 3303,18125 6869,18125 6869,19276 5086,19276 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="3892" y="18599"><tspan fill="rgb(0,0,0)" stroke="none">Date string</tspan></tspan><tspan class="TextPosition" x="4276" y="19146"><tspan fill="rgb(0,0,0)" stroke="none">parsing</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id15">
<path fill="rgb(204,255,204)" stroke="none" d="M 17384,9243 L 14712,9243 14712,8092 20056,8092 20056,9243 17384,9243 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 17384,9243 L 14712,9243 14712,8092 20056,8092 20056,9243 17384,9243 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="15723" y="8839"><tspan fill="rgb(0,0,0)" stroke="none">Reporting tools</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id16">
<path fill="rgb(230,230,255)" stroke="none" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 6964,16338 L 4292,16338 4292,9127 9636,9127 9636,16338 6964,16338 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="5303" y="10443"><tspan fill="rgb(0,0,0)" stroke="none">Application API</tspan></tspan><tspan class="TextPosition" x="6897" y="10990"><tspan fill="rgb(0,0,0)" stroke="none"> </tspan></tspan><tspan class="TextPosition" x="5125" y="11537"><tspan fill="rgb(0,0,0)" stroke="none">CPF data editing</tspan></tspan><tspan class="TextPosition" x="5093" y="12084"><tspan fill="rgb(0,0,0)" stroke="none">HTML templating</tspan></tspan><tspan class="TextPosition" x="5070" y="12631"><tspan fill="rgb(0,0,0)" stroke="none">Data serialization</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="5563" y="13178"><tspan fill="rgb(0,0,0)" stroke="none">Data exports</tspan></tspan><tspan class="TextPosition" x="5756" y="13725"><tspan fill="rgb(0,0,0)" stroke="none">Dashboard</tspan></tspan><tspan class="TextPosition" x="5538" y="14272"><tspan fill="rgb(0,0,0)" stroke="none">User session</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id17">
<path fill="rgb(230,230,255)" stroke="none" d="M 18335,4406 L 15663,4406 15663,3255 21007,3255 21007,4406 18335,4406 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 18335,4406 L 15663,4406 15663,3255 21007,3255 21007,4406 18335,4406 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="15744" y="4002"><tspan fill="rgb(0,0,0)" stroke="none">History Search Tool API</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id18">
<path fill="none" stroke="rgb(0,0,0)" d="M 6665,7809 L 6869,8709"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,9128 L 7011,8656 6718,8722 6964,9128 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id19">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7398 L 15295,4054"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 15663,3831 L 15201,3936 15356,4193 15663,3831 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id20">
<path fill="none" stroke="rgb(0,0,0)" d="M 9790,7399 L 14296,8561"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14712,8668 L 14314,8410 14239,8701 14712,8668 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id21">
<path fill="none" stroke="rgb(0,0,0)" d="M 18414,4830 L 18516,5373"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18335,4407 L 18270,4877 18565,4822 18335,4407 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18595,5796 L 18660,5326 18365,5381 18595,5796 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id22">
<path fill="none" stroke="rgb(0,0,0)" d="M 20485,8642 L 22130,8541"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 20056,8668 L 20514,8790 20496,8491 20056,8668 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,8515 L 22101,8393 22119,8692 22559,8515 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id23">
<path fill="none" stroke="rgb(0,0,0)" d="M 19088,11950 L 22173,10413"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18703,12142 L 19173,12076 19039,11807 18703,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,10221 L 22088,10287 22222,10556 22558,10221 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id24">
<path fill="none" stroke="rgb(0,0,0)" d="M 19076,14167 L 22206,11962"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,14415 L 19178,14278 19005,14033 18724,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,11714 L 22104,11851 22277,12096 22558,11714 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id25">
<path fill="none" stroke="rgb(0,0,0)" d="M 13002,16129 L 10014,14511"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,16334 L 13056,15988 12913,16252 13380,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,14306 L 9960,14652 10103,14388 9636,14306 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id26">
<path fill="none" stroke="rgb(0,0,0)" d="M 19055,16059 L 22227,13419"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,16334 L 19166,16161 18974,15931 18724,16334 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22558,13144 L 22116,13317 22308,13547 22558,13144 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id27">
<path fill="none" stroke="rgb(0,0,0)" d="M 6652,16635 L 5398,17830"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 6964,16339 L 6535,16541 6741,16758 6964,16339 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5086,18126 L 5515,17924 5309,17707 5086,18126 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id28">
<path fill="none" stroke="rgb(0,0,0)" d="M 8749,16683 L 9102,17158"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 8492,16338 L 8640,16789 8881,16609 8492,16338 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9359,17503 L 9211,17052 8970,17232 9359,17503 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id29">
<path fill="none" stroke="rgb(0,0,0)" d="M 12921,14397 C 10781,14218 12239,12926 10087,12750"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,14415 L 12936,14247 12924,14547 13380,14415 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,12733 L 10080,12901 10092,12601 9636,12733 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id30">
<path fill="none" stroke="rgb(0,0,0)" d="M 12977,12075 L 10061,11616"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13402,12142 L 12981,11924 12934,12220 13402,12142 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9636,11549 L 10057,11767 10104,11471 9636,11549 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id31">
<path fill="rgb(114,159,207)" stroke="none" d="M 18595,6544 L 16564,6544 16564,5796 20625,5796 20625,6544 18595,6544 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 18595,6544 L 16564,6544 16564,5796 20625,5796 20625,6544 18595,6544 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="17016" y="6342"><tspan fill="rgb(0,0,0)" stroke="none">Elastic Search</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id32">
<path fill="none" stroke="rgb(0,0,0)" d="M 22120,5847 C 21312,5912 21872,6091 21064,6156"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,5833 L 22104,5699 22115,5999 22559,5833 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 20626,6170 L 21081,6304 21070,6004 20626,6170 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id33">
<path fill="none" stroke="rgb(0,0,0)" d="M 5524,3470 L 5705,4083"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5826,4496 L 5843,4022 5555,4107 5826,4496 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id34">
<path fill="none" stroke="rgb(0,0,0)" d="M 18335,3256 L 18753,2163"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18906,1761 L 18605,2128 18886,2235 18906,1761 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id35">
<path fill="none" stroke="rgb(0,0,0)" d="M 15331,8167 C 15331,3307 14758,6292 14717,2239"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14715,1761 L 14567,2212 14867,2210 14715,1761 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id36">
<path fill="none" stroke="rgb(0,0,0)" d="M 9636,10371 C 12599,10371 14003,7646 14077,2196"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 14080,1761 L 13927,2210 14227,2212 14080,1761 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id37">
<path fill="rgb(204,153,153)" stroke="none" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 12608,1761 L 4172,1761 4172,1126 21044,1126 21044,1761 12608,1761 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="10619" y="1615"><tspan fill="rgb(0,0,0)" stroke="none">User/web browser</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id38">
<path fill="none" stroke="rgb(0,0,0)" d="M 11012,1761 C 11012,2524 7225,2133 6169,2526"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 5898,2778 L 6333,2590 6133,2366 5898,2778 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id39">
<path fill="rgb(230,230,255)" stroke="none" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 16052,18852 L 13380,18852 13380,17701 18724,17701 18724,18852 16052,18852 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="14611" y="18448"><tspan fill="rgb(0,0,0)" stroke="none">Authorization</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id40">
<path fill="none" stroke="rgb(0,0,0)" d="M 13035,18020 L 9982,15745"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 13380,18277 L 13109,17888 12930,18128 13380,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 9637,15488 L 9908,15877 10087,15637 9637,15488 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id41">
<path fill="none" stroke="rgb(0,0,0)" d="M 19053,18001 L 22230,15336"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 18724,18277 L 19165,18103 18972,17873 18724,18277 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22559,15060 L 22118,15234 22311,15464 22559,15060 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id42">
<path fill="rgb(230,230,255)" stroke="none" d="M 11105,3666 L 9127,3666 9127,2777 13082,2777 13082,3666 11105,3666 Z"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 11105,3666 L 9127,3666 9127,2777 13082,2777 13082,3666 11105,3666 Z"/>
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="9538" y="3393"><tspan fill="rgb(0,0,0)" stroke="none">Authentication</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id43">
<path fill="none" stroke="rgb(0,0,0)" d="M 12028,1761 C 12028,2523 11522,2193 11259,2397"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 11105,2778 L 11421,2424 11146,2305 11105,2778 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id44">
<path fill="none" stroke="rgb(0,0,0)" d="M 11296,3666 C 11296,4417 9898,4292 9277,3969 8656,3646 8782,3314 8302,3175"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 7876,3124 L 8304,3329 8341,3032 7876,3124 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.CustomShape">
<g id="id45">
<path fill="none" stroke="rgb(52,101,164)" d="M 13970,20066 L 1000,20066 1000,19804 26940,19804 26940,20066 13970,20066 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id46">
<path fill="none" stroke="rgb(0,0,0)" d="M 23402,1998 L 24459,1992"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 24889,1990 L 24438,1842 24440,2142 24889,1990 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.TextShape">
<g id="id47">
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="21805" y="1661"><tspan fill="rgb(0,0,0)" stroke="none">unidirectional data</tspan></tspan></tspan></text>
</g>
</g>
<g class="com.sun.star.drawing.ConnectorShape">
<g id="id48">
<path fill="none" stroke="rgb(0,0,0)" d="M 25672,3249 L 22658,3280"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 26102,3244 L 25650,3099 25654,3399 26102,3244 Z"/>
<path fill="rgb(0,0,0)" stroke="none" d="M 22228,3285 L 22680,3430 22676,3130 22228,3285 Z"/>
</g>
</g>
<g class="com.sun.star.drawing.TextShape">
<g id="id49">
<text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="22078" y="2977"><tspan fill="rgb(0,0,0)" stroke="none">bidirectional data</tspan></tspan></tspan></text>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment