|
|
|
## Data Catalog Service
|
|
|
|
|
|
|
|
### Table of contents <a name="TOC"></a>
|
|
|
|
|
|
|
|
- [Introduction](#introduction)
|
|
|
|
- [Data Catalog API access](#data-catalog-access)
|
|
|
|
- [Source/Entity Configuration](#source-entity-configuration)
|
|
|
|
* [Source API Specs(Create/Get Source)](#source-api-specs)
|
|
|
|
+ [Parameters](#source-parameters)
|
|
|
|
+ [Examples](#source-examples)
|
|
|
|
* [Entity API Specs(Create/Get Entity)](#entity-api-specs)
|
|
|
|
+ [Parameters](#entity-parameters)
|
|
|
|
+ [Examples](#entity-examples)
|
|
|
|
- [Dropfile Template Configuration](#dropfile-template-configuration)
|
|
|
|
* [WidgetTemplate API Specs(Create/Get Dropfile Widget Template)](#widget-api-specs)
|
|
|
|
+ [Parameters](#widget-parameters)
|
|
|
|
+ [Examples](#widget-examples)
|
|
|
|
- [Enrchment Configuration](#enrichment-configuration)
|
|
|
|
* [MergeDefinition API Specs(Create/Get Merge Definition file)](#mergeDefinition-api-specs)
|
|
|
|
+ [Parameters](#mergeDefinition-parameters)
|
|
|
|
+ [Examples](#mergeDefinition-examples)
|
|
|
|
* [MergeTemplate API Specs(Create/Get Merge Template file)](#mergeTemplate-api-specs)
|
|
|
|
+ [Parameters](#mergeTemplate-parameters)
|
|
|
|
+ [Examples](#mergeTemplate-examples)
|
|
|
|
* [EntitySchema API Specs (Create/Get Raw/WKE Entity Schema)](#entitySchema-api-specs)
|
|
|
|
+ [Parameters](#entitySchema-parameters)
|
|
|
|
+ [Examples](#entitySchema-examples)
|
|
|
|
* [WkeSchema API Specs (Create/Get Source Schema for Well Known Entity)](#wkeSchema-api-specs)
|
|
|
|
+ [Parameters](#wkeSchema-parameters)
|
|
|
|
+ [Examples](#wkeSchema-examples)
|
|
|
|
* [EntityView API Specs (Create/Get Raw/WKE Entity View)](#entityView-api-specs)
|
|
|
|
+ [Parameters](#entityView-parameters)
|
|
|
|
+ [Examples](#entityView-examples)
|
|
|
|
* [uiMetadata API Specs (Update Source-Entity view)](#uiMetadata-api-specs)
|
|
|
|
+ [Parameters](#uiMetadata-parameters)
|
|
|
|
+ [Examples](#uiMetadata-examples)
|
|
|
|
- [OCR Mapping Configuration](#ocr-mapping-configuration)
|
|
|
|
* [OCRMapping API Specs (Create/Get OCR Mapping File)](#OCRMapping-api-specs)
|
|
|
|
+ [Examples](#uiMetadata-examples)
|
|
|
|
- [GIS Mapping Configuration](#gis-mapping-configuration)
|
|
|
|
* [GISMapping API Specs (Create/Get OCR Mapping File)](#GISMapping-api-specs)
|
|
|
|
+ [Examples](#GISMapping-examples)
|
|
|
|
## Introduction <a name="introduction"></a>
|
|
|
|
|
|
|
|
The main goals of the Data Catalog Service are to create configuration files and records that are required in ingestion and enrichment workflow.
|
|
|
|
|
|
|
|
## Data Catalog API access <a name="data-catalog-access"></a>
|
|
|
|
|
|
|
|
* Required Roles
|
|
|
|
|
|
|
|
Data Catalog service requires that users have dedicated roles in order to use it. Users must be a member of `users.datalake.editors` or `users.datalake.admins` or `users.datalake.ops`, roles can be assigned using the [Entitlements Service](/solutions/datalake/tutorials/core-services/entitlementsservice). Please look at the API documentation for specific requirements.
|
|
|
|
|
|
|
|
In addition to service roles, users __must__ be a member of data groups to access the data.
|
|
|
|
|
|
|
|
* Required Headers
|
|
|
|
|
|
|
|
The Data Ecosystem stores data in different tenants, depending on the different accounts in the DELFI system.
|
|
|
|
|
|
|
|
A user may belong to more than one account. As a user, after logging into the DELFI portal, you need to select the account you wish to be active.
|
|
|
|
Likewise, when using the Data Catalog APIs, you need to specify the active account in the header called Slb-Account-Id. The correct Slb-Account-Id can be obtained from the CFS services. The Slb-Account-Id enables the search within the mapped tenant. e.g.
|
|
|
|
```
|
|
|
|
Slb-Account-Id: slb
|
|
|
|
```
|
|
|
|
|
|
|
|
There is also a special tenant known as “common”, which contains all public data in the Data Ecosystem, and is accessible to all users.
|
|
|
|
```
|
|
|
|
Slb-Account-Id: common
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Source/Entity Configuration <a name="source-entity-configuration"></a>
|
|
|
|
Users can create source/entity <b>or</b> get existing source/entity.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Source API Specs(Create/Get Source) <a name="source-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API registers/creates a new source in datalake. Newly created source appears in Source drop down in Dropfile widget and Sources tab in Data catalog screen in DM App.
|
|
|
|
GET | This API retrieves source from datalake having source name as input. Use namespace to get retrives source details
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="source-parameters"></a>
|
|
|
|
|
|
|
|
* `status` values are case sensitive and possible values are ['New','Active','Reserved','Work in Progress','Deprecated'].
|
|
|
|
* `namespace` should in camel case.
|
|
|
|
* `displayName` is mandatory fields.
|
|
|
|
* `scope` values are case sensitive and possible values are ['Generic','System','Banned','Ingestion']
|
|
|
|
* `comments` and `definition` are optional fields.
|
|
|
|
|
|
|
|
#### Example <a name="source-examples"></a>
|
|
|
|
|
|
|
|
* Create source.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/source
|
|
|
|
{
|
|
|
|
"status": "ACTIVE",
|
|
|
|
"definition": "North Dakota Industrial Commission",
|
|
|
|
"displayName": "NorthDakota",
|
|
|
|
"namespace": "ndic",
|
|
|
|
"comments": "Public Dataset",
|
|
|
|
"scope": "Generic"
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get the source.
|
|
|
|
|
|
|
|
GET /datacatalog/v1/source?namespace=ndic
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/source' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"status": "ACTIVE",
|
|
|
|
"definition": "North Dakota Industrial Commission",
|
|
|
|
"displayName": "NorthDakota",
|
|
|
|
"namespace": "ndic",
|
|
|
|
"comments": "Public Dataset",
|
|
|
|
"scope": "Generic"
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
### Entity API Specs(Create/Get Entity) <a name="entity-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
------|--------
|
|
|
|
POST | This API registers/creates a new entity in datalake. Newly created source appears in Entity drop down in Dropfile widget and Entities tab in Data catalog screen in DM App.
|
|
|
|
GET | This API retrieves entity from datalake having source name as input. Use entityType in query parameter to get retrives source details
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="entity-parameters">
|
|
|
|
|
|
|
|
* `status` values are case sensitive and possible values are ['New','Active','Reserved','Work in Progress','Deprecated'].
|
|
|
|
* `entityType` should in camel case.
|
|
|
|
* `displayName` is mandatory fields.
|
|
|
|
* `scope` values are case sensitive and possible values are ['Generic','System','Banned','Ingestion']
|
|
|
|
* `comments` and `definition` are optional fields.
|
|
|
|
|
|
|
|
#### Examples <a name="source-examples"></a>
|
|
|
|
|
|
|
|
* Create the entity with name "completion"
|
|
|
|
|
|
|
|
POST /datacatalog/v1/entity
|
|
|
|
{
|
|
|
|
"status": "Active",
|
|
|
|
"definition": "A generic term used to describe the events and equipment necessary to bring a wellbore into production once drilling operations have been concluded, including but not limited to the assembly of downhole tubulars and equipment required to enable safe and efficient production from an oil or gas well.",
|
|
|
|
"displayName": "completion",
|
|
|
|
"entityType": "completion",
|
|
|
|
"comments": "",
|
|
|
|
"scope": "Generic"
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get the entity for completion
|
|
|
|
|
|
|
|
GET /datacatalog/v1/entity?entityType=completion
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/entity' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data ' {
|
|
|
|
"status": "Active",
|
|
|
|
"definition": "A generic term used to describe the events and equipment necessary to bring a wellbore into production once drilling operations have been concluded, including but not limited to the assembly of downhole tubulars and equipment required to enable safe and efficient production from an oil or gas well.",
|
|
|
|
"displayName": "completion",
|
|
|
|
"entityType": "completion",
|
|
|
|
"comments": "",
|
|
|
|
"scope": "Generic"
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
## Dropfile Template Configuration <a name="dropfile-template-configuration"></a>
|
|
|
|
Users can create the template for dropfile widget.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### WidgetTemplate API Specs(Create/Get Dropfile Widget Template) <a name="widget-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API creates a template that is used in Dropfile widget. This templates defines ingestorRoutine, enrichmentRoutine and other parameters based on source, entity and file type.
|
|
|
|
GET | This API lists all the templates that are used in Dropfile widget.
|
|
|
|
DELETE |This API deletes a template that is used in Dropfile widget. Used template name in path parameter.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="widget-parameters"></a>
|
|
|
|
* `template` template name should passed.
|
|
|
|
* `ingestorRoutines` value should in valid format example:`[{\"CSVIngestor\":{\"datasetDescriptor\":\"common:wkshop:wellbore-dataset_descriptor-1.5\",\"overwriteSchema\":false}}]`.
|
|
|
|
* `enrichmentRoutines` value should in valid format example:`[{\"DefaultEnrichment\": {}}]`
|
|
|
|
* `scope` values are case sensitive and possible values are ['Generic','System','Banned','Ingestion']
|
|
|
|
* `indexRoutines` value should in valid format.
|
|
|
|
* `description`,`fileType`, `entityType`, and `source` are optional fields.
|
|
|
|
|
|
|
|
#### Examples <a name="widget-examples"></a>
|
|
|
|
|
|
|
|
* Create the widget template.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/widgetTemplate
|
|
|
|
{
|
|
|
|
"ingestorRoutines": "[{\"CSVIngestor\":{\"datasetDescriptor\":\"common:wkshop:wellbore-dataset_descriptor-1.5\",\"overwriteSchema\":false}}]",
|
|
|
|
"enrichmentRoutines": "",
|
|
|
|
"description": "Well Summary",
|
|
|
|
"fileType": "csv",
|
|
|
|
"entityType": "WellBore",
|
|
|
|
"source": "onewkShop",
|
|
|
|
"indexRoutines": "",
|
|
|
|
"template": "Wellsummary"
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get list of template.
|
|
|
|
|
|
|
|
GET /datacatalog/v1/widgetTemplate
|
|
|
|
|
|
|
|
|
|
|
|
* Delete the Wellsummary template.
|
|
|
|
|
|
|
|
DELETE /datacatalog/v1/widgetTemplate/Wellsummary
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/widgetTemplate' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"ingestorRoutines": "[{\"CSVIngestor\":{\"datasetDescriptor\":\"common:wkshop:wellbore-dataset_descriptor-1.5\",\"overwriteSchema\":false}}]",
|
|
|
|
"enrichmentRoutines": "",
|
|
|
|
"description": "Well Summary",
|
|
|
|
"fileType": "csv",
|
|
|
|
"entityType": "WellBore",
|
|
|
|
"source": "onewkShop",
|
|
|
|
"indexRoutines": "",
|
|
|
|
"template": "Wellsummary"
|
|
|
|
} '
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
|
|
|
|
## Create Enrchment Configuration <a name="enrichment-configuration"></a>
|
|
|
|
User can create the enrichment config files.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### MergeDefinition API Specs(Create/Get Merge Definition file) <a name="mergeDefinition-api-specs"> </a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API defines the priority of the sources for each attribute. This information is looked up at the time of merging to determine whether the value in the incoming source record should replace the existing value in the WKE.The priorities thus defined are referred to as the 'merge definition rule'. Each rule is created with a unique name, and this name is specified as one of the inputs to the enrichment job.
|
|
|
|
GET | This API gets merge definition file from storage having file name as input.
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="mergeDefinition-parameters"></a>
|
|
|
|
|
|
|
|
* `name` of definition file that will store inside GCS area in Json format. Name should pass without extension.
|
|
|
|
* `priorityRankings` should contain at least one attribute and priorities list.
|
|
|
|
* `attribute` name for which priority will be apply during enrichment.
|
|
|
|
* `priorities` list of priority
|
|
|
|
* `seedSource` is optional field.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="mergeDefinition-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Create bootcamp_cdowellborerule file.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/mergeDefinition
|
|
|
|
|
|
|
|
{
|
|
|
|
"seedSource": "",
|
|
|
|
"name": "bootcamp_cdowellborerule",
|
|
|
|
"priorityRankings": [{
|
|
|
|
"attribute": "SurfaceLocationLongitude",
|
|
|
|
"priorities": [
|
|
|
|
"common:bootcamp_cdo:wellbore:1.0.0",
|
|
|
|
"common:wke:well:1.0.0"
|
|
|
|
]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get bootcamp_cdowellborerule file
|
|
|
|
|
|
|
|
GET /datacatalog/v1/mergeDefinition/bootcamp_cdowellborerule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/mergeDefinition' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"seedSource": "",
|
|
|
|
"name": "bootcamp_cdowellborerule",
|
|
|
|
"priorityRankings": [{
|
|
|
|
"attribute": "SurfaceLocationLongitude",
|
|
|
|
"priorities": [
|
|
|
|
"common:bootcamp_cdo:wellbore:1.0.0",
|
|
|
|
"common:wke:well:1.0.0"
|
|
|
|
]
|
|
|
|
}]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
### MergeTemplate API Specs(Create/Get Merge Rule Template) <a name="mergeTemplate-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API generates template which is the main input for enrichment process. It denotes the sources that we are merging, the criteria to match the records in them and the merge definition rule name.
|
|
|
|
GET | This API gets mergeTemplate record, required input is template name in query parameter .
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="mergeTemplate-parameters"></a>
|
|
|
|
* `target` targe field name.
|
|
|
|
* `mergeRuleTemplateName` name of the template.
|
|
|
|
* `mergeDefinition` name of the merge definition file. File should in GCS area. same we can create using mergeDefinition API.
|
|
|
|
* `sourceKind` kind of source.
|
|
|
|
* `matchRules` At least one match rule should pass.
|
|
|
|
* `jobName` is optional field.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="mergeTemplate-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Create mergeTemplate for common:workshop:wellbore:1.0.0.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/mergeTemplate
|
|
|
|
{
|
|
|
|
"target": "Well",
|
|
|
|
"jobName": "workshopJobWellbore",
|
|
|
|
"mergeRuleTemplateName": "IntegratedPipeline",
|
|
|
|
"mergeDefinition": "workshopwellborerule",
|
|
|
|
"sourceKind": "common:workshop:wellbore:1.0.0",
|
|
|
|
"matchRules": [
|
|
|
|
{
|
|
|
|
"sourceB": "common:wke:well:1.0.0",
|
|
|
|
"attributeB": "WellName",
|
|
|
|
"sourceA": "common:workshop:wellbore:1.0.0",
|
|
|
|
"attributeA": "WellName"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get template for common:workshop:wellbore:1.0.0
|
|
|
|
|
|
|
|
GET /datacatalog/v1/mergeTemplate/common:workshop:wellbore:1.0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/mergeTemplate' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"target": "Well",
|
|
|
|
"jobName": "workshopJobWellbore",
|
|
|
|
"mergeRuleTemplateName": "IntegratedPipeline",
|
|
|
|
"mergeDefinition": "workshopwellborerule",
|
|
|
|
"sourceKind": "common:workshop:wellbore:1.0.0",
|
|
|
|
"matchRules": [
|
|
|
|
{
|
|
|
|
"sourceB": "common:wke:well:1.0.0",
|
|
|
|
"attributeB": "WellName",
|
|
|
|
"sourceA": "common:workshop:wellbore:1.0.0",
|
|
|
|
"attributeA": "WellName"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
### EntitySchema API Specs (Create/Get Raw/WKE Entity Schema) <a name="entitySchema-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API creates schema file for raw and wke entities. This configuration has datatype mapping for every attribute for that entity and is used by enrichment workflows.
|
|
|
|
GET | This API gets schema record, required input is kind in path parameter .
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="entitySchema-parameters"></a>
|
|
|
|
* `kind` kind name for schema.
|
|
|
|
* `schema` schema fields should pass.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="entitySchema-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Create schema for slb:avocet:completion:1.0.0
|
|
|
|
|
|
|
|
POST /datacatalog/v1/entitySchema
|
|
|
|
{
|
|
|
|
"kind": "slb:avocet:completion:1.0.0",
|
|
|
|
"schema": [{
|
|
|
|
"datatype": "TEXT",
|
|
|
|
"conversionRequired": false,
|
|
|
|
"attributeName": "NAME",
|
|
|
|
"unitSystem": "",
|
|
|
|
"measurementType": "Dimensionless",
|
|
|
|
"unit": ""
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"datatype": "TEXT",
|
|
|
|
"conversionRequired": false,
|
|
|
|
"attributeName": "API",
|
|
|
|
"unitSystem": "",
|
|
|
|
"measurementType": "Dimensionless",
|
|
|
|
"unit": ""
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
* Get schema for slb:avocet:completion:1.0.0
|
|
|
|
|
|
|
|
GET /datacatalog/v1/entitySchema/slb:avocet:completion:1.0.0
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/entitySchema' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"kind": "slb:avocet:completion:1.0.0",
|
|
|
|
"schema": [{
|
|
|
|
"datatype": "TEXT",
|
|
|
|
"conversionRequired": false,
|
|
|
|
"attributeName": "NAME",
|
|
|
|
"unitSystem": "",
|
|
|
|
"measurementType": "Dimensionless",
|
|
|
|
"unit": ""
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"datatype": "TEXT",
|
|
|
|
"conversionRequired": false,
|
|
|
|
"attributeName": "API",
|
|
|
|
"unitSystem": "",
|
|
|
|
"measurementType": "Dimensionless",
|
|
|
|
"unit": ""
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
|
|
|
|
## WkeSchema API Specs (Create/Get Source Schema for Well Known Entity) <a name="wkeSchema-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API creates a mapping between the raw source attributes and the well known attributes. It lists the attributes of the source and describes what the equivalent WKE attribute is, which is needed to merge two sources.
|
|
|
|
GET | Get Source Schema record. Required input is wkeName and kind in path parameter.
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="wkeSchema-parameters"></a>
|
|
|
|
* `kind` name for which schema get created.
|
|
|
|
* `wkeName` wkeName.
|
|
|
|
* `schema` schema fields should pass.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="wkeSchema-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Create WKE schema for common:tokyo:wellbore:1.0.0
|
|
|
|
|
|
|
|
POST /datacatalog/v1/wkeSchema
|
|
|
|
{
|
|
|
|
"kind": "common:tokyo:wellbore:1.0.0",
|
|
|
|
"wkeName": "well",
|
|
|
|
"schema": [{
|
|
|
|
"wkaAttributeName": "WellName",
|
|
|
|
"id": 1,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well_Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"wkaAttributeName": "SurfaceLocationLatitude",
|
|
|
|
"id": 2,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Latitude"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get WKE schema for common:tokyo:wellbore:1.0.0
|
|
|
|
|
|
|
|
GET /datacatalog/v1/wkeSchema/common:tokyo:wellbore:1.0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/wkeSchema' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"kind": "common:tokyo:wellbore:1.0.0",
|
|
|
|
"wkeName": "well",
|
|
|
|
"schema": [{
|
|
|
|
"wkaAttributeName": "WellName",
|
|
|
|
"id": 1,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well_Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"wkaAttributeName": "SurfaceLocationLatitude",
|
|
|
|
"id": 2,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Latitude"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
### EntityView API Specs (Create/Get Raw/WKE Entity View) <a name="entityView-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API creates view file for the raw and wke entities. This configuration is used by Data Management App for displaying entity details in Grid View, Card View, Generic Summary Pane(widget)..
|
|
|
|
GET | This API retrieves view file for raw and wke entities from storage having kind as input in path parameter.
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="entityView-parameters"></a>
|
|
|
|
|
|
|
|
* `kind` name for which view file get created.
|
|
|
|
* `uiMapping` uiMapping definition.
|
|
|
|
|
|
|
|
#### Examples <a name="entityView-examples"></a>
|
|
|
|
|
|
|
|
* Create view file.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/entityView
|
|
|
|
{
|
|
|
|
"kind": "slb:avocet:completion:1.0.0",
|
|
|
|
"view": {
|
|
|
|
"uiMapping": [{
|
|
|
|
"DisplayField": "Score",
|
|
|
|
"ValueField": "Score",
|
|
|
|
"Grid": {
|
|
|
|
"order": 1
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"DisplayField": "Well Name",
|
|
|
|
"Tag": [
|
|
|
|
"wellName"
|
|
|
|
],
|
|
|
|
"FlyOut": {
|
|
|
|
"order": 1
|
|
|
|
},
|
|
|
|
"JSONHeader": "true",
|
|
|
|
"Grid": {
|
|
|
|
"order": 2
|
|
|
|
},
|
|
|
|
"ValueField": "NAME"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get view file.
|
|
|
|
|
|
|
|
GET /datacatalog/v1/entityView/slb:avocet:completion:1.0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/entityView' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"kind": "slb:avocet:completion:1.0.0",
|
|
|
|
"view": {
|
|
|
|
"uiMapping": [{
|
|
|
|
"DisplayField": "Score",
|
|
|
|
"ValueField": "Score",
|
|
|
|
"Grid": {
|
|
|
|
"order": 1
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"DisplayField": "Well Name",
|
|
|
|
"Tag": [
|
|
|
|
"wellName"
|
|
|
|
],
|
|
|
|
"FlyOut": {
|
|
|
|
"order": 1
|
|
|
|
},
|
|
|
|
"JSONHeader": "true",
|
|
|
|
"Grid": {
|
|
|
|
"order": 2
|
|
|
|
},
|
|
|
|
"ValueField": "NAME"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
## uiMetadata API Specs (Update Source-Entity view) <a name="uiMetadata-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
PUT | This API maps entities to its kind. Data Management app uses this generated configuration to list entities with their corresponding sources and is also used to locate the config files by Enrichment process. This is also used by GIS.
|
|
|
|
|
|
|
|
|
|
|
|
#### Parameters <a name="uiMetadata-parameters"></a>
|
|
|
|
* `forUI` to show and hide the fields from UI.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="uiMetadata-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Update UI
|
|
|
|
|
|
|
|
PUT /datacatalog/v1/uiMetadata
|
|
|
|
{
|
|
|
|
"forUI": true,
|
|
|
|
"value": "avocet",
|
|
|
|
"key": "Avocet",
|
|
|
|
"entity": [
|
|
|
|
{
|
|
|
|
"entityName": "Completions",
|
|
|
|
"kindName": "common:avocet:completion:1.0.0",
|
|
|
|
"forUI": false
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request PUT \
|
|
|
|
--url '/datacatalog/v1/uiMetadata' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"forUI": true,
|
|
|
|
"value": "avocet",
|
|
|
|
"key": "Avocet",
|
|
|
|
"entity": [
|
|
|
|
{
|
|
|
|
"entityName": "Completions",
|
|
|
|
"kindName": "common:avocet:completion:1.0.0",
|
|
|
|
"forUI": false
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
## Create OCR Mapping Configuration <a name=ocr-mapping-configuration></a>
|
|
|
|
User can create the OCR config files.
|
|
|
|
|
|
|
|
|
|
|
|
## OCRMapping API Specs (Create/Get OCR Mapping File) <a name="OCRMapping-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API maps source attributes to attributes of enriched document entity that is used by search functionality of document enriched metadata.
|
|
|
|
GET | This API retrieves OCR Mapping file from storage having source as input in path parameter.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="OCRMapping-examples"></a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* Create OCR Mapping file.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/OCRMapping
|
|
|
|
{
|
|
|
|
"entity_map": {
|
|
|
|
"search:workshop:document:1.0.0": [
|
|
|
|
{
|
|
|
|
"sourceName": "kind",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "kind"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "id",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "id"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "legal",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DocumentLegal"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "acl",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DatalakeAcl"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "namespace",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "Source"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "status",
|
|
|
|
"sourceParentPath": "results::legal",
|
|
|
|
"name": "DatalakeStatus"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "version",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DocumentLakeVersion"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "fileName",
|
|
|
|
"sourceParentPath": "results::data",
|
|
|
|
"name": "DocumentFilename"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"storage:workshop:document:1.0.0": [
|
|
|
|
{
|
|
|
|
"sourceName": "id",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLakeId"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "version",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLakeVersion"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "kind",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeKind"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "acl",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeAcl"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "legal",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLegal"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "user",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeUser"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "fileName",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentFilename"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "bucketURL",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentBucketURL"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "mimeType",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentMimeType"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "dateCreated",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentDateCreated"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get OCR Mapping file.
|
|
|
|
|
|
|
|
GET /datacatalog/v1/OCRMapping/{source}
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/OCRMapping' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data '{
|
|
|
|
"entity_map": {
|
|
|
|
"search:workshop:document:1.0.0": [
|
|
|
|
{
|
|
|
|
"sourceName": "kind",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "kind"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "id",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "id"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "legal",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DocumentLegal"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "acl",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DatalakeAcl"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "namespace",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "Source"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "status",
|
|
|
|
"sourceParentPath": "results::legal",
|
|
|
|
"name": "DatalakeStatus"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "version",
|
|
|
|
"sourceParentPath": "results",
|
|
|
|
"name": "DocumentLakeVersion"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "fileName",
|
|
|
|
"sourceParentPath": "results::data",
|
|
|
|
"name": "DocumentFilename"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"storage:workshop:document:1.0.0": [
|
|
|
|
{
|
|
|
|
"sourceName": "id",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLakeId"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "version",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLakeVersion"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "kind",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeKind"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "acl",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeAcl"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "legal",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DocumentLegal"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "user",
|
|
|
|
"sourceParentPath": "",
|
|
|
|
"name": "DatalakeUser"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "fileName",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentFilename"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "bucketURL",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentBucketURL"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "mimeType",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentMimeType"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"sourceName": "dateCreated",
|
|
|
|
"sourceParentPath": "data",
|
|
|
|
"name": "DocumentDateCreated"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
## Create GIS Mapping Configuration <a name=gis-mapping-configuration></a>
|
|
|
|
User can create the GIS config files.
|
|
|
|
|
|
|
|
|
|
|
|
### GISMapping API Specs (Create/Get OCR Mapping File) <a name="GISMapping-api-specs"></a>
|
|
|
|
|
|
|
|
Method|Description
|
|
|
|
----|--------
|
|
|
|
POST | This API maps source attributes to GIS attributes of an entity. This mapping is used by GIS.
|
|
|
|
GET | This API gets GIS mapping file from storage having kind as input in path parameter.
|
|
|
|
|
|
|
|
|
|
|
|
#### Examples <a name="GISMapping-api-specs"></a>
|
|
|
|
|
|
|
|
|
|
|
|
* Create GIS Mapping file.
|
|
|
|
|
|
|
|
POST /datacatalog/v1/gisMapping
|
|
|
|
{
|
|
|
|
"kind": "common:ihs:wellbore:1.0.0",
|
|
|
|
"mapping": [
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Source",
|
|
|
|
"id": 1,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "IHS"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Well Name",
|
|
|
|
"id": 2,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Field",
|
|
|
|
"id": 3,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Field Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Operator",
|
|
|
|
"id": 4,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Operator Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Spud Date",
|
|
|
|
"id": 5,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Spud Date"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Current Status",
|
|
|
|
"id": 6,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Technical Status"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Class",
|
|
|
|
"id": 7,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well Class"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
* Get GIS Mpping file.
|
|
|
|
|
|
|
|
GET /datacatalog/v1/gisMapping/common:ihs:wellbore:1.0.0
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>**Curl**</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
curl --request POST \
|
|
|
|
--url '/datacatalog/v1/gisMapping' \
|
|
|
|
--header 'accept: application/json' \
|
|
|
|
--header 'authorization: Bearer <JWT>' \
|
|
|
|
--header 'content-type: application/json' \
|
|
|
|
--header 'Slb-Account-Id: common' \
|
|
|
|
--data ' {
|
|
|
|
"kind": "common:ihs:wellbore:1.0.0",
|
|
|
|
"mapping": [
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Source",
|
|
|
|
"id": 1,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "IHS"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Well Name",
|
|
|
|
"id": 2,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Field",
|
|
|
|
"id": 3,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Field Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Operator",
|
|
|
|
"id": 4,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Operator Name"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Spud Date",
|
|
|
|
"id": 5,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Spud Date"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Current Status",
|
|
|
|
"id": 6,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Technical Status"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"gisAttributeName": "Class",
|
|
|
|
"id": 7,
|
|
|
|
"isActive": true,
|
|
|
|
"sourceAttributeName": "Well Class"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}'
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
[Back to table of contents](#TOC)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\ No newline at end of file |