CPS-391
-
Getting issue details...
STATUS
Guiding Principles
- NCMP REST Interface will follow/be inspired by RESTConf interface for easy acceptance of and transition to this interface
- Will follow ONAP's RESTful API Design Specification
- The interface will include the concept of data-stores inspired by Network Management Datastore Architecture (NMDA) and as used in RESTConf
- The application should be able to easily switch between 'pass-through' and other datastores (also identical rest endpoint and responses)
References
Follow principles/patterns of RESTCONF RFC-8040 https://datatracker.ietf.org/doc/html/rfc8040
Follow principles/patterns of yang-patch RFC-8072 https://datatracker.ietf.org/doc/html/rfc8040
Follow principles/patterns of RESTCONF NMDA RFC-8527 https://datatracker.ietf.org/doc/html/rfc8527
Open Issues & Decisions
Click here to expand...
| Description | Notes | Decision |
---|
1 | Priority of async calls |
| In Istanbul, async calls are required only in pass-through cases. NCMP does not have to handle these requests |
2 | Will we use the data node wrapper on GET rest operations? | Currently, we wrap the response of GET operations using the data node wrapper. | we should mainly support yang-data/json controlled by "accept-header" |
3 | In the URI will we distinguish between data and operations (RFC calls) as part of the path? | | This only applies to pass-through yes, we will distinguish between data and operation |
4 | Which query parameters will NCMP support? |
| Parent data resource identifier can handle any path using the same query parameter - cpsPath
- RESTConf Path (pass-through)
- Proprietary Path (pass-through)
|
5 | Yml should include return types and examples of the payload |
| Legacy and new API documentation needs to include output examples. Task created, see
CPS-401
-
Getting issue details...
STATUS
|
6 | camel case or dash in URI |
| We will use a dash for param names e.g. cm-handle (although it has since been agreed we use 'ch' in this particular case) See no.3 https://restfulapi.net/resource-naming/ |
7 | Insert /resource-path in front of the resource path to prevent ambiguous paths | <OP>/ncmp/<v{v-number}>/ch/<cm-handle>/<data|operations|{ncmp-operation}>/ds/{datastore}/[rp:]{resource-path}?{query} | Optionally insert the resource path ('rp:') if it clashes with the current |
8 | Granularity of update scenarios (and priority) | - Add child and its descendants (supported in cps core)
- Add all list elements (supported in cps core)
- Replace child and its descendants (supported in cps core)
- Replace all list elements (pending in cps core)
- Update single leaf (new)
- Add list entry (new)
| Priority is pass-through only so it depends on the RETSConf protocol that is supported. In Jakarta or if required by other projects more fine-grained 'operation' datastore update options can be implemented |
9 | Fallback option for datastore in release I |
| No, explicit datastore options will be used in Istanbul |
10 | fields is a rest conf option, investigate is it fully supported by onap |
| Supported in pass-through for ONAP DMI plugin but depending on the support by the actual target. The intention is to increase support 'fields' in future requirements following RFC-8040 for operational datastore etc. |
11 | Agree on URI syntax | Proposed syntax by CPS team <OP>/ncmp/<v{v-number}>/ch/<cm-handle>/<data|operations|{ncmp-operation}>/ds/{datastore}/[rp:]{resource-path}?{query} | review completed and proposed URI agreed |
12 | Will we combine query capabilities with update capabilities? |
| We have decided not to combine query capabilities with update capabilities |
13 | Description of header limitations |
| HTTP Header Limitations Some servers put size limitations on HTTP headers, making them unsuitable for storing cmHandle information. LIMITATION NOTE: server implementations put size limits on the headers meaning header contents should be designed carefully : Apache - 8K Nginx - 4K-8K IIS - 8K-16K Tomcat - 8K – 48K |
14 | Will NCMP support paths for pass-through:running |
| The plugin will not do transformation or validation of paths in the case of pass-through:running |
15 | Specification of path per cm handle |
| DMI Plugin can take cps paths or restconf paths and it needs to specify that per cm handle when cm handle is created |
16 | What is the default path for NCMP |
| In NCMP default will always be cps path and depending on the adapter we can change it as needed per cm handle |
17 | Fields parameter for ncmp/operational? |
| The fields parameter is ignored in ncmp/operational (in Istanbul release) |
18 | Is specifying the datastore mandatory? |
| Datastore is mandatory in Istanbul release |
19 | Register a DMI plugin with NCMP |
| DMI plugin is a part of cm handle registration. The rest endpoint on NCMP can be multiple calls |
20 | Retrieve list of modules (names) for a cmHandle |
| Retrieve a list of module names for cm handle - this will be used by ncmp to get the models. - assuming ncmp model discovery is complete and it is stored in cps core, this will come from cached information |
21 | Where will sync be implemented? |
| Implement sync in the dmi plugin and then have ncmp be able to pass on the request. This is not a bulk operation |
22 | Config-true only support (filter out config-false data) |
| Use datastore 'running' to select this but filtering not supported in I for cached data |
23 | Enable NCMP to convert cpsPath to mutliple options(RESTConf, netConf, leave as cpsPath) | When other DMI-Plugins are realized they might need a different conversion then the default from cspPath to RESTConf. This could be configured by using a known property for each cm-handle | Not required in Istanbul. But DB model can easily be updated to cater for this when needed |
24 | Datastore conversion in NCMP or DMI-Plugin | DMI-Plugin will know best how to convert. This will also reduce future impacts on NCMP for new options. | NCMP will do now conversion of datastore names |
25 | What datastore/s (name/s) is/are supported by NCMP to referred to the cached data. 'Operational' or 'running' | 'operational' would imply RO and config=false data is included. 'To also support 'running' using the same data a filter would have to be applied | see supported datastore in I : 103416823 |
26 | Consider fallback option when user specifies ncmp/operational but data is NOT synced |
| NCMP will forward requests for un-synced cmHandles to the DMI Plugin (Including required transformation of resource path etc.) |
27 | Support for &fields parameter when using cached data | - not supported (ignored, not rejects, nice for future compatibility)
- treat as 'no descendants' (low cost)
- use to filter cached data
| &Fields parameter will be ignored for 'cached' data in Istanbul timeframe long term expectation is to have support following RESTConf/ODL behavior as much as possible |
28 | Support for &fields parameter when forwarding to plugin for non-synced cmHandles | - not supported (ignored, not rejects, nice for future compatibility)
- treat as 'no descendants' (low cost)
- translate (insert module names) and forward
| A spike
CPS-455
-
Getting issue details...
STATUS
will be executed to determine the feasibility of option 3 and decide if it can make Istanbul scope |
29 | Response for Data Sync request (in Istanbul timeframe) | The action is blocking synchronous through whole stack (in I) so response could include the data returned by the node. However this seem incorrect for an 'action' so maybe the response should just be just an acknowledgment it is 'done' | No need to return data, just HTTP Code 200 (OK) will suffice |
RESTCONF/NETCONF relationship
![](/download/attachments/103416822/image2021-5-10_16-28-3.png?version=1&modificationDate=1620660486000&api=v2)
NCMP URI
NCMP URI format to follow below pattern
<OP>/ncmp/<v{v-number}>/ch/<cm-handle>/<data|operations|{ncmp-action}>/ds/{datastore}/[rp:]{resource-path}?{query}
URI |
| Mandatory or Optional |
---|
<OP> | the HTTP method | Mandatory |
ncmp / | the ncmp root resource | Mandatory |
<v{v-number}> | version of the ncmp interface <path> is the target resource URI <query> is the query parameter list | Mandatory |
ch/<cm-handle> | unique (string) identifier of a yang tree instance. | Optional |
<data|operations|{ncmp-action}> | request category - yang data, rpc operation or a (non-modelled) ncmp api action. this could be data, operations or ncmp-action (e.g. 'sync-data') | Mandatory |
ds/{datastore} | optional datastore | Optional |
<resource-path> | the path expression identifying the resource that is being accessed by the operation. If this field is not present, then the target resource is the API itself. | Optional |
<query> | the set of parameters associated with the RESTCONF message; see Section 3.4 of [RFC3986]. RESTCONF parameters have the familiar form of "name=value" pairs. Most query parameters are optional to implement by the server and optional to use by the client. Each optional query parameter is identified by a URI | Optional |
Datastores
New datastores are defined for ncmp to access the CPS 'intent' or 'operational' datastore.
Alternatively, the request can be sent directly to the 'device' itself (bypassing CPS datastores) using one of the 'passthrough-*' datastores options as below
The new ncmp datastores required for ONAP Release I include :
1 | ncmp-datastores:operational (RO / config=true/false) | Read from the CPS "operational" store (cached) | config true and config false data |
2 | ncmp-datastores:passthrough-running (RW / config=true) | Read/Write to/from the live devices ietf-datastores:running (no local ncmp validation) | config-true data only |
3 | ncmp-datastores:passthrough-operational (RO / config=true/false) |
| config true and config false data |
4 | ncmp-datastores:running (RW / config=true/false) |
|
|
Future datastores to be supported by NCMP might include :
1 | ncmp-datastores:passthrough-intented (RO) | Read from the live devices ietf-datastores:intended | ? |
If datastore (ds/{datastore}) is omitted from URI, the datastore from cmhandle is used
If datastore (ds/{datastore}) is omitted from URI AND the model/moduleSet exists, the datastore defaults to ncmp-datastores:running
Yang data resource actions and RPC operations are run directly on the 'device' meaning ncmp-datastores:passthrough-running is used for these request
| State | Input | Behavior | Data | Notes |
---|
# | Data-Sync | Datastore parameter | Expected Resource-Path format | Accept-Header | Fields (filter) | Data Source | Included DataNodes (config) |
---|
1 | On | Not Specified | cpsPath | application/yang-data+json | N/A | Not supported | N/A | N/A |
|
2 | On | Not Specified | cpsPath | application/json | N/A | Not supported | N/A | N/A |
|
3 | Off | Not Specified | cpsPath | application/yang-data+json | N/A | Not supported | N/A | N/A |
|
4 | Off | Not Specified | cpsPath | N/A | N/A | Not supported | N/A | N/A | there are NO DataNode objects in CPS to output as JSON) |
5 | Off | Not Specified | other then cpsPath | N/A | N/A | Not supported | N/A | N/A | Not supported Since NCMP can only convert cpsPaths |
6 | On | Off | ncmp/passthrough-operational | NCMP does not parse | NCMP does not parse | depends on DMI-Plugin (supported in ONAP) | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | config + non-config | The DMI plugin may error if the RP or accept header are not supported. The DMI plugin may forward the request without processing too. |
7 | On | Off | ncmp/passthrough-running | NCMP does not parse | NCMP does not parse | depends on DMI-Plugin (supported in ONAP) | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | config-only |
|
8 | On | ncmp/operational | cpsPath | application/yang-data+json | Not supported in Istanbul releases | Read from cache output: application/yang-data+json | CPS-Core | config + non-config | NCMP/CPS-Core needs to remove DataNode wrapping
|
9 | On | ncmp/operational | cpsPath | application/json | Not supported in Istanbul releases | Read from cache output: application/json | CPS-Core | config + non-config |
|
10 | Off | ncmp/operational | cpsPath | application/yang-data+json | to be determined in spike, see issue #28
| Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | Read from DMI plugin Output application/yang-data+json | DMI-Plugin | config + non-config |
|
11 | On | Off | ncmp/running | cpsPath | application/yang-data+json | to be determined in spike, see issue #28 | Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | Read from DMI plugin Output application/yang-data+json | DMI-Plugin | config-only |
|
Works Items for above.
# | Description | Component | Enables |
---|
1 | Forward request from NCMP to CPS-Core | NCMP | 8,9 |
2 | Forward request from NCMP to DMI-Plugin | NCMP | 6,7 |
3 | Convert json (dataNode) to yang-data+json | CPS-Core/NCMP | 8 |
4 | Convert cpsPath to RESTConf Path | NCMP | 10,11 |
5 | Enhance &fields parameter where needed | NCMP | 10,11+fields option |
6 | NOT Supported | N/A | 1,2,3,4,5 |
- Write operations are only supported on the ncmp-datastores:running and ncmp-datastores:passthrough-running datastores
- Write operations are only supported for config=true data
- Fields and similar parameters are not supported for write operations
| State | Input | Behavior | Data | Notes |
---|
# | Data-Sync | Operation | Datastore parameter | Expected Resource-Path format | Accept-Header | DataSource | Output |
---|
1 | On | Off | Create | ncmp/passthrough-running | NCMP does not parse | NCMP does not parse | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | ? | The DMI plugin may error if the RP or accept header are not supported. The DMI plugin may forward the request without processing too. |
2 | On | Off | Update | ncmp/passthrough-running | NCMP does not parse | NCMP does not parse | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | ? | The DMI plugin may error if the RP or accept header are not supported. The DMI plugin may forward the request without processing too. |
3 | On | Off | Delete | ncmp/passthrough-running | NCMP does not parse | NCMP does not parse | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | ? | The DMI plugin may error if the RP or accept header are not supported. The DMI plugin may forward the request without processing too. |
4 | On | Off | Patch | ncmp/passthrough-running | NCMP does not parse | NCMP does not parse | Resolve DMI plugin Forward request to plugin Output received response | DMI-Plugin | ? | The DMI plugin may error if the RP or accept header are not supported. The DMI plugin may forward the request without processing too. |
5 | On | Off | Create | ncmp/running | cpsPath | application/yang-data+json | Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | update using DMI plugin Output application/yang-data+json | DMI-Plugin | ? |
|
6 | On | Off | Update | ncmp/running | cpsPath | application/yang-data+json | Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | update using DMI plugin Output application/yang-data+json | DMI-Plugin | ? |
|
7 | On | Off | Delete | ncmp/running | cpsPath | application/yang-data+json | Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | update using DMI plugin Output application/yang-data+json | DMI-Plugin | ? |
|
8 | On | Off | Patch | ncmp/running | cpsPath | application/yang-data+json | Resolve DMI plugin Convert cpsPath to RESTConfPath Forward request to plugin | update using DMI plugin Output application/yang-data+json | DMI-Plugin | ? |
|
REST API
Click here to expand...
| Req/usecase | REST Method | URI / Payload | Request/Response Example | Release I |
---|
1 | Read of a data resource getting specific fields for a given cmHandle Sync call | GET | ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier}?fields={fields}
Note 'topic' and 'fields' are only supported in passthrough mode at this time (ONAP Release I). If not passhrough then an exception is thrown from NCMP at this time. Accept : application/yang-data+json Always return the yang-data+json in the "data" event payload | Scenario : Read the GNBCUCPFunction for cmhandle "335ff" as passthrough Method : GET URI : {ncmp-root}/ncmp/v1/data/ch/335ff/ManagedElement[@id=Kista-001] /GNBCUCPFunction[@id=1]?fields=pLMNId;gNBId;gNBIdLength Header : Accept: application/yang-data+json
Response : { "_3gpp-common-managed-element:ManagedElement" : [ { "id"="Kista-001", _3gpp-nr-nrm-gnbcucpfunction:GNBCUCPFunction : [ { "id"="1", "attributes" : { "pLMNId : [ { "mcc" : "01", "mnc" : "123" }], "gNBId" : 123, "gNBIdLength" : 3 } } ] } ] } | Y |
2 | Async read of a data resource getting specific fields from ncmp-datastores: passthrough-running for a given cmHandle | GET | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier}?fields={fields}&topic={topicId} Note 'topic' and 'fields' are only supported in passthrough mode at this time (ONAP Release I). If not passhrough then an exception is thrown from NCMP at this time. Accept : application/json
Always return the yang-data+json in the "data" event payload | Scenario : Read the GNBCUCPFunction for cmhandle "335ff" as passthrough Method : GET URI : {ncmp-root}/ncmp/v1/data/ch/335ff/ManagedElement[@id=Kista-001] /GNBCUCPFunction[@id=1]?fields=pLMNId;gNBId;gNBIdLength&topic=anr-app: anr24234234:v2 OR {ncmp-root}/ncmp/v1/data/ch/335ff/ds/ncmp-datastores:passthrough-running? fields=_3gpp-common-managed-element:ManagedElement/_3gpp-nr-nrm-gnbcucpfunction:GNBCUCPFunction(pLMNId;gNBId;gNBIdLength)&topic=anr-app: anr24234234:v2
Header : Accept: application/json
Note : async not supported by NCMP locally in ONAP Rel I | ? |
3 | Read a data resource directly from source (passthrough) for a cmHandle. Only return specific field(s). Synchronous call | GET | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier}?fields={fields} Accept: application/yang-data+json | Scenario : Read the EUtranCellFDD.(administrativeState, operationalState, tac, earfcndl, cellId, physicalLayerCellId) for cmhandle "335ff" Method : GET URI : {ncmp-root}/ncmp/v1/data/ch/335ff/ManagedElement[@id=Kista-001] /ENodeBFunction?fields=ericsson-enm-lrat:EUtranCellFDD(administrativeState; operationalState;tac;earfcndl;cellId; physicalLayerCellId) Header : Accept: application/yang-data+json | Y |
4 | Read a data resource with some leaf value condition directly from the source (passthrough) for a cmHandle. Only return specific field(s). Synchronous call | GET | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier[<condition]}?fields={fields}
Accept: application/yang-data+json | Scenario : Read the LocalSctpEndpoint.(interfaceUsed==X2, sctpEndpointRef) for cmhandle "335ff" as passthrough Method : GET URI cps-path {ncmp-root}/ncmp/v1/query/ch/335ff//LocalSctpEndpoint[interfaceUsed=X2]? fields=sctpEndpointRef |
|
5 | Read descendant data resources with specified fields under a given data resource for a given cmHandle | GET | {ncmp-root}/ncmp/v1/ch/<cm-handle>/{data-resource-identifier}?fields={fields-expression} options Option | Description |
---|
fields | Request a subset of the target resource contents |
| Scenario : Read all NRCellDU MOs with attributes userLabel and id under the _3gpp-nr-nrm-gnbdufunction:GNBDUFunction MO Method : GET URI :{ncmp-root}/ncmp/v1/ch/3445fff/data/ManagedElement[@id=Kista-001] /GNBCUCPFunction[@id=1]?fields=_3gpp-nr-nrm-nrcelldu:NRCellDU/attributes (administrativeState;operationalState) Header : Accept : application/yang-data+json Response : HTTP/1.1 200 OK Date: Thu, 26 Jan 2017 20:56:30 GMT Server: example-server Content-Type: application/yang-data+json { _3gpp-nr-nrm-gnbdufunction:GNBDUFunction=1 { _3gpp-nr-nrm-nrcelldu:NRCellDU=1 { "top3gpp:id" : "NR-Cell-001" "attributes" : { "administrativeState " : "LOCKED", "operationalState" : "disabled" } }, _3gpp-nr-nrm-nrcelldu:NRCellDU=2 { "top3gpp:id" : "NR-Cell-002" "attributes" : { "administrativeState " : "LOCKED", "operationalState" : "disabled" } }, _3gpp-nr-nrm-nrcelldu:NRCellDU=3 { "top3gpp:id" : "NR-Cell-003" "attributes" : { "administrativeState " : "LOCKED", "operationalState" : "disabled" } }, _3gpp-nr-nrm-nrcelldu:NRCellDU=4 { "top3gpp:id" : "NR-Cell-004" "attributes" : { "administrativeState " : "LOCKED", "operationalState" : "disabled" } }, _3gpp-nr-nrm-nrcelldu:NRCellDU=5 { "top3gpp:id" : "NR-Cell-005" "attributes" : { "administrativeState " : "LOCKED", "operationalState" : "disabled" } } } } |
|
6 | Create a data resource for a cmhandle | POST | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{parent-data-resource-identifier} { <new-yang-data-resource> } Content: application/yang-data+json | Scenario : Create ericsson-nrsectorcarrier-vdu-add:NRSectorCarrier=4 under _3gppcommon-managed-element:ManagedElement=Kista-001/_3gpp-nr-nrm-gnbdufunction: GNBDUFunction=1 Method : POST URI : {ncmp-root}/ncmp/v1/data/ch/34l5k32/ManagedElement[@id=Kista-001] /GNBDUFunction[@id=1] Header : Content-Type: application/yang-data+json |
|
7 | Update a data resource for a cmhandle with plain-patch update | PATCH | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier} { } Content: application/yang-data+json Behaves as a merge - merge with existing if it exists or create if it does not exist. | Scenario : Update _3gpp-nr-nrm-nrsectorcarrier:NRSectorCarrier=4 txDirection to "DL_AND_UL" under _3gpp-common-managed-element:ManagedElement=Kista001/_3gpp-nr-nrm-gnbdufunction:GNBDUFunction=1 Method : PATCH URI : {ncmp-root}/ncmp/v1/data/ch/34l5k32/ManagedElement[@id=Kista-001] /GNBDUFunction[@id=1]/NRSectorCarrier[@id=4] Header : Content-Type: application/yang-data+json Body : |
|
8 | Update a data resource with multiple edits for a cmhandle with yang-patch update | PATCH | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier} { <updated-yang-data-resource> }
Content: application/yang-patch+json If using yang-patch content then ds/ncmp-datastore-passthrough-running must be used by rad apps until full support is available from NCMP/CPS | Scenario : Update _3gpp-common-managed-element:ManagedElement=Kista-001/_3gpp-nr-nrm-gnbdufunction:GNBDUFunction=1 with multiple operations on the tree Method : PATCH URI : {ncmp-root}/ncmp/v1/data/ch/34l5k32/ds/ncmp-datastore-passthrough-running/ManagedElement[@id=Kista-001]/GNBDUFunction[@id=1] |
|
9 | Replace a data resource for a cmhandle | PUT | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier} { <yang-data-resource-for-replace> } Content: application/yang-data+json | Scenario : Replace _3gpp-nr-nrm-nrsectorcarrier:NRSectorCarrier=4 txDirection to "DL_AND_UL" under _3gpp-common-managed-element:ManagedElement=Kista001/_3gpp-nr-nrm-gnbdufunction:GNBDUFunction=1 - removes all config params not specified including sub-tree if one exists Method : PUT URI : {ncmp-root}/ncmp/v1/data/ch/34l5k32/ManagedElement[@id=Kista-001] /GNBDUFunction[@id=1]/NRSectorCarrier[@id=4] Header : Content-Type: application/yang-data+json |
|
10 | Delete a data resource for a cmhandle | DELETE | {ncmp-root}/ncmp/v1/data/ch/<cm-handle>/{data-resource-identifier | Scenario : Delete ericsson-nrsectorcarrier-vdu-add:NRSectorCarrier=4 under _3gppcommon-managed-element:ManagedElement=Kista-001/_3gpp-nr-nrm-gnbdufunction: GNBDUFunction=1 Method : DELETE URI : {ncmp-root}/ncmp/v1/data/ch/34l5k32/ManagedElement[@id=Kista-001] /GNBDUFunction[@id=1]/NRSectorCarrier[@id=4] Header : Accept: application/json Body : {} |
|
11 | Get all cmhandles that support a given module | GET | {ncmp-root}/ncmp/v1/data/ch?module={module-name} Content: application/json | Scenario : Get the all cmhandles that support a given module Method : GET URI : {ncmp-root}/ncmp/v1/data/ch?module=_3gpp-nr-nrm-gnbdufunction Header : Accept: application/json Response: { cm-handles : [ "ew534fe", "23ft4", "434fsdf", ... ] } |
|
NCMP / DMI Overview
Click here to expand...
eyJleHRTcnZJbnRlZ1R5cGUiOiIiLCJnQ2xpZW50SWQiOiIiLCJjcmVhdG9yTmFtZSI6Ik5pYW1oIENvcmUiLCJvdXRwdXRUeXBlIjoiYmxvY2siLCJsYXN0TW9kaWZpZXJOYW1lIjoiTmlhbWggQ29yZSIsImxhbmd1YWdlIjoiZW4iLCJkaWFncmFtRGlzcGxheU5hbWUiOiIiLCJzRmlsZUlkIjoiIiwiYXR0SWQiOiIxMDM0MTcyNjgiLCJkaWFncmFtTmFtZSI6Ik5DTVAgTm9ydGhib3VuZCBSRVNUIEFQSSIsImFzcGVjdCI6IiIsImxpbmtzIjoiYXV0byIsImNlb05hbWUiOiJDUFMtMzkxU3Bpa2U6IERlZmluZSBhbmQgQWdyZWUgTkNNUCBSRVNUIEludGVyZmFjZSIsInRic3R5bGUiOiJ0b3AiLCJjYW5Db21tZW50IjpmYWxzZSwiZGlhZ3JhbVVybCI6IiIsImNzdkZpbGVVcmwiOiIiLCJib3JkZXIiOnRydWUsIm1heFNjYWxlIjoiMSIsIm93bmluZ1BhZ2VJZCI6MTAzNDE2ODIyLCJlZGl0YWJsZSI6ZmFsc2UsImNlb0lkIjoxMDM0MjIyNTUsInBhZ2VJZCI6IiIsImxib3giOnRydWUsInNlcnZlckNvbmZpZyI6eyJlbWFpbHByZXZpZXciOiIxIn0sIm9kcml2ZUlkIjoiIiwicmV2aXNpb24iOjgsIm1hY3JvSWQiOiIxZDNmYzczNi04MGQxLTQ3NTgtODE1MC01OGNkMTY5MTEyNTAiLCJwcmV2aWV3TmFtZSI6Ik5DTVAgTm9ydGhib3VuZCBSRVNUIEFQSS5wbmciLCJsaWNlbnNlU3RhdHVzIjoiT0siLCJzZXJ2aWNlIjoiIiwiaXNUZW1wbGF0ZSI6IiIsIndpZHRoIjoiOTcxIiwic2ltcGxlVmlld2VyIjpmYWxzZSwibGFzdE1vZGlmaWVkIjoxNjIwOTA5ODAwMDAwLCJleGNlZWRQYWdlV2lkdGgiOmZhbHNlLCJvQ2xpZW50SWQiOiIifQ==