@c8y/ngx-components 1023.22.2 → 1023.22.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs +2 -2
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +18 -6
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/locales/de.po +7 -4
- package/locales/es.po +5 -2
- package/locales/fr.po +5 -2
- package/locales/ja_JP.po +5 -2
- package/locales/ko.po +5 -2
- package/locales/locales.pot +1 -1
- package/locales/nl.po +5 -2
- package/locales/pl.po +5 -2
- package/locales/pt_BR.po +5 -2
- package/locales/zh_CN.po +5 -2
- package/locales/zh_TW.po +5 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-protocol-opcua.mjs","sources":["../../protocol-opcua/address-space.service.ts","../../protocol-opcua/opcua-address-space-detail.component.ts","../../protocol-opcua/opcua-address-space-detail.component.html","../../protocol-opcua/opcuaService.ts","../../protocol-opcua/opcua-agent.guard.ts","../../protocol-opcua/opcua-device-protocol-browse-path-validation.directive.ts","../../protocol-opcua/dynamic-data-source.ts","../../protocol-opcua/opcua-address-space-tree.component.ts","../../protocol-opcua/opcua-address-space-tree.component.html","../../protocol-opcua/opcua-address-space.component.ts","../../protocol-opcua/opcua-address-space.component.html","../../protocol-opcua/opcua-auto-apply-settings.component.ts","../../protocol-opcua/opcua-auto-apply-settings.component.html","../../protocol-opcua/opcua-device-protocol-data-reporting.component.ts","../../protocol-opcua/opcua-device-protocol-data-reporting.html","../../protocol-opcua/opcua-device-protocol-description.component.ts","../../protocol-opcua/opcua-device-protocol-description.html","../../protocol-opcua/mappings/custom-action-mapping.ts","../../protocol-opcua/mappings/default-mappings.ts","../../protocol-opcua/opcua-device-protocol-object-mapping-status-icon.component.ts","../../protocol-opcua/opcua-device-protocol-mapping.component.ts","../../protocol-opcua/opcua-device-protocol-mapping.html","../../protocol-opcua/opcua-device-protocol-detail.component.ts","../../protocol-opcua/opcua-device-protocol-detail.html","../../protocol-opcua/opcua-microservice.guard.ts","../../protocol-opcua/opcua-server.interface.ts","../../protocol-opcua/opcua-server-config.component.ts","../../protocol-opcua/opcua-server-config.component.html","../../protocol-opcua/opcua-server-list.component.ts","../../protocol-opcua/opcua-server-list.component.html","../../protocol-opcua/opcua-server.guard.ts","../../protocol-opcua/opcua-servers.component.ts","../../protocol-opcua/opcua-servers.component.html","../../protocol-opcua/opcua-protocol.module.ts","../../protocol-opcua/ng1/downgraded.components.ts","../../protocol-opcua/ng1/index.ts","../../protocol-opcua/c8y-ngx-components-protocol-opcua.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { FetchClient, IFetchOptions } from '@c8y/client';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable()\nexport class AddressSpaceService {\n private nodeNavigationData$: BehaviorSubject<NodeNavigationData>;\n private client: FetchClient;\n private microserviceUrl: string;\n private header: any;\n\n constructor(fetchClient: FetchClient) {\n this.client = fetchClient;\n this.microserviceUrl = '/service/opcua-mgmt-service/address-space';\n this.header = { 'Content-Type': 'application/json' };\n this.nodeNavigationData$ = new BehaviorSubject<NodeNavigationData>({\n node: undefined,\n selectedAncestorIds: []\n });\n }\n\n resetTreeToRootNode() {\n this.triggerNodeToOpen({ node: undefined, selectedAncestorIds: [] });\n }\n\n triggerNodeToOpen(nodeNavigationData: NodeNavigationData) {\n this.nodeNavigationData$.next(nodeNavigationData);\n }\n\n getNodeNavData$(): Observable<NodeNavigationData> {\n return this.nodeNavigationData$.asObservable();\n }\n\n getNode(serverId: string, nodeId?: string) {\n if (serverId && serverId.length > 0) {\n if (nodeId && nodeId.length > 0) {\n return this.getNodeById(serverId, nodeId);\n }\n return this.getRootNode(serverId);\n }\n }\n\n getRootNode(serverId: string) {\n if (serverId && serverId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.microserviceUrl}/${serverId}`, options);\n }\n }\n\n getNodeById(serverId: string, nodeId: string) {\n if (serverId && nodeId && serverId.length > 0 && nodeId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n const param = encodeURIComponent(nodeId);\n return this.client.fetch(`${this.microserviceUrl}/${serverId}?nodeId=${param}`, options);\n }\n }\n\n getChildrenOf(node: AddressSpaceNode, serverId: string) {\n if (serverId && node.nodeId && serverId.length > 0 && node.nodeId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n const param = encodeURIComponent(node.nodeId);\n return this.client.fetch(\n `${this.microserviceUrl}/${serverId}/children?nodeId=${param}`,\n options\n );\n }\n }\n\n childrenAvailable(nodeReferences: AdressSpaceNodeReference[]): boolean {\n if (!nodeReferences || nodeReferences.length === 0) {\n return false;\n }\n return nodeReferences.some(ref => !ref.inverse && ref.hierarchical);\n }\n\n async getSearchedNodes(searchKey: string, serverId: string) {\n const url = `service/opcua-mgmt-service/search/${serverId}/`;\n const options: IFetchOptions = {\n headers: this.header,\n params: {\n searchString: '*' + searchKey + '*'\n }\n };\n const res = await this.client.fetch(url, options);\n return res.json();\n }\n\n getIcon(nodeClassName: string) {\n const iconList = {\n Object: 'cube',\n Variable: 'th-list',\n Method: 'random',\n View: 'window-maximize',\n ObjectType: 'c8y-group',\n VariableType: 'c8y-group',\n ReferenceType: 'c8y-group',\n DataType: 'c8y-group'\n };\n return iconList[nodeClassName] || 'circle';\n }\n}\n\nexport interface AddressSpaceNode {\n nodeId: string;\n currentlyLoadingChildren?: boolean;\n nodeClass?: number;\n nodeClassName?: string;\n browseName?: string;\n displayName?: string;\n description?: any;\n references?: AdressSpaceNodeReference[];\n ancestorNodeIds?: [string[]];\n children: AddressSpaceNode[];\n expanded: boolean;\n absolutePaths: [string[]];\n relativePath?: string[];\n parentNode?: AddressSpaceNode;\n}\n\nexport interface AdressSpaceNodeReference {\n referenceId: string;\n targetId: string;\n inverse: boolean;\n hierarchical: boolean;\n}\n\nexport interface SearchedNode {\n absolutePath: string[];\n ancestorNodeIds: [string[]];\n displayName: string;\n nodeClassName: string;\n nodeId: string;\n}\n\nexport interface NodeNavigationData {\n node: AddressSpaceNode;\n selectedAncestorIds: string[];\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { AddressSpaceNode, AddressSpaceService, NodeNavigationData } from './address-space.service';\nimport { omit } from 'lodash-es';\nimport { NgClass, NgFor, NgIf, JsonPipe, KeyValuePipe } from '@angular/common';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'opcua-address-space-detail',\n templateUrl: './opcua-address-space-detail.component.html',\n imports: [NgClass, NgFor, NgIf, C8yTranslatePipe, JsonPipe, KeyValuePipe]\n})\nexport class OpcuaAddressSpaceDetailComponent {\n @Input() set node(n) {\n this._node = n;\n if (n) {\n this.setNodeData(n);\n } else {\n // remove details from current view\n this.showDetails = false;\n }\n }\n nodeDataAttr: Map<string, string>;\n nodeDataRef: object[];\n selected = false;\n showDetails = false;\n\n @Output() toggleAttrDetail: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n\n private _node: AddressSpaceNode;\n\n constructor(private addressSpaceService: AddressSpaceService) {}\n setNodeData(nodeData) {\n this.showDetails = true;\n const { attributes, references } = nodeData;\n this.nodeDataRef = references;\n const omitList = [\n 'attributes',\n 'references',\n 'children',\n 'currentlyLoadingChildren',\n 'expanded',\n 'browsePath',\n 'relativePath',\n 'parentNode'\n ];\n this.nodeDataAttr = Object.assign({}, attributes, omit(nodeData, omitList));\n }\n\n toggleDetail(node) {\n this.showDetails = !this.showDetails;\n this.toggleAttrDetail.emit(node);\n }\n\n navigateTo(ancestors: string[]) {\n const nodeNavData: NodeNavigationData = {\n node: this._node,\n selectedAncestorIds: ancestors\n };\n\n this.toggleDetail(this._node);\n this.addressSpaceService.triggerNodeToOpen(nodeNavData);\n }\n}\n","<div\n class=\"card m-b-4 split-row-2 animated fast pointer-all\"\n [ngClass]=\"{ fadeInRightBig: showDetails, fadeOutRightBig: !showDetails }\"\n>\n <div class=\"card-header separator\">\n <h4>{{ 'Attributes' | translate }}</h4>\n <button\n class=\"close m-l-auto visible-sm visible-xs\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"toggleDetail(nodeDataAttr)\"\n >\n ×\n </button>\n </div>\n <div\n class=\"card-inner-scroll\"\n tabindex=\"0\"\n >\n <div\n class=\"card-block\"\n tabindex=\"-1\"\n >\n <table class=\"table table-striped table-condensed\">\n <colgroup>\n <col width=\"50%\" />\n <col width=\"50%\" />\n </colgroup>\n <thead>\n <tr>\n <th>{{ 'Attribute' | translate }}</th>\n <th>{{ 'Value' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of nodeDataAttr | keyvalue\">\n <td>{{ item.key }}</td>\n <td\n class=\"text-break-word\"\n *ngIf=\"item.key === 'absolutePaths'\"\n >\n {{ item.value | json }}\n </td>\n <td\n class=\"text-break-word\"\n *ngIf=\"item.key === 'ancestorNodeIds'\"\n >\n <a\n *ngFor=\"let value of item.value\"\n (click)=\"navigateTo(value)\"\n >\n {{ value | json }}\n </a>\n </td>\n <td *ngIf=\"item.key !== 'absolutePaths' && item.key !== 'ancestorNodeIds'\">\n {{ item.value }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n<div\n class=\"card split-row-2 animated fast pointer-all\"\n style=\"height: calc(50% - 4px)\"\n [ngClass]=\"{ fadeInRightBig: showDetails, fadeOutRightBig: !showDetails }\"\n>\n <div class=\"card-header separator\">\n <h4>{{ 'References' | translate }}</h4>\n </div>\n <div\n class=\"card-inner-scroll\"\n tabindex=\"0\"\n >\n <div\n class=\"card-block\"\n tabindex=\"-1\"\n >\n <table class=\"table table-striped table-condensed\">\n <colgroup>\n <col width=\"50%\" />\n <col width=\"50%\" />\n </colgroup>\n <thead>\n <tr>\n <th>{{ 'Attribute' | translate }}</th>\n <th>{{ 'Value' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of nodeDataRef\">\n <td>{{ item.referenceLabel }}</td>\n <td class=\"text-break-word\">{{ item.targetLabel }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n FetchClient,\n IFetchOptions,\n IFetchResponse,\n InventoryBinaryService,\n InventoryService\n} from '@c8y/client';\nimport { AlertService } from '@c8y/ngx-components';\nimport { OpcuaServer } from './opcua-server.interface';\n\n@Injectable()\nexport class OpcuaService {\n private binaryService: InventoryBinaryService;\n private microserviceUrlDepr: string;\n private microserviceUrl: string;\n private deviceTypeProtocolUrl: string;\n private header: any;\n\n constructor(\n private client: FetchClient,\n private inventoryService: InventoryService,\n private router: Router,\n private alertService: AlertService\n ) {\n this.microserviceUrl = '/service/opcua-mgmt-service';\n this.microserviceUrlDepr = '/service/opcua-mgmt-service/server';\n this.deviceTypeProtocolUrl = '/service/opcua-mgmt-service/deviceTypes';\n this.header = { 'Content-Type': 'application/json' };\n this.binaryService = inventoryService.binary;\n }\n createServer(data: OpcuaServer) {\n if (this.doesGatewayIdExist(data)) {\n this.cleanUpPayload(data);\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.microserviceUrlDepr}`, options);\n }\n }\n\n async updateServer(server: OpcuaServer) {\n if (this.doesGatewayIdExist(server) && this.doesIdExist(server)) {\n this.cleanUpPayload(server);\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(server)\n };\n const res = await this.client.fetch(`${this.microserviceUrlDepr}`, options);\n let data;\n try {\n data = await res.json();\n } catch (e) {\n // nothing\n }\n\n if (res.status !== 200) {\n this.alertService.addServerFailure({ data, res });\n } else {\n return data;\n }\n }\n }\n\n removeServer(data: OpcuaServer) {\n if (this.doesGatewayIdExist(data) && this.doesIdExist(data)) {\n const options: IFetchOptions = {\n method: 'DELETE'\n };\n return this.client.fetch(`${this.microserviceUrlDepr}/${data.gatewayId}/${data.id}`, options);\n }\n }\n\n getKeystore(binaryId: string) {\n if (binaryId && binaryId.length > 0) {\n return this.inventoryService.detail(binaryId);\n }\n return null;\n }\n\n uploadKeystore(file: File) {\n if (file && file.size > 0) {\n return this.binaryService.create(file);\n }\n return Promise.reject('Invalid file');\n }\n\n async updateKeystore(id: string, file: File) {\n if (id && id.length > 0 && file && file.size > 0) {\n const { res } = await this.removeKeystore(id);\n if (res && res.status === 204) {\n return this.uploadKeystore(file);\n }\n }\n return Promise.reject('Invalid file');\n }\n\n removeKeystore(id: string) {\n if (id && id.length > 0) {\n return this.binaryService.delete(id);\n }\n }\n\n getMoId() {\n const currentUrl: string = this.router.routerState.snapshot.url;\n const isDevice: boolean = new RegExp(/device\\/\\d+/).test(currentUrl);\n if (isDevice) {\n return currentUrl.match(/\\d+/)[0];\n }\n return '';\n }\n\n getId() {\n const currentUrl: string = this.router.routerState.snapshot.url;\n const isDeviceprotocol: boolean = new RegExp(/deviceprotocols/).test(currentUrl);\n if (isDeviceprotocol && RegExp(/\\d+$/).test(currentUrl)) {\n return currentUrl.match(/\\d+$/)[0];\n }\n }\n\n async getDeviceProtocol(id: string) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}/${id}`, options);\n }\n\n async updateDeviceProtocol(data) {\n const options: IFetchOptions = {\n method: 'PUT',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}/${data.id}`, options);\n }\n\n async createDeviceProtocol(data) {\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}`, options);\n }\n\n getServers(id: string) {\n if (id && id.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.microserviceUrlDepr}/${id}`, options);\n }\n }\n\n getServer(id: string): Promise<IFetchResponse> {\n if (id && id.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client\n .fetch(`${this.microserviceUrl}/servers/${id}`, options)\n .then(this.handleErrorStatusCodes);\n }\n }\n\n /**\n * Checks the response for errors and throws exceptions, otherwise returns the response as is.\n *\n * @param response The response from server.\n *\n * @returns If no errors are detected, it returns the same response.\n *\n * @throws If an error is detected, it throws `{ res, data }`, where `data` contains error details from server.\n */\n\n protected async handleErrorStatusCodes(response: IFetchResponse): Promise<IFetchResponse> {\n if (response.status >= 400) {\n let data = null;\n try {\n data = await response.json();\n } catch (ex) {\n try {\n data = await response.text();\n } catch (ex) {\n // do nothing\n }\n }\n throw { res: response, data };\n }\n return response;\n }\n\n private doesGatewayIdExist(data: OpcuaServer) {\n return data && data.gatewayId && data.gatewayId.length > 0;\n }\n\n private doesIdExist(data: OpcuaServer) {\n return data && data.id && data.id.length > 0 && data.id !== 'new';\n }\n\n private cleanUpPayload(data: OpcuaServer) {\n if (data) {\n if (data.id && data.id === 'new') {\n delete data.id;\n }\n if (data.quickInfo) {\n delete data.quickInfo;\n }\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class OpcuaAgentGuard {\n type = 'c8y_OPCUA_Device_Agent';\n canActivate({ data }) {\n const { contextData } = data;\n return contextData && contextData.type === this.type;\n }\n}\n","import { Directive, forwardRef, ElementRef, Input } from '@angular/core';\nimport { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms';\nimport { some, isEqual, isEmpty } from 'lodash-es';\n\n@Directive({\n selector: '[c8yBrowsePathValidator][ngModel]',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => OpcuaDeviceProtocolBrowsePathValidation),\n multi: true\n }\n ]\n})\nexport class OpcuaDeviceProtocolBrowsePathValidation implements Validator {\n @Input() getMappings: () => [];\n @Input() model: any;\n\n constructor(private el: ElementRef) {}\n\n validate(control: AbstractControl): { [key: string]: any } {\n if (control.value) {\n if (!this.isValidJson(control.value)) {\n return { invalidBrowsePathNotation: true };\n } else {\n if (this.isBrowsePathUnique(control.value)) {\n return { browsePathNotUnique: true };\n }\n }\n }\n return null;\n }\n\n isValidJson(value) {\n try {\n const browsePath = JSON.parse(value);\n return !isEmpty(browsePath);\n } catch (error) {\n return false;\n }\n }\n\n toArray(str) {\n return JSON.parse(str);\n }\n\n isBrowsePathUnique(value): boolean {\n const mappings = this.getMappings();\n const found = some(mappings, item => {\n if (isEqual(item.browsePath, this.toArray(value)) && item.id !== this.model.id) {\n return item;\n }\n });\n return found ? true : false;\n }\n}\n","import { BehaviorSubject, Observable, merge } from 'rxjs';\nimport { NestedTreeControl } from '@angular/cdk/tree';\nimport { CollectionViewer, SelectionChange } from '@angular/cdk/collections';\nimport { AddressSpaceService, AddressSpaceNode } from './address-space.service';\nimport { map } from 'rxjs/operators';\n\nexport class DynamicDataSource {\n dataChange = new BehaviorSubject<AddressSpaceNode[]>([]);\n\n get data(): AddressSpaceNode[] {\n return this.dataChange.value;\n }\n set data(value: AddressSpaceNode[]) {\n this.treeControl.dataNodes = value;\n this.dataChange.next(value);\n }\n\n constructor(\n public treeControl: NestedTreeControl<AddressSpaceNode>,\n private addressSpaceService: AddressSpaceService,\n private serverId: string\n ) {\n this.treeControl.isExpanded = (node: AddressSpaceNode) => node.expanded;\n }\n\n connect(collectionViewer: CollectionViewer): Observable<AddressSpaceNode[]> {\n this.treeControl.expansionModel.changed.subscribe(\n (change: SelectionChange<AddressSpaceNode>) => {\n if (change.added || change.removed) {\n this.handleTreeControl(change);\n }\n }\n );\n return merge(collectionViewer.viewChange, this.dataChange).pipe(map(() => this.data));\n }\n\n /** Handle expand/collapse behaviors */\n handleTreeControl(change: SelectionChange<AddressSpaceNode>) {\n if (change.added) {\n change.added.forEach(node => this.toggleNode(node, true));\n }\n if (change.removed) {\n change.removed\n .slice()\n .reverse()\n .forEach(node => this.toggleNode(node, false));\n }\n }\n\n /**\n * Toggle the node, remove from display list\n */\n async toggleNode(addressSpaceNode: AddressSpaceNode, expand: boolean) {\n if (!addressSpaceNode.children || addressSpaceNode.children.length === 0) {\n addressSpaceNode.currentlyLoadingChildren = true;\n\n const res = await this.addressSpaceService.getChildrenOf(addressSpaceNode, this.serverId);\n const children = (await res.json()) as AddressSpaceNode[];\n\n addressSpaceNode.children = children || [];\n addressSpaceNode.children = addressSpaceNode.children.map((node: AddressSpaceNode) => {\n node.parentNode = addressSpaceNode;\n return node;\n });\n addressSpaceNode.currentlyLoadingChildren = false;\n\n this.treeControl.expand(addressSpaceNode);\n }\n\n addressSpaceNode.expanded = expand && addressSpaceNode.children.length > 0;\n this.refreshNestedTree(this.data);\n\n return Promise.resolve(addressSpaceNode);\n }\n catch() {\n // do nothing\n }\n\n private refreshNestedTree(treeData: AddressSpaceNode[]) {\n // necessary to rerender tree, otherwise new nodes will not\n // appear, but they are added to the list.\n this.data = [];\n this.dataChange.next(treeData);\n this.triggerResize(); // to resize the modal window when creating a new device protocol\n }\n\n private triggerResize() {\n setTimeout(() => {\n try {\n window.dispatchEvent(new Event('resize'));\n } catch (error) {\n // do nothing\n }\n }, 200);\n }\n}\n","import {\n NestedTreeControl,\n CdkTree,\n CdkTreeNodeDef,\n CdkNestedTreeNode,\n CdkTreeNodeToggle,\n CdkTreeNodeOutlet\n} from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport {\n AlertService,\n IconDirective,\n LoadingComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { clone } from 'lodash';\nimport { Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { AddressSpaceNode, AddressSpaceService, NodeNavigationData } from './address-space.service';\nimport { DynamicDataSource } from './dynamic-data-source';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgClass } from '@angular/common';\n\n@Component({\n selector: 'opcua-address-space-tree',\n templateUrl: './opcua-address-space-tree.component.html',\n imports: [\n NgIf,\n CdkTree,\n CdkTreeNodeDef,\n CdkNestedTreeNode,\n NgClass,\n IconDirective,\n CdkTreeNodeToggle,\n CdkTreeNodeOutlet,\n LoadingComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAddressSpaceTreeComponent implements OnInit, OnDestroy, OnChanges {\n @Input()\n set moId(id: string) {\n this._moId = id || undefined;\n }\n\n @Input() node;\n @Input() focusEmitter: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n @Output() selectedNode: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n nestedTreeControl: NestedTreeControl<AddressSpaceNode>;\n dataSource: DynamicDataSource = null;\n focused: AddressSpaceNode;\n loading = false;\n subscriptionRef: Subscription;\n nodeNavDataSubscription: Subscription;\n private _moId: string;\n private destroy$: Subject<void> = new Subject<void>();\n\n constructor(\n private addressSpaceService: AddressSpaceService,\n private opcuaService: OpcuaService,\n private alertService: AlertService\n ) {}\n\n getChildren = (node: AddressSpaceNode) => (node.expanded ? node.children : []);\n hasChild = (_: number, _nodeData: AddressSpaceNode) =>\n this.addressSpaceService.childrenAvailable(_nodeData.references);\n\n ngOnInit() {\n this.initializeDataSet();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes.moId &&\n changes.moId.previousValue &&\n changes.moId.currentValue !== changes.moId.previousValue\n ) {\n this.initializeDataSet();\n }\n }\n\n initializeDataSet() {\n this.nodeNavDataSubscription = this.addressSpaceService\n .getNodeNavData$()\n .pipe(takeUntil(this.destroy$))\n .subscribe(nodeNavData => this.openNode(nodeNavData));\n this.subscriptionRef = this.focusEmitter.subscribe(node => {\n this.focused = this.isFocusedNode(node) ? undefined : node;\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n // clean up the address-space-tree\n this.addressSpaceService.resetTreeToRootNode();\n\n if (this.nodeNavDataSubscription && !this.nodeNavDataSubscription.closed) {\n this.nodeNavDataSubscription.unsubscribe();\n }\n\n if (this.subscriptionRef && !this.subscriptionRef.closed) {\n this.subscriptionRef.unsubscribe();\n }\n }\n\n async openNode(nodeNavData: NodeNavigationData) {\n const { node, selectedAncestorIds } = nodeNavData;\n let nodeId;\n\n // We just set the nodeId when the selectedAncestorIds variable an empty array.\n // If selectedAncestorIds contain any id we assume that the tree should be travsersed beginning\n // from the root node.\n if (node && node.nodeId && selectedAncestorIds && selectedAncestorIds.length === 0) {\n nodeId = node.nodeId;\n }\n // Always recreate the tree when routing to a specific nested node,\n // because previous modifications to the tree-structure could cause errors\n // while traversing with 'old' tree-data\n // -----------------\n // setupTree is able to handle nodeId = undefined\n await this.setupTree(nodeId);\n\n if (!selectedAncestorIds || selectedAncestorIds.length === 0) {\n return;\n }\n\n if (nodeNavData && this.dataSource) {\n const clonedAncestors = clone(selectedAncestorIds);\n clonedAncestors.shift();\n\n const n = await this.dataSource.toggleNode(this.dataSource.data[0], true);\n this.setChildNodes(n.children, clonedAncestors);\n\n this.toggleFocusedNode(node);\n }\n }\n\n setChildNodes(nodes: AddressSpaceNode[], ids: string[]) {\n if (nodes) {\n ids.forEach(async id => {\n const match = nodes.find(n => n.nodeId === id);\n if (match && ids.length > 0) {\n const idx = ids.findIndex(value => value === id);\n if (idx >= 0) {\n ids.splice(idx, 1);\n }\n const toggledNode = await this.dataSource.toggleNode(match, true);\n this.setChildNodes(toggledNode.children, ids);\n }\n });\n }\n }\n\n async setupTree(nodeId?: string) {\n this.loading = true;\n\n if (!this._moId || this._moId.length === 0) {\n this._moId = this.opcuaService.getMoId();\n }\n\n // addressSpaceService.getNode returns either the root node of the server (moId)\n // or if nodeId !== undefined the node with given nodeId\n const res = await this.addressSpaceService.getNode(this._moId, nodeId);\n if (res) {\n if (res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n this.dataSource = undefined;\n } else {\n const rootNode = (await res.json()) as AddressSpaceNode;\n this.nestedTreeControl = new NestedTreeControl<AddressSpaceNode>(this.getChildren);\n this.dataSource = new DynamicDataSource(\n this.nestedTreeControl,\n this.addressSpaceService,\n this._moId\n );\n this.dataSource.data = [rootNode];\n }\n this.loading = false;\n } else {\n this.loading = false;\n }\n }\n\n getMoId() {\n if (!this._moId || this._moId.length === 0) {\n return this.opcuaService.getMoId();\n }\n return this._moId;\n }\n\n getIcon(nodeClassName) {\n return this.addressSpaceService.getIcon(nodeClassName);\n }\n\n toggleFocusedNode(node) {\n const relativePath = [];\n this.getRelativePath(node, relativePath);\n node.relativePath = relativePath;\n\n this.selectedNode.emit(node);\n this.focused = this.isFocusedNode(node) ? undefined : node;\n }\n\n isFocusedNode(node: AddressSpaceNode) {\n if (this.focused) {\n return node.nodeId === this.focused.nodeId;\n }\n return false;\n }\n\n private getRelativePath(node: AddressSpaceNode, relativePath: string[]) {\n if (node.parentNode) {\n relativePath.unshift(node.browseName);\n this.getRelativePath(node.parentNode, relativePath);\n }\n }\n}\n","<div\n class=\"card-block\"\n *ngIf=\"dataSource && !loading\"\n>\n <cdk-tree\n [dataSource]=\"dataSource\"\n [treeControl]=\"nestedTreeControl\"\n >\n <!-- This is the tree node template for leaf nodes -->\n <cdk-nested-tree-node\n class=\"interact\"\n *cdkTreeNodeDef=\"let node\"\n (click)=\"toggleFocusedNode(node)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n >\n <span>\n <i\n class=\"m-r-4 interact\"\n [c8yIcon]=\"getIcon(node.nodeClassName)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n ></i>\n {{ node.displayName }}\n </span>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node; when: hasChild\">\n <div role=\"group\">\n <div class=\"d-flex a-i-center\">\n <button\n class=\"btn-clean text-primary m-r-4\"\n title=\"{{ 'Expand node' | translate }}\"\n cdkTreeNodeToggle\n [disabled]=\"node.currentlyLoadingChildren\"\n >\n <i\n [ngClass]=\"{\n 'dlt-c8y-icon-plus-square': !node.expanded,\n 'dlt-c8y-icon-minus-square': node.expanded\n }\"\n ></i>\n </button>\n <i\n class=\"m-r-4 interact\"\n [c8yIcon]=\"getIcon(node.nodeClassName)\"\n ></i>\n <span\n class=\"interact\"\n (click)=\"toggleFocusedNode(node)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n >\n {{ node.displayName }}\n </span>\n <span\n class=\"m-l-4\"\n [style.visibility]=\"node.currentlyLoadingChildren ? 'visible' : 'hidden'\"\n >\n <i class=\"dlt-c8y-icon-circle-o-notch icon-spin\"></i>\n </span>\n </div>\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n<div\n class=\"p-t-8\"\n *ngIf=\"loading\"\n>\n <c8y-loading></c8y-loading>\n</div>\n<div\n class=\"alert alert-info m-t-16\"\n *ngIf=\"!dataSource && !loading\"\n translate\n>\n No source data available to fetch address space.\n</div>\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n OnDestroy,\n OnInit,\n Output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IOperation, OperationService, OperationStatus } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ModalService,\n OperationRealtimeService,\n IconDirective,\n LoadingComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { filter, map } from 'rxjs/operators';\nimport { AddressSpaceNode, AddressSpaceService } from './address-space.service';\nimport { DynamicDataSource } from './dynamic-data-source';\nimport { OpcuaServer, OpcuaServerConfig } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgFor, NgClass } from '@angular/common';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { FormsModule } from '@angular/forms';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaAddressSpaceDetailComponent } from './opcua-address-space-detail.component';\n\n@Component({\n selector: 'opcua-address-space',\n templateUrl: './opcua-address-space.component.html',\n imports: [\n NgIf,\n OperationDetailsComponent,\n FormsModule,\n IconDirective,\n LoadingComponent,\n NgFor,\n NgClass,\n OpcuaAddressSpaceTreeComponent,\n OpcuaAddressSpaceDetailComponent,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAddressSpaceComponent implements OnInit, OnDestroy {\n currentNode: AddressSpaceNode;\n selectednode = false;\n searchKey: string;\n isSearch: boolean;\n loading = false;\n searchInProgress = false;\n filterLabel: string;\n dataSource: DynamicDataSource;\n nodeList;\n operation?: IOperation;\n isOperationRunning = signal(false);\n destroyRef = inject(DestroyRef);\n\n @Output() focusStatus: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n private moId = '';\n constructor(\n private addressSpaceService: AddressSpaceService,\n private opcuaService: OpcuaService,\n private operationService: OperationService,\n private operationRealtimeService: OperationRealtimeService,\n private alert: AlertService,\n private modalService: ModalService\n ) {}\n\n async ngOnInit() {\n this.filterLabel = gettext('Filter…');\n this.moId = this.opcuaService.getMoId();\n\n this.operation = await this.getRunningScanAddressSpaceOperation();\n this.isOperationRunning.set(!!this.operation);\n\n this.operationRealtimeService\n .onAll$(this.moId)\n .pipe(\n map(({ data }) => data as IOperation),\n filter(operation => operation.c8y_ua_command_ScanAddressSpace),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(operation => {\n this.operation = operation;\n this.isOperationRunning.set(\n operation.status == OperationStatus.EXECUTING ||\n operation.status == OperationStatus.PENDING\n );\n if (operation.status == OperationStatus.SUCCESSFUL) {\n this.addressSpaceService.resetTreeToRootNode();\n }\n });\n }\n\n async getRunningScanAddressSpaceOperation(): Promise<IOperation | undefined> {\n const filter: object = {\n deviceId: this.moId,\n fragmentType: 'c8y_ua_command_ScanAddressSpace',\n dateFrom: new Date(0).toISOString(),\n revert: true,\n pageSize: 1\n };\n const [operation] = (await this.operationService.list(filter)).data ?? [];\n\n return operation?.status == OperationStatus.EXECUTING ||\n operation?.status == OperationStatus.PENDING\n ? operation\n : undefined;\n }\n\n ngOnDestroy() {\n // The BehaviourSubject will store the last array of ancestorNodes from the previous search\n // this would cause the component while subscribing in the init-phase to the subject to travers\n // to the last searched node again. From user perspective it does not make sense, because the user\n // left the Address space (tab) and should loose the context and just request a new search or\n // browse the tree manually.\n this.addressSpaceService.resetTreeToRootNode();\n }\n\n async searchNodes() {\n this.searchInProgress = true;\n this.clearNodeListAndCheckSearchString();\n if (this.isSearch) {\n this.currentNode = undefined;\n this.nodeList = await this.addressSpaceService.getSearchedNodes(this.searchKey, this.moId);\n this.searchInProgress = false;\n this.nodeList.resultLabel = gettext('Results found');\n }\n }\n\n clearNodeListAndCheckSearchString() {\n this.isSearch = this.searchKey !== undefined && this.searchKey !== '' ? true : false;\n if (!this.isSearch) {\n this.searchInProgress = false;\n }\n }\n\n clearSearch() {\n this.isSearch = false;\n this.searchKey = '';\n this.currentNode = undefined;\n }\n\n getIcon(nodeClassName: string) {\n return this.addressSpaceService.getIcon(nodeClassName);\n }\n\n async selectNode(node) {\n if (node && node.nodeId && node.nodeId.length > 0) {\n const res = await this.addressSpaceService.getNodeById(this.moId, node.nodeId);\n this.toggleCurrentNode((await res.json()) as AddressSpaceNode);\n }\n }\n\n toggleCurrentNode(node: AddressSpaceNode) {\n this.currentNode = this.isNodeSet(node) ? undefined : node;\n }\n\n backHandler(node) {\n this.isSearch = false;\n this.focusStatus.emit(node);\n this.toggleCurrentNode(node);\n }\n\n isNodeSet(node: AddressSpaceNode) {\n if (this.currentNode !== undefined && this.currentNode.nodeId === node.nodeId) {\n return true;\n }\n return false;\n }\n async rescanAddressSpace() {\n const serverResponse = await this.opcuaService.getServer(this.moId);\n const server = (await serverResponse.json()) as OpcuaServer;\n let warning: string = gettext(\n 'Rescanning address space from root node might take several hours. Do you want to proceed?'\n );\n\n if (server) {\n if (server.config.partialAddressScan && !isEmpty(server.config.partialAddressScanNodeIds)) {\n warning = gettext(\n 'Rescanning from nodes ' +\n server.config.partialAddressScanNodeIds?.join(';') +\n '. Address space rescan might take several hours. Do you want to proceed?'\n );\n }\n }\n\n const doit = await this.modalService.confirm(\n gettext('Rescan address space'),\n warning,\n 'warning',\n { ok: gettext('Rescan'), cancel: gettext('Cancel') }\n );\n if (!doit) {\n return;\n }\n\n const operation = await this.createConfigurationAwareScanAdressSpaceOperation(server.config);\n try {\n this.operation = (await this.operationService.create(operation)).data;\n this.isOperationRunning.set(true);\n } catch (error) {\n this.alert.add({\n text: gettext('Error creating rescan operation'),\n detailedData: error,\n type: 'danger',\n timeout: 8000\n });\n this.isOperationRunning.set(false);\n }\n }\n\n async createConfigurationAwareScanAdressSpaceOperation(\n config: OpcuaServerConfig\n ): Promise<IOperation> {\n const result: IOperation = {\n deviceId: this.moId,\n description: gettext('[RESCAN] Address space import from Root node'),\n c8y_ua_command_ScanAddressSpace: {\n skipSync: false\n }\n };\n\n if (config) {\n if (config.partialAddressScan && config.partialAddressScanNodeIds) {\n const nodeIds = config.partialAddressScanNodeIds;\n result.c8y_ua_command_ScanAddressSpace.nodeIds = config.partialAddressScanNodeIds;\n result.description = gettext(`[RESCAN] Address space from node[s] ${nodeIds.join(';')}`);\n }\n }\n return result;\n }\n}\n","<div class=\"row split-scroll\">\n <div class=\"col-md-5 col-xs-12 scroll-column no-gutter-r\">\n <div class=\"card bg-level-2 split-scroll overflow-auto\">\n <div class=\"flex-grow\">\n <fieldset\n class=\"card-block large-padding bg-level-2 p-0\"\n id=\"operation-block\"\n *ngIf=\"!!operation\"\n >\n <c8y-operation-details [operation]=\"operation\"></c8y-operation-details>\n </fieldset>\n </div>\n <div class=\"card-block separator sticky-top\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ filterLabel | translate }}\"\n type=\"search\"\n (keydown.enter)=\"searchNodes()\"\n [(ngModel)]=\"searchKey\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"submit\"\n *ngIf=\"!isSearch\"\n (click)=\"searchNodes()\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Clear`input`' | translate }}\"\n type=\"button\"\n *ngIf=\"isSearch\"\n (click)=\"clearSearch()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n <div\n class=\"p-t-16\"\n *ngIf=\"isSearch && !loading\"\n >\n <p *ngIf=\"!searchInProgress\">\n <em>{{ nodeList.resultLabel | translate }}</em>\n \n <span class=\"badge badge-info\">{{ nodeList?.length }}</span>\n </p>\n </div>\n </div>\n\n <div\n class=\"p-t-8\"\n *ngIf=\"(isSearch && loading) || searchInProgress\"\n >\n <c8y-loading></c8y-loading>\n </div>\n\n <div\n class=\"inner-scroll\"\n *ngIf=\"isSearch && !loading && !searchInProgress\"\n >\n <div\n class=\"list-group list-group-links\"\n *ngIf=\"isSearch && !loading\"\n >\n <button\n *ngFor=\"let nodeItem of nodeList\"\n (click)=\"selectNode(nodeItem)\"\n [ngClass]=\"{ 'list-group-item d-flex': true }\"\n >\n <div class=\"list-group-icon m-r-4\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"getIcon(nodeItem.nodeClassName)\"\n ></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <span tile=\"nodeId\">{{ nodeItem.nodeId }}</span>\n {{ nodeItem.displayName }}\n </div>\n </button>\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n *ngIf=\"!isSearch\"\n >\n <opcua-address-space-tree\n (selectedNode)=\"toggleCurrentNode($event)\"\n [focusEmitter]=\"focusStatus\"\n ></opcua-address-space-tree>\n </div>\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n [class.btn-pending]=\"isOperationRunning()\"\n type=\"button\"\n (click)=\"rescanAddressSpace()\"\n [disabled]=\"isOperationRunning()\"\n >\n {{ 'Rescan' | translate }}\n </button>\n </div>\n </div>\n </div>\n <opcua-address-space-detail\n class=\"col-md-7 col-xs-12 scroll-column no-gutter-l no-pointer\"\n [node]=\"currentNode\"\n (toggleAttrDetail)=\"backHandler($event)\"\n ></opcua-address-space-detail>\n</div>\n","import { Component, Input, OnInit, EventEmitter } from '@angular/core';\nimport { AutoApplyConstraints } from './opcua-protocol-device-type.interface';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yTranslateDirective,\n FormGroupComponent,\n SelectLegacyComponent,\n ListItemComponent,\n FilterInputComponent,\n ListItemBodyComponent,\n ListItemCheckboxComponent,\n InputGroupListContainerDirective,\n InputGroupListComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { reject } from 'lodash-es';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n@Component({\n selector: 'opcua-auto-apply',\n templateUrl: './opcua-auto-apply-settings.component.html',\n imports: [\n C8yTranslateDirective,\n CollapseDirective,\n FormGroupComponent,\n SelectLegacyComponent,\n NgIf,\n ListItemComponent,\n FilterInputComponent,\n ListItemBodyComponent,\n NgFor,\n ListItemCheckboxComponent,\n FormsModule,\n InputGroupListContainerDirective,\n InputGroupListComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAutoApplySettingsComponent implements OnInit {\n opcuaServers: IManagedObject[] = [];\n selectedItems: IManagedObject[] = [];\n filteredList: IManagedObject[] = [];\n checked = {};\n readonly sizeToShowFilter: number = 5;\n constraints: AutoApplyConstraints = {\n browsePathMatchesRegex: '',\n matchesNodeIds: [],\n serverObjectHasFragment: '',\n matchesServerIds: []\n };\n placeholderSelectServerIds: string = gettext('Select server IDs from list');\n showServerIds: boolean;\n showBrowsePath: boolean;\n showServerFragment: boolean;\n showRootNodes: boolean;\n updateSelectedItem: EventEmitter<boolean> = new EventEmitter();\n private _model: IManagedObject;\n\n constructor(private inventoryService: InventoryService) {}\n\n async ngOnInit() {\n const { data } = await this.inventoryService.list({\n pageSize: 1000,\n withTotalPages: true,\n type: 'c8y_OpcuaServer'\n });\n\n this.opcuaServers = data;\n this.filteredList = data;\n this.selectedItems = [];\n\n const { matchesServerIds } = this.constraints;\n\n data.forEach(server => {\n if (\n matchesServerIds &&\n matchesServerIds.length > 0 &&\n matchesServerIds.find(itemId => itemId === server.id)\n ) {\n this.selectedItems.push(server);\n this.checked[server.id] = true;\n this.showServerIds = true;\n }\n });\n }\n\n @Input() set model(model) {\n if (model && model.applyConstraints) {\n this.constraints = model.applyConstraints as AutoApplyConstraints;\n }\n this._model = model;\n }\n\n get model() {\n return this._model;\n }\n\n serverIdsSelected(items: IManagedObject[]) {\n if (this.constraints) {\n this.constraints.matchesServerIds = items.map((item: IManagedObject) => item.id);\n }\n this.selectedItems = items;\n }\n\n onChangeNodeId(event) {\n if (event.target.checked) {\n this.showRootNodes = true;\n this.add();\n } else {\n this.showRootNodes = false;\n this.constraints.matchesNodeIds = [];\n }\n }\n\n onChangeShowServerIds(event) {\n if (!event.target.checked) {\n this.constraints.matchesServerIds = [];\n this.showServerIds = false;\n this.selectedItems = [];\n this.checked = {};\n } else {\n this.showServerIds = true;\n }\n }\n\n onChangeShowBrowsePath(event) {\n if (!event.target.checked) {\n this.constraints.browsePathMatchesRegex = '';\n this.showBrowsePath = false;\n } else {\n this.showBrowsePath = true;\n }\n }\n\n onChangeShowServerFragment(event) {\n if (!event.target.checked) {\n this.constraints.serverObjectHasFragment = '';\n this.showServerFragment = false;\n } else {\n this.showServerFragment = true;\n }\n }\n\n add() {\n this.constraints.matchesNodeIds.push('');\n }\n\n remove(index) {\n this.constraints.matchesNodeIds.splice(index, 1);\n }\n\n trackByFn(index: any, _item: any) {\n return index;\n }\n\n updateConstraints(items) {\n if (this.constraints) {\n this.constraints.matchesServerIds = items.map((item: IManagedObject) => item.id);\n }\n }\n\n filterItems(filterText) {\n if (filterText.length !== 0) {\n const search = new RegExp(filterText, 'i');\n this.filteredList = this.opcuaServers.filter(({ name, id }) => {\n return search.test(name) || search.test(id);\n });\n } else {\n this.filteredList = this.opcuaServers;\n }\n }\n\n isChecked(item) {\n return this.checked[item.id];\n }\n\n onSelect(selected, item) {\n if (!selected) {\n this.selectedItems = reject(this.selectedItems, { id: item.id });\n delete this.checked[item.id];\n } else {\n this.selectedItems.push(item);\n this.checked[item.id] = selected;\n }\n this.updateSelectedItem.emit(true);\n this.updateConstraints(this.selectedItems);\n }\n}\n","<div class=\"row\">\n <div class=\"col-md-4\">\n <p translate>\n Specifying auto-apply constraints allows you to limit the scope where the device protocols are\n applied, for example by specifying a set of possible servers or node IDs.\n </p>\n <p translate>\n If no constraints are set, device protocols are applied at any fitting location on the OPC UA\n server.\n </p>\n </div>\n\n <div class=\"col-md-6\">\n <ul class=\"list-group\" style=\"box-shadow: none;\">\n <!-- Limit device type to a set of servers -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to a set of servers' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"\n constraints.matchesServerIds !== null && constraints.matchesServerIds.length > 0\n \"\n (change)=\"onChangeShowServerIds($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to a set of servers' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [collapse]=\"\n (!showServerIds &&\n (constraints.matchesServerIds !== null && constraints.matchesServerIds.length < 1)) ||\n (!showServerIds && constraints.matchesServerIds === null)\n \"\n [isAnimated]=\"true\"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <c8y-select-legacy\n [items]=\"opcuaServers\"\n [selected]=\"selectedItems\"\n [placeholder]=\"placeholderSelectServerIds\"\n (onChange)=\"serverIdsSelected($event)\"\n [updateItems]=\"updateSelectedItem\"\n >\n \n <c8y-li *ngIf=\"opcuaServers.length > sizeToShowFilter\" class=\"sticky-top\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"filterItems($event)\"></c8y-filter>\n </c8y-li>\n <c8y-li *ngIf=\"filteredList && filteredList.length === 0\">\n <c8y-li-body> \n <div class=\"c8y-empty-state text-left\">\n <p>{{ 'No items to display.' | translate }}</p>\n </div>\n </c8y-li-body>\n </c8y-li>\n <c8y-li *ngFor=\"let item of filteredList\">\n <c8y-li-checkbox\n [selected]=\"isChecked(item)\"\n (onSelect)=\"onSelect($event, item)\"\n ></c8y-li-checkbox>\n <c8y-li-body>{{ item.name | translate }}<br>\n <span class=\"text-label-small m-r-4\" translate>ID</span> <small>{{ item.id }}</small>\n </c8y-li-body>\n </c8y-li>\n </c8y-select-legacy>\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type scope in the address space -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol scope in the address space' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"\n constraints.browsePathMatchesRegex !== null &&\n constraints.browsePathMatchesRegex.length > 0\n \"\n (change)=\"onChangeShowBrowsePath($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol scope in the address space' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"\n (!showBrowsePath &&\n constraints.browsePathMatchesRegex !== null &&\n constraints.browsePathMatchesRegex.length < 1) ||\n (!showBrowsePath && constraints.browsePathMatchesRegex === null)\n \"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <input\n name=\"browsePath\"\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} /objects/devices/.*\"\n [(ngModel)]=\"constraints.browsePathMatchesRegex\"\n ngDefaultControl\n />\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type to servers with a certain fragment-->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to servers with a certain fragment' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"constraints.serverObjectHasFragment !== null && constraints.serverObjectHasFragment.length > 0\"\n (change)=\"onChangeShowServerFragment($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to servers with a certain fragment' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"(!showServerFragment && constraints.serverObjectHasFragment !== null && constraints.serverObjectHasFragment.length < 1) || (!showServerFragment && constraints.serverObjectHasFragment === null)\"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <input\n name=\"serverFragment\"\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_SomeServerMarker\"\n [(ngModel)]=\"constraints.serverObjectHasFragment\"\n ngDefaultControl\n />\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type to a specific root node ID -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to specific root nodes ID' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"constraints.matchesNodeIds !== null && constraints.matchesNodeIds.length > 0\"\n (change)=\"onChangeNodeId($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to specific root nodes ID' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"(!showRootNodes && constraints.matchesNodeIds !== null && constraints.matchesNodeIds.length < 1) || ( !showRootNodes && constraints.matchesNodeIds === null)\"\n >\n <ul c8yInputGroupListContainer class=\"list-unstyled p-t-16\">\n <li\n class=\"m-b-8\"\n *ngFor=\"let item of constraints.matchesNodeIds; let i = index; trackBy: trackByFn\"\n >\n <c8y-input-group-list [index]=\"i\" (onAdd)=\"add()\" (onRemove)=\"remove($event)\">\n <c8y-form-group class=\"form-group--tooltip-validation\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} nodeId\"\n [(ngModel)]=\"constraints.matchesNodeIds[i]\"\n [required]=\"true\"\n />\n </c8y-form-group>\n </c8y-input-group-list>\n </li>\n </ul> \n </div>\n </li>\n </ul>\n </div>\n</div>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { set, unset, toInteger } from 'lodash';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n MinValidationDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ControlContainer, NgModelGroup, FormsModule } from '@angular/forms';\nimport { NgFor } from '@angular/common';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\n\n@Component({\n selector: 'opcua-device-protocol-data-reporting',\n templateUrl: './opcua-device-protocol-data-reporting.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgModelGroup }],\n imports: [\n FormGroupComponent,\n C8yTranslateDirective,\n NgFor,\n FormsModule,\n RequiredInputPlaceholderDirective,\n CollapseDirective,\n MinValidationDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaDeviceProtocolDataReportingComponent {\n @Input() set model(_model) {\n if (_model.subscriptionType) {\n this.subscription = _model.subscriptionType;\n if (this.subscription.type === 'CyclicRead') {\n this.cyclicReadParameters = _model.subscriptionType.cyclicReadParameters;\n this.requireCyclic = true;\n this.requireSubscription = false;\n }\n\n if (this.subscription.type === 'Subscription') {\n this.subscriptionParameters = _model.subscriptionType.subscriptionParameters;\n this.requireCyclic = false;\n this.requireSubscription = true;\n }\n\n if (this.subscription.type === 'None') {\n this.requireCyclic = false;\n this.requireSubscription = false;\n }\n }\n this._model = _model;\n this.subscriptionTypeName = 'subscriptionType' + _model.id;\n }\n @Input() groupName;\n\n _model: object;\n @Output() onSubscriptionChange: EventEmitter<any> = new EventEmitter<any>();\n\n subscription = {\n type: 'None'\n };\n subscriptionParameters = {\n samplingRate: undefined,\n deadbandType: 'None',\n deadbandValue: undefined,\n ranges: '',\n queueSize: undefined,\n dataChangeTrigger: 'Status',\n discardOldest: true\n };\n\n cyclicReadParameters = {\n rate: undefined\n };\n\n types: any[] = [\n { value: 'None', label: gettext('None') },\n { value: 'CyclicRead', label: gettext('Cyclic read') },\n { value: 'Subscription', label: gettext('Subscription') }\n ];\n\n filters: any[] = [\n { value: 'None', label: gettext('None') },\n { value: 'Absolute', label: gettext('Absolute') },\n { value: 'Percent', label: gettext('Percent') }\n ];\n\n triggers: any[] = [\n { value: 'Status', label: gettext('Status') },\n { value: 'StatusValue', label: gettext('Status/Value') },\n { value: 'StatusValueTimestamp', label: gettext('Status/Value/Timestamp') }\n ];\n\n discard: any[] = [\n { value: true, label: gettext('oldest`data`') },\n { value: false, label: gettext('newest`data`') }\n ];\n\n requireCyclic = false;\n requireSubscription = false;\n subscriptionTypeName = 'subscriptionType';\n\n parseReadingInterval = $event => toInteger($event.target.value);\n\n updateModel() {\n setTimeout(() => {\n unset(this.subscription, 'subscriptionParameters');\n unset(this.subscription, 'cyclicReadParameters');\n if (this.subscription.type === 'CyclicRead') {\n this.requireCyclic = true;\n this.requireSubscription = false;\n set(this.subscription, 'cyclicReadParameters', this.cyclicReadParameters);\n } else if (this.subscription.type === 'Subscription') {\n this.requireCyclic = false;\n this.requireSubscription = true;\n set(this.subscription, 'subscriptionParameters', this.subscriptionParameters);\n } else if (this.subscription.type === 'None') {\n this.requireCyclic = false;\n this.requireSubscription = false;\n }\n this.onSubscriptionChange.emit(this.subscription);\n });\n }\n}\n","<c8y-form-group>\n <label translate>Mechanism</label>\n <label\n title=\"{{ mechanism.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n *ngFor=\"let mechanism of types\"\n >\n <input\n type=\"radio\"\n name=\"{{subscriptionTypeName}}\"\n [value]=\"mechanism.value\"\n [(ngModel)]=\"subscription.type\"\n (change)=\"updateModel()\"\n required\n [attr.data-cy]=\"mechanism.value\"\n />\n <span></span>\n <span>{{ mechanism.label | translate }}</span>\n </label>\n</c8y-form-group>\n\n<div class=\"row collapse\" [collapse]=\"subscription.type != 'CyclicRead'\" [isAnimated]=\"true\">\n <div class=\"col-sm-6 col-md-4 col-lg-3\">\n <c8y-form-group>\n <label translate>Reading interval</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"rate\"\n [(ngModel)]=\"cyclicReadParameters.rate\"\n placeholder=\"{{ 'e.g.' | translate }} 50\"\n [required]=\"requireCyclic\"\n min=\"50\"\n [attr.data-cy]=\"'cyclicReadRate'\"\n />\n <span class=\"input-group-addon units\" title=\"{{ 'Milliseconds' | translate }}\">\n {{ 'msec' | translate }}\n </span>\n </div>\n </c8y-form-group>\n </div>\n</div>\n\n<div class=\"row collapse\" [collapse]=\"subscription.type != 'Subscription'\" [isAnimated]=\"true\">\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Sampling interval</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"samplingRate\"\n [(ngModel)]=\"subscriptionParameters.samplingRate\"\n placeholder=\"{{ 'e.g.' | translate }} 500\"\n [required]=\"requireSubscription\"\n min=\"0\"\n [attr.data-cy]=\"'subscriptionSamplingRate'\"\n />\n <span class=\"input-group-addon units\" title=\"{{ 'Milliseconds' | translate }}\" translate>\n msec\n </span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Queue size</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"queueSize\"\n [(ngModel)]=\"subscriptionParameters.queueSize\"\n placeholder=\"{{ 'e.g.' | translate }} 10\"\n min=\"1\"\n [attr.data-cy]=\"'subscriptionQueueSize'\"\n />\n <span class=\"input-group-addon\">\n <strong translate>Discard</strong> \n <label\n *ngFor=\"let discardOption of discard\"\n title=\"{{ discardOption.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"discard{{ _model.id }}\"\n [value]=\"discardOption.value\"\n [(ngModel)]=\"subscriptionParameters.discardOldest\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"discardOption.label\"\n [attr.data-name]=\"'discard' + _model.id\"\n />\n <span></span>\n <span>{{ discardOption.label | translate }}</span>\n </label>\n </span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"clearfix\"></div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Data change trigger</label>\n <label\n *ngFor=\"let trigger of triggers\"\n title=\"{{ trigger.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"dataChangeTrigger{{ _model.id }}\"\n [value]=\"trigger.value\"\n [(ngModel)]=\"subscriptionParameters.dataChangeTrigger\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"trigger.label\"\n [attr.data-name]=\"'dataChangeTrigger' + _model.id\"\n />\n <span></span>\n <span>{{ trigger.label | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Deadband filter</label>\n <label\n *ngFor=\"let deadbandFilter of filters\"\n title=\"{{ deadbandFilter.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"deadbandType{{ _model.id }}\"\n [value]=\"deadbandFilter.value\"\n [(ngModel)]=\"subscriptionParameters.deadbandType\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"deadbandFilter.label\"\n [attr.data-name]=\"'deadbandType' + _model.id\"\n />\n <span></span>\n <span>{{ deadbandFilter.label | translate }}</span>\n </label>\n </c8y-form-group>\n <div [collapse]=\"subscriptionParameters.deadbandType == 'None'\" [isAnimated]=\"true\">\n <c8y-form-group>\n <label translate>Deadband value</label>\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"deadbandValue\"\n [(ngModel)]=\"subscriptionParameters.deadbandValue\"\n placeholder=\"{{ 'e.g.' | translate }} 10\"\n [required]=\"subscriptionParameters.deadbandType != 'None'\"\n min=\"0\"\n [attr.data-cy]=\"'deadbandValue'\"\n />\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\r\nimport { NgForm, ControlContainer, FormsModule } from '@angular/forms';\r\nimport {\r\n C8yTranslateDirective,\r\n IconDirective,\r\n C8yTranslatePipe,\r\n DatePipe\r\n} from '@c8y/ngx-components';\r\nimport { NgClass, NgIf } from '@angular/common';\r\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\r\n\r\n@Component({\r\n selector: 'opcua-device-protocol-description',\r\n templateUrl: './opcua-device-protocol-description.html',\r\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\r\n imports: [\r\n C8yTranslateDirective,\r\n NgClass,\r\n FormsModule,\r\n NgIf,\r\n ButtonCheckboxDirective,\r\n IconDirective,\r\n C8yTranslatePipe,\r\n DatePipe\r\n ]\r\n})\r\nexport class OpcuaDeviceProtocolDescription {\r\n _model: any;\r\n autoScan: string;\r\n @Input() set model(_model) {\r\n this.moId = _model.referencedServerId;\r\n this._model = _model;\r\n this.autoScan = _model.enabled ? '1' : '0';\r\n }\r\n\r\n private moId = '';\r\n\r\n setAutoScanOption(data: string) {\r\n this._model.enabled = data !== '0' ? true : false;\r\n }\r\n}\r\n","<div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-device-protocols\"></i>\n <p>\n <small class=\"label label-info\">{{ _model.fieldbusType }}</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"content-flex-80\">\n <div class=\"col-9\">\n <div class=\"form-group form-group-lg m-b-0\">\n <label class=\"sr-only\" translate>Name</label>\n <label class=\"editable\" [ngClass]=\"{ updated: ctrlName.dirty }\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"name\"\n #ctrlName=\"ngModel\"\n [(ngModel)]=\"_model.name\"\n style=\"max-width:calc( {{ _model.name.length || 10 }} * 1ch + 14px)\"\n />\n </label>\n </div>\n <div class=\"form-group\">\n <label class=\"sr-only\" translate>Description</label>\n <label class=\"editable\" [ngClass]=\"{ updated: ctrlDescription.dirty }\">\n <textarea\n class=\"form-control\"\n rows=\"1\"\n name=\"description\"\n placeholder=\"{{ 'e.g. My protocol description' | translate }}\"\n #ctrlDescription=\"ngModel\"\n [(ngModel)]=\"_model.description\"\n style=\"max-width:calc( {{ _model.description?.length || 25 }} * 1ch + 14px)\"\n ></textarea>\n <span *ngIf=\"_model.description\">\n {{ _model.description }}\n </span>\n </label>\n </div>\n <div class=\"d-flex\">\n <div>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"autoScanAddressSpace\"\n [(ngModel)]=\"autoScan\"\n (ngModelChange)=\"setAutoScanOption($event)\"\n btnCheckbox\n btnCheckboxTrue=\"1\"\n btnCheckboxFalse=\"0\"\n ngDefaultControl\n >\n <i *ngIf=\"autoScan === '1'\" c8yIcon=\"check\" class=\"text-success\"></i>\n <span *ngIf=\"autoScan === '1'\">\n {{ 'Active`auto scanning`' | translate }}\n </span>\n\n <i *ngIf=\"autoScan === '0'\" c8yIcon=\"ban\" class=\"text-danger\"></i>\n <span *ngIf=\"autoScan === '0'\">\n {{ 'Inactive`auto scanning`' | translate }}\n </span>\n </button>\n </div>\n <small class=\"m-l-16 text-muted\">\n {{\n 'When active, the gateway scans the address space of all servers and automatically applies this device protocol to all nodes matching the criteria.'\n | translate\n }}\n </small>\n </div>\n </div>\n <div class=\"flex-grow\">\n <ul class=\"list-unstyled small\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>ID</label>\n <span class=\"m-l-auto\">{{ _model.id }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Date created</label>\n <span class=\"m-l-auto\">{{ _model.creationTime | c8yDate }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Last update</label>\n <span class=\"m-l-auto\">{{ _model.lastUpdated | c8yDate }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Fieldbus version</label>\n <span class=\"m-l-auto\">{{ _model.fieldbusVersion }}</span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { BaseObjectMapping } from '@c8y/ngx-components/device-protocol-object-mappings';\n\nexport class OpcuaCustomActionObjectMapping extends BaseObjectMapping {\n constructor() {\n super({\n icon: 'bell',\n label: gettext('Custom action'),\n formlyFieldConfig: {\n key: 'customAction',\n fieldGroup: [\n {\n type: 'array',\n key: 'headers',\n props: {\n label: gettext('headers'),\n addText: gettext('Add Header'),\n required: true\n },\n className: 'formly-group-array-cols d-block min-height-fit',\n fieldArray: {\n fieldGroup: [\n {\n key: 'key',\n type: 'string',\n focus: true,\n props: {\n placeholder: 'Authorization',\n label: gettext('Key'),\n required: true,\n smallFormGroup: true\n },\n wrappers: ['c8y-form-field']\n },\n {\n key: 'value',\n type: 'string',\n props: {\n placeholder: 'Basic <credentials>',\n label: gettext('Value'),\n required: true,\n smallFormGroup: true\n }\n }\n ]\n }\n },\n {\n className: 'row',\n wrappers: ['c8y-legend-wrapper'],\n props: {\n label: gettext('Action')\n },\n fieldGroup: [\n {\n type: 'string',\n key: 'endpoint',\n props: {\n label: gettext('Endpoint'),\n smallFormGroup: true,\n required: true\n },\n className: 'col-md-6 p-0'\n },\n {\n type: 'textarea',\n key: 'bodyTemplate',\n props: {\n label: gettext('Body template'),\n smallFormGroup: true,\n required: true,\n description: gettext(\n 'The following placeholders are available: ${value}`KEEP_ORIGINAL`, ${serverId}`KEEP_ORIGINAL`, ${nodeId}`KEEP_ORIGINAL`, ${deviceId}`KEEP_ORIGINAL`.'\n )\n },\n className: 'col-md-6'\n }\n ]\n }\n ]\n }\n });\n }\n}\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlarmObjectMapping,\n ALARM_SEVERITY,\n EventObjectMapping,\n MeasurementObjectMapping\n} from '@c8y/ngx-components/device-protocol-object-mappings';\n\nexport class OpcuaMeasurementObjectMapping extends MeasurementObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'measurementCreation', smallFormGroup);\n }\n}\n\nexport class OpcuaEventObjectMapping extends EventObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'eventCreation', smallFormGroup, undefined, [\n {\n key: 'type',\n type: 'string',\n props: {\n label: gettext('Type'),\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'text',\n type: 'string',\n props: {\n label: gettext('Text'),\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n }\n ]);\n }\n}\n\nexport class OpcuaAlarmObjectMapping extends AlarmObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'alarmCreation', smallFormGroup, undefined, [\n {\n key: 'severity',\n type: 'select',\n props: {\n label: gettext('Severity'),\n options: [...Object.values(ALARM_SEVERITY).map(value => ({ label: value, value }))],\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'type',\n type: 'string',\n props: {\n label: gettext('Type'),\n smallFormGroup,\n required: true\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'text',\n type: 'string',\n props: {\n label: gettext('Text'),\n smallFormGroup,\n required: true\n },\n className: 'col-md-3 col-sm-6'\n }\n ]);\n }\n}\n","import { Directive, ElementRef, Injector, Input } from '@angular/core';\nimport { UpgradeComponent } from '@angular/upgrade/static';\n\n@Directive({ selector: 'c8y-object-mapping-status-icons' })\nexport class OpcuaDeviceProtocolObjectMappingStatus extends UpgradeComponent {\n @Input() mapping: any;\n constructor(elementRef: ElementRef, injector: Injector) {\n super('c8yObjectMappingStatusIcons', elementRef, injector);\n }\n}\n","import {\n Component,\n OnInit,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { ControlContainer, NgModelGroup, FormsModule } from '@angular/forms';\nimport { isNil, isEmpty, assign, unset, get, set, cloneDeep, isEqual } from 'lodash-es';\nimport { AddressSpaceService } from './address-space.service';\nimport {\n OpcuaMeasurementObjectMapping,\n OpcuaCustomActionObjectMapping,\n OpcuaAlarmObjectMapping,\n OpcuaEventObjectMapping\n} from './mappings';\nimport { NgClass, NgIf, JsonPipe } from '@angular/common';\nimport {\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { OpcuaDeviceProtocolObjectMappingStatus } from './opcua-device-protocol-object-mapping-status-icon.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { OpcuaDeviceProtocolBrowsePathValidation } from './opcua-device-protocol-browse-path-validation.directive';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { ObjectMappingComponent } from '@c8y/ngx-components/device-protocol-object-mappings';\n\n@Component({\n selector: 'opcua-device-protocol-mapping',\n templateUrl: './opcua-device-protocol-mapping.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgModelGroup }],\n imports: [\n NgClass,\n IconDirective,\n NgIf,\n OpcuaDeviceProtocolObjectMappingStatus,\n TooltipDirective,\n CollapseDirective,\n FormsModule,\n FormGroupComponent,\n BsDropdownDirective,\n RequiredInputPlaceholderDirective,\n OpcuaDeviceProtocolBrowsePathValidation,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n OpcuaAddressSpaceTreeComponent,\n MessagesComponent,\n MessageDirective,\n OpcuaDeviceProtocolDataReportingComponent,\n ObjectMappingComponent,\n C8yTranslatePipe,\n JsonPipe\n ]\n})\nexport class OpcuaDeviceProtocolMapping implements OnInit, OnChanges {\n @ViewChild('variableForm', { static: false }) subFormRef: NgModelGroup;\n @ViewChild('browsePathModel', { static: false }) browsePathModel: any;\n\n @Input('resource') _model;\n @Input() index;\n @Input() getParentAttr;\n @Input() referencedServerId;\n @Input() referencedRootNodeId;\n @Output() onAction: EventEmitter<any> = new EventEmitter<any>();\n\n mapping;\n\n isDetailOpen;\n referencedNode;\n isPathFocused = false;\n groupName: string;\n browsePath: string;\n nodeDisplayName: string;\n isBrowsePathUniq = true;\n dataReporting = 'default';\n isTreeOpen = false;\n isNew = false;\n resetModel = false;\n dataReportingName;\n\n mappingTypes = [\n OpcuaMeasurementObjectMapping,\n OpcuaAlarmObjectMapping,\n OpcuaEventObjectMapping,\n OpcuaCustomActionObjectMapping\n ];\n\n private objectMappingState = {\n valid: false,\n dirty: false\n };\n constructor(private addressSpaceService: AddressSpaceService) {}\n\n toggleDetail() {\n this.isDetailOpen = !this.isDetailOpen;\n if (this.resetModel) {\n this.initialFormSetup();\n }\n }\n\n getMappings = () => this.getParentAttr('mappings');\n\n ngOnInit() {\n this.dataReportingName = 'ReportingMode' + this.index;\n this.initialFormSetup();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // this is done to keep the \"onDelete\" logic in\n // opcua-device-protocol-detail.component intact\n if (\n !isNil(get(changes, '_model.previousValue')) &&\n !isEqual(this._model, changes._model.previousValue)\n ) {\n if (this.mapping && this.mapping.name === this._model.name) {\n this.mapping.id = this._model.id;\n }\n }\n }\n\n onMappingUpdate({ dirty, valid }: { dirty: boolean; valid: boolean; touched?: boolean }) {\n this.objectMappingState = {\n valid,\n dirty\n };\n }\n\n initialFormSetup() {\n const mapping = {\n id: '',\n browsePath: [],\n name: '',\n subscriptionType: {\n type: 'None'\n }\n };\n\n this.mapping = assign({}, mapping, cloneDeep(this._model));\n\n if (isEmpty(this.mapping.browsePath)) {\n this.isNew = true;\n this.isDetailOpen = true;\n } else {\n this.browsePath = this.stringfyBrowsePath(this.mapping.browsePath);\n this.nodeDisplayName = this.mapping.name;\n }\n\n if (this.referencedRootNodeId) {\n this.referencedNode = { nodeId: this.referencedRootNodeId };\n this.addressSpaceService.triggerNodeToOpen({\n node: {\n nodeId: this.referencedRootNodeId,\n children: [],\n expanded: false,\n absolutePaths: [[]]\n },\n selectedAncestorIds: []\n });\n } else {\n this.referencedNode = { nodeId: '' };\n }\n\n if (this.mapping?.customAction) {\n Object.assign(this.mapping, {\n customAction: {\n ...this.mapping.customAction,\n headers: this.mapHeadersObjectToList(this.mapping?.customAction?.headers)\n }\n });\n }\n\n if (get(this._model, 'subscriptionType')) {\n this.dataReporting = 'custom';\n } else {\n this.dataReporting = 'default';\n }\n this.resetModel = false;\n }\n\n showAddressSpaceTree() {\n return !isEmpty(this.referencedServerId);\n }\n\n ngAfterViewInit() {\n if (\n get(this.mapping, 'subscriptionType') &&\n get(this.mapping, 'subscriptionType.type') !== 'None'\n ) {\n this.dataReporting = 'custom';\n }\n }\n\n mapHeadersObjectToList(headers) {\n if (Object.keys(headers).length > 0) {\n return Object.keys(headers).map(item => {\n return { key: item, value: headers[item] };\n });\n }\n }\n\n stringfyBrowsePath(path) {\n return JSON.stringify(path);\n }\n\n updateBrowsePath(node) {\n this.mapping.browsePath = node.relativePath;\n this.nodeDisplayName = node.displayName;\n this.mapping.name = this.nodeDisplayName;\n this.browsePath = this.stringfyBrowsePath(this.mapping.browsePath);\n this.browsePathModel.control.markAsDirty();\n }\n\n updateDisplayname() {\n this.mapping.name = this.nodeDisplayName;\n }\n\n updateBrowsePathInput() {\n if (this.browsePath) {\n try {\n this.mapping.browsePath = JSON.parse(this.browsePath);\n } catch (error) {\n return;\n }\n }\n }\n\n save() {\n if (this.dataReporting === 'default') {\n unset(this.mapping, 'subscriptionType');\n }\n\n if (get(this.mapping, 'measurementCreation')) {\n const { measurementCreation } = this.mapping;\n set(measurementCreation, 'fragmentName', get(measurementCreation, 'type'));\n }\n\n if (this.mapping.customAction) {\n this.mapping.customAction.headers = this.mapping.customAction.headers.reduce(\n (result, item) => {\n result[item.key] = item.value;\n return result;\n },\n {}\n );\n }\n\n this.onAction.emit({\n action: 'save',\n data: this.mapping\n });\n this.isDetailOpen = false;\n }\n\n cancel() {\n this.isDetailOpen = false;\n this.resetModel = true;\n\n if (this.mapping.id === 'new') {\n this.onAction.emit({\n action: 'delete',\n data: assign({}, this.mapping)\n });\n }\n }\n\n onDelete() {\n this.onAction.emit({ action: 'delete', data: this.mapping });\n }\n\n canSave({ valid, dirty }) {\n const areValid = (): boolean => valid && this.objectMappingState.valid;\n const areDirty = (): boolean => dirty || this.objectMappingState.dirty;\n return areValid() && areDirty();\n }\n\n isActive() {\n return this.isDetailOpen;\n }\n\n setTreeFromRefNode() {\n if (this.referencedRootNodeId) {\n this.addressSpaceService.triggerNodeToOpen({\n node: {\n nodeId: this.referencedRootNodeId,\n children: [],\n expanded: false,\n absolutePaths: [[]]\n },\n selectedAncestorIds: []\n });\n }\n }\n\n updateSubscriptionType(value) {\n this.mapping.subscriptionType = value;\n }\n}\n","<div\n class=\"c8y-list__item\"\n [ngClass]=\"{ expanded: isDetailOpen }\"\n [attr.data-cy]=\"mapping.browsePath | json\"\n>\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"sliders\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-70\">\n <div class=\"col-5\">\n <p\n class=\"text-truncate\"\n title=\" {{ nodeDisplayName }} {{\n mapping.browsePath.length > 0 ? (mapping.browsePath | json) : ''\n }}\"\n (click)=\"toggleDetail()\"\n >\n {{ nodeDisplayName }}\n <small\n class=\"text-muted\"\n *ngIf=\"mapping.browsePath.length > 0\"\n >\n {{ mapping.browsePath | json }}\n </small>\n </p>\n </div>\n <div class=\"col-5\">\n <div class=\"list-functionalities\">\n <label class=\"small m-r-8 m-b-0 hidden-xs\">\n {{ 'Functionalities' | translate }}\n </label>\n <c8y-object-mapping-status-icons [mapping]=\"mapping\"></c8y-object-mapping-status-icons>\n </div>\n </div>\n <div class=\"flex-grow d-flex p-r-8\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n c8yIcon=\"minus-circle\"\n (click)=\"onDelete()\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\">\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ active: isDetailOpen }\"\n (click)=\"toggleDetail()\"\n [attr.data-cy]=\"'toggleDetail'\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"collapse\"\n [collapse]=\"!isDetailOpen\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <div\n class=\"form\"\n [ngModelGroup]=\"index\"\n #variableForm=\"ngModelGroup\"\n *ngIf=\"isDetailOpen\"\n >\n <div class=\"row p-t-8\">\n <c8y-form-group\n class=\"col-md-4\"\n [status]=\"!isBrowsePathUniq ? 'error' : ''\"\n *ngIf=\"showAddressSpaceTree(); else simpleInput\"\n >\n <label>{{ 'Path' | translate }}</label>\n <div\n class=\"dropdown fit-w\"\n dropdown\n #dropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ ['2:Node1', '2:SubNode1'] | json }}\"\n name=\"browsePath\"\n type=\"text\"\n autocomplete=\"off\"\n required\n c8yBrowsePathValidator\n [getMappings]=\"getMappings\"\n [model]=\"mapping\"\n [(ngModel)]=\"browsePath\"\n (change)=\"updateBrowsePathInput()\"\n (focus)=\"setTreeFromRefNode()\"\n #browsePathModel=\"ngModel\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Toggle address space' | translate }}\"\n type=\"button\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'caret-down'\"></i>\n </button>\n </span>\n </div>\n <div\n class=\"dropdown-menu panel-inner-scroll fit-w\"\n style=\"max-height: 240px\"\n *dropdownMenu\n >\n <opcua-address-space-tree\n [node]=\"referencedNode\"\n [moId]=\"referencedServerId\"\n (selectedNode)=\"updateBrowsePath($event); dropdown.hide()\"\n ></opcua-address-space-tree>\n </div>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"invalidBrowsePathNotation\"\n text=\"{{ 'Must be a valid array of strings.' | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"browsePathNotUnique\"\n text=\"{{ 'Variable with this path is already added.' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <ng-template #simpleInput>\n <c8y-form-group class=\"col-md-4\">\n <label>{{ 'Path' | translate }}</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ ['2:Node1', '2:SubNode1'] | json }}\"\n name=\"browsePath\"\n type=\"text\"\n autocomplete=\"off\"\n required\n c8yBrowsePathValidator\n [getMappings]=\"getMappings\"\n [model]=\"mapping\"\n [(ngModel)]=\"browsePath\"\n (change)=\"updateBrowsePathInput()\"\n #browsePathModel=\"ngModel\"\n />\n <c8y-messages>\n <c8y-message\n name=\"invalidBrowsePathNotation\"\n text=\"{{ 'Must be a valid array of strings.' | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"browsePathNotUnique\"\n text=\"{{ 'Variable with this path is already added.' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </ng-template>\n\n <c8y-form-group class=\"col-md-4\">\n <label>{{ 'Name' | translate }}</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. childDevice2' | translate }} \"\n name=\"displayName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"nodeDisplayName\"\n (change)=\"updateDisplayname()\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div\n class=\"row\"\n ngModelGroup=\"dataReportingSection\"\n >\n <c8y-form-group class=\"col-sm-4 col-md-3 col-lg-2\">\n <label>\n <span>{{ 'Data reporting' | translate }}</span>\n </label>\n <div class=\"input-group\">\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Default' | translate }}\"\n >\n <input\n name=\"{{ dataReportingName }}\"\n type=\"radio\"\n value=\"default\"\n [(ngModel)]=\"dataReporting\"\n />\n <span></span>\n <span>{{ 'Default' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Custom' | translate }}\"\n >\n <input\n name=\"{{ dataReportingName }}\"\n type=\"radio\"\n value=\"custom\"\n [(ngModel)]=\"dataReporting\"\n />\n <span></span>\n <span>{{ 'Custom' | translate }}</span>\n </label>\n </div>\n </c8y-form-group>\n <div\n class=\"col-sm-8 col-md-9 col-lg-10\"\n *ngIf=\"dataReporting === 'custom'\"\n ngModelGroup=\"overriddenSubscription\"\n >\n <opcua-device-protocol-data-reporting\n [model]=\"mapping\"\n (onSubscriptionChange)=\"updateSubscriptionType($event)\"\n ></opcua-device-protocol-data-reporting>\n </div>\n </div>\n\n <c8y-device-protocol-object-mappings\n [data]=\"mapping\"\n [objectMappingTypes]=\"mappingTypes\"\n (onUpdate)=\"onMappingUpdate($event)\">\n </c8y-device-protocol-object-mappings>\n\n <button\n class=\"btn btn-default m-t-16 m-b-16\"\n title=\"{{ 'Cancel' | translate }}\"\n id=\"cancelBtn\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary m-t-16 m-b-16\"\n title=\"{{ 'Save' | translate }}\"\n id=\"saveBtn\"\n type=\"button\"\n (click)=\"save()\"\n [disabled]=\"!canSave(variableForm)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, ViewChildren, QueryList, ChangeDetectorRef } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { OpcuaService } from './opcuaService';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n EmptyStateComponent,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { OpcuaDeviceType } from './opcua-protocol-device-type.interface';\nimport { find, assign, omit, findIndex, pick, get, isNil } from 'lodash-es';\nimport { OpcuaDeviceProtocolMapping } from './opcua-device-protocol-mapping.component';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { OpcuaDeviceProtocolDescription } from './opcua-device-protocol-description.component';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { OpcuaAutoApplySettingsComponent } from './opcua-auto-apply-settings.component';\n\n@Component({\n selector: 'opcua-device-protocol-detail',\n templateUrl: './opcua-device-protocol-detail.html',\n imports: [\n NgIf,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n FormsModule,\n OpcuaDeviceProtocolDescription,\n C8yTranslateDirective,\n NgFor,\n OpcuaDeviceProtocolMapping,\n EmptyStateComponent,\n IconDirective,\n OpcuaDeviceProtocolDataReportingComponent,\n OpcuaAutoApplySettingsComponent,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaDeviceProtocolDetailComponent implements OnInit {\n @ViewChildren(OpcuaDeviceProtocolMapping) instanceList: QueryList<OpcuaDeviceProtocolMapping>;\n\n initialModel: OpcuaDeviceType = {\n id: '',\n fieldbusType: 'opcuaV2',\n description: '',\n unit: '',\n fieldbusVersion: 4,\n name: '',\n referencedServerId: '',\n referencedRootNodeId: '',\n subscriptionType: {\n type: 'None'\n },\n mappings: [],\n overriddenSubscriptions: [],\n applyConstraints: {\n browsePathMatchesRegex: '',\n matchesNodeIds: [],\n serverObjectHasFragment: '',\n matchesServerIds: []\n },\n enabled: ''\n };\n\n model: any;\n server: any;\n selectedNode: any;\n isLoaded = true;\n\n constructor(\n private changeDetectorRef: ChangeDetectorRef,\n private opcuaService: OpcuaService,\n private alertService: AlertService,\n private router: Router\n ) {}\n\n ngAfterContentChecked() {\n this.changeDetectorRef.detectChanges();\n }\n\n getParentAttr = key => get(this.model, key);\n\n getMapping() {\n return this.model.mappings;\n }\n\n getEmptyMappingObject() {\n const { mappings } = this.model;\n return {\n id: mappings.length > 0 ? Math.max(...mappings.map(m => m.id)) + 1 : 0,\n browsePath: []\n };\n }\n\n getOverriddenSubscriptionsByPath(browsePath: string[]): any {\n if (isNil(browsePath) || browsePath.length === 0) {\n return undefined;\n }\n return find(this.model.overriddenSubscriptions, { browsePath });\n }\n\n getStructuredResource(resource) {\n const overriddenSubscriptions: any = this.getOverriddenSubscriptionsByPath(resource.browsePath);\n let result = assign({}, resource);\n if (overriddenSubscriptions) {\n result = assign({}, resource, { subscriptionType: overriddenSubscriptions.subscriptionType });\n }\n return result;\n }\n\n async ngOnInit() {\n const id = this.opcuaService.getId();\n\n if (id) {\n const res = await this.opcuaService.getDeviceProtocol(id);\n if (res && res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n this.isLoaded = false;\n } else {\n const data = await res.json();\n if (data && data.applyConstraints === null) {\n delete data.applyConstraints;\n }\n if (data && data.subscriptionType === null) {\n delete data.subscriptionType;\n }\n this.model = assign(this.initialModel, data);\n if (!this.model.mappings) {\n this.model.mappings = [];\n }\n this.model = assign(this.initialModel, this.updateViableMapping(data));\n this.isLoaded = false;\n }\n }\n }\n\n updateViableMapping(model) {\n const { mappings } = model;\n let result = [];\n if (mappings) {\n result = mappings.map((item, i) => {\n return assign(this.getStructuredResource(item), { id: i });\n });\n }\n return assign(model, { mappings: result });\n }\n\n trackById(_index: number, el: any): number {\n return get(el, 'id');\n }\n\n addVariable() {\n this.model.mappings.push(this.getEmptyMappingObject());\n }\n\n updateVariable(mappingObject) {\n const { mappings } = this.model;\n const { id } = mappingObject;\n const index = findIndex(mappings, { id });\n mappings[index > -1 ? index : 0] = mappingObject;\n }\n\n removeVariable(mappingObject) {\n const { mappings } = this.model;\n const { id } = mappingObject;\n let index = -1;\n\n // id typeof string || number\n if (!isNil(id) && (id.length > 0 || id > -1)) {\n index = findIndex(mappings, { id });\n }\n\n if (index > -1) {\n mappings.splice(index, 1);\n }\n }\n\n actionHandler(actionObject) {\n switch (actionObject.action) {\n case 'save':\n this.updateVariable(actionObject.data);\n break;\n case 'delete':\n this.removeVariable(actionObject.data);\n break;\n }\n }\n\n extractOverridSubscriptionType(_mapping) {\n const overriddenSubscriptions = [];\n\n const variableMapping = [];\n _mapping.forEach(element => {\n if (element.id !== 'new') {\n if (element.subscriptionType) {\n overriddenSubscriptions.push(\n assign(\n { browsePath: element.browsePath },\n { subscriptionType: element.subscriptionType }\n )\n );\n }\n variableMapping.push(omit(element, ['subscriptionType']));\n }\n });\n return [variableMapping, overriddenSubscriptions];\n }\n\n prepareRequestJson(_model) {\n let requestJson = {};\n const [mappings, overriddenSubscriptions] = this.extractOverridSubscriptionType(\n _model.mappings\n );\n requestJson = assign(requestJson, pick(_model, Object.keys(this.initialModel)), {\n mappings,\n overriddenSubscriptions\n });\n return requestJson;\n }\n\n async save() {\n try {\n const res = await this.opcuaService.updateDeviceProtocol(this.prepareRequestJson(this.model));\n const data = await res.json();\n\n if (res && res.status === 200) {\n this.router.navigate(['deviceprotocols']);\n this.alertService.success(gettext('Device protocol saved.'));\n } else {\n const { details } = data;\n this.alertService.addServerFailure({ res, data: details });\n }\n } catch (ex) {\n this.alertService.danger(gettext('Failed to save. Try again.'));\n }\n }\n\n canSave(deviceTypeForm) {\n if (this.instanceList) {\n const activeInstances = this.instanceList.filter(item => item.isActive());\n\n if (activeInstances.length > 0) {\n return true;\n }\n }\n return !deviceTypeForm.form.valid;\n }\n}\n","<c8y-title *ngIf=\"!isLoaded\">{{ model.name }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-protocols'\"\n [label]=\"'Device types' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-protocols'\"\n [label]=\"'Device protocols' | translate\"\n [path]=\"'deviceprotocols'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'c8y-device-protocols'\" [label]=\"model?.name\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <form #deviceTypeForm=\"ngForm\" name=\"detailForm\" *ngIf=\"!isLoaded\" class=\"card card--fullpage\">\n <opcua-device-protocol-description [model]=\"model\"></opcua-device-protocol-description>\n <div class=\"inner-scroll\">\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"h4\" translate>Variables</div>\n </div>\n <div class=\"p-l-16 p-r-16\">\n <div class=\"c8y-list__group\" *ngIf=\"model.mappings.length > 0\" ngModelGroup=\"variable\">\n <opcua-device-protocol-mapping\n *ngFor=\"let resource of getMapping(); index as i; trackBy: trackById\"\n [index]=\"i\"\n [referencedServerId]=\"model.referencedServerId\"\n [referencedRootNodeId]=\"model.referencedRootNodeId\"\n [resource]=\"getStructuredResource(resource)\"\n [getParentAttr]=\"getParentAttr\"\n (onAction)=\"actionHandler($event)\"\n ></opcua-device-protocol-mapping>\n </div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16\">\n <c8y-ui-empty-state\n *ngIf=\"model.mappings.length === 0\"\n [icon]=\"'sliders'\"\n [title]=\"'No variables to display.' | translate\"\n [subtitle]=\"'Click below to add your first variable.' | translate\"\n ></c8y-ui-empty-state>\n\n <div class=\"card-footer\">\n <button\n type=\"button\"\n title=\"{{ 'Add variable' | translate }}\"\n class=\"btn btn-default addVariableBtn\"\n (click)=\"addVariable()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add variable' | translate }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"h4\" translate>Data reporting</div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16\" ngModelGroup=\"subscription\">\n <opcua-device-protocol-data-reporting\n [groupName]=\"'subscription'\"\n [model]=\"model\"\n ></opcua-device-protocol-data-reporting>\n </div>\n </div>\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom sticky-top\">\n <div class=\"h4\" translate>Auto apply constraints</div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16 overflow-visible\" ngModelGroup=\"autoApply\">\n <opcua-auto-apply [model]=\"model\"></opcua-auto-apply>\n </div>\n </div>\n\n <div class=\"card-footer sticky-bottom separator\" style=\"z-index: 101\">\n <button\n title=\"{{ 'Save' | translate }}\"\n id=\"deviceTypeSave\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"canSave(deviceTypeForm)\"\n type=\"button\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\n\nimport { AppStateService } from '@c8y/ngx-components';\n\n@Injectable()\nexport class OpcuaMicroserviceGuard {\n microserviceName = 'opcua-mgmt-service';\n checkApp: Promise<boolean>;\n\n constructor(private app: AppStateService) {}\n\n canActivate() {\n if (!this.checkApp) {\n this.checkApp = this.app.isApplicationAvailable(this.microserviceName);\n }\n return this.checkApp;\n }\n}\n","export const NEW_SERVER_ID = 'new';\nexport interface OpcuaServer {\n name: string;\n id: string;\n gatewayId?: string;\n subtitle?: string;\n connectionStatus?: any;\n enabeled?: any;\n config: OpcuaServerConfig;\n quickInfo?: {\n padlock?: string;\n padlockMsg?: string;\n };\n active: true | false;\n}\n\nexport interface OpcuaServerConfig {\n securityMode: string;\n keystorePass?: any;\n keystoreFilename?: string;\n keystoreBinaryId?: any;\n certificatePass?: any;\n userIdentityMode?: string;\n serverUrl?: string;\n userName?: string;\n userPassword?: string;\n passwordEncrypted?: boolean;\n rescanCron?: any;\n timeout?: number;\n autoReconnect?: boolean;\n targetConnectionState?: 'enabled' | 'disabled' | null;\n statusCheckInterval?: number;\n valid?: boolean;\n autoScanAddressSpace?: boolean;\n partialAddressScanNodeIds?: Array<string>;\n partialAddressScan?: boolean;\n}\n","import {\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n signal,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup, NgForm, FormsModule } from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n DropAreaComponent,\n DroppedFile,\n ModalService,\n Status,\n EmptyStateComponent,\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslateDirective,\n DeviceStatusComponent,\n DefaultValidationDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { cloneDeep, has } from 'lodash-es';\nimport { debounceTime, merge, Subject } from 'rxjs';\nimport { NEW_SERVER_ID, OpcuaServer, OpcuaServerConfig } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgFor, NgClass } from '@angular/common';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\n\n@Component({\n selector: 'opcua-server-config',\n templateUrl: './opcua-server-config.component.html',\n imports: [\n NgIf,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslateDirective,\n ButtonCheckboxDirective,\n DeviceStatusComponent,\n DefaultValidationDirective,\n NgFor,\n DropAreaComponent,\n NgClass,\n CollapseDirective,\n FormlyModule,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServerConfigComponent implements OnInit, OnChanges {\n currentSecMode: string;\n fileName = '';\n targetConnectionState = '1';\n minIntervalNumber = 1;\n connectionStatusLabel = '';\n autoScanAddressSpace = '0';\n advancedSettings = false;\n advancedSettingsForm = new FormGroup({});\n advancedSettingsFields: FormlyFieldConfig[] = [];\n isNew = signal<boolean>(false);\n @ViewChild('opcuaConfigForm', { static: false }) set opcuaConfigForm(opcuaConfigForm: NgForm) {\n if (opcuaConfigForm) {\n opcuaConfigForm.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(e => {\n this.opcuaConfigFormValueChange$.next(e);\n });\n }\n }\n @ViewChild(DropAreaComponent, { static: false }) dropArea: DropAreaComponent;\n @Output() canceled = new EventEmitter<OpcuaServer>();\n @Output() removed = new EventEmitter<OpcuaServer>();\n @Output() saved = new EventEmitter<OpcuaServer>();\n @Output() updated = new EventEmitter<OpcuaServer>();\n @Input() set server(server: OpcuaServer) {\n this._server = cloneDeep(server);\n if (server) {\n this.isNew.set(server.id === NEW_SERVER_ID);\n this.model = cloneDeep(server);\n this.fileName = this.model.config.keystoreFilename;\n\n if (this.isNew()) {\n // enabled connection state\n this.targetConnectionState = this.targetConnectionState ?? '1';\n this.model.config.targetConnectionState =\n this.model.config.targetConnectionState ?? 'enabled';\n this.model.config.statusCheckInterval = this.model.config.statusCheckInterval ?? 40;\n this.model.config.timeout = this.model.config.timeout ?? 30;\n this.model.config.autoScanAddressSpace = this.model.config.autoScanAddressSpace ?? true;\n this.model.config.partialAddressScan = this.model.config.partialAddressScan ?? false;\n } else {\n this.targetConnectionState =\n this.model.config.targetConnectionState === 'enabled' ? '1' : '0';\n }\n this.updateConnectionStatusLabel(this._server);\n this.setNewPassword();\n }\n }\n\n get server(): OpcuaServer {\n return this._server;\n }\n model: OpcuaServer;\n changePassword = false;\n initialPasswordRequired = true;\n securityModes: string[];\n authenticationMode: any;\n authenticationModes: any[];\n NONE = 'NONE';\n SIGN = 'SIGN';\n SIGN_ENC = 'SIGN_ENCRYPT';\n securityPolicies: any = {\n sign: [`BASIC256_${this.SIGN}`, `BASIC128RSA15_${this.SIGN}`, `BASIC256SHA256_${this.SIGN}`],\n sign_enc: [\n `BASIC256_${this.SIGN_ENC}`,\n `BASIC128RSA15_${this.SIGN_ENC}`,\n `BASIC256SHA256_${this.SIGN_ENC}`\n ]\n };\n private ANONYM = {\n id: 1,\n value: gettext('Anonymous')\n };\n private USER_PASSWORD = {\n id: 2,\n value: gettext('Username/Password')\n };\n private KEY_BASED = {\n id: 3,\n value: gettext('Key-based Authentication')\n };\n private _server: OpcuaServer;\n private initialKeystore = {\n lastModified: 0,\n name: '',\n type: '',\n slice: null,\n size: 0\n } as File;\n private keystore: File = this.initialKeystore;\n private authSwitch = false;\n private opcuaConfigFormValueChange$ = new Subject();\n private opcuaConfigFormChangesSubscribed = false;\n private destroyRef = inject(DestroyRef);\n\n constructor(\n private opcuaService: OpcuaService,\n private modalService: ModalService,\n private alertService: AlertService,\n private readonly changeDetectorRef: ChangeDetectorRef\n ) {\n this.advancedSettingsFields = this.getAdvancedSettingsFields();\n }\n\n async ngOnInit() {\n this.authSwitch = false;\n\n this.securityModes = [this.NONE, this.SIGN, this.SIGN_ENC];\n\n this.authenticationModes = [this.ANONYM, this.USER_PASSWORD, this.KEY_BASED];\n\n this.setCurrentAuthenticationMode();\n this.setCurrentSecurityMode();\n }\n\n ngOnChanges() {\n this.setCurrentSecurityMode();\n this.setCurrentAuthenticationMode();\n }\n\n ngAfterViewChecked(): void {\n this.changeDetectorRef.detectChanges();\n\n if (!this.opcuaConfigFormChangesSubscribed) {\n merge(this.opcuaConfigFormValueChange$, this.advancedSettingsForm.valueChanges)\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.updated.emit(this.model));\n this.opcuaConfigFormChangesSubscribed = true;\n }\n }\n\n cancel(): void {\n this.advancedSettingsForm.reset();\n this.canceled.emit(this.model);\n this._server = null;\n }\n\n async remove() {\n try {\n await this.modalService.confirm(\n gettext('Delete server'),\n gettext(\"You're about to delete server. Do you want to proceed?\"),\n Status.DANGER,\n {\n ok: gettext('Delete'),\n cancel: gettext('Cancel')\n }\n );\n await this.removeKeystore(this.model);\n this.removed.emit(this.model);\n this._server = null;\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async save() {\n if (\n this.keystore &&\n this.keystore.size > 0 &&\n this.keystore.name &&\n this.keystore.name.length > 0\n ) {\n const response = await this.uploadKeystore(this.model.config.keystoreBinaryId);\n\n if (response && response.data && response.data.id) {\n this.model.config.keystoreBinaryId = response.data.id;\n }\n\n // if the keystore was uploaded successful we can remove\n // the local keystore. This will prevent another request to binary api\n // when the user will edit other inputs in the form and hit save again.\n this.keystore = this.initialKeystore;\n }\n\n // will remove any empty or undefined strings from the UI before saving it to the config\n function notEmpty<TValue>(value: TValue | null | undefined | string): value is TValue {\n return value !== null && value !== undefined && value != '';\n }\n\n // clean up array of empty strings\n this.model.config.partialAddressScanNodeIds = (\n this.model.config.partialAddressScanNodeIds || []\n ).filter(notEmpty);\n\n // will remove keystore (binary) when the user switched\n // authentication settings from key-based to anonymous or username/password\n if (this.authSwitch) {\n this.removeKeystore(this.server);\n }\n\n // when the user sets a new password, make sure to mark it as\n // \"not encrypted\" by setting passwordEncrypted to false\n const userPassword: string = this.getModelConfig('userPassword');\n if (userPassword && userPassword.length > 0) {\n this.model.config.passwordEncrypted = false;\n }\n\n this.saved.emit(this.model);\n }\n\n uploadFile(droppedFiles: DroppedFile[]) {\n if (droppedFiles.length === 1) {\n this.keystore = droppedFiles[0].file;\n this.fileName = this.keystore.name;\n } else {\n }\n }\n\n setPolicy(data: any) {\n if (data === this.NONE) {\n this.model.config.securityMode = this.NONE;\n } else if (data === this.SIGN) {\n this.model.config.securityMode = this.securityPolicies.sign[0];\n } else if (data === this.SIGN_ENC) {\n this.model.config.securityMode = this.securityPolicies.sign_enc[0];\n }\n }\n\n setServerConnection(data: string) {\n this.model.config.targetConnectionState = data !== '0' ? 'enabled' : 'disabled';\n }\n\n updateAuthentication(data: any) {\n if (data && data.id) {\n switch (data.id) {\n // Anonymous\n case 1:\n this.resetUserAuthentication();\n this.resetKeyBasedAuthentication();\n break;\n\n // User/Password\n case 2:\n this.resetKeyBasedAuthentication();\n this.restoreUserData();\n this.setNewPassword();\n break;\n\n // Key-based\n case 3:\n this.resetUserAuthentication();\n this.restoreKeyBasedData();\n break;\n\n default:\n break;\n }\n }\n }\n\n updateConnectionStatusLabel(server) {\n const connected = server.c8y_Connection && server.c8y_Connection.status === 'CONNECTED';\n const label = connected ? gettext('Connected') : gettext('Disconnected');\n this.connectionStatusLabel = label;\n }\n\n setNewPassword() {\n const username: string = this.getModelConfig('userName');\n if (username && username.length > 0) {\n // userName is given, NO need to change the password because it is already set\n this.changePassword = false;\n this.initialPasswordRequired = false;\n } else {\n // no userName in response, so require the user to set the initial pw\n this.changePassword = true;\n this.initialPasswordRequired = true;\n }\n }\n\n toggleChangePassword() {\n this.changePassword = !this.changePassword;\n // When the user hides the pw-input field but has entered a\n // string to it before, we need to discard the changes reflected in the model\n // otherwise we PUT it with the model when user hits the save button\n if (!this.changePassword) {\n if (this.getModelConfig('userPassword')) {\n delete this.model.config.userPassword;\n }\n }\n }\n\n private uploadKeystore(binaryId?: string) {\n if (!binaryId) {\n return this.opcuaService.uploadKeystore(this.keystore);\n } else if (binaryId && binaryId.length > 0) {\n // update existing binary\n return this.opcuaService.updateKeystore(binaryId, this.keystore);\n }\n }\n\n private removeKeystore(server: OpcuaServer) {\n if (\n server &&\n server.config &&\n server.config.keystoreBinaryId &&\n server.config.keystoreBinaryId.length > 0\n ) {\n this.authSwitch = false;\n return this.opcuaService.removeKeystore(this.server.config.keystoreBinaryId);\n }\n }\n\n private resetUserAuthentication() {\n this.model.config.userName = null;\n this.model.config.userPassword = null;\n this.model.config.userIdentityMode = 'none';\n }\n\n private resetKeyBasedAuthentication() {\n this.authSwitch = true;\n\n this.model.config.keystorePass = null;\n this.model.config.certificatePass = null;\n this.model.config.keystoreBinaryId = '';\n this.model.config.keystoreFilename = '';\n this.model.config.userIdentityMode = 'none';\n }\n\n private restoreUserData() {\n this.model.config.userName = this._server.config.userName;\n this.model.config.userIdentityMode = 'userAndPassword';\n }\n\n private restoreKeyBasedData() {\n this.authSwitch = false;\n this.model.config.keystorePass = this._server.config.keystorePass;\n this.model.config.certificatePass = this._server.config.certificatePass;\n this.model.config.keystoreBinaryId = this._server.config.keystoreBinaryId;\n this.model.config.keystoreFilename = this._server.config.keystoreFilename;\n this.model.config.userIdentityMode = 'certificate';\n }\n\n private getServerConfig(): OpcuaServerConfig {\n let cfg: OpcuaServerConfig = {\n securityMode: this.NONE,\n userIdentityMode: 'none'\n };\n if (this.server && this.server.config) {\n cfg = this.server.config;\n }\n return cfg;\n }\n\n private setCurrentSecurityMode() {\n const { securityMode } = this.getServerConfig();\n if (securityMode) {\n const foundInSign = this.securityPolicies.sign.find(el => el === securityMode);\n if (foundInSign) {\n this.currentSecMode = this.SIGN;\n } else {\n const foundInSignEncrypt = this.securityPolicies.sign_enc.find(el => el === securityMode);\n foundInSignEncrypt\n ? (this.currentSecMode = this.SIGN_ENC)\n : (this.currentSecMode = this.NONE);\n }\n }\n }\n\n private setCurrentAuthenticationMode() {\n const { userIdentityMode } = this.getServerConfig();\n\n switch (userIdentityMode) {\n case 'certificate':\n this.authenticationMode = this.KEY_BASED;\n break;\n\n case 'userAndPassword':\n this.authenticationMode = this.USER_PASSWORD;\n break;\n\n case 'Anonymous':\n this.authenticationMode = this.ANONYM;\n break;\n\n case 'UserName':\n this.authenticationMode = this.USER_PASSWORD;\n break;\n\n case 'Certificate':\n this.authenticationMode = this.KEY_BASED;\n break;\n\n default:\n this.authenticationMode = this.ANONYM;\n break;\n }\n }\n\n private getModelConfig(fragment: string) {\n if (this.model && this.model.config) {\n if (fragment && fragment.length > 0) {\n return has(this.model.config, fragment) ? this.model.config[`${fragment}`] : undefined;\n }\n }\n return undefined;\n }\n\n private getAdvancedSettingsFields(): FormlyFieldConfig[] {\n return [\n {\n fieldGroupClassName: 'tight-grid',\n fieldGroup: [\n {\n key: 'timeout',\n type: 'number',\n className: 'col-xs-6',\n props: {\n label: gettext('Timeout'),\n placeholder: '30',\n required: true,\n min: this.minIntervalNumber,\n addonRight: {\n text: gettext('seconds')\n }\n }\n },\n {\n key: 'statusCheckInterval',\n type: 'number',\n className: 'col-xs-6',\n props: {\n label: gettext('Status check interval'),\n placeholder: '40',\n required: true,\n min: this.minIntervalNumber,\n addonRight: {\n text: gettext('seconds')\n }\n }\n }\n ]\n },\n {\n fieldGroupClassName: 'row',\n fieldGroup: [\n {\n key: 'autoScanAddressSpace',\n type: 'checkbox',\n className: 'col-sm-6',\n props: {\n label: gettext('Auto scan address space'),\n indeterminate: false\n }\n },\n {\n key: 'partialAddressScan',\n type: 'radio',\n className: 'col-sm-6',\n props: {\n label: gettext('Address scan type'),\n options: [\n { label: gettext('Partial'), value: true },\n { label: gettext('Full'), value: false }\n ]\n }\n }\n ]\n },\n {\n key: 'partialAddressScanNodeIds',\n type: 'array',\n props: {\n label: gettext('Partial address scan nodes'),\n description: gettext(\n 'Add node IDs to be scanned in the address space of the OPC UA server'\n ),\n required: true\n },\n fieldArray: {\n type: 'string',\n props: {\n label: gettext('Node ID'),\n placeholder: 'ns=2;s=Node1',\n required: true\n }\n },\n expressions: {\n hide: ({ parent }) => !parent?.model?.partialAddressScan\n }\n }\n ];\n }\n}\n","<c8y-ui-empty-state\n [icon]=\"'server'\"\n [title]=\"'No server to display.' | translate\"\n [subtitle]=\"'Add or select a server.' | translate\"\n *ngIf=\"!server\"\n></c8y-ui-empty-state>\n\n<form\n class=\"d-contents\"\n #opcuaConfigForm=\"ngForm\"\n *ngIf=\"server\"\n>\n <div class=\"card-header large-padding separator sticky-top visible-sm visible-xs\">\n <button\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n {{ 'Back' | translate }}\n </button>\n </div>\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\">\n <!-- SERVER NAME -->\n <c8y-form-group class=\"m-b-8\">\n <label>{{ 'Server name' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"name\"\n placeholder=\"{{ 'e.g. My server' | translate }}\"\n name=\"name\"\n type=\"text\"\n required\n [(ngModel)]=\"model.name\"\n />\n <c8y-messages>\n <c8y-message\n name=\"required\"\n text=\"{{ 'Server name is required' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"card-block large-padding bg-level-2\">\n <div class=\"tight-grid\">\n <div class=\"col-sm-6\">\n <label\n class=\"fit-w\"\n translate\n >\n Server connection\n </label>\n <button\n class=\"btn m-t-4\"\n name=\"serverConnection\"\n type=\"button\"\n [(ngModel)]=\"targetConnectionState\"\n (ngModelChange)=\"setServerConnection($event)\"\n btnCheckbox\n btnCheckboxTrue=\"1\"\n btnCheckboxFalse=\"0\"\n >\n <span\n title=\"{{ 'Enabled' | translate }}\"\n [hidden]=\"targetConnectionState !== '1'\"\n >\n {{ 'Enabled' | translate }}\n </span>\n <span\n title=\"{{ 'Disabled' | translate }}\"\n [hidden]=\"targetConnectionState !== '0'\"\n >\n {{ 'Disabled' | translate }}\n </span>\n </button>\n </div>\n <div class=\"col-sm-6\">\n <label translate>Connection status</label>\n <div class=\"form-control-static\">\n <device-status\n class=\"p-r-8\"\n [mo]=\"server\"\n ></device-status>\n <span>{{ connectionStatusLabel | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <!-- SERVER URL-->\n <c8y-form-group>\n <label\n for=\"configServerUrl\"\n translate\n >\n Server URL\n </label>\n <input\n class=\"form-control\"\n id=\"configServerUrl\"\n name=\"serverUrl\"\n type=\"text\"\n required\n [(ngModel)]=\"model.config.serverUrl\"\n c8yDefaultValidation=\"opcuaBrowsePath\"\n />\n </c8y-form-group>\n\n <!-- SECURITY MODE -->\n <div class=\"tight-grid\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <!-- NONE, SIGN, SIGN & ENCRYPT-->\n <label\n for=\"config.securityMode\"\n translate\n >\n Security mode\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.securityMode\"\n name=\"securityMode\"\n required\n [(ngModel)]=\"currentSecMode\"\n (ngModelChange)=\"setPolicy($event)\"\n >\n <option\n *ngFor=\"let mode of securityModes\"\n [ngValue]=\"mode\"\n >\n {{ mode }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"currentSecMode === NONE\"\n >\n <div class=\"form-group\">\n <label\n for=\"config.securityPolicy\"\n translate\n >\n Security policy\n </label>\n <input\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n type=\"text\"\n required\n [readonly]=\"true\"\n [(ngModel)]=\"model.config.securityMode\"\n />\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"currentSecMode !== NONE\"\n >\n <div class=\"form-group\">\n <label\n for=\"config.securityPolicy\"\n translate\n >\n Security policy\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n required\n *ngIf=\"currentSecMode === SIGN\"\n [(ngModel)]=\"model.config.securityMode\"\n >\n <option\n *ngFor=\"let policy of securityPolicies.sign\"\n [ngValue]=\"policy\"\n >\n {{ policy }}\n </option>\n </select>\n <select\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n required\n *ngIf=\"currentSecMode === SIGN_ENC\"\n [(ngModel)]=\"model.config.securityMode\"\n >\n <option\n *ngFor=\"let policy of securityPolicies.sign_enc\"\n [ngValue]=\"policy\"\n >\n {{ policy }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- AUTHENTICATION -->\n <div class=\"row tight-grid\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.authenticationMode\"\n translate\n >\n Authentication\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.authenticationMode\"\n name=\"authenticationMode\"\n required\n [(ngModel)]=\"authenticationMode\"\n (ngModelChange)=\"updateAuthentication($event)\"\n >\n <option\n *ngFor=\"let auth of authenticationModes\"\n [ngValue]=\"auth\"\n >\n {{ auth.value | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n <!-- User/Pw-->\n <div\n class=\"tight-grid\"\n *ngIf=\"authenticationMode.id === 2\"\n >\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.userName\"\n translate\n >\n Username\n </label>\n <input\n class=\"form-control\"\n id=\"config.userName\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n name=\"userName\"\n type=\"text\"\n autocomplete=\"new-password\"\n required\n [(ngModel)]=\"model.config.userName\"\n />\n </div>\n </div>\n\n <!-- change password section BEGINS-->\n <div class=\"col-md-6\">\n <div\n class=\"form-group\"\n *ngIf=\"!initialPasswordRequired\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n </div>\n\n <div class=\"form-group\">\n <div *ngIf=\"changePassword\">\n <label\n for=\"config.password\"\n translate\n >\n Password\n </label>\n <input\n class=\"form-control\"\n id=\"config.userPassword\"\n name=\"password\"\n type=\"password\"\n autocomplete=\"new-password\"\n required\n [(ngModel)]=\"model.config.userPassword\"\n />\n </div>\n </div>\n </div>\n <!-- change password section ENDS-->\n </div>\n\n <!-- Key-based -->\n <div\n class=\"tight-grid\"\n *ngIf=\"authenticationMode.id === 3\"\n >\n <!-- KEYSTORE PASSWORD -->\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.keystorePass\"\n translate\n >\n Keystore password\n </label>\n <input\n class=\"form-control\"\n id=\"config.keystorePass\"\n name=\"keystorePass\"\n type=\"password\"\n required\n [(ngModel)]=\"model.config.keystorePass\"\n />\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.certificatePass\"\n translate\n >\n Certificate password\n </label>\n <input\n class=\"form-control\"\n id=\"config.certificatePass\"\n name=\"keystorePass\"\n type=\"password\"\n required\n [(ngModel)]=\"model.config.certificatePass\"\n />\n </div>\n </div>\n <!-- UPLOAD KEYSTORE -->\n <div class=\"col-md-12\">\n <div class=\"form-group\">\n <label\n for=\"certificateUpload\"\n translate\n >\n Upload keystore\n </label>\n <input\n class=\"form-control m-b-8\"\n placeholder=\"{{ 'e.g.' | translate }} yourKeystore.jks\"\n name=\"certificateUpload\"\n type=\"text\"\n required\n [readonly]=\"true\"\n [ngModel]=\"fileName\"\n />\n <c8y-drop-area\n [title]=\"'Import keystore with jks file extension' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n ></c8y-drop-area>\n </div>\n </div>\n </div>\n\n <div class=\"form-group m-b-0 d-flex a-i-center\">\n <button\n class=\"btn btn-dot collapse-btn\"\n title=\"{{ (advancedSettings ? collapse : expand) | translate }}\"\n [attr.aria-label]=\"(advancedSettings ? collapse : expand) | translate\"\n [attr.aria-expanded]=\"advancedSettings\"\n [ngClass]=\"{ active: advancedSettings }\"\n (click)=\"advancedSettings = !advancedSettings\"\n data-cy=\"opcua-server-config--advanced-settings-toggle\"\n >\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n <label class=\"m-0\">\n <span>{{ 'Advanced settings' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div\n class=\"card-block collapse\"\n [collapse]=\"!advancedSettings\"\n [isAnimated]=\"true\"\n [ngClass]=\"{ 'bg-level-1': advancedSettings }\"\n >\n <formly-form\n [form]=\"advancedSettingsForm\"\n [fields]=\"advancedSettingsFields\"\n [model]=\"model.config\"\n ></formly-form>\n </div>\n </div>\n <div class=\"card-footer large-padding separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"remove()\"\n [disabled]=\"isNew()\"\n >\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"!opcuaConfigForm.valid || !advancedSettingsForm.valid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { OpcuaServer } from './opcua-server.interface';\nimport { NgIf, NgFor } from '@angular/common';\nimport {\n EmptyStateComponent,\n IconDirective,\n DeviceStatusComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'opcua-server-list',\n templateUrl: './opcua-server-list.component.html',\n imports: [\n NgIf,\n EmptyStateComponent,\n NgFor,\n IconDirective,\n DeviceStatusComponent,\n TooltipDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServerListComponent {\n @Input() serverList: OpcuaServer[] = [];\n @Output() present = new EventEmitter<OpcuaServer>();\n\n presentConfig(server: OpcuaServer) {\n server.active = true;\n this.present.emit(server);\n }\n}\n","<!-- add active class to c8y-stacked-item when clicked -->\n<div class=\"card-block\" *ngIf=\"serverList.length === 0\">\n <c8y-ui-empty-state\n class=\"m-l-auto p-l-8 d-flex p-r-16\"\n [icon]=\"'server'\"\n [title]=\"'No servers found.' | translate\"\n [subtitle]=\"'Click below to add a new server.' | translate\"\n ></c8y-ui-empty-state>\n</div>\n<div\n class=\"c8y-stacked-item\"\n [class.active]=\"server.active\"\n *ngFor=\"let server of serverList\"\n (click)=\"presentConfig(server)\"\n>\n <i [c8yIcon]=\"'server'\" class=\"icon-20\"></i>\n <div class=\"p-l-16 text-truncate\">\n <p id=\"serverName\" class=\"text-truncate\">{{ server.name }}</p>\n <small id=\"serverUrl\" class=\"text-truncate text-muted\">{{ server.config.serverUrl }}</small>\n </div>\n <div class=\"m-l-auto p-l-8 d-flex p-r-16 a-i-center\">\n <device-status class=\"p-r-8\" [mo]=\"server\"></device-status>\n <button\n class=\"btn btn-dot text-gray-darker\"\n type=\"button\"\n [attr.aria-label]=\"server.quickInfo.padlockMsg | translate\"\n tooltip=\"{{ server.quickInfo.padlockMsg | translate }}\"\n placement=\"left\"\n container=\"body\"\n >\n <i [c8yIcon]=\"server.quickInfo.padlock\"></i>\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class OpcuaServerGuard {\n type = 'c8y_OpcuaServer';\n canActivate({ data }) {\n const { contextData } = data;\n return contextData && contextData.type === this.type;\n }\n}\n","import { Component, OnInit, Optional } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ContextRouteComponent,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep } from 'lodash';\nimport { NEW_SERVER_ID, OpcuaServer } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { OpcuaServerListComponent } from './opcua-server-list.component';\nimport { OpcuaServerConfigComponent } from './opcua-server-config.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'opcua-servers',\n templateUrl: './opcua-servers.component.html',\n imports: [\n PopoverDirective,\n OpcuaServerListComponent,\n IconDirective,\n OpcuaServerConfigComponent,\n NgClass,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServersComponent implements OnInit {\n serverObjectList: OpcuaServer[] = [];\n initialServerObject: OpcuaServer = {\n id: NEW_SERVER_ID,\n name: gettext('New Server'),\n config: {\n securityMode: 'NONE',\n keystorePass: null,\n keystoreBinaryId: null,\n keystoreFilename: '',\n certificatePass: null,\n serverUrl: '',\n userName: '',\n userPassword: '',\n rescanCron: null,\n timeout: 30,\n statusCheckInterval: 40,\n autoReconnect: true,\n autoScanAddressSpace: true,\n partialAddressScan: false,\n valid: true\n },\n quickInfo: {\n padlock: 'unlock',\n padlockMsg: ''\n },\n active: true\n };\n server: OpcuaServer;\n active = false;\n private moId = '';\n\n constructor(\n private opcuaService: OpcuaService,\n private alertService: AlertService,\n private translateService: TranslateService,\n @Optional() private context: ContextRouteComponent\n ) {}\n\n async ngOnInit() {\n this.moId = this.opcuaService.getMoId();\n if (this.moId && this.moId.length > 0) {\n const res = await this.opcuaService.getServers(this.moId);\n if (res && res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n } else {\n this.serverObjectList = (await res.json()) as OpcuaServer[];\n this.serverObjectList.map(server => this.setQuickInfo(server));\n this.onPresent(this.serverObjectList[0], false);\n }\n }\n }\n\n localServerObjectExist() {\n return !!this.serverObjectList.find(server => server.id === NEW_SERVER_ID);\n }\n\n addServer() {\n const server: OpcuaServer = cloneDeep(this.initialServerObject);\n this.serverObjectList.push(server);\n this.onPresent(server);\n }\n\n onSaved(server: OpcuaServer) {\n if (server && server.id) {\n server.gatewayId = this.moId;\n if (server.id === NEW_SERVER_ID) {\n this.createServer(server);\n } else {\n this.updateServer(server);\n }\n }\n }\n\n onUpdated(server: OpcuaServer) {\n if (server.id === NEW_SERVER_ID) {\n this.serverObjectList.forEach(item => {\n if (item.id === server.id) {\n item.name = server.name;\n item.config = server.config;\n this.setQuickInfo(item);\n }\n });\n }\n }\n\n reloadTabs() {\n if (this.context) {\n this.context.refreshTabs();\n }\n }\n\n onCanceled(server: OpcuaServer) {\n if (server?.id === NEW_SERVER_ID) {\n this.removeServerObjectListById(server.id);\n } else {\n // update activity status for UI\n this.serverObjectList.forEach(item => {\n if (item.id === server.id) {\n item.active = false;\n }\n });\n // When server id is not 'new' we just close the details\n delete this.server;\n }\n }\n\n onRemoved(server: OpcuaServer) {\n if (server.id === NEW_SERVER_ID) {\n this.onCanceled(server);\n } else {\n this.removeServer(server);\n }\n }\n\n async getKeystore(binaryId: string) {\n const { data } = await this.opcuaService.getKeystore(binaryId);\n return data;\n }\n\n async onPresent(server: OpcuaServer, overridePresent = true) {\n if (server && server.id !== NEW_SERVER_ID && server.config && server.config.keystoreBinaryId) {\n try {\n const mo = await this.getKeystore(server.config.keystoreBinaryId);\n server.config.keystoreFilename = mo.name;\n } catch (ex) {\n this.server = Object.assign({}, server);\n }\n }\n if (this.serverObjectList.length > 0) {\n this.serverObjectList.forEach(item => {\n item.active = false;\n\n if (item.id === server.id) {\n item.active = true;\n server.active = item.active;\n }\n });\n this.setQuickInfo(server);\n if (overridePresent || !this.server) {\n this.server = Object.assign({}, server);\n }\n }\n }\n\n private async createServer(server: OpcuaServer) {\n const response = await this.opcuaService.createServer(server);\n const svr = (await response.json()) as OpcuaServer;\n this.updateServerObjectListById(NEW_SERVER_ID, svr);\n this.onPresent(svr);\n this.reloadTabs();\n }\n\n private async updateServer(server: OpcuaServer) {\n const updatedServer = (await this.opcuaService.updateServer(server)) as OpcuaServer;\n if (updatedServer) {\n this.updateServerObjectListById(updatedServer.id, updatedServer);\n }\n }\n\n private async removeServer(server: OpcuaServer) {\n try {\n await this.opcuaService.removeServer(server);\n this.removeServerObjectListById(server.id);\n this.reloadTabs();\n } catch (ex) {}\n }\n\n private removeServerObjectListById(id: string) {\n this.serverObjectList.forEach((item, index) => {\n if (item.id === id) {\n this.serverObjectList.splice(index, 1);\n delete this.server;\n }\n });\n }\n\n private updateServerObjectListById(id: string, server: OpcuaServer) {\n const idx = this.serverObjectList.findIndex(item => item.id === id);\n if (idx > -1) {\n this.setQuickInfo(server);\n this.serverObjectList[idx] = server;\n }\n delete this.server;\n }\n\n private setQuickInfo(server: OpcuaServer) {\n server.quickInfo = {\n padlock: 'unlock',\n padlockMsg: ''\n };\n\n if (server && server.config) {\n if (server.config.securityMode) {\n server.quickInfo.padlock = server.config.securityMode !== 'NONE' ? 'lock' : 'unlock';\n server.quickInfo.padlockMsg = this.translateService.instant(\n gettext('The security policy is set to {{param}}.'),\n { param: server.config.securityMode }\n );\n }\n }\n }\n}\n","<div class=\"card content-fullpage split-view--5-7\">\n <div class=\"card-header grid__col--fullspan separator\">\n <div class=\"h4 card-title\">OPC UA servers</div>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Below you can configure one or more OPC UA servers. The OPC UA agent will connect to these servers if they are enabled and the connection state is set to connected.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <div class=\"bg-level-1 flex-grow\">\n <div class=\"c8y-nav-stacked\">\n <opcua-server-list\n [serverList]=\"serverObjectList\"\n (present)=\"onPresent($event)\"\n ></opcua-server-list>\n </div>\n </div>\n <div class=\"card-footer separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Add server' | translate }}\"\n type=\"button\"\n [disabled]=\"localServerObjectExist()\"\n (click)=\"addServer()\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add server' | translate }}\n </button>\n </div>\n </div>\n\n <opcua-server-config\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': server }\"\n (canceled)=\"onCanceled($event)\"\n (removed)=\"onRemoved($event)\"\n (saved)=\"onSaved($event)\"\n (updated)=\"onUpdated($event)\"\n [server]=\"server\"\n ></opcua-server-config>\n</div>\n","import { CdkTreeModule } from '@angular/cdk/tree';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CoreModule,\n DeviceStatusModule,\n DropAreaModule,\n DynamicFormsModule,\n FormsModule,\n hookRoute,\n Route,\n ViewContext\n} from '@c8y/ngx-components';\nimport { ObjectMappingComponent } from '@c8y/ngx-components/device-protocol-object-mappings';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddressSpaceService } from './address-space.service';\nimport { OpcuaAddressSpaceDetailComponent } from './opcua-address-space-detail.component';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaAddressSpaceComponent } from './opcua-address-space.component';\nimport { OpcuaAgentGuard } from './opcua-agent.guard';\nimport { OpcuaAutoApplySettingsComponent } from './opcua-auto-apply-settings.component';\nimport { OpcuaDeviceProtocolBrowsePathValidation } from './opcua-device-protocol-browse-path-validation.directive';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { OpcuaDeviceProtocolDescription } from './opcua-device-protocol-description.component';\nimport { OpcuaDeviceProtocolDetailComponent } from './opcua-device-protocol-detail.component';\nimport { OpcuaDeviceProtocolMapping } from './opcua-device-protocol-mapping.component';\nimport { OpcuaDeviceProtocolObjectMappingStatus } from './opcua-device-protocol-object-mapping-status-icon.component';\nimport { OpcuaMicroserviceGuard } from './opcua-microservice.guard';\nimport { OpcuaServerConfigComponent } from './opcua-server-config.component';\nimport { OpcuaServerListComponent } from './opcua-server-list.component';\nimport { OpcuaServerGuard } from './opcua-server.guard';\nimport { OpcuaServersComponent } from './opcua-servers.component';\nimport { OpcuaService } from './opcuaService';\n\nconst opcuaRoutes: Route[] = [\n {\n context: ViewContext.Device,\n path: 'opcua-servers',\n component: OpcuaServersComponent,\n label: gettext('OPC UA server'),\n icon: 'server',\n canActivate: [OpcuaAgentGuard, OpcuaMicroserviceGuard]\n },\n {\n context: ViewContext.Device,\n path: 'address-space',\n component: OpcuaAddressSpaceComponent,\n label: gettext('Address space'),\n icon: 'cloud-network',\n canActivate: [OpcuaServerGuard, OpcuaMicroserviceGuard]\n }\n];\n\nconst deviceProtocolRoutes: Route[] = [\n {\n path: 'deviceprotocols/opcuaV2/:id',\n component: OpcuaDeviceProtocolDetailComponent\n }\n];\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n ReactiveFormsModule,\n DropAreaModule,\n ButtonsModule,\n CdkTreeModule,\n RouterModule.forChild(deviceProtocolRoutes),\n TooltipModule.forRoot(),\n PopoverModule.forRoot(),\n DeviceStatusModule,\n OperationDetailsModule,\n BrowserAnimationsModule,\n CollapseModule.forRoot(),\n BsDropdownModule.forRoot(),\n ObjectMappingComponent,\n DynamicFormsModule,\n OpcuaServersComponent,\n OpcuaServerListComponent,\n OpcuaServerConfigComponent,\n OpcuaAddressSpaceComponent,\n OpcuaAddressSpaceTreeComponent,\n OpcuaAddressSpaceDetailComponent,\n OpcuaDeviceProtocolDescription,\n OpcuaDeviceProtocolDetailComponent,\n OpcuaDeviceProtocolDataReportingComponent,\n OpcuaDeviceProtocolMapping,\n OpcuaDeviceProtocolObjectMappingStatus,\n OpcuaAutoApplySettingsComponent,\n OpcuaDeviceProtocolBrowsePathValidation\n ],\n providers: [\n OpcuaAgentGuard,\n OpcuaServerGuard,\n OpcuaMicroserviceGuard,\n OpcuaService,\n AddressSpaceService,\n hookRoute(opcuaRoutes)\n ]\n})\nexport class OpcuaProtocolModule {}\n","import { downgradeComponent } from '@angular/upgrade/static';\nimport { OpcuaAddressSpaceTreeComponent } from '../opcua-address-space-tree.component';\nexport const opcuaAddressSpaceTreeComponentDowngradedComponent = downgradeComponent({\n component: OpcuaAddressSpaceTreeComponent,\n inputs: ['moId'],\n outputs: ['selectedNode']\n});\n","import * as angular from 'angular';\nimport { registerNgModule } from '@c8y/ng1-modules';\nimport { opcuaAddressSpaceTreeComponentDowngradedComponent } from './downgraded.components';\n\nconst NAME_OPCUA = 'c8y.upgrade.opcua';\n\nangular\n .module(NAME_OPCUA, [])\n .directive('c8yOpcuaAddressSpaceTree', opcuaAddressSpaceTreeComponentDowngradedComponent);\n\nexport const ng1ModulesOPCUA = [NAME_OPCUA];\n\nregisterNgModule(ng1ModulesOPCUA);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AddressSpaceService","i3","i2.OpcuaService","i4","i5","i2","i1","unset","set","i1.OpcuaService","cloneDeep","FormsModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKa,mBAAmB,CAAA;AAM9B,IAAA,WAAA,CAAY,WAAwB,EAAA;AAClC,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,2CAA2C;QAClE,IAAI,CAAC,MAAM,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE;AACpD,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,eAAe,CAAqB;AACjE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,mBAAmB,EAAE;AACtB,SAAA,CAAC;IACJ;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IACtE;AAEA,IAAA,iBAAiB,CAAC,kBAAsC,EAAA;AACtD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC;IACnD;IAEA,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;IAChD;IAEA,OAAO,CAAC,QAAgB,EAAE,MAAe,EAAA;QACvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC3C;AACA,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QACnC;IACF;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAA;QAC1B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;AACD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAA,CAAE,EAAE,OAAO,CAAC;QAC1E;IACF;IAEA,WAAW,CAAC,QAAgB,EAAE,MAAc,EAAA;AAC1C,QAAA,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAClE,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;AACD,YAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;AACxC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,QAAA,EAAW,KAAK,EAAE,EAAE,OAAO,CAAC;QAC1F;IACF;IAEA,aAAa,CAAC,IAAsB,EAAE,QAAgB,EAAA;QACpD,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5E,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;YACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7C,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CACtB,GAAG,IAAI,CAAC,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,iBAAA,EAAoB,KAAK,EAAE,EAC9D,OAAO,CACR;QACH;IACF;AAEA,IAAA,iBAAiB,CAAC,cAA0C,EAAA;QAC1D,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAClD,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC;IACrE;AAEA,IAAA,MAAM,gBAAgB,CAAC,SAAiB,EAAE,QAAgB,EAAA;AACxD,QAAA,MAAM,GAAG,GAAG,CAAA,kCAAA,EAAqC,QAAQ,GAAG;AAC5D,QAAA,MAAM,OAAO,GAAkB;YAC7B,OAAO,EAAE,IAAI,CAAC,MAAM;AACpB,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,GAAG,GAAG,SAAS,GAAG;AACjC;SACF;AACD,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;AACjD,QAAA,OAAO,GAAG,CAAC,IAAI,EAAE;IACnB;AAEA,IAAA,OAAO,CAAC,aAAqB,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,UAAU,EAAE,WAAW;AACvB,YAAA,YAAY,EAAE,WAAW;AACzB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,QAAQ,EAAE;SACX;AACD,QAAA,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ;IAC5C;+GAvGW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAnB,mBAAmB,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;MCOY,gCAAgC,CAAA;IAC3C,IAAa,IAAI,CAAC,CAAC,EAAA;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC;QACd,IAAI,CAAC,EAAE;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrB;aAAO;;AAEL,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QAC1B;IACF;AAUA,IAAA,WAAA,CAAoB,mBAAwC,EAAA;QAAxC,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QAPvC,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,WAAW,GAAG,KAAK;AAET,QAAA,IAAA,CAAA,gBAAgB,GAAmC,IAAI,YAAY,EAAoB;IAIlC;AAC/D,IAAA,WAAW,CAAC,QAAQ,EAAA;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,QAAQ;AAC3C,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;AAC7B,QAAA,MAAM,QAAQ,GAAG;YACf,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,0BAA0B;YAC1B,UAAU;YACV,YAAY;YACZ,cAAc;YACd;SACD;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7E;AAEA,IAAA,YAAY,CAAC,IAAI,EAAA;AACf,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;AAEA,IAAA,UAAU,CAAC,SAAmB,EAAA;AAC5B,QAAA,MAAM,WAAW,GAAuB;YACtC,IAAI,EAAE,IAAI,CAAC,KAAK;AAChB,YAAA,mBAAmB,EAAE;SACtB;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,WAAW,CAAC;IACzD;+GAlDW,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX7C,uuFAmGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1FY,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,QAAQ,wCAAE,YAAY,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE7D,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAL5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,OAAA,EAE7B,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,uuFAAA,EAAA;;sBAGxE;;sBAcA;;;MEbU,YAAY,CAAA;AAOvB,IAAA,WAAA,CACU,MAAmB,EACnB,gBAAkC,EAClC,MAAc,EACd,YAA0B,EAAA;QAH1B,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,YAAY,GAAZ,YAAY;AAEpB,QAAA,IAAI,CAAC,eAAe,GAAG,6BAA6B;AACpD,QAAA,IAAI,CAAC,mBAAmB,GAAG,oCAAoC;AAC/D,QAAA,IAAI,CAAC,qBAAqB,GAAG,yCAAyC;QACtE,IAAI,CAAC,MAAM,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE;AACpD,QAAA,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,MAAM;IAC9C;AACA,IAAA,YAAY,CAAC,IAAiB,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACzB,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,MAAM;AACpB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;aAC1B;AACD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,mBAAmB,CAAA,CAAE,EAAE,OAAO,CAAC;QAClE;IACF;IAEA,MAAM,YAAY,CAAC,MAAmB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AAC/D,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC3B,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,MAAM;AACpB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;aAC5B;AACD,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC;AAC3E,YAAA,IAAI,IAAI;AACR,YAAA,IAAI;AACF,gBAAA,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;YACzB;YAAE,OAAO,CAAC,EAAE;;YAEZ;AAEA,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACnD;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;IACF;AAEA,IAAA,YAAY,CAAC,IAAiB,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;AAC3D,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE;aACT;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,mBAAmB,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,CAAA,CAAE,EAAE,OAAO,CAAC;QAC/F;IACF;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAA;QAC1B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,cAAc,CAAC,IAAU,EAAA;QACvB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;YACzB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACxC;AACA,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;IACvC;AAEA,IAAA,MAAM,cAAc,CAAC,EAAU,EAAE,IAAU,EAAA;AACzC,QAAA,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;YAChD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AAC7B,gBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YAClC;QACF;AACA,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;IACvC;AAEA,IAAA,cAAc,CAAC,EAAU,EAAA;QACvB,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC;IACF;IAEA,OAAO,GAAA;QACL,MAAM,UAAU,GAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;AAC/D,QAAA,MAAM,QAAQ,GAAY,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACpE,IAAI,QAAQ,EAAE;YACZ,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC;AACA,QAAA,OAAO,EAAE;IACX;IAEA,KAAK,GAAA;QACH,MAAM,UAAU,GAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;AAC/D,QAAA,MAAM,gBAAgB,GAAY,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAChF,QAAA,IAAI,gBAAgB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvD,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC;IACF;IAEA,MAAM,iBAAiB,CAAC,EAAU,EAAA;AAChC,QAAA,MAAM,OAAO,GAAkB;AAC7B,YAAA,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC;SACf;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAA,CAAE,EAAE,OAAO,CAAC;IAC1E;IAEA,MAAM,oBAAoB,CAAC,IAAI,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAkB;AAC7B,YAAA,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,MAAM;AACpB,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;SAC1B;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC;IAC/E;IAEA,MAAM,oBAAoB,CAAC,IAAI,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAkB;AAC7B,YAAA,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,MAAM;AACpB,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;SAC1B;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,qBAAqB,CAAA,CAAE,EAAE,OAAO,CAAC;IACpE;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;AACD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAA,CAAE,EAAE,OAAO,CAAC;QACxE;IACF;AAEA,IAAA,SAAS,CAAC,EAAU,EAAA;QAClB,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;YACD,OAAO,IAAI,CAAC;iBACT,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,eAAe,YAAY,EAAE,CAAA,CAAE,EAAE,OAAO;AACtD,iBAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACtC;IACF;AAEA;;;;;;;;AAQG;IAEO,MAAM,sBAAsB,CAAC,QAAwB,EAAA;AAC7D,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE;YAC1B,IAAI,IAAI,GAAG,IAAI;AACf,YAAA,IAAI;AACF,gBAAA,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;YAC9B;YAAE,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;gBAC9B;gBAAE,OAAO,EAAE,EAAE;;gBAEb;YACF;AACA,YAAA,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC/B;AACA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,kBAAkB,CAAC,IAAiB,EAAA;AAC1C,QAAA,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;IAC5D;AAEQ,IAAA,WAAW,CAAC,IAAiB,EAAA;AACnC,QAAA,OAAO,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK;IACnE;AAEQ,IAAA,cAAc,CAAC,IAAiB,EAAA;QACtC,IAAI,IAAI,EAAE;YACR,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE;gBAChC,OAAO,IAAI,CAAC,EAAE;YAChB;AACA,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,OAAO,IAAI,CAAC,SAAS;YACvB;QACF;IACF;+GA3MW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAZ,YAAY,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCTY,eAAe,CAAA;AAD5B,IAAA,WAAA,GAAA;QAEE,IAAA,CAAA,IAAI,GAAG,wBAAwB;AAKhC,IAAA;IAJC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAA;AAClB,QAAA,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI;QAC5B,OAAO,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;IACtD;+GALW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAf,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCYY,uCAAuC,CAAA;AAIlD,IAAA,WAAA,CAAoB,EAAc,EAAA;QAAd,IAAA,CAAA,EAAE,GAAF,EAAE;IAAe;AAErC,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE;YAC5C;iBAAO;gBACL,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC1C,oBAAA,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE;gBACtC;YACF;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,WAAW,CAAC,KAAK,EAAA;AACf,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACpC,YAAA,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,OAAO,CAAC,GAAG,EAAA;AACT,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACxB;AAEA,IAAA,kBAAkB,CAAC,KAAK,EAAA;AACtB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAG;YAClC,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC9E,gBAAA,OAAO,IAAI;YACb;AACF,QAAA,CAAC,CAAC;QACF,OAAO,KAAK,GAAG,IAAI,GAAG,KAAK;IAC7B;+GAxCW,uCAAuC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uCAAuC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EARvC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,uCAAuC,CAAC;AACtE,gBAAA,KAAK,EAAE;AACR;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEU,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBAVnD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mCAAmC;AAC7C,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,6CAA6C,CAAC;AACtE,4BAAA,KAAK,EAAE;AACR;AACF;AACF,iBAAA;;sBAEE;;sBACA;;;MCVU,iBAAiB,CAAA;AAG5B,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK;IAC9B;IACA,IAAI,IAAI,CAAC,KAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,WAAA,CACS,WAAgD,EAC/C,mBAAwC,EACxC,QAAgB,EAAA;QAFjB,IAAA,CAAA,WAAW,GAAX,WAAW;QACV,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACnB,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAblB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,CAAqB,EAAE,CAAC;AAetD,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,IAAsB,KAAK,IAAI,CAAC,QAAQ;IACzE;AAEA,IAAA,OAAO,CAAC,gBAAkC,EAAA;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAC/C,CAAC,MAAyC,KAAI;YAC5C,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE;AAClC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAChC;AACF,QAAA,CAAC,CACF;QACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF;;AAGA,IAAA,iBAAiB,CAAC,MAAyC,EAAA;AACzD,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D;AACA,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,MAAM,CAAC;AACJ,iBAAA,KAAK;AACL,iBAAA,OAAO;AACP,iBAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,UAAU,CAAC,gBAAkC,EAAE,MAAe,EAAA;AAClE,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACxE,YAAA,gBAAgB,CAAC,wBAAwB,GAAG,IAAI;AAEhD,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC;YACzF,MAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB;AAEzD,YAAA,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE;AAC1C,YAAA,gBAAgB,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAsB,KAAI;AACnF,gBAAA,IAAI,CAAC,UAAU,GAAG,gBAAgB;AAClC,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;AACF,YAAA,gBAAgB,CAAC,wBAAwB,GAAG,KAAK;AAEjD,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC3C;AAEA,QAAA,gBAAgB,CAAC,QAAQ,GAAG,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC1E,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEjC,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC1C;IACA,KAAK,GAAA;;IAEL;AAEQ,IAAA,iBAAiB,CAAC,QAA4B,EAAA;;;AAGpD,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB;IAEQ,aAAa,GAAA;QACnB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI;gBACF,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3C;YAAE,OAAO,KAAK,EAAE;;YAEhB;QACF,CAAC,EAAE,GAAG,CAAC;IACT;AACD;;MC7CY,8BAA8B,CAAA;IACzC,IACI,IAAI,CAAC,EAAU,EAAA;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,SAAS;IAC9B;AAcA,IAAA,WAAA,CACU,mBAAwC,EACxC,YAA0B,EAC1B,YAA0B,EAAA;QAF1B,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACnB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;AAdb,QAAA,IAAA,CAAA,YAAY,GAAmC,IAAI,YAAY,EAAoB;AAClF,QAAA,IAAA,CAAA,YAAY,GAAmC,IAAI,YAAY,EAAoB;QAE7F,IAAA,CAAA,UAAU,GAAsB,IAAI;QAEpC,IAAA,CAAA,OAAO,GAAG,KAAK;AAIP,QAAA,IAAA,CAAA,QAAQ,GAAkB,IAAI,OAAO,EAAQ;QAQrD,IAAA,CAAA,WAAW,GAAG,CAAC,IAAsB,MAAM,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AAC9E,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,CAAS,EAAE,SAA2B,KAChD,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC;IAJ/D;IAMH,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IACE,OAAO,CAAC,IAAI;YACZ,OAAO,CAAC,IAAI,CAAC,aAAa;YAC1B,OAAO,CAAC,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,aAAa,EACxD;YACA,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACjC,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,aAAA,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,IAAG;AACxD,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI;AAC5D,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAExB,QAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE;QAE9C,IAAI,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE;AACxE,YAAA,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE;QAC5C;QAEA,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;AACxD,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;QACpC;IACF;IAEA,MAAM,QAAQ,CAAC,WAA+B,EAAA;AAC5C,QAAA,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,WAAW;AACjD,QAAA,IAAI,MAAM;;;;AAKV,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;AAClF,YAAA,MAAM,GAAG,IAAI,CAAC,MAAM;QACtB;;;;;;AAMA,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAE5B,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5D;QACF;AAEA,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,mBAAmB,CAAC;YAClD,eAAe,CAAC,KAAK,EAAE;YAEvB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,eAAe,CAAC;AAE/C,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC9B;IACF;IAEA,aAAa,CAAC,KAAyB,EAAE,GAAa,EAAA;QACpD,IAAI,KAAK,EAAE;AACT,YAAA,GAAG,CAAC,OAAO,CAAC,OAAM,EAAE,KAAG;AACrB,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;gBAC9C,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,oBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC;AAChD,oBAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,wBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;oBACpB;AACA,oBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;oBACjE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC;gBAC/C;AACF,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,MAAM,SAAS,CAAC,MAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAEnB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QAC1C;;;AAIA,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QACtE,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AACtB,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,SAAS;gBACpD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACjD,gBAAA,IAAI,CAAC,UAAU,GAAG,SAAS;YAC7B;iBAAO;gBACL,MAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB;gBACvD,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAmB,IAAI,CAAC,WAAW,CAAC;AAClF,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CACrC,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,KAAK,CACX;gBACD,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;YACnC;AACA,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACtB;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACtB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1C,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QACpC;QACA,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA,IAAA,OAAO,CAAC,aAAa,EAAA;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC;IACxD;AAEA,IAAA,iBAAiB,CAAC,IAAI,EAAA;QACpB,MAAM,YAAY,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAEhC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI;IAC5D;AAEA,IAAA,aAAa,CAAC,IAAsB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM;QAC5C;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,eAAe,CAAC,IAAsB,EAAE,YAAsB,EAAA;AACpE,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;QACrD;IACF;+GAlLW,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClD3C,qwEA6EA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxCI,IAAI,6FACJ,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,gEACjB,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACrB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAjB1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,OAAA,EAE3B;wBACP,IAAI;wBACJ,OAAO;wBACP,cAAc;wBACd,iBAAiB;wBACjB,OAAO;wBACP,aAAa;wBACb,iBAAiB;wBACjB,iBAAiB;wBACjB,gBAAgB;wBAChB,qBAAqB;wBACrB;AACD,qBAAA,EAAA,QAAA,EAAA,qwEAAA,EAAA;;sBAGA;;sBAKA;;sBACA;;sBACA;;;METU,0BAA0B,CAAA;IAgBrC,WAAA,CACU,mBAAwC,EACxC,YAA0B,EAC1B,gBAAkC,EAClC,wBAAkD,EAClD,KAAmB,EACnB,YAA0B,EAAA;QAL1B,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACnB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,wBAAwB,GAAxB,wBAAwB;QACxB,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,YAAY,GAAZ,YAAY;QApBtB,IAAA,CAAA,YAAY,GAAG,KAAK;QAGpB,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,gBAAgB,GAAG,KAAK;AAKxB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAErB,QAAA,IAAA,CAAA,WAAW,GAAmC,IAAI,YAAY,EAAoB;QACpF,IAAA,CAAA,IAAI,GAAG,EAAE;IAQd;AAEH,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QAEvC,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,mCAAmC,EAAE;QACjE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AAE7C,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,IAAI,CAAC,IAAI;AAChB,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAkB,CAAC,EACrC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,+BAA+B,CAAC,EAC9D,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;YAC1B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC,SAAS;AAC3C,gBAAA,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC,OAAO,CAC9C;YACD,IAAI,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE;AAClD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE;YAChD;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,MAAM,mCAAmC,GAAA;AACvC,QAAA,MAAM,MAAM,GAAW;YACrB,QAAQ,EAAE,IAAI,CAAC,IAAI;AACnB,YAAA,YAAY,EAAE,iCAAiC;YAC/C,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACnC,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,QAAQ,EAAE;SACX;AACD,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE;AAEzE,QAAA,OAAO,SAAS,EAAE,MAAM,IAAI,eAAe,CAAC,SAAS;AACnD,YAAA,SAAS,EAAE,MAAM,IAAI,eAAe,CAAC;AACrC,cAAE;cACA,SAAS;IACf;IAEA,WAAW,GAAA;;;;;;AAMT,QAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE;IAChD;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC5B,IAAI,CAAC,iCAAiC,EAAE;AACxC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;AAC1F,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;YAC7B,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;QACtD;IACF;IAEA,iCAAiC,GAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE,GAAG,IAAI,GAAG,KAAK;AACpF,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC/B;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;IAC9B;AAEA,IAAA,OAAO,CAAC,aAAqB,EAAA;QAC3B,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC;IACxD;IAEA,MAAM,UAAU,CAAC,IAAI,EAAA;AACnB,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAC9E,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAsB;QAChE;IACF;AAEA,IAAA,iBAAiB,CAAC,IAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI;IAC5D;AAEA,IAAA,WAAW,CAAC,IAAI,EAAA;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,SAAS,CAAC,IAAsB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AAC7E,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,kBAAkB,GAAA;AACtB,QAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACnE,MAAM,MAAM,IAAI,MAAM,cAAc,CAAC,IAAI,EAAE,CAAgB;AAC3D,QAAA,IAAI,OAAO,GAAW,OAAO,CAC3B,2FAA2F,CAC5F;QAED,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,MAAM,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE;gBACzF,OAAO,GAAG,OAAO,CACf,wBAAwB;oBACtB,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC;AAClD,oBAAA,0EAA0E,CAC7E;YACH;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAC1C,OAAO,CAAC,sBAAsB,CAAC,EAC/B,OAAO,EACP,SAAS,EACT,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CACrD;QACD,IAAI,CAAC,IAAI,EAAE;YACT;QACF;QAEA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gDAAgD,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5F,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI;AACrE,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACb,gBAAA,IAAI,EAAE,OAAO,CAAC,iCAAiC,CAAC;AAChD,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,OAAO,EAAE;AACV,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC;IACF;IAEA,MAAM,gDAAgD,CACpD,MAAyB,EAAA;AAEzB,QAAA,MAAM,MAAM,GAAe;YACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;AACnB,YAAA,WAAW,EAAE,OAAO,CAAC,8CAA8C,CAAC;AACpE,YAAA,+BAA+B,EAAE;AAC/B,gBAAA,QAAQ,EAAE;AACX;SACF;QAED,IAAI,MAAM,EAAE;YACV,IAAI,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,yBAAyB,EAAE;AACjE,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,yBAAyB;gBAChD,MAAM,CAAC,+BAA+B,CAAC,OAAO,GAAG,MAAM,CAAC,yBAAyB;AACjF,gBAAA,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,CAAA,oCAAA,EAAuC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;YAC1F;QACF;AACA,QAAA,OAAO,MAAM;IACf;+GA5LW,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,IAAA,CAAA,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjDvC,0pHAmHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9EI,IAAI,6FACJ,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,aAAa,2EACb,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,OAAO,oFACP,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,gCAAgC,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChC,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAhBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EAEtB;wBACP,IAAI;wBACJ,yBAAyB;wBACzB,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,KAAK;wBACL,OAAO;wBACP,8BAA8B;wBAC9B,gCAAgC;wBAChC;AACD,qBAAA,EAAA,QAAA,EAAA,0pHAAA,EAAA;;sBAgBA;;;MErBU,+BAA+B,CAAA;AAoB1C,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAnBpC,IAAA,CAAA,YAAY,GAAqB,EAAE;QACnC,IAAA,CAAA,aAAa,GAAqB,EAAE;QACpC,IAAA,CAAA,YAAY,GAAqB,EAAE;QACnC,IAAA,CAAA,OAAO,GAAG,EAAE;QACH,IAAA,CAAA,gBAAgB,GAAW,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAyB;AAClC,YAAA,sBAAsB,EAAE,EAAE;AAC1B,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,uBAAuB,EAAE,EAAE;AAC3B,YAAA,gBAAgB,EAAE;SACnB;AACD,QAAA,IAAA,CAAA,0BAA0B,GAAW,OAAO,CAAC,6BAA6B,CAAC;AAK3E,QAAA,IAAA,CAAA,kBAAkB,GAA0B,IAAI,YAAY,EAAE;IAGL;AAEzD,IAAA,MAAM,QAAQ,GAAA;QACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAChD,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,IAAI,EAAE;AACP,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AAEvB,QAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,WAAW;AAE7C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAG;AACpB,YAAA,IACE,gBAAgB;gBAChB,gBAAgB,CAAC,MAAM,GAAG,CAAC;AAC3B,gBAAA,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,EACrD;AACA,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI;AAC9B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YAC3B;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,IAAa,KAAK,CAAC,KAAK,EAAA;AACtB,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,gBAAgB,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,gBAAwC;QACnE;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;IACrB;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA,IAAA,iBAAiB,CAAC,KAAuB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAoB,KAAK,IAAI,CAAC,EAAE,CAAC;QAClF;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;IAC5B;AAEA,IAAA,cAAc,CAAC,KAAK,EAAA;AAClB,QAAA,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YACzB,IAAI,CAAC,GAAG,EAAE;QACZ;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,EAAE;QACtC;IACF;AAEA,IAAA,qBAAqB,CAAC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,EAAE;AACtC,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE;QACnB;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;AAEA,IAAA,sBAAsB,CAAC,KAAK,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,sBAAsB,GAAG,EAAE;AAC5C,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC7B;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;AAEA,IAAA,0BAA0B,CAAC,KAAK,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,uBAAuB,GAAG,EAAE;AAC7C,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;IACF;IAEA,GAAG,GAAA;QACD,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C;AAEA,IAAA,MAAM,CAAC,KAAK,EAAA;QACV,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD;IAEA,SAAS,CAAC,KAAU,EAAE,KAAU,EAAA;AAC9B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,iBAAiB,CAAC,KAAK,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAoB,KAAK,IAAI,CAAC,EAAE,CAAC;QAClF;IACF;AAEA,IAAA,WAAW,CAAC,UAAU,EAAA;AACpB,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAI;AAC5D,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7C,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;QACvC;IACF;AAEA,IAAA,SAAS,CAAC,IAAI,EAAA;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9B;IAEA,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAA;QACrB,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,QAAQ;QAClC;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5C;+GApJW,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1C5C,uiPA+LA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtKI,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,IAAI,6FACJ,iBAAiB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,oBAAoB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,qBAAqB,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,yBAAyB,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,gCAAgC,EAAA,QAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChC,uBAAuB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,iCAAiC,+EACjC,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBArB3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EAEnB;wBACP,qBAAqB;wBACrB,iBAAiB;wBACjB,kBAAkB;wBAClB,qBAAqB;wBACrB,IAAI;wBACJ,iBAAiB;wBACjB,oBAAoB;wBACpB,qBAAqB;wBACrB,KAAK;wBACL,yBAAyB;wBACzB,WAAW;wBACX,gCAAgC;wBAChC,uBAAuB;wBACvB,iCAAiC;wBACjC;AACD,qBAAA,EAAA,QAAA,EAAA,uiPAAA,EAAA;;sBAkDA;;;ME7DU,yCAAyC,CAAA;AAftD,IAAA,WAAA,GAAA;AA0CY,QAAA,IAAA,CAAA,oBAAoB,GAAsB,IAAI,YAAY,EAAO;AAE3E,QAAA,IAAA,CAAA,YAAY,GAAG;AACb,YAAA,IAAI,EAAE;SACP;AACD,QAAA,IAAA,CAAA,sBAAsB,GAAG;AACvB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,iBAAiB,EAAE,QAAQ;AAC3B,YAAA,aAAa,EAAE;SAChB;AAED,QAAA,IAAA,CAAA,oBAAoB,GAAG;AACrB,YAAA,IAAI,EAAE;SACP;AAED,QAAA,IAAA,CAAA,KAAK,GAAU;YACb,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YACzC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;YACtD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;SACxD;AAED,QAAA,IAAA,CAAA,OAAO,GAAU;YACf,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YACzC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE;YACjD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;SAC9C;AAED,QAAA,IAAA,CAAA,QAAQ,GAAU;YAChB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC7C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE;YACxD,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,OAAO,CAAC,wBAAwB,CAAC;SAC1E;AAED,QAAA,IAAA,CAAA,OAAO,GAAU;YACf,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE;YAC/C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;SAC/C;QAED,IAAA,CAAA,aAAa,GAAG,KAAK;QACrB,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAC3B,IAAA,CAAA,oBAAoB,GAAG,kBAAkB;AAEzC,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AAqBhE,IAAA;IA7FC,IAAa,KAAK,CAAC,MAAM,EAAA;AACvB,QAAA,IAAI,MAAM,CAAC,gBAAgB,EAAE;AAC3B,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,gBAAgB;YAC3C,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC3C,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,gBAAgB,CAAC,oBAAoB;AACxE,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;YAEA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE;gBAC7C,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,gBAAgB,CAAC,sBAAsB;AAC5E,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;YACjC;YAEA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,MAAM,EAAE;AACrC,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;QACF;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,oBAAoB,GAAG,kBAAkB,GAAG,MAAM,CAAC,EAAE;IAC5D;IAoDA,WAAW,GAAA;QACT,UAAU,CAAC,MAAK;AACd,YAAA,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC;AAClD,YAAA,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,CAAC;YAChD,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE;AAC3C,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;gBAChC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE,IAAI,CAAC,oBAAoB,CAAC;YAC3E;iBAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE;AACpD,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;gBAC/B,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,EAAE,IAAI,CAAC,sBAAsB,CAAC;YAC/E;iBAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,MAAM,EAAE;AAC5C,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;YACA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACnD,QAAA,CAAC,CAAC;IACJ;+GA7FW,yCAAyC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yCAAyC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BtD,k+KAkKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/II,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACL,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,iCAAiC,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjC,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,sBAAsB,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACtB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EATH,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAA,CAAA,CAAA;;4FAY9D,yCAAyC,EAAA,UAAA,EAAA,CAAA;kBAfrD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sCAAsC,EAAA,aAAA,EAEjC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAA,OAAA,EAChE;wBACP,kBAAkB;wBAClB,qBAAqB;wBACrB,KAAK;wBACL,WAAW;wBACX,iCAAiC;wBACjC,iBAAiB;wBACjB,sBAAsB;wBACtB;AACD,qBAAA,EAAA,QAAA,EAAA,k+KAAA,EAAA;;sBAGA;;sBAuBA;;sBAGA;;;ME9BU,8BAA8B,CAAA;AAf3C,IAAA,WAAA,GAAA;QAwBU,IAAA,CAAA,IAAI,GAAG,EAAE;AAKlB,IAAA;IAXC,IAAa,KAAK,CAAC,MAAM,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,kBAAkB;AACrC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG;IAC5C;AAIA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,KAAK;IACnD;+GAbW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1B3C,+oIAiGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjFI,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,uBAAuB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,QAAQ,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,aAAA,EATK,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;;4FAYxD,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAf1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,EAAA,aAAA,EAE9B,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,OAAA,EAC1D;wBACP,qBAAqB;wBACrB,OAAO;wBACP,WAAW;wBACX,IAAI;wBACJ,uBAAuB;wBACvB,aAAa;wBACb,gBAAgB;wBAChB;AACD,qBAAA,EAAA,QAAA,EAAA,+oIAAA,EAAA;;sBAKA;;;AE1BG,MAAO,8BAA+B,SAAQ,iBAAiB,CAAA;AACnE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC;AACJ,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,YAAA,iBAAiB,EAAE;AACjB,gBAAA,GAAG,EAAE,cAAc;AACnB,gBAAA,UAAU,EAAE;AACV,oBAAA;AACE,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,GAAG,EAAE,SAAS;AACd,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;AACzB,4BAAA,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC;AAC9B,4BAAA,QAAQ,EAAE;AACX,yBAAA;AACD,wBAAA,SAAS,EAAE,gDAAgD;AAC3D,wBAAA,UAAU,EAAE;AACV,4BAAA,UAAU,EAAE;AACV,gCAAA;AACE,oCAAA,GAAG,EAAE,KAAK;AACV,oCAAA,IAAI,EAAE,QAAQ;AACd,oCAAA,KAAK,EAAE,IAAI;AACX,oCAAA,KAAK,EAAE;AACL,wCAAA,WAAW,EAAE,eAAe;AAC5B,wCAAA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;AACrB,wCAAA,QAAQ,EAAE,IAAI;AACd,wCAAA,cAAc,EAAE;AACjB,qCAAA;oCACD,QAAQ,EAAE,CAAC,gBAAgB;AAC5B,iCAAA;AACD,gCAAA;AACE,oCAAA,GAAG,EAAE,OAAO;AACZ,oCAAA,IAAI,EAAE,QAAQ;AACd,oCAAA,KAAK,EAAE;AACL,wCAAA,WAAW,EAAE,qBAAqB;AAClC,wCAAA,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;AACvB,wCAAA,QAAQ,EAAE,IAAI;AACd,wCAAA,cAAc,EAAE;AACjB;AACF;AACF;AACF;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,SAAS,EAAE,KAAK;wBAChB,QAAQ,EAAE,CAAC,oBAAoB,CAAC;AAChC,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,QAAQ;AACxB,yBAAA;AACD,wBAAA,UAAU,EAAE;AACV,4BAAA;AACE,gCAAA,IAAI,EAAE,QAAQ;AACd,gCAAA,GAAG,EAAE,UAAU;AACf,gCAAA,KAAK,EAAE;AACL,oCAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC1B,oCAAA,cAAc,EAAE,IAAI;AACpB,oCAAA,QAAQ,EAAE;AACX,iCAAA;AACD,gCAAA,SAAS,EAAE;AACZ,6BAAA;AACD,4BAAA;AACE,gCAAA,IAAI,EAAE,UAAU;AAChB,gCAAA,GAAG,EAAE,cAAc;AACnB,gCAAA,KAAK,EAAE;AACL,oCAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,oCAAA,cAAc,EAAE,IAAI;AACpB,oCAAA,QAAQ,EAAE,IAAI;AACd,oCAAA,WAAW,EAAE,OAAO,CAClB,sJAAsJ;AAEzJ,iCAAA;AACD,gCAAA,SAAS,EAAE;AACZ;AACF;AACF;AACF;AACF;AACF,SAAA,CAAC;IACJ;AACD;;AC3EK,MAAO,6BAA8B,SAAQ,wBAAwB,CAAA;AACzE,IAAA,WAAA,CAAsB,iBAAiB,IAAI,EAAA;AACzC,QAAA,KAAK,CAAC,IAAI,EAAE,qBAAqB,EAAE,cAAc,CAAC;QAD9B,IAAA,CAAA,cAAc,GAAd,cAAc;IAEpC;AACD;AAEK,MAAO,uBAAwB,SAAQ,kBAAkB,CAAA;AAC7D,IAAA,WAAA,CAAsB,iBAAiB,IAAI,EAAA;QACzC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE;AACtD,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AACtB,oBAAA,QAAQ,EAAE,IAAI;oBACd;AACD,iBAAA;AACD,gBAAA,SAAS,EAAE;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AACtB,oBAAA,QAAQ,EAAE,IAAI;oBACd;AACD,iBAAA;AACD,gBAAA,SAAS,EAAE;AACZ;AACF,SAAA,CAAC;QAtBkB,IAAA,CAAA,cAAc,GAAd,cAAc;IAuBpC;AACD;AAEK,MAAO,uBAAwB,SAAQ,kBAAkB,CAAA;AAC7D,IAAA,WAAA,CAAsB,iBAAiB,IAAI,EAAA;QACzC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE;AACtD,YAAA;AACE,gBAAA,GAAG,EAAE,UAAU;AACf,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;oBAC1B,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,oBAAA,QAAQ,EAAE,IAAI;oBACd;AACD,iBAAA;AACD,gBAAA,SAAS,EAAE;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACtB,cAAc;AACd,oBAAA,QAAQ,EAAE;AACX,iBAAA;AACD,gBAAA,SAAS,EAAE;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACtB,cAAc;AACd,oBAAA,QAAQ,EAAE;AACX,iBAAA;AACD,gBAAA,SAAS,EAAE;AACZ;AACF,SAAA,CAAC;QAjCkB,IAAA,CAAA,cAAc,GAAd,cAAc;IAkCpC;AACD;;ACzEK,MAAO,sCAAuC,SAAQ,gBAAgB,CAAA;IAE1E,WAAA,CAAY,UAAsB,EAAE,QAAkB,EAAA;AACpD,QAAA,KAAK,CAAC,6BAA6B,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC5D;+GAJW,sCAAsC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtC,sCAAsC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAtC,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBADlD,SAAS;mBAAC,EAAE,QAAQ,EAAE,iCAAiC,EAAE;;sBAEvD;;;MC+DU,0BAA0B,CAAA;AAqCrC,IAAA,WAAA,CAAoB,mBAAwC,EAAA;QAAxC,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;AA5B7B,QAAA,IAAA,CAAA,QAAQ,GAAsB,IAAI,YAAY,EAAO;QAM/D,IAAA,CAAA,aAAa,GAAG,KAAK;QAIrB,IAAA,CAAA,gBAAgB,GAAG,IAAI;QACvB,IAAA,CAAA,aAAa,GAAG,SAAS;QACzB,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,KAAK,GAAG,KAAK;QACb,IAAA,CAAA,UAAU,GAAG,KAAK;AAGlB,QAAA,IAAA,CAAA,YAAY,GAAG;YACb,6BAA6B;YAC7B,uBAAuB;YACvB,uBAAuB;YACvB;SACD;AAEO,QAAA,IAAA,CAAA,kBAAkB,GAAG;AAC3B,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,KAAK,EAAE;SACR;QAUD,IAAA,CAAA,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;IATa;IAE/D,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;IAIA,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK;QACrD,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;;QAGhC,IACE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAC5C,YAAA,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EACnD;AACA,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBAC1D,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE;YAClC;QACF;IACF;AAEA,IAAA,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAyD,EAAA;QACrF,IAAI,CAAC,kBAAkB,GAAG;YACxB,KAAK;YACL;SACD;IACH;IAEA,gBAAgB,GAAA;AACd,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,gBAAgB,EAAE;AAChB,gBAAA,IAAI,EAAE;AACP;SACF;AAED,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;QAC1C;AAEA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,IAAI,CAAC,cAAc,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE;AAC3D,YAAA,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;AACzC,gBAAA,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,oBAAoB;AACjC,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,QAAQ,EAAE,KAAK;oBACf,aAAa,EAAE,CAAC,EAAE;AACnB,iBAAA;AACD,gBAAA,mBAAmB,EAAE;AACtB,aAAA,CAAC;QACJ;aAAO;YACL,IAAI,CAAC,cAAc,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;AAC9B,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;AAC1B,gBAAA,YAAY,EAAE;AACZ,oBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;AAC5B,oBAAA,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;AACzE;AACF,aAAA,CAAC;QACJ;QAEA,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;QAC/B;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;IAEA,oBAAoB,GAAA;AAClB,QAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC1C;IAEA,eAAe,GAAA;AACb,QAAA,IACE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,KAAK,MAAM,EACrD;AACA,YAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;QAC/B;IACF;AAEA,IAAA,sBAAsB,CAAC,OAAO,EAAA;QAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAG;AACrC,gBAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;AAC5C,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,kBAAkB,CAAC,IAAI,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,gBAAgB,CAAC,IAAI,EAAA;QACnB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY;AAC3C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe;AACxC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAClE,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE;IAC5C;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe;IAC1C;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACvD;YAAE,OAAO,KAAK,EAAE;gBACd;YACF;QACF;IACF;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;AACpC,YAAAC,OAAK,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;QACzC;QAEA,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE;AAC5C,YAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,OAAO;AAC5C,YAAAC,KAAG,CAAC,mBAAmB,EAAE,cAAc,EAAE,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC5E;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAC1E,CAAC,MAAM,EAAE,IAAI,KAAI;gBACf,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK;AAC7B,gBAAA,OAAO,MAAM;YACf,CAAC,EACD,EAAE,CACH;QACH;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC;AACZ,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QAEtB,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,gBAAA,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO;AAC9B,aAAA,CAAC;QACJ;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9D;AAEA,IAAA,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAA;AACtB,QAAA,MAAM,QAAQ,GAAG,MAAe,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK;AACtE,QAAA,MAAM,QAAQ,GAAG,MAAe,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK;AACtE,QAAA,OAAO,QAAQ,EAAE,IAAI,QAAQ,EAAE;IACjC;IAEA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;AACzC,gBAAA,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,oBAAoB;AACjC,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,QAAQ,EAAE,KAAK;oBACf,aAAa,EAAE,CAAC,EAAE;AACnB,iBAAA;AACD,gBAAA,mBAAmB,EAAE;AACtB,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,sBAAsB,CAAC,KAAK,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,KAAK;IACvC;+GAjPW,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAR,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,CAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpEvC,spSAyQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3NI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,sCAAsC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtC,gBAAgB,ghBAChB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iCAAiC,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjC,uCAAuC,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvC,yBAAyB,kHACzB,uBAAuB,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yCAAyC,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzC,sBAAsB,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACtB,gBAAgB,6CAChB,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,aAAA,EArBK,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAA,CAAA,CAAA;;4FAwB9D,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBA3BtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,EAAA,aAAA,EAE1B,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAA,OAAA,EAChE;wBACP,OAAO;wBACP,aAAa;wBACb,IAAI;wBACJ,sCAAsC;wBACtC,gBAAgB;wBAChB,iBAAiB;wBACjB,WAAW;wBACX,kBAAkB;wBAClB,mBAAmB;wBACnB,iCAAiC;wBACjC,uCAAuC;wBACvC,yBAAyB;wBACzB,uBAAuB;wBACvB,8BAA8B;wBAC9B,iBAAiB;wBACjB,gBAAgB;wBAChB,yCAAyC;wBACzC,sBAAsB;wBACtB,gBAAgB;wBAChB;AACD,qBAAA,EAAA,QAAA,EAAA,spSAAA,EAAA;;sBAGA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAC3C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAE9C,KAAK;uBAAC,UAAU;;sBAChB;;sBACA;;sBACA;;sBACA;;sBACA;;;MElCU,kCAAkC,CAAA;AA+B7C,IAAA,WAAA,CACU,iBAAoC,EACpC,YAA0B,EAC1B,YAA0B,EAC1B,MAAc,EAAA;QAHd,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACjB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,MAAM,GAAN,MAAM;AAhChB,QAAA,IAAA,CAAA,YAAY,GAAoB;AAC9B,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,kBAAkB,EAAE,EAAE;AACtB,YAAA,oBAAoB,EAAE,EAAE;AACxB,YAAA,gBAAgB,EAAE;AAChB,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,uBAAuB,EAAE,EAAE;AAC3B,YAAA,gBAAgB,EAAE;AAChB,gBAAA,sBAAsB,EAAE,EAAE;AAC1B,gBAAA,cAAc,EAAE,EAAE;AAClB,gBAAA,uBAAuB,EAAE,EAAE;AAC3B,gBAAA,gBAAgB,EAAE;AACnB,aAAA;AACD,YAAA,OAAO,EAAE;SACV;QAKD,IAAA,CAAA,QAAQ,GAAG,IAAI;AAaf,QAAA,IAAA,CAAA,aAAa,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IANxC;IAEH,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;IACxC;IAIA,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;IAC5B;IAEA,qBAAqB,GAAA;AACnB,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK;QAC/B,OAAO;AACL,YAAA,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AACtE,YAAA,UAAU,EAAE;SACb;IACH;AAEA,IAAA,gCAAgC,CAAC,UAAoB,EAAA;QACnD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,UAAU,EAAE,CAAC;IACjE;AAEA,IAAA,qBAAqB,CAAC,QAAQ,EAAA;QAC5B,MAAM,uBAAuB,GAAQ,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/F,IAAI,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC;QACjC,IAAI,uBAAuB,EAAE;AAC3B,YAAA,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;QAC/F;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,QAAQ,GAAA;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QAEpC,IAAI,EAAE,EAAE;YACN,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACzD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AAC7B,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,SAAS;gBACpD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACjD,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACvB;iBAAO;AACL,gBAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;gBAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;oBAC1C,OAAO,IAAI,CAAC,gBAAgB;gBAC9B;gBACA,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;oBAC1C,OAAO,IAAI,CAAC,gBAAgB;gBAC9B;gBACA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AAC5C,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACxB,oBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;gBAC1B;AACA,gBAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACtE,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACvB;QACF;IACF;AAEA,IAAA,mBAAmB,CAAC,KAAK,EAAA;AACvB,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK;QAC1B,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AAChC,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5D,YAAA,CAAC,CAAC;QACJ;QACA,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5C;IAEA,SAAS,CAAC,MAAc,EAAE,EAAO,EAAA;AAC/B,QAAA,OAAO,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;IACtB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACxD;AAEA,IAAA,cAAc,CAAC,aAAa,EAAA;AAC1B,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK;AAC/B,QAAA,MAAM,EAAE,EAAE,EAAE,GAAG,aAAa;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;AACzC,QAAA,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa;IAClD;AAEA,IAAA,cAAc,CAAC,aAAa,EAAA;AAC1B,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK;AAC/B,QAAA,MAAM,EAAE,EAAE,EAAE,GAAG,aAAa;AAC5B,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC;;AAGd,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5C,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;QACrC;AAEA,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,YAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3B;IACF;AAEA,IAAA,aAAa,CAAC,YAAY,EAAA;AACxB,QAAA,QAAQ,YAAY,CAAC,MAAM;AACzB,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;gBACtC;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;gBACtC;;IAEN;AAEA,IAAA,8BAA8B,CAAC,QAAQ,EAAA;QACrC,MAAM,uBAAuB,GAAG,EAAE;QAElC,MAAM,eAAe,GAAG,EAAE;AAC1B,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAG;AACzB,YAAA,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE;AACxB,gBAAA,IAAI,OAAO,CAAC,gBAAgB,EAAE;oBAC5B,uBAAuB,CAAC,IAAI,CAC1B,MAAM,CACJ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAClC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAC/C,CACF;gBACH;AACA,gBAAA,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC3D;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,CAAC,eAAe,EAAE,uBAAuB,CAAC;IACnD;AAEA,IAAA,kBAAkB,CAAC,MAAM,EAAA;QACvB,IAAI,WAAW,GAAG,EAAE;AACpB,QAAA,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC,8BAA8B,CAC7E,MAAM,CAAC,QAAQ,CAChB;AACD,QAAA,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE;YAC9E,QAAQ;YACR;AACD,SAAA,CAAC;AACF,QAAA,OAAO,WAAW;IACpB;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7F,YAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;YAE7B,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;gBAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAC9D;iBAAO;AACL,gBAAA,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI;AACxB,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC5D;QACF;QAAE,OAAO,EAAE,EAAE;YACX,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACjE;IACF;AAEA,IAAA,OAAO,CAAC,cAAc,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEzE,YAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK;IACnC;+GAjNW,kCAAkC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kCAAkC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAC/B,0BAA0B,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5C1C,+yHA4FA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjEI,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,uBAAuB,2HACvB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,8BAA8B,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,0BAA0B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,yCAAyC,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzC,+BAA+B,2EAC/B,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBApB9C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAAA,OAAA,EAE/B;wBACP,IAAI;wBACJ,cAAc;wBACd,mBAAmB;wBACnB,uBAAuB;wBACvB,WAAW;wBACX,8BAA8B;wBAC9B,qBAAqB;wBACrB,KAAK;wBACL,0BAA0B;wBAC1B,mBAAmB;wBACnB,aAAa;wBACb,yCAAyC;wBACzC,+BAA+B;wBAC/B;AACD,qBAAA,EAAA,QAAA,EAAA,+yHAAA,EAAA;;sBAGA,YAAY;uBAAC,0BAA0B;;;MEvC7B,sBAAsB,CAAA;AAIjC,IAAA,WAAA,CAAoB,GAAoB,EAAA;QAApB,IAAA,CAAA,GAAG,GAAH,GAAG;QAHvB,IAAA,CAAA,gBAAgB,GAAG,oBAAoB;IAGI;IAE3C,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACxE;QACA,OAAO,IAAI,CAAC,QAAQ;IACtB;+GAXW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAtB,sBAAsB,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;ACJM,MAAM,aAAa,GAAG;;MCkEhB,0BAA0B,CAAA;IAWrC,IAAqD,eAAe,CAAC,eAAuB,EAAA;QAC1F,IAAI,eAAe,EAAE;AACnB,YAAA,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AACxF,gBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,YAAA,CAAC,CAAC;QACJ;IACF;IAMA,IAAa,MAAM,CAAC,MAAmB,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,aAAa,CAAC;AAC3C,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB;AAElD,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;;gBAEhB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,IAAI,GAAG;AAC9D,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB;oBACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,IAAI,SAAS;AACtD,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE;AACnF,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;AAC3D,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI;AACvF,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,IAAI,KAAK;YACtF;iBAAO;AACL,gBAAA,IAAI,CAAC,qBAAqB;AACxB,oBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG;YACrE;AACA,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9C,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;AA4CA,IAAA,WAAA,CACU,YAA0B,EAC1B,YAA0B,EAC1B,YAA0B,EACjB,iBAAoC,EAAA;QAH7C,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACH,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QAhGpC,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,qBAAqB,GAAG,GAAG;QAC3B,IAAA,CAAA,iBAAiB,GAAG,CAAC;QACrB,IAAA,CAAA,qBAAqB,GAAG,EAAE;QAC1B,IAAA,CAAA,oBAAoB,GAAG,GAAG;QAC1B,IAAA,CAAA,gBAAgB,GAAG,KAAK;AACxB,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;QACxC,IAAA,CAAA,sBAAsB,GAAwB,EAAE;AAChD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAU,KAAK,iDAAC;AASpB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAe;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAe;AACzC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAe;AACvC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAe;QA8BnD,IAAA,CAAA,cAAc,GAAG,KAAK;QACtB,IAAA,CAAA,uBAAuB,GAAG,IAAI;QAI9B,IAAA,CAAA,IAAI,GAAG,MAAM;QACb,IAAA,CAAA,IAAI,GAAG,MAAM;QACb,IAAA,CAAA,QAAQ,GAAG,cAAc;AACzB,QAAA,IAAA,CAAA,gBAAgB,GAAQ;AACtB,YAAA,IAAI,EAAE,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,IAAI,EAAE,EAAE,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5F,YAAA,QAAQ,EAAE;gBACR,CAAA,SAAA,EAAY,IAAI,CAAC,QAAQ,CAAA,CAAE;gBAC3B,CAAA,cAAA,EAAiB,IAAI,CAAC,QAAQ,CAAA,CAAE;gBAChC,CAAA,eAAA,EAAkB,IAAI,CAAC,QAAQ,CAAA;AAChC;SACF;AACO,QAAA,IAAA,CAAA,MAAM,GAAG;AACf,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,OAAO,CAAC,WAAW;SAC3B;AACO,QAAA,IAAA,CAAA,aAAa,GAAG;AACtB,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,OAAO,CAAC,mBAAmB;SACnC;AACO,QAAA,IAAA,CAAA,SAAS,GAAG;AAClB,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,OAAO,CAAC,0BAA0B;SAC1C;AAEO,QAAA,IAAA,CAAA,eAAe,GAAG;AACxB,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,IAAI,EAAE;SACC;AACD,QAAA,IAAA,CAAA,QAAQ,GAAS,IAAI,CAAC,eAAe;QACrC,IAAA,CAAA,UAAU,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,2BAA2B,GAAG,IAAI,OAAO,EAAE;QAC3C,IAAA,CAAA,gCAAgC,GAAG,KAAK;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAQrC,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,EAAE;IAChE;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AAEvB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AAE1D,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC;QAE5E,IAAI,CAAC,4BAA4B,EAAE;QACnC,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,4BAA4B,EAAE;IACrC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;AAEtC,QAAA,IAAI,CAAC,IAAI,CAAC,gCAAgC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,oBAAoB,CAAC,YAAY;AAC3E,iBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC3D,iBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,gCAAgC,GAAG,IAAI;QAC9C;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;IACrB;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAC7B,OAAO,CAAC,eAAe,CAAC,EACxB,OAAO,CAAC,wDAAwD,CAAC,EACjE,MAAM,CAAC,MAAM,EACb;AACE,gBAAA,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC;AACrB,gBAAA,MAAM,EAAE,OAAO,CAAC,QAAQ;AACzB,aAAA,CACF;YACD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;QAAE,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE;AACN,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC;QACF;IACF;AAEA,IAAA,MAAM,IAAI,GAAA;QACR,IACE,IAAI,CAAC,QAAQ;AACb,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI;YAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAC7B;AACA,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAE9E,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE;AACjD,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE;YACvD;;;;AAKA,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe;QACtC;;QAGA,SAAS,QAAQ,CAAS,KAAyC,EAAA;YACjE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,EAAE;QAC7D;;QAGA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,GAAG,CAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,IAAI,EAAE,EACjD,MAAM,CAAC,QAAQ,CAAC;;;AAIlB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC;;;QAIA,MAAM,YAAY,GAAW,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;QAChE,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,GAAG,KAAK;QAC7C;QAEA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,UAAU,CAAC,YAA2B,EAAA;AACpC,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;YACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;QACpC;aAAO;QACP;IACF;AAEA,IAAA,SAAS,CAAC,IAAS,EAAA;AACjB,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;QAC5C;AAAO,aAAA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE;AAAO,aAAA,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpE;IACF;AAEA,IAAA,mBAAmB,CAAC,IAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,KAAK,GAAG,GAAG,SAAS,GAAG,UAAU;IACjF;AAEA,IAAA,oBAAoB,CAAC,IAAS,EAAA;AAC5B,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;AACnB,YAAA,QAAQ,IAAI,CAAC,EAAE;;AAEb,gBAAA,KAAK,CAAC;oBACJ,IAAI,CAAC,uBAAuB,EAAE;oBAC9B,IAAI,CAAC,2BAA2B,EAAE;oBAClC;;AAGF,gBAAA,KAAK,CAAC;oBACJ,IAAI,CAAC,2BAA2B,EAAE;oBAClC,IAAI,CAAC,eAAe,EAAE;oBACtB,IAAI,CAAC,cAAc,EAAE;oBACrB;;AAGF,gBAAA,KAAK,CAAC;oBACJ,IAAI,CAAC,uBAAuB,EAAE;oBAC9B,IAAI,CAAC,mBAAmB,EAAE;oBAC1B;AAEF,gBAAA;oBACE;;QAEN;IACF;AAEA,IAAA,2BAA2B,CAAC,MAAM,EAAA;AAChC,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,WAAW;AACvF,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;AACxE,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;IACpC;IAEA,cAAc,GAAA;QACZ,MAAM,QAAQ,GAAW,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QACxD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEnC,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;QACtC;aAAO;;AAEL,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;QACrC;IACF;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc;;;;AAI1C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE;AACvC,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;YACvC;QACF;IACF;AAEQ,IAAA,cAAc,CAAC,QAAiB,EAAA;QACtC,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxD;aAAO,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE1C,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;QAClE;IACF;AAEQ,IAAA,cAAc,CAAC,MAAmB,EAAA;AACxC,QAAA,IACE,MAAM;AACN,YAAA,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM,CAAC,gBAAgB;YAC9B,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EACzC;AACA,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC9E;IACF;IAEQ,uBAAuB,GAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;QACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM;IAC7C;IAEQ,2BAA2B,GAAA;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QAEtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE;QACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE;QACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM;IAC7C;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;QACzD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,iBAAiB;IACxD;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY;AACjE,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe;AACvE,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB;AACzE,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB;QACzE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,GAAG,aAAa;IACpD;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,GAAG,GAAsB;YAC3B,YAAY,EAAE,IAAI,CAAC,IAAI;AACvB,YAAA,gBAAgB,EAAE;SACnB;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrC,YAAA,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;QAC1B;AACA,QAAA,OAAO,GAAG;IACZ;IAEQ,sBAAsB,GAAA;QAC5B,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;QAC/C,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,YAAY,CAAC;YAC9E,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI;YACjC;iBAAO;AACL,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,YAAY,CAAC;gBACzF;uBACK,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ;uBACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;YACvC;QACF;IACF;IAEQ,4BAA4B,GAAA;QAClC,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;QAEnD,QAAQ,gBAAgB;AACtB,YAAA,KAAK,aAAa;AAChB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS;gBACxC;AAEF,YAAA,KAAK,iBAAiB;AACpB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa;gBAC5C;AAEF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM;gBACrC;AAEF,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa;gBAC5C;AAEF,YAAA,KAAK,aAAa;AAChB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS;gBACxC;AAEF,YAAA;AACE,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM;gBACrC;;IAEN;AAEQ,IAAA,cAAc,CAAC,QAAgB,EAAA;QACrC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAC,GAAG,SAAS;YACxF;QACF;AACA,QAAA,OAAO,SAAS;IAClB;IAEQ,yBAAyB,GAAA;QAC/B,OAAO;AACL,YAAA;AACE,gBAAA,mBAAmB,EAAE,YAAY;AACjC,gBAAA,UAAU,EAAE;AACV,oBAAA;AACE,wBAAA,GAAG,EAAE,SAAS;AACd,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,UAAU;AACrB,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;AACzB,4BAAA,WAAW,EAAE,IAAI;AACjB,4BAAA,QAAQ,EAAE,IAAI;4BACd,GAAG,EAAE,IAAI,CAAC,iBAAiB;AAC3B,4BAAA,UAAU,EAAE;AACV,gCAAA,IAAI,EAAE,OAAO,CAAC,SAAS;AACxB;AACF;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,GAAG,EAAE,qBAAqB;AAC1B,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,UAAU;AACrB,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC;AACvC,4BAAA,WAAW,EAAE,IAAI;AACjB,4BAAA,QAAQ,EAAE,IAAI;4BACd,GAAG,EAAE,IAAI,CAAC,iBAAiB;AAC3B,4BAAA,UAAU,EAAE;AACV,gCAAA,IAAI,EAAE,OAAO,CAAC,SAAS;AACxB;AACF;AACF;AACF;AACF,aAAA;AACD,YAAA;AACE,gBAAA,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,UAAU,EAAE;AACV,oBAAA;AACE,wBAAA,GAAG,EAAE,sBAAsB;AAC3B,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,SAAS,EAAE,UAAU;AACrB,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC;AACzC,4BAAA,aAAa,EAAE;AAChB;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,GAAG,EAAE,oBAAoB;AACzB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,SAAS,EAAE,UAAU;AACrB,wBAAA,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC;AACnC,4BAAA,OAAO,EAAE;gCACP,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;gCAC1C,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK;AACvC;AACF;AACF;AACF;AACF,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,2BAA2B;AAChC,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,4BAA4B,CAAC;AAC5C,oBAAA,WAAW,EAAE,OAAO,CAClB,sEAAsE,CACvE;AACD,oBAAA,QAAQ,EAAE;AACX,iBAAA;AACD,gBAAA,UAAU,EAAE;AACV,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE;AACL,wBAAA,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;AACzB,wBAAA,WAAW,EAAE,cAAc;AAC3B,wBAAA,QAAQ,EAAE;AACX;AACF,iBAAA;AACD,gBAAA,WAAW,EAAE;AACX,oBAAA,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE;AACvC;AACF;SACF;IACH;+GAneW,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,uVAkB1B,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpF9B,ivaAybA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3YI,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,orDACX,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iCAAiC,oFACjC,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,uBAAuB,2GACvB,qBAAqB,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,0BAA0B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,iBAAiB,4RACjB,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,YAAY,yKACZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAxBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EAEtB;wBACP,IAAI;wBACJ,mBAAmB;wBACnB,WAAW;wBACX,aAAa;wBACb,kBAAkB;wBAClB,iCAAiC;wBACjC,iBAAiB;wBACjB,gBAAgB;wBAChB,qBAAqB;wBACrB,uBAAuB;wBACvB,qBAAqB;wBACrB,0BAA0B;wBAC1B,KAAK;wBACL,iBAAiB;wBACjB,OAAO;wBACP,iBAAiB;wBACjB,YAAY;wBACZ;AACD,qBAAA,EAAA,QAAA,EAAA,ivaAAA,EAAA;;sBAaA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAO9C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAC9C;;sBACA;;sBACA;;sBACA;;sBACA;;;MEjEU,wBAAwB,CAAA;AAbrC,IAAA,WAAA,GAAA;QAcW,IAAA,CAAA,UAAU,GAAkB,EAAE;AAC7B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAe;AAMpD,IAAA;AAJC,IAAA,aAAa,CAAC,MAAmB,EAAA;AAC/B,QAAA,MAAM,CAAC,MAAM,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAC3B;+GAPW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBrC,mwCAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnBI,IAAI,6FACJ,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,qBAAqB,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,gBAAgB,2gBAChB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EAEpB;wBACP,IAAI;wBACJ,mBAAmB;wBACnB,KAAK;wBACL,aAAa;wBACb,qBAAqB;wBACrB,gBAAgB;wBAChB;AACD,qBAAA,EAAA,QAAA,EAAA,mwCAAA,EAAA;;sBAGA;;sBACA;;;MEvBU,gBAAgB,CAAA;AAD7B,IAAA,WAAA,GAAA;QAEE,IAAA,CAAA,IAAI,GAAG,iBAAiB;AAKzB,IAAA;IAJC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAA;AAClB,QAAA,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI;QAC5B,OAAO,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;IACtD;+GALW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAhB,gBAAgB,EAAA,CAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MC2BY,qBAAqB,CAAA;AAgChC,IAAA,WAAA,CACU,YAA0B,EAC1B,YAA0B,EAC1B,gBAAkC,EACtB,OAA8B,EAAA;QAH1C,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QACJ,IAAA,CAAA,OAAO,GAAP,OAAO;QAnC7B,IAAA,CAAA,gBAAgB,GAAkB,EAAE;AACpC,QAAA,IAAA,CAAA,mBAAmB,GAAgB;AACjC,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC;AAC3B,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,MAAM;AACpB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,gBAAgB,EAAE,EAAE;AACpB,gBAAA,eAAe,EAAE,IAAI;AACrB,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,YAAY,EAAE,EAAE;AAChB,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,mBAAmB,EAAE,EAAE;AACvB,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,oBAAoB,EAAE,IAAI;AAC1B,gBAAA,kBAAkB,EAAE,KAAK;AACzB,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA,SAAS,EAAE;AACT,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,UAAU,EAAE;AACb,aAAA;AACD,YAAA,MAAM,EAAE;SACT;QAED,IAAA,CAAA,MAAM,GAAG,KAAK;QACN,IAAA,CAAA,IAAI,GAAG,EAAE;IAOd;AAEH,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACvC,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AAC7B,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,SAAS;gBACpD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACnD;iBAAO;gBACL,IAAI,CAAC,gBAAgB,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkB;AAC3D,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9D,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;YACjD;QACF;IACF;IAEA,sBAAsB,GAAA;AACpB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,aAAa,CAAC;IAC5E;IAEA,SAAS,GAAA;QACP,MAAM,MAAM,GAAgBK,WAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC/D,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IACxB;AAEA,IAAA,OAAO,CAAC,MAAmB,EAAA;AACzB,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,EAAE;AACvB,YAAA,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI;AAC5B,YAAA,IAAI,MAAM,CAAC,EAAE,KAAK,aAAa,EAAE;AAC/B,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAC3B;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAC3B;QACF;IACF;AAEA,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,MAAM,CAAC,EAAE,KAAK,aAAa,EAAE;AAC/B,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;gBACnC,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE;AACzB,oBAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACvB,oBAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC3B,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACzB;AACF,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;QAC5B;IACF;AAEA,IAAA,UAAU,CAAC,MAAmB,EAAA;AAC5B,QAAA,IAAI,MAAM,EAAE,EAAE,KAAK,aAAa,EAAE;AAChC,YAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C;aAAO;;AAEL,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;gBACnC,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE;AACzB,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;gBACrB;AACF,YAAA,CAAC,CAAC;;YAEF,OAAO,IAAI,CAAC,MAAM;QACpB;IACF;AAEA,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,MAAM,CAAC,EAAE,KAAK,aAAa,EAAE;AAC/B,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3B;IACF;IAEA,MAAM,WAAW,CAAC,QAAgB,EAAA;AAChC,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC9D,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,SAAS,CAAC,MAAmB,EAAE,eAAe,GAAG,IAAI,EAAA;AACzD,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;AAC5F,YAAA,IAAI;AACF,gBAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACjE,MAAM,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC,IAAI;YAC1C;YAAE,OAAO,EAAE,EAAE;gBACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;YACzC;QACF;QACA,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AACnC,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;gBAEnB,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE;AACzB,oBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,oBAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;gBAC7B;AACF,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;YACzC;QACF;IACF;IAEQ,MAAM,YAAY,CAAC,MAAmB,EAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC;QAC7D,MAAM,GAAG,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB;AAClD,QAAA,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,GAAG,CAAC;AACnD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,MAAM,YAAY,CAAC,MAAmB,EAAA;AAC5C,QAAA,MAAM,aAAa,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAgB;QACnF,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,0BAA0B,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC;QAClE;IACF;IAEQ,MAAM,YAAY,CAAC,MAAmB,EAAA;AAC5C,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC;AAC5C,YAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,EAAE;QACnB;AAAE,QAAA,OAAO,EAAE,EAAE,EAAC;IAChB;AAEQ,IAAA,0BAA0B,CAAC,EAAU,EAAA;QAC3C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5C,YAAA,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;gBAClB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC,MAAM;YACpB;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,0BAA0B,CAAC,EAAU,EAAE,MAAmB,EAAA;AAChE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AACnE,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,MAAM;QACrC;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;AAEQ,IAAA,YAAY,CAAC,MAAmB,EAAA;QACtC,MAAM,CAAC,SAAS,GAAG;AACjB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,UAAU,EAAE;SACb;AAED,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;AAC3B,YAAA,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC9B,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ;gBACpF,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CACzD,OAAO,CAAC,0CAA0C,CAAC,EACnD,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CACtC;YACH;QACF;IACF;+GA1MW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BlC,kmDAgDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3BI,gBAAgB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,OAAO,+EACP,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAZjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAEhB;wBACP,gBAAgB;wBAChB,wBAAwB;wBACxB,aAAa;wBACb,0BAA0B;wBAC1B,OAAO;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,kmDAAA,EAAA;;0BAsCE;;;AEvBL,MAAM,WAAW,GAAY;AAC3B,IAAA;QACE,OAAO,EAAE,WAAW,CAAC,MAAM;AAC3B,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,SAAS,EAAE,qBAAqB;AAChC,QAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,WAAW,EAAE,CAAC,eAAe,EAAE,sBAAsB;AACtD,KAAA;AACD,IAAA;QACE,OAAO,EAAE,WAAW,CAAC,MAAM;AAC3B,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,SAAS,EAAE,0BAA0B;AACrC,QAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,WAAW,EAAE,CAAC,gBAAgB,EAAE,sBAAsB;AACvD;CACF;AAED,MAAM,oBAAoB,GAAY;AACpC,IAAA;AACE,QAAA,IAAI,EAAE,6BAA6B;AACnC,QAAA,SAAS,EAAE;AACZ;CACF;MA2CY,mBAAmB,CAAA;+GAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAvC5B,UAAU;YACVM,aAAW;YACX,mBAAmB;YACnB,cAAc;YACd,aAAa;AACb,YAAA,aAAa,2DAIb,kBAAkB;YAClB,sBAAsB;AACtB,YAAA,uBAAuB,4CAGvB,sBAAsB;YACtB,kBAAkB;YAClB,qBAAqB;YACrB,wBAAwB;YACxB,0BAA0B;YAC1B,0BAA0B;YAC1B,8BAA8B;YAC9B,gCAAgC;YAChC,8BAA8B;YAC9B,kCAAkC;YAClC,yCAAyC;YACzC,0BAA0B;YAC1B,sCAAsC;YACtC,+BAA+B;YAC/B,uCAAuC,CAAA,EAAA,CAAA,CAAA;AAW9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,SAAA,EATnB;YACT,eAAe;YACf,gBAAgB;YAChB,sBAAsB;YACtB,YAAY;YACZ,mBAAmB;YACnB,SAAS,CAAC,WAAW;AACtB,SAAA,EAAA,OAAA,EAAA,CArCC,UAAU;YACVA,aAAW;YACX,mBAAmB;YACnB,cAAc;YACd,aAAa;YACb,aAAa;AACb,YAAA,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC3C,aAAa,CAAC,OAAO,EAAE;YACvB,aAAa,CAAC,OAAO,EAAE;YACvB,kBAAkB;YAClB,sBAAsB;YACtB,uBAAuB;YACvB,cAAc,CAAC,OAAO,EAAE;YACxB,gBAAgB,CAAC,OAAO,EAAE;YAC1B,sBAAsB;YACtB,kBAAkB;YAClB,qBAAqB;YACrB,wBAAwB;YACxB,0BAA0B;YAC1B,0BAA0B;YAC1B,8BAA8B;YAE9B,8BAA8B;YAC9B,kCAAkC;YAClC,yCAAyC;YACzC,0BAA0B;YAE1B,+BAA+B,CAAA,EAAA,CAAA,CAAA;;4FAYtB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAzC/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACVA,aAAW;wBACX,mBAAmB;wBACnB,cAAc;wBACd,aAAa;wBACb,aAAa;AACb,wBAAA,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC;wBAC3C,aAAa,CAAC,OAAO,EAAE;wBACvB,aAAa,CAAC,OAAO,EAAE;wBACvB,kBAAkB;wBAClB,sBAAsB;wBACtB,uBAAuB;wBACvB,cAAc,CAAC,OAAO,EAAE;wBACxB,gBAAgB,CAAC,OAAO,EAAE;wBAC1B,sBAAsB;wBACtB,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;wBACxB,0BAA0B;wBAC1B,0BAA0B;wBAC1B,8BAA8B;wBAC9B,gCAAgC;wBAChC,8BAA8B;wBAC9B,kCAAkC;wBAClC,yCAAyC;wBACzC,0BAA0B;wBAC1B,sCAAsC;wBACtC,+BAA+B;wBAC/B;AACD,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACT,eAAe;wBACf,gBAAgB;wBAChB,sBAAsB;wBACtB,YAAY;wBACZ,mBAAmB;wBACnB,SAAS,CAAC,WAAW;AACtB;AACF,iBAAA;;;AC1GM,MAAM,iDAAiD,GAAG,kBAAkB,CAAC;AAClF,IAAA,SAAS,EAAE,8BAA8B;IACzC,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,cAAc;AACzB,CAAA,CAAC;;ACFF,MAAM,UAAU,GAAG,mBAAmB;AAEtC;AACG,KAAA,MAAM,CAAC,UAAU,EAAE,EAAE;AACrB,KAAA,SAAS,CAAC,0BAA0B,EAAE,iDAAiD,CAAC;AAEpF,MAAM,eAAe,GAAG,CAAC,UAAU;AAE1C,gBAAgB,CAAC,eAAe,CAAC;;ACZjC;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-protocol-opcua.mjs","sources":["../../protocol-opcua/address-space.service.ts","../../protocol-opcua/opcua-address-space-detail.component.ts","../../protocol-opcua/opcua-address-space-detail.component.html","../../protocol-opcua/opcuaService.ts","../../protocol-opcua/opcua-agent.guard.ts","../../protocol-opcua/opcua-device-protocol-browse-path-validation.directive.ts","../../protocol-opcua/dynamic-data-source.ts","../../protocol-opcua/opcua-address-space-tree.component.ts","../../protocol-opcua/opcua-address-space-tree.component.html","../../protocol-opcua/opcua-address-space.component.ts","../../protocol-opcua/opcua-address-space.component.html","../../protocol-opcua/opcua-auto-apply-settings.component.ts","../../protocol-opcua/opcua-auto-apply-settings.component.html","../../protocol-opcua/opcua-device-protocol-data-reporting.component.ts","../../protocol-opcua/opcua-device-protocol-data-reporting.html","../../protocol-opcua/opcua-device-protocol-description.component.ts","../../protocol-opcua/opcua-device-protocol-description.html","../../protocol-opcua/mappings/custom-action-mapping.ts","../../protocol-opcua/mappings/default-mappings.ts","../../protocol-opcua/opcua-device-protocol-object-mapping-status-icon.component.ts","../../protocol-opcua/opcua-device-protocol-mapping.component.ts","../../protocol-opcua/opcua-device-protocol-mapping.html","../../protocol-opcua/opcua-device-protocol-detail.component.ts","../../protocol-opcua/opcua-device-protocol-detail.html","../../protocol-opcua/opcua-microservice.guard.ts","../../protocol-opcua/opcua-server.interface.ts","../../protocol-opcua/opcua-server-config.component.ts","../../protocol-opcua/opcua-server-config.component.html","../../protocol-opcua/opcua-server-list.component.ts","../../protocol-opcua/opcua-server-list.component.html","../../protocol-opcua/opcua-server.guard.ts","../../protocol-opcua/opcua-servers.component.ts","../../protocol-opcua/opcua-servers.component.html","../../protocol-opcua/opcua-protocol.module.ts","../../protocol-opcua/ng1/downgraded.components.ts","../../protocol-opcua/ng1/index.ts","../../protocol-opcua/c8y-ngx-components-protocol-opcua.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { FetchClient, IFetchOptions } from '@c8y/client';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable()\nexport class AddressSpaceService {\n private nodeNavigationData$: BehaviorSubject<NodeNavigationData>;\n private client: FetchClient;\n private microserviceUrl: string;\n private header: any;\n\n constructor(fetchClient: FetchClient) {\n this.client = fetchClient;\n this.microserviceUrl = '/service/opcua-mgmt-service/address-space';\n this.header = { 'Content-Type': 'application/json' };\n this.nodeNavigationData$ = new BehaviorSubject<NodeNavigationData>({\n node: undefined,\n selectedAncestorIds: []\n });\n }\n\n resetTreeToRootNode() {\n this.triggerNodeToOpen({ node: undefined, selectedAncestorIds: [] });\n }\n\n triggerNodeToOpen(nodeNavigationData: NodeNavigationData) {\n this.nodeNavigationData$.next(nodeNavigationData);\n }\n\n getNodeNavData$(): Observable<NodeNavigationData> {\n return this.nodeNavigationData$.asObservable();\n }\n\n getNode(serverId: string, nodeId?: string) {\n if (serverId && serverId.length > 0) {\n if (nodeId && nodeId.length > 0) {\n return this.getNodeById(serverId, nodeId);\n }\n return this.getRootNode(serverId);\n }\n }\n\n getRootNode(serverId: string) {\n if (serverId && serverId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.microserviceUrl}/${serverId}`, options);\n }\n }\n\n getNodeById(serverId: string, nodeId: string) {\n if (serverId && nodeId && serverId.length > 0 && nodeId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n const param = encodeURIComponent(nodeId);\n return this.client.fetch(`${this.microserviceUrl}/${serverId}?nodeId=${param}`, options);\n }\n }\n\n getChildrenOf(node: AddressSpaceNode, serverId: string) {\n if (serverId && node.nodeId && serverId.length > 0 && node.nodeId.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n const param = encodeURIComponent(node.nodeId);\n return this.client.fetch(\n `${this.microserviceUrl}/${serverId}/children?nodeId=${param}`,\n options\n );\n }\n }\n\n childrenAvailable(nodeReferences: AdressSpaceNodeReference[]): boolean {\n if (!nodeReferences || nodeReferences.length === 0) {\n return false;\n }\n return nodeReferences.some(ref => !ref.inverse && ref.hierarchical);\n }\n\n async getSearchedNodes(searchKey: string, serverId: string) {\n const url = `service/opcua-mgmt-service/search/${serverId}/`;\n const options: IFetchOptions = {\n headers: this.header,\n params: {\n searchString: '*' + searchKey + '*'\n }\n };\n const res = await this.client.fetch(url, options);\n return res.json();\n }\n\n getIcon(nodeClassName: string) {\n const iconList = {\n Object: 'cube',\n Variable: 'th-list',\n Method: 'random',\n View: 'window-maximize',\n ObjectType: 'c8y-group',\n VariableType: 'c8y-group',\n ReferenceType: 'c8y-group',\n DataType: 'c8y-group'\n };\n return iconList[nodeClassName] || 'circle';\n }\n}\n\nexport interface AddressSpaceNode {\n nodeId: string;\n currentlyLoadingChildren?: boolean;\n nodeClass?: number;\n nodeClassName?: string;\n browseName?: string;\n displayName?: string;\n description?: any;\n references?: AdressSpaceNodeReference[];\n ancestorNodeIds?: [string[]];\n children: AddressSpaceNode[];\n expanded: boolean;\n absolutePaths: [string[]];\n relativePath?: string[];\n parentNode?: AddressSpaceNode;\n}\n\nexport interface AdressSpaceNodeReference {\n referenceId: string;\n targetId: string;\n inverse: boolean;\n hierarchical: boolean;\n}\n\nexport interface SearchedNode {\n absolutePath: string[];\n ancestorNodeIds: [string[]];\n displayName: string;\n nodeClassName: string;\n nodeId: string;\n}\n\nexport interface NodeNavigationData {\n node: AddressSpaceNode;\n selectedAncestorIds: string[];\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { AddressSpaceNode, AddressSpaceService, NodeNavigationData } from './address-space.service';\nimport { omit } from 'lodash-es';\nimport { NgClass, NgFor, NgIf, JsonPipe, KeyValuePipe } from '@angular/common';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'opcua-address-space-detail',\n templateUrl: './opcua-address-space-detail.component.html',\n imports: [NgClass, NgFor, NgIf, C8yTranslatePipe, JsonPipe, KeyValuePipe]\n})\nexport class OpcuaAddressSpaceDetailComponent {\n @Input() set node(n) {\n this._node = n;\n if (n) {\n this.setNodeData(n);\n } else {\n // remove details from current view\n this.showDetails = false;\n }\n }\n nodeDataAttr: Map<string, string>;\n nodeDataRef: object[];\n selected = false;\n showDetails = false;\n\n @Output() toggleAttrDetail: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n\n private _node: AddressSpaceNode;\n\n constructor(private addressSpaceService: AddressSpaceService) {}\n setNodeData(nodeData) {\n this.showDetails = true;\n const { attributes, references } = nodeData;\n this.nodeDataRef = references;\n const omitList = [\n 'attributes',\n 'references',\n 'children',\n 'currentlyLoadingChildren',\n 'expanded',\n 'browsePath',\n 'relativePath',\n 'parentNode'\n ];\n this.nodeDataAttr = Object.assign({}, attributes, omit(nodeData, omitList));\n }\n\n toggleDetail(node) {\n this.showDetails = !this.showDetails;\n this.toggleAttrDetail.emit(node);\n }\n\n navigateTo(ancestors: string[]) {\n const nodeNavData: NodeNavigationData = {\n node: this._node,\n selectedAncestorIds: ancestors\n };\n\n this.toggleDetail(this._node);\n this.addressSpaceService.triggerNodeToOpen(nodeNavData);\n }\n}\n","<div\n class=\"card m-b-4 split-row-2 animated fast pointer-all\"\n [ngClass]=\"{ fadeInRightBig: showDetails, fadeOutRightBig: !showDetails }\"\n>\n <div class=\"card-header separator\">\n <h4>{{ 'Attributes' | translate }}</h4>\n <button\n class=\"close m-l-auto visible-sm visible-xs\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"toggleDetail(nodeDataAttr)\"\n >\n ×\n </button>\n </div>\n <div\n class=\"card-inner-scroll\"\n tabindex=\"0\"\n >\n <div\n class=\"card-block\"\n tabindex=\"-1\"\n >\n <table class=\"table table-striped table-condensed\">\n <colgroup>\n <col width=\"50%\" />\n <col width=\"50%\" />\n </colgroup>\n <thead>\n <tr>\n <th>{{ 'Attribute' | translate }}</th>\n <th>{{ 'Value' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of nodeDataAttr | keyvalue\">\n <td>{{ item.key }}</td>\n <td\n class=\"text-break-word\"\n *ngIf=\"item.key === 'absolutePaths'\"\n >\n {{ item.value | json }}\n </td>\n <td\n class=\"text-break-word\"\n *ngIf=\"item.key === 'ancestorNodeIds'\"\n >\n <a\n *ngFor=\"let value of item.value\"\n (click)=\"navigateTo(value)\"\n >\n {{ value | json }}\n </a>\n </td>\n <td *ngIf=\"item.key !== 'absolutePaths' && item.key !== 'ancestorNodeIds'\">\n {{ item.value }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n<div\n class=\"card split-row-2 animated fast pointer-all\"\n style=\"height: calc(50% - 4px)\"\n [ngClass]=\"{ fadeInRightBig: showDetails, fadeOutRightBig: !showDetails }\"\n>\n <div class=\"card-header separator\">\n <h4>{{ 'References' | translate }}</h4>\n </div>\n <div\n class=\"card-inner-scroll\"\n tabindex=\"0\"\n >\n <div\n class=\"card-block\"\n tabindex=\"-1\"\n >\n <table class=\"table table-striped table-condensed\">\n <colgroup>\n <col width=\"50%\" />\n <col width=\"50%\" />\n </colgroup>\n <thead>\n <tr>\n <th>{{ 'Attribute' | translate }}</th>\n <th>{{ 'Value' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of nodeDataRef\">\n <td>{{ item.referenceLabel }}</td>\n <td class=\"text-break-word\">{{ item.targetLabel }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n FetchClient,\n IFetchOptions,\n IFetchResponse,\n InventoryBinaryService,\n InventoryService\n} from '@c8y/client';\nimport { AlertService } from '@c8y/ngx-components';\nimport { OpcuaServer } from './opcua-server.interface';\n\n@Injectable()\nexport class OpcuaService {\n private binaryService: InventoryBinaryService;\n private microserviceUrlDepr: string;\n private microserviceUrl: string;\n private deviceTypeProtocolUrl: string;\n private header: any;\n\n constructor(\n private client: FetchClient,\n private inventoryService: InventoryService,\n private router: Router,\n private alertService: AlertService\n ) {\n this.microserviceUrl = '/service/opcua-mgmt-service';\n this.microserviceUrlDepr = '/service/opcua-mgmt-service/server';\n this.deviceTypeProtocolUrl = '/service/opcua-mgmt-service/deviceTypes';\n this.header = { 'Content-Type': 'application/json' };\n this.binaryService = inventoryService.binary;\n }\n createServer(data: OpcuaServer) {\n if (this.doesGatewayIdExist(data)) {\n this.cleanUpPayload(data);\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.microserviceUrlDepr}`, options);\n }\n }\n\n async updateServer(server: OpcuaServer) {\n if (this.doesGatewayIdExist(server) && this.doesIdExist(server)) {\n this.cleanUpPayload(server);\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(server)\n };\n const res = await this.client.fetch(`${this.microserviceUrlDepr}`, options);\n let data;\n try {\n data = await res.json();\n } catch (e) {\n // nothing\n }\n\n if (res.status !== 200) {\n this.alertService.addServerFailure({ data, res });\n } else {\n return data;\n }\n }\n }\n\n removeServer(data: OpcuaServer) {\n if (this.doesGatewayIdExist(data) && this.doesIdExist(data)) {\n const options: IFetchOptions = {\n method: 'DELETE'\n };\n return this.client.fetch(`${this.microserviceUrlDepr}/${data.gatewayId}/${data.id}`, options);\n }\n }\n\n getKeystore(binaryId: string) {\n if (binaryId && binaryId.length > 0) {\n return this.inventoryService.detail(binaryId);\n }\n return null;\n }\n\n uploadKeystore(file: File) {\n if (file && file.size > 0) {\n return this.binaryService.create(file);\n }\n return Promise.reject('Invalid file');\n }\n\n async updateKeystore(id: string, file: File) {\n if (id && id.length > 0 && file && file.size > 0) {\n const { res } = await this.removeKeystore(id);\n if (res && res.status === 204) {\n return this.uploadKeystore(file);\n }\n }\n return Promise.reject('Invalid file');\n }\n\n removeKeystore(id: string) {\n if (id && id.length > 0) {\n return this.binaryService.delete(id);\n }\n }\n\n getMoId() {\n const currentUrl: string = this.router.routerState.snapshot.url;\n const isDevice: boolean = new RegExp(/device\\/\\d+/).test(currentUrl);\n if (isDevice) {\n return currentUrl.match(/\\d+/)[0];\n }\n return '';\n }\n\n getId() {\n const currentUrl: string = this.router.routerState.snapshot.url;\n const isDeviceprotocol: boolean = new RegExp(/deviceprotocols/).test(currentUrl);\n if (isDeviceprotocol && RegExp(/\\d+$/).test(currentUrl)) {\n return currentUrl.match(/\\d+$/)[0];\n }\n }\n\n async getDeviceProtocol(id: string) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}/${id}`, options);\n }\n\n async updateDeviceProtocol(data) {\n const options: IFetchOptions = {\n method: 'PUT',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}/${data.id}`, options);\n }\n\n async createDeviceProtocol(data) {\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify(data)\n };\n return this.client.fetch(`${this.deviceTypeProtocolUrl}`, options);\n }\n\n getServers(id: string) {\n if (id && id.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client.fetch(`${this.microserviceUrlDepr}/${id}`, options);\n }\n }\n\n getServer(id: string): Promise<IFetchResponse> {\n if (id && id.length > 0) {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.header\n };\n return this.client\n .fetch(`${this.microserviceUrl}/servers/${id}`, options)\n .then(this.handleErrorStatusCodes);\n }\n }\n\n /**\n * Checks the response for errors and throws exceptions, otherwise returns the response as is.\n *\n * @param response The response from server.\n *\n * @returns If no errors are detected, it returns the same response.\n *\n * @throws If an error is detected, it throws `{ res, data }`, where `data` contains error details from server.\n */\n\n protected async handleErrorStatusCodes(response: IFetchResponse): Promise<IFetchResponse> {\n if (response.status >= 400) {\n let data = null;\n try {\n data = await response.json();\n } catch (ex) {\n try {\n data = await response.text();\n } catch (ex) {\n // do nothing\n }\n }\n throw { res: response, data };\n }\n return response;\n }\n\n private doesGatewayIdExist(data: OpcuaServer) {\n return data && data.gatewayId && data.gatewayId.length > 0;\n }\n\n private doesIdExist(data: OpcuaServer) {\n return data && data.id && data.id.length > 0 && data.id !== 'new';\n }\n\n private cleanUpPayload(data: OpcuaServer) {\n if (data) {\n if (data.id && data.id === 'new') {\n delete data.id;\n }\n if (data.quickInfo) {\n delete data.quickInfo;\n }\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class OpcuaAgentGuard {\n type = 'c8y_OPCUA_Device_Agent';\n canActivate({ data }) {\n const { contextData } = data;\n return contextData && contextData.type === this.type;\n }\n}\n","import { Directive, forwardRef, ElementRef, Input } from '@angular/core';\nimport { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms';\nimport { some, isEqual, isEmpty } from 'lodash-es';\n\n@Directive({\n selector: '[c8yBrowsePathValidator][ngModel]',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => OpcuaDeviceProtocolBrowsePathValidation),\n multi: true\n }\n ]\n})\nexport class OpcuaDeviceProtocolBrowsePathValidation implements Validator {\n @Input() getMappings: () => [];\n @Input() model: any;\n\n constructor(private el: ElementRef) {}\n\n validate(control: AbstractControl): { [key: string]: any } {\n if (control.value) {\n if (!this.isValidJson(control.value)) {\n return { invalidBrowsePathNotation: true };\n } else {\n if (this.isBrowsePathUnique(control.value)) {\n return { browsePathNotUnique: true };\n }\n }\n }\n return null;\n }\n\n isValidJson(value) {\n try {\n const browsePath = JSON.parse(value);\n return !isEmpty(browsePath);\n } catch (error) {\n return false;\n }\n }\n\n toArray(str) {\n return JSON.parse(str);\n }\n\n isBrowsePathUnique(value): boolean {\n const mappings = this.getMappings();\n const found = some(mappings, item => {\n if (isEqual(item.browsePath, this.toArray(value)) && item.id !== this.model.id) {\n return item;\n }\n });\n return found ? true : false;\n }\n}\n","import { BehaviorSubject, Observable, merge } from 'rxjs';\nimport { NestedTreeControl } from '@angular/cdk/tree';\nimport { CollectionViewer, SelectionChange } from '@angular/cdk/collections';\nimport { AddressSpaceService, AddressSpaceNode } from './address-space.service';\nimport { map } from 'rxjs/operators';\n\nexport class DynamicDataSource {\n dataChange = new BehaviorSubject<AddressSpaceNode[]>([]);\n\n get data(): AddressSpaceNode[] {\n return this.dataChange.value;\n }\n set data(value: AddressSpaceNode[]) {\n this.treeControl.dataNodes = value;\n this.dataChange.next(value);\n }\n\n constructor(\n public treeControl: NestedTreeControl<AddressSpaceNode>,\n private addressSpaceService: AddressSpaceService,\n private serverId: string\n ) {\n this.treeControl.isExpanded = (node: AddressSpaceNode) => node.expanded;\n }\n\n connect(collectionViewer: CollectionViewer): Observable<AddressSpaceNode[]> {\n this.treeControl.expansionModel.changed.subscribe(\n (change: SelectionChange<AddressSpaceNode>) => {\n if (change.added || change.removed) {\n this.handleTreeControl(change);\n }\n }\n );\n return merge(collectionViewer.viewChange, this.dataChange).pipe(map(() => this.data));\n }\n\n /** Handle expand/collapse behaviors */\n handleTreeControl(change: SelectionChange<AddressSpaceNode>) {\n if (change.added) {\n change.added.forEach(node => this.toggleNode(node, true));\n }\n if (change.removed) {\n change.removed\n .slice()\n .reverse()\n .forEach(node => this.toggleNode(node, false));\n }\n }\n\n /**\n * Toggle the node, remove from display list\n */\n async toggleNode(addressSpaceNode: AddressSpaceNode, expand: boolean) {\n if (!addressSpaceNode.children || addressSpaceNode.children.length === 0) {\n addressSpaceNode.currentlyLoadingChildren = true;\n\n const res = await this.addressSpaceService.getChildrenOf(addressSpaceNode, this.serverId);\n const children = (await res.json()) as AddressSpaceNode[];\n\n addressSpaceNode.children = children || [];\n addressSpaceNode.children = addressSpaceNode.children.map((node: AddressSpaceNode) => {\n node.parentNode = addressSpaceNode;\n return node;\n });\n addressSpaceNode.currentlyLoadingChildren = false;\n\n this.treeControl.expand(addressSpaceNode);\n }\n\n addressSpaceNode.expanded = expand && addressSpaceNode.children.length > 0;\n this.refreshNestedTree(this.data);\n\n return Promise.resolve(addressSpaceNode);\n }\n catch() {\n // do nothing\n }\n\n private refreshNestedTree(treeData: AddressSpaceNode[]) {\n // necessary to rerender tree, otherwise new nodes will not\n // appear, but they are added to the list.\n this.data = [];\n this.dataChange.next(treeData);\n this.triggerResize(); // to resize the modal window when creating a new device protocol\n }\n\n private triggerResize() {\n setTimeout(() => {\n try {\n window.dispatchEvent(new Event('resize'));\n } catch (error) {\n // do nothing\n }\n }, 200);\n }\n}\n","import {\n NestedTreeControl,\n CdkTree,\n CdkTreeNodeDef,\n CdkNestedTreeNode,\n CdkTreeNodeToggle,\n CdkTreeNodeOutlet\n} from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport {\n AlertService,\n IconDirective,\n LoadingComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { clone } from 'lodash';\nimport { Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { AddressSpaceNode, AddressSpaceService, NodeNavigationData } from './address-space.service';\nimport { DynamicDataSource } from './dynamic-data-source';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgClass } from '@angular/common';\n\n@Component({\n selector: 'opcua-address-space-tree',\n templateUrl: './opcua-address-space-tree.component.html',\n imports: [\n NgIf,\n CdkTree,\n CdkTreeNodeDef,\n CdkNestedTreeNode,\n NgClass,\n IconDirective,\n CdkTreeNodeToggle,\n CdkTreeNodeOutlet,\n LoadingComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAddressSpaceTreeComponent implements OnInit, OnDestroy, OnChanges {\n @Input()\n set moId(id: string) {\n this._moId = id || undefined;\n }\n\n @Input() node;\n @Input() focusEmitter: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n @Output() selectedNode: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n nestedTreeControl: NestedTreeControl<AddressSpaceNode>;\n dataSource: DynamicDataSource = null;\n focused: AddressSpaceNode;\n loading = false;\n subscriptionRef: Subscription;\n nodeNavDataSubscription: Subscription;\n private _moId: string;\n private destroy$: Subject<void> = new Subject<void>();\n\n constructor(\n private addressSpaceService: AddressSpaceService,\n private opcuaService: OpcuaService,\n private alertService: AlertService\n ) {}\n\n getChildren = (node: AddressSpaceNode) => (node.expanded ? node.children : []);\n hasChild = (_: number, _nodeData: AddressSpaceNode) =>\n this.addressSpaceService.childrenAvailable(_nodeData.references);\n\n ngOnInit() {\n this.initializeDataSet();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes.moId &&\n changes.moId.previousValue &&\n changes.moId.currentValue !== changes.moId.previousValue\n ) {\n this.initializeDataSet();\n }\n }\n\n initializeDataSet() {\n this.nodeNavDataSubscription = this.addressSpaceService\n .getNodeNavData$()\n .pipe(takeUntil(this.destroy$))\n .subscribe(nodeNavData => this.openNode(nodeNavData));\n this.subscriptionRef = this.focusEmitter.subscribe(node => {\n this.focused = this.isFocusedNode(node) ? undefined : node;\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n // clean up the address-space-tree\n this.addressSpaceService.resetTreeToRootNode();\n\n if (this.nodeNavDataSubscription && !this.nodeNavDataSubscription.closed) {\n this.nodeNavDataSubscription.unsubscribe();\n }\n\n if (this.subscriptionRef && !this.subscriptionRef.closed) {\n this.subscriptionRef.unsubscribe();\n }\n }\n\n async openNode(nodeNavData: NodeNavigationData) {\n const { node, selectedAncestorIds } = nodeNavData;\n let nodeId;\n\n // We just set the nodeId when the selectedAncestorIds variable an empty array.\n // If selectedAncestorIds contain any id we assume that the tree should be travsersed beginning\n // from the root node.\n if (node && node.nodeId && selectedAncestorIds && selectedAncestorIds.length === 0) {\n nodeId = node.nodeId;\n }\n // Always recreate the tree when routing to a specific nested node,\n // because previous modifications to the tree-structure could cause errors\n // while traversing with 'old' tree-data\n // -----------------\n // setupTree is able to handle nodeId = undefined\n await this.setupTree(nodeId);\n\n if (!selectedAncestorIds || selectedAncestorIds.length === 0) {\n return;\n }\n\n if (nodeNavData && this.dataSource) {\n const clonedAncestors = clone(selectedAncestorIds);\n clonedAncestors.shift();\n\n const n = await this.dataSource.toggleNode(this.dataSource.data[0], true);\n this.setChildNodes(n.children, clonedAncestors);\n\n this.toggleFocusedNode(node);\n }\n }\n\n setChildNodes(nodes: AddressSpaceNode[], ids: string[]) {\n if (nodes) {\n ids.forEach(async id => {\n const match = nodes.find(n => n.nodeId === id);\n if (match && ids.length > 0) {\n const idx = ids.findIndex(value => value === id);\n if (idx >= 0) {\n ids.splice(idx, 1);\n }\n const toggledNode = await this.dataSource.toggleNode(match, true);\n this.setChildNodes(toggledNode.children, ids);\n }\n });\n }\n }\n\n async setupTree(nodeId?: string) {\n this.loading = true;\n\n if (!this._moId || this._moId.length === 0) {\n this._moId = this.opcuaService.getMoId();\n }\n\n // addressSpaceService.getNode returns either the root node of the server (moId)\n // or if nodeId !== undefined the node with given nodeId\n const res = await this.addressSpaceService.getNode(this._moId, nodeId);\n if (res) {\n if (res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n this.dataSource = undefined;\n } else {\n const rootNode = (await res.json()) as AddressSpaceNode;\n this.nestedTreeControl = new NestedTreeControl<AddressSpaceNode>(this.getChildren);\n this.dataSource = new DynamicDataSource(\n this.nestedTreeControl,\n this.addressSpaceService,\n this._moId\n );\n this.dataSource.data = [rootNode];\n }\n this.loading = false;\n } else {\n this.loading = false;\n }\n }\n\n getMoId() {\n if (!this._moId || this._moId.length === 0) {\n return this.opcuaService.getMoId();\n }\n return this._moId;\n }\n\n getIcon(nodeClassName) {\n return this.addressSpaceService.getIcon(nodeClassName);\n }\n\n toggleFocusedNode(node) {\n const relativePath = [];\n this.getRelativePath(node, relativePath);\n node.relativePath = relativePath;\n\n this.selectedNode.emit(node);\n this.focused = this.isFocusedNode(node) ? undefined : node;\n }\n\n isFocusedNode(node: AddressSpaceNode) {\n if (this.focused) {\n return node.nodeId === this.focused.nodeId;\n }\n return false;\n }\n\n private getRelativePath(node: AddressSpaceNode, relativePath: string[]) {\n if (node.parentNode) {\n relativePath.unshift(node.browseName);\n this.getRelativePath(node.parentNode, relativePath);\n }\n }\n}\n","<div\n class=\"card-block\"\n *ngIf=\"dataSource && !loading\"\n>\n <cdk-tree\n [dataSource]=\"dataSource\"\n [treeControl]=\"nestedTreeControl\"\n >\n <!-- This is the tree node template for leaf nodes -->\n <cdk-nested-tree-node\n class=\"interact\"\n *cdkTreeNodeDef=\"let node\"\n (click)=\"toggleFocusedNode(node)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n >\n <span>\n <i\n class=\"m-r-4 interact\"\n [c8yIcon]=\"getIcon(node.nodeClassName)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n ></i>\n {{ node.displayName }}\n </span>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node; when: hasChild\">\n <div role=\"group\">\n <div class=\"d-flex a-i-center\">\n <button\n class=\"btn-clean text-primary m-r-4\"\n title=\"{{ 'Expand node' | translate }}\"\n cdkTreeNodeToggle\n [disabled]=\"node.currentlyLoadingChildren\"\n >\n <i\n [ngClass]=\"{\n 'dlt-c8y-icon-plus-square': !node.expanded,\n 'dlt-c8y-icon-minus-square': node.expanded\n }\"\n ></i>\n </button>\n <i\n class=\"m-r-4 interact\"\n [c8yIcon]=\"getIcon(node.nodeClassName)\"\n ></i>\n <span\n class=\"interact\"\n (click)=\"toggleFocusedNode(node)\"\n [ngClass]=\"{ strong: isFocusedNode(node) }\"\n >\n {{ node.displayName }}\n </span>\n <span\n class=\"m-l-4\"\n [style.visibility]=\"node.currentlyLoadingChildren ? 'visible' : 'hidden'\"\n >\n <i class=\"dlt-c8y-icon-circle-o-notch icon-spin\"></i>\n </span>\n </div>\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n<div\n class=\"p-t-8\"\n *ngIf=\"loading\"\n>\n <c8y-loading></c8y-loading>\n</div>\n<div\n class=\"alert alert-info m-t-16\"\n *ngIf=\"!dataSource && !loading\"\n translate\n>\n No source data available to fetch address space.\n</div>\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n OnDestroy,\n OnInit,\n Output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IOperation, OperationService, OperationStatus } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ModalService,\n OperationRealtimeService,\n IconDirective,\n LoadingComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { filter, map } from 'rxjs/operators';\nimport { AddressSpaceNode, AddressSpaceService } from './address-space.service';\nimport { DynamicDataSource } from './dynamic-data-source';\nimport { OpcuaServer, OpcuaServerConfig } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgFor, NgClass } from '@angular/common';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { FormsModule } from '@angular/forms';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaAddressSpaceDetailComponent } from './opcua-address-space-detail.component';\n\n@Component({\n selector: 'opcua-address-space',\n templateUrl: './opcua-address-space.component.html',\n imports: [\n NgIf,\n OperationDetailsComponent,\n FormsModule,\n IconDirective,\n LoadingComponent,\n NgFor,\n NgClass,\n OpcuaAddressSpaceTreeComponent,\n OpcuaAddressSpaceDetailComponent,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAddressSpaceComponent implements OnInit, OnDestroy {\n currentNode: AddressSpaceNode;\n selectednode = false;\n searchKey: string;\n isSearch: boolean;\n loading = false;\n searchInProgress = false;\n filterLabel: string;\n dataSource: DynamicDataSource;\n nodeList;\n operation?: IOperation;\n isOperationRunning = signal(false);\n destroyRef = inject(DestroyRef);\n\n @Output() focusStatus: EventEmitter<AddressSpaceNode> = new EventEmitter<AddressSpaceNode>();\n private moId = '';\n constructor(\n private addressSpaceService: AddressSpaceService,\n private opcuaService: OpcuaService,\n private operationService: OperationService,\n private operationRealtimeService: OperationRealtimeService,\n private alert: AlertService,\n private modalService: ModalService\n ) {}\n\n async ngOnInit() {\n this.filterLabel = gettext('Filter…');\n this.moId = this.opcuaService.getMoId();\n\n this.operation = await this.getRunningScanAddressSpaceOperation();\n this.isOperationRunning.set(!!this.operation);\n\n this.operationRealtimeService\n .onAll$(this.moId)\n .pipe(\n map(({ data }) => data as IOperation),\n filter(operation => operation.c8y_ua_command_ScanAddressSpace),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(operation => {\n this.operation = operation;\n this.isOperationRunning.set(\n operation.status == OperationStatus.EXECUTING ||\n operation.status == OperationStatus.PENDING\n );\n if (operation.status == OperationStatus.SUCCESSFUL) {\n this.addressSpaceService.resetTreeToRootNode();\n }\n });\n }\n\n async getRunningScanAddressSpaceOperation(): Promise<IOperation | undefined> {\n const filter: object = {\n deviceId: this.moId,\n fragmentType: 'c8y_ua_command_ScanAddressSpace',\n dateFrom: new Date(0).toISOString(),\n revert: true,\n pageSize: 1\n };\n const [operation] = (await this.operationService.list(filter)).data ?? [];\n\n return operation?.status == OperationStatus.EXECUTING ||\n operation?.status == OperationStatus.PENDING\n ? operation\n : undefined;\n }\n\n ngOnDestroy() {\n // The BehaviourSubject will store the last array of ancestorNodes from the previous search\n // this would cause the component while subscribing in the init-phase to the subject to travers\n // to the last searched node again. From user perspective it does not make sense, because the user\n // left the Address space (tab) and should loose the context and just request a new search or\n // browse the tree manually.\n this.addressSpaceService.resetTreeToRootNode();\n }\n\n async searchNodes() {\n this.searchInProgress = true;\n this.clearNodeListAndCheckSearchString();\n if (this.isSearch) {\n this.currentNode = undefined;\n this.nodeList = await this.addressSpaceService.getSearchedNodes(this.searchKey, this.moId);\n this.searchInProgress = false;\n this.nodeList.resultLabel = gettext('Results found');\n }\n }\n\n clearNodeListAndCheckSearchString() {\n this.isSearch = this.searchKey !== undefined && this.searchKey !== '' ? true : false;\n if (!this.isSearch) {\n this.searchInProgress = false;\n }\n }\n\n clearSearch() {\n this.isSearch = false;\n this.searchKey = '';\n this.currentNode = undefined;\n }\n\n getIcon(nodeClassName: string) {\n return this.addressSpaceService.getIcon(nodeClassName);\n }\n\n async selectNode(node) {\n if (node && node.nodeId && node.nodeId.length > 0) {\n const res = await this.addressSpaceService.getNodeById(this.moId, node.nodeId);\n this.toggleCurrentNode((await res.json()) as AddressSpaceNode);\n }\n }\n\n toggleCurrentNode(node: AddressSpaceNode) {\n this.currentNode = this.isNodeSet(node) ? undefined : node;\n }\n\n backHandler(node) {\n this.isSearch = false;\n this.focusStatus.emit(node);\n this.toggleCurrentNode(node);\n }\n\n isNodeSet(node: AddressSpaceNode) {\n if (this.currentNode !== undefined && this.currentNode.nodeId === node.nodeId) {\n return true;\n }\n return false;\n }\n async rescanAddressSpace() {\n const serverResponse = await this.opcuaService.getServer(this.moId);\n const server = (await serverResponse.json()) as OpcuaServer;\n let warning: string = gettext(\n 'Rescanning address space from root node might take several hours. Do you want to proceed?'\n );\n\n if (server) {\n if (server.config.partialAddressScan && !isEmpty(server.config.partialAddressScanNodeIds)) {\n warning = gettext(\n 'Rescanning from nodes ' +\n server.config.partialAddressScanNodeIds?.join(';') +\n '. Address space rescan might take several hours. Do you want to proceed?'\n );\n }\n }\n\n const doit = await this.modalService.confirm(\n gettext('Rescan address space'),\n warning,\n 'warning',\n { ok: gettext('Rescan'), cancel: gettext('Cancel') }\n );\n if (!doit) {\n return;\n }\n\n const operation = await this.createConfigurationAwareScanAdressSpaceOperation(server.config);\n try {\n this.operation = (await this.operationService.create(operation)).data;\n this.isOperationRunning.set(true);\n } catch (error) {\n this.alert.add({\n text: gettext('Error creating rescan operation'),\n detailedData: error,\n type: 'danger',\n timeout: 8000\n });\n this.isOperationRunning.set(false);\n }\n }\n\n async createConfigurationAwareScanAdressSpaceOperation(\n config: OpcuaServerConfig\n ): Promise<IOperation> {\n const result: IOperation = {\n deviceId: this.moId,\n description: gettext('[RESCAN] Address space import from Root node'),\n c8y_ua_command_ScanAddressSpace: {\n skipSync: false\n }\n };\n\n if (config) {\n if (config.partialAddressScan && config.partialAddressScanNodeIds) {\n const nodeIds = config.partialAddressScanNodeIds;\n result.c8y_ua_command_ScanAddressSpace.nodeIds = config.partialAddressScanNodeIds;\n result.description = gettext(`[RESCAN] Address space from node[s] ${nodeIds.join(';')}`);\n }\n }\n return result;\n }\n}\n","<div class=\"row split-scroll\">\n <div class=\"col-md-5 col-xs-12 scroll-column no-gutter-r\">\n <div class=\"card bg-level-2 split-scroll overflow-auto\">\n <div class=\"flex-grow\">\n <fieldset\n class=\"card-block large-padding bg-level-2 p-0\"\n id=\"operation-block\"\n *ngIf=\"!!operation\"\n >\n <c8y-operation-details [operation]=\"operation\"></c8y-operation-details>\n </fieldset>\n </div>\n <div class=\"card-block separator sticky-top\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ filterLabel | translate }}\"\n type=\"search\"\n (keydown.enter)=\"searchNodes()\"\n [(ngModel)]=\"searchKey\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"submit\"\n *ngIf=\"!isSearch\"\n (click)=\"searchNodes()\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Clear`input`' | translate }}\"\n type=\"button\"\n *ngIf=\"isSearch\"\n (click)=\"clearSearch()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n <div\n class=\"p-t-16\"\n *ngIf=\"isSearch && !loading\"\n >\n <p *ngIf=\"!searchInProgress\">\n <em>{{ nodeList.resultLabel | translate }}</em>\n \n <span class=\"badge badge-info\">{{ nodeList?.length }}</span>\n </p>\n </div>\n </div>\n\n <div\n class=\"p-t-8\"\n *ngIf=\"(isSearch && loading) || searchInProgress\"\n >\n <c8y-loading></c8y-loading>\n </div>\n\n <div\n class=\"inner-scroll\"\n *ngIf=\"isSearch && !loading && !searchInProgress\"\n >\n <div\n class=\"list-group list-group-links\"\n *ngIf=\"isSearch && !loading\"\n >\n <button\n *ngFor=\"let nodeItem of nodeList\"\n (click)=\"selectNode(nodeItem)\"\n [ngClass]=\"{ 'list-group-item d-flex': true }\"\n >\n <div class=\"list-group-icon m-r-4\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"getIcon(nodeItem.nodeClassName)\"\n ></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <span tile=\"nodeId\">{{ nodeItem.nodeId }}</span>\n {{ nodeItem.displayName }}\n </div>\n </button>\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n *ngIf=\"!isSearch\"\n >\n <opcua-address-space-tree\n (selectedNode)=\"toggleCurrentNode($event)\"\n [focusEmitter]=\"focusStatus\"\n ></opcua-address-space-tree>\n </div>\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n [class.btn-pending]=\"isOperationRunning()\"\n type=\"button\"\n (click)=\"rescanAddressSpace()\"\n [disabled]=\"isOperationRunning()\"\n >\n {{ 'Rescan' | translate }}\n </button>\n </div>\n </div>\n </div>\n <opcua-address-space-detail\n class=\"col-md-7 col-xs-12 scroll-column no-gutter-l no-pointer\"\n [node]=\"currentNode\"\n (toggleAttrDetail)=\"backHandler($event)\"\n ></opcua-address-space-detail>\n</div>\n","import { Component, Input, OnInit, EventEmitter } from '@angular/core';\nimport { AutoApplyConstraints } from './opcua-protocol-device-type.interface';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yTranslateDirective,\n FormGroupComponent,\n SelectLegacyComponent,\n ListItemComponent,\n FilterInputComponent,\n ListItemBodyComponent,\n ListItemCheckboxComponent,\n InputGroupListContainerDirective,\n InputGroupListComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { reject } from 'lodash-es';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n@Component({\n selector: 'opcua-auto-apply',\n templateUrl: './opcua-auto-apply-settings.component.html',\n imports: [\n C8yTranslateDirective,\n CollapseDirective,\n FormGroupComponent,\n SelectLegacyComponent,\n NgIf,\n ListItemComponent,\n FilterInputComponent,\n ListItemBodyComponent,\n NgFor,\n ListItemCheckboxComponent,\n FormsModule,\n InputGroupListContainerDirective,\n InputGroupListComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaAutoApplySettingsComponent implements OnInit {\n opcuaServers: IManagedObject[] = [];\n selectedItems: IManagedObject[] = [];\n filteredList: IManagedObject[] = [];\n checked = {};\n readonly sizeToShowFilter: number = 5;\n constraints: AutoApplyConstraints = {\n browsePathMatchesRegex: '',\n matchesNodeIds: [],\n serverObjectHasFragment: '',\n matchesServerIds: []\n };\n placeholderSelectServerIds: string = gettext('Select server IDs from list');\n showServerIds: boolean;\n showBrowsePath: boolean;\n showServerFragment: boolean;\n showRootNodes: boolean;\n updateSelectedItem: EventEmitter<boolean> = new EventEmitter();\n private _model: IManagedObject;\n\n constructor(private inventoryService: InventoryService) {}\n\n async ngOnInit() {\n const { data } = await this.inventoryService.list({\n pageSize: 1000,\n withTotalPages: true,\n type: 'c8y_OpcuaServer'\n });\n\n this.opcuaServers = data;\n this.filteredList = data;\n this.selectedItems = [];\n\n const { matchesServerIds } = this.constraints;\n\n data.forEach(server => {\n if (\n matchesServerIds &&\n matchesServerIds.length > 0 &&\n matchesServerIds.find(itemId => itemId === server.id)\n ) {\n this.selectedItems.push(server);\n this.checked[server.id] = true;\n this.showServerIds = true;\n }\n });\n }\n\n @Input() set model(model) {\n if (model && model.applyConstraints) {\n this.constraints = model.applyConstraints as AutoApplyConstraints;\n }\n this._model = model;\n }\n\n get model() {\n return this._model;\n }\n\n serverIdsSelected(items: IManagedObject[]) {\n if (this.constraints) {\n this.constraints.matchesServerIds = items.map((item: IManagedObject) => item.id);\n }\n this.selectedItems = items;\n }\n\n onChangeNodeId(event) {\n if (event.target.checked) {\n this.showRootNodes = true;\n this.add();\n } else {\n this.showRootNodes = false;\n this.constraints.matchesNodeIds = [];\n }\n }\n\n onChangeShowServerIds(event) {\n if (!event.target.checked) {\n this.constraints.matchesServerIds = [];\n this.showServerIds = false;\n this.selectedItems = [];\n this.checked = {};\n } else {\n this.showServerIds = true;\n }\n }\n\n onChangeShowBrowsePath(event) {\n if (!event.target.checked) {\n this.constraints.browsePathMatchesRegex = '';\n this.showBrowsePath = false;\n } else {\n this.showBrowsePath = true;\n }\n }\n\n onChangeShowServerFragment(event) {\n if (!event.target.checked) {\n this.constraints.serverObjectHasFragment = '';\n this.showServerFragment = false;\n } else {\n this.showServerFragment = true;\n }\n }\n\n add() {\n this.constraints.matchesNodeIds.push('');\n }\n\n remove(index) {\n this.constraints.matchesNodeIds.splice(index, 1);\n }\n\n trackByFn(index: any, _item: any) {\n return index;\n }\n\n updateConstraints(items) {\n if (this.constraints) {\n this.constraints.matchesServerIds = items.map((item: IManagedObject) => item.id);\n }\n }\n\n filterItems(filterText) {\n if (filterText.length !== 0) {\n const search = new RegExp(filterText, 'i');\n this.filteredList = this.opcuaServers.filter(({ name, id }) => {\n return search.test(name) || search.test(id);\n });\n } else {\n this.filteredList = this.opcuaServers;\n }\n }\n\n isChecked(item) {\n return this.checked[item.id];\n }\n\n onSelect(selected, item) {\n if (!selected) {\n this.selectedItems = reject(this.selectedItems, { id: item.id });\n delete this.checked[item.id];\n } else {\n this.selectedItems.push(item);\n this.checked[item.id] = selected;\n }\n this.updateSelectedItem.emit(true);\n this.updateConstraints(this.selectedItems);\n }\n}\n","<div class=\"row\">\n <div class=\"col-md-4\">\n <p translate>\n Specifying auto-apply constraints allows you to limit the scope where the device protocols are\n applied, for example by specifying a set of possible servers or node IDs.\n </p>\n <p translate>\n If no constraints are set, device protocols are applied at any fitting location on the OPC UA\n server.\n </p>\n </div>\n\n <div class=\"col-md-6\">\n <ul class=\"list-group\" style=\"box-shadow: none;\">\n <!-- Limit device type to a set of servers -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to a set of servers' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"\n constraints.matchesServerIds !== null && constraints.matchesServerIds.length > 0\n \"\n (change)=\"onChangeShowServerIds($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to a set of servers' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [collapse]=\"\n (!showServerIds &&\n (constraints.matchesServerIds !== null && constraints.matchesServerIds.length < 1)) ||\n (!showServerIds && constraints.matchesServerIds === null)\n \"\n [isAnimated]=\"true\"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <c8y-select-legacy\n [items]=\"opcuaServers\"\n [selected]=\"selectedItems\"\n [placeholder]=\"placeholderSelectServerIds\"\n (onChange)=\"serverIdsSelected($event)\"\n [updateItems]=\"updateSelectedItem\"\n >\n \n <c8y-li *ngIf=\"opcuaServers.length > sizeToShowFilter\" class=\"sticky-top\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"filterItems($event)\"></c8y-filter>\n </c8y-li>\n <c8y-li *ngIf=\"filteredList && filteredList.length === 0\">\n <c8y-li-body> \n <div class=\"c8y-empty-state text-left\">\n <p>{{ 'No items to display.' | translate }}</p>\n </div>\n </c8y-li-body>\n </c8y-li>\n <c8y-li *ngFor=\"let item of filteredList\">\n <c8y-li-checkbox\n [selected]=\"isChecked(item)\"\n (onSelect)=\"onSelect($event, item)\"\n ></c8y-li-checkbox>\n <c8y-li-body>{{ item.name | translate }}<br>\n <span class=\"text-label-small m-r-4\" translate>ID</span> <small>{{ item.id }}</small>\n </c8y-li-body>\n </c8y-li>\n </c8y-select-legacy>\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type scope in the address space -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol scope in the address space' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"\n constraints.browsePathMatchesRegex !== null &&\n constraints.browsePathMatchesRegex.length > 0\n \"\n (change)=\"onChangeShowBrowsePath($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol scope in the address space' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"\n (!showBrowsePath &&\n constraints.browsePathMatchesRegex !== null &&\n constraints.browsePathMatchesRegex.length < 1) ||\n (!showBrowsePath && constraints.browsePathMatchesRegex === null)\n \"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <input\n name=\"browsePath\"\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} /objects/devices/.*\"\n [(ngModel)]=\"constraints.browsePathMatchesRegex\"\n ngDefaultControl\n />\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type to servers with a certain fragment-->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to servers with a certain fragment' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"constraints.serverObjectHasFragment !== null && constraints.serverObjectHasFragment.length > 0\"\n (change)=\"onChangeShowServerFragment($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to servers with a certain fragment' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"(!showServerFragment && constraints.serverObjectHasFragment !== null && constraints.serverObjectHasFragment.length < 1) || (!showServerFragment && constraints.serverObjectHasFragment === null)\"\n >\n <c8y-form-group class=\"m-t-8 m-b-8\">\n <input\n name=\"serverFragment\"\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_SomeServerMarker\"\n [(ngModel)]=\"constraints.serverObjectHasFragment\"\n ngDefaultControl\n />\n </c8y-form-group>\n </div>\n </li>\n <!-- Limit device type to a specific root node ID -->\n <li class=\"list-group-item\">\n <label\n title=\"{{ 'Limit device protocol to specific root nodes ID' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"constraints.matchesNodeIds !== null && constraints.matchesNodeIds.length > 0\"\n (change)=\"onChangeNodeId($event)\"\n />\n <span></span>\n <span class=\"m-l-8\">\n {{ 'Limit device protocol to specific root nodes ID' | translate }}\n </span>\n </label>\n <div\n class=\"collapse\"\n [isAnimated]=\"true\"\n [collapse]=\"(!showRootNodes && constraints.matchesNodeIds !== null && constraints.matchesNodeIds.length < 1) || ( !showRootNodes && constraints.matchesNodeIds === null)\"\n >\n <ul c8yInputGroupListContainer class=\"list-unstyled p-t-16\">\n <li\n class=\"m-b-8\"\n *ngFor=\"let item of constraints.matchesNodeIds; let i = index; trackBy: trackByFn\"\n >\n <c8y-input-group-list [index]=\"i\" (onAdd)=\"add()\" (onRemove)=\"remove($event)\">\n <c8y-form-group class=\"form-group--tooltip-validation\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} nodeId\"\n [(ngModel)]=\"constraints.matchesNodeIds[i]\"\n [required]=\"true\"\n />\n </c8y-form-group>\n </c8y-input-group-list>\n </li>\n </ul> \n </div>\n </li>\n </ul>\n </div>\n</div>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { set, unset, toInteger } from 'lodash';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n FormGroupComponent,\n C8yTranslateDirective,\n RequiredInputPlaceholderDirective,\n MinValidationDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ControlContainer, NgModelGroup, FormsModule } from '@angular/forms';\nimport { NgFor } from '@angular/common';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\n\n@Component({\n selector: 'opcua-device-protocol-data-reporting',\n templateUrl: './opcua-device-protocol-data-reporting.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgModelGroup }],\n imports: [\n FormGroupComponent,\n C8yTranslateDirective,\n NgFor,\n FormsModule,\n RequiredInputPlaceholderDirective,\n CollapseDirective,\n MinValidationDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaDeviceProtocolDataReportingComponent {\n @Input() set model(_model) {\n if (_model.subscriptionType) {\n this.subscription = _model.subscriptionType;\n if (this.subscription.type === 'CyclicRead') {\n this.cyclicReadParameters = _model.subscriptionType.cyclicReadParameters;\n this.requireCyclic = true;\n this.requireSubscription = false;\n }\n\n if (this.subscription.type === 'Subscription') {\n this.subscriptionParameters = _model.subscriptionType.subscriptionParameters;\n this.requireCyclic = false;\n this.requireSubscription = true;\n }\n\n if (this.subscription.type === 'None') {\n this.requireCyclic = false;\n this.requireSubscription = false;\n }\n }\n this._model = _model;\n this.subscriptionTypeName = 'subscriptionType' + _model.id;\n }\n @Input() groupName;\n\n _model: object;\n @Output() onSubscriptionChange: EventEmitter<any> = new EventEmitter<any>();\n\n subscription = {\n type: 'None'\n };\n subscriptionParameters = {\n samplingRate: undefined,\n deadbandType: 'None',\n deadbandValue: undefined,\n ranges: '',\n queueSize: undefined,\n dataChangeTrigger: 'Status',\n discardOldest: true\n };\n\n cyclicReadParameters = {\n rate: undefined\n };\n\n types: any[] = [\n { value: 'None', label: gettext('None') },\n { value: 'CyclicRead', label: gettext('Cyclic read') },\n { value: 'Subscription', label: gettext('Subscription') }\n ];\n\n filters: any[] = [\n { value: 'None', label: gettext('None') },\n { value: 'Absolute', label: gettext('Absolute') },\n { value: 'Percent', label: gettext('Percent') }\n ];\n\n triggers: any[] = [\n { value: 'Status', label: gettext('Status') },\n { value: 'StatusValue', label: gettext('Status/Value') },\n { value: 'StatusValueTimestamp', label: gettext('Status/Value/Timestamp') }\n ];\n\n discard: any[] = [\n { value: true, label: gettext('oldest`data`') },\n { value: false, label: gettext('newest`data`') }\n ];\n\n requireCyclic = false;\n requireSubscription = false;\n subscriptionTypeName = 'subscriptionType';\n\n parseReadingInterval = $event => toInteger($event.target.value);\n\n updateModel() {\n setTimeout(() => {\n unset(this.subscription, 'subscriptionParameters');\n unset(this.subscription, 'cyclicReadParameters');\n if (this.subscription.type === 'CyclicRead') {\n this.requireCyclic = true;\n this.requireSubscription = false;\n set(this.subscription, 'cyclicReadParameters', this.cyclicReadParameters);\n } else if (this.subscription.type === 'Subscription') {\n this.requireCyclic = false;\n this.requireSubscription = true;\n set(this.subscription, 'subscriptionParameters', this.subscriptionParameters);\n } else if (this.subscription.type === 'None') {\n this.requireCyclic = false;\n this.requireSubscription = false;\n }\n this.onSubscriptionChange.emit(this.subscription);\n });\n }\n}\n","<c8y-form-group>\n <label translate>Mechanism</label>\n <label\n title=\"{{ mechanism.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n *ngFor=\"let mechanism of types\"\n >\n <input\n type=\"radio\"\n name=\"{{subscriptionTypeName}}\"\n [value]=\"mechanism.value\"\n [(ngModel)]=\"subscription.type\"\n (change)=\"updateModel()\"\n required\n [attr.data-cy]=\"mechanism.value\"\n />\n <span></span>\n <span>{{ mechanism.label | translate }}</span>\n </label>\n</c8y-form-group>\n\n<div class=\"row collapse\" [collapse]=\"subscription.type != 'CyclicRead'\" [isAnimated]=\"true\">\n <div class=\"col-sm-6 col-md-4 col-lg-3\">\n <c8y-form-group>\n <label translate>Reading interval</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"rate\"\n [(ngModel)]=\"cyclicReadParameters.rate\"\n placeholder=\"{{ 'e.g.' | translate }} 50\"\n [required]=\"requireCyclic\"\n min=\"50\"\n [attr.data-cy]=\"'cyclicReadRate'\"\n />\n <span class=\"input-group-addon units\" title=\"{{ 'Milliseconds' | translate }}\">\n {{ 'msec' | translate }}\n </span>\n </div>\n </c8y-form-group>\n </div>\n</div>\n\n<div class=\"row collapse\" [collapse]=\"subscription.type != 'Subscription'\" [isAnimated]=\"true\">\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Sampling interval</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"samplingRate\"\n [(ngModel)]=\"subscriptionParameters.samplingRate\"\n placeholder=\"{{ 'e.g.' | translate }} 500\"\n [required]=\"requireSubscription\"\n min=\"0\"\n [attr.data-cy]=\"'subscriptionSamplingRate'\"\n />\n <span class=\"input-group-addon units\" title=\"{{ 'Milliseconds' | translate }}\" translate>\n msec\n </span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Queue size</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"queueSize\"\n [(ngModel)]=\"subscriptionParameters.queueSize\"\n placeholder=\"{{ 'e.g.' | translate }} 10\"\n min=\"1\"\n [attr.data-cy]=\"'subscriptionQueueSize'\"\n />\n <span class=\"input-group-addon\">\n <strong translate>Discard</strong> \n <label\n *ngFor=\"let discardOption of discard\"\n title=\"{{ discardOption.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"discard{{ _model.id }}\"\n [value]=\"discardOption.value\"\n [(ngModel)]=\"subscriptionParameters.discardOldest\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"discardOption.label\"\n [attr.data-name]=\"'discard' + _model.id\"\n />\n <span></span>\n <span>{{ discardOption.label | translate }}</span>\n </label>\n </span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"clearfix\"></div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Data change trigger</label>\n <label\n *ngFor=\"let trigger of triggers\"\n title=\"{{ trigger.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"dataChangeTrigger{{ _model.id }}\"\n [value]=\"trigger.value\"\n [(ngModel)]=\"subscriptionParameters.dataChangeTrigger\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"trigger.label\"\n [attr.data-name]=\"'dataChangeTrigger' + _model.id\"\n />\n <span></span>\n <span>{{ trigger.label | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6 col-lg-4\">\n <c8y-form-group>\n <label translate>Deadband filter</label>\n <label\n *ngFor=\"let deadbandFilter of filters\"\n title=\"{{ deadbandFilter.label | translate }}\"\n class=\"c8y-radio radio-inline\"\n >\n <input\n type=\"radio\"\n name=\"deadbandType{{ _model.id }}\"\n [value]=\"deadbandFilter.value\"\n [(ngModel)]=\"subscriptionParameters.deadbandType\"\n [required]=\"requireSubscription\"\n [attr.data-cy]=\"deadbandFilter.label\"\n [attr.data-name]=\"'deadbandType' + _model.id\"\n />\n <span></span>\n <span>{{ deadbandFilter.label | translate }}</span>\n </label>\n </c8y-form-group>\n <div [collapse]=\"subscriptionParameters.deadbandType == 'None'\" [isAnimated]=\"true\">\n <c8y-form-group>\n <label translate>Deadband value</label>\n <input\n class=\"form-control\"\n type=\"number\"\n name=\"deadbandValue\"\n [(ngModel)]=\"subscriptionParameters.deadbandValue\"\n placeholder=\"{{ 'e.g.' | translate }} 10\"\n [required]=\"subscriptionParameters.deadbandType != 'None'\"\n min=\"0\"\n [attr.data-cy]=\"'deadbandValue'\"\n />\n </c8y-form-group>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\r\nimport { NgForm, ControlContainer, FormsModule } from '@angular/forms';\r\nimport {\r\n C8yTranslateDirective,\r\n IconDirective,\r\n C8yTranslatePipe,\r\n DatePipe\r\n} from '@c8y/ngx-components';\r\nimport { NgClass, NgIf } from '@angular/common';\r\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\r\n\r\n@Component({\r\n selector: 'opcua-device-protocol-description',\r\n templateUrl: './opcua-device-protocol-description.html',\r\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\r\n imports: [\r\n C8yTranslateDirective,\r\n NgClass,\r\n FormsModule,\r\n NgIf,\r\n ButtonCheckboxDirective,\r\n IconDirective,\r\n C8yTranslatePipe,\r\n DatePipe\r\n ]\r\n})\r\nexport class OpcuaDeviceProtocolDescription {\r\n _model: any;\r\n autoScan: string;\r\n @Input() set model(_model) {\r\n this.moId = _model.referencedServerId;\r\n this._model = _model;\r\n this.autoScan = _model.enabled ? '1' : '0';\r\n }\r\n\r\n private moId = '';\r\n\r\n setAutoScanOption(data: string) {\r\n this._model.enabled = data !== '0' ? true : false;\r\n }\r\n}\r\n","<div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-device-protocols\"></i>\n <p>\n <small class=\"label label-info\">{{ _model.fieldbusType }}</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"content-flex-80\">\n <div class=\"col-9\">\n <div class=\"form-group form-group-lg m-b-0\">\n <label class=\"sr-only\" translate>Name</label>\n <label class=\"editable\" [ngClass]=\"{ updated: ctrlName.dirty }\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"name\"\n #ctrlName=\"ngModel\"\n [(ngModel)]=\"_model.name\"\n style=\"max-width:calc( {{ _model.name.length || 10 }} * 1ch + 14px)\"\n />\n </label>\n </div>\n <div class=\"form-group\">\n <label class=\"sr-only\" translate>Description</label>\n <label class=\"editable\" [ngClass]=\"{ updated: ctrlDescription.dirty }\">\n <textarea\n class=\"form-control\"\n rows=\"1\"\n name=\"description\"\n placeholder=\"{{ 'e.g. My protocol description' | translate }}\"\n #ctrlDescription=\"ngModel\"\n [(ngModel)]=\"_model.description\"\n style=\"max-width:calc( {{ _model.description?.length || 25 }} * 1ch + 14px)\"\n ></textarea>\n <span *ngIf=\"_model.description\">\n {{ _model.description }}\n </span>\n </label>\n </div>\n <div class=\"d-flex\">\n <div>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"autoScanAddressSpace\"\n [(ngModel)]=\"autoScan\"\n (ngModelChange)=\"setAutoScanOption($event)\"\n btnCheckbox\n btnCheckboxTrue=\"1\"\n btnCheckboxFalse=\"0\"\n ngDefaultControl\n >\n <i *ngIf=\"autoScan === '1'\" c8yIcon=\"check\" class=\"text-success\"></i>\n <span *ngIf=\"autoScan === '1'\">\n {{ 'Active`auto scanning`' | translate }}\n </span>\n\n <i *ngIf=\"autoScan === '0'\" c8yIcon=\"ban\" class=\"text-danger\"></i>\n <span *ngIf=\"autoScan === '0'\">\n {{ 'Inactive`auto scanning`' | translate }}\n </span>\n </button>\n </div>\n <small class=\"m-l-16 text-muted\">\n {{\n 'When active, the gateway scans the address space of all servers and automatically applies this device protocol to all nodes matching the criteria.'\n | translate\n }}\n </small>\n </div>\n </div>\n <div class=\"flex-grow\">\n <ul class=\"list-unstyled small\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>ID</label>\n <span class=\"m-l-auto\">{{ _model.id }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Date created</label>\n <span class=\"m-l-auto\">{{ _model.creationTime | c8yDate }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Last update</label>\n <span class=\"m-l-auto\">{{ _model.lastUpdated | c8yDate }}</span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-8\" translate>Fieldbus version</label>\n <span class=\"m-l-auto\">{{ _model.fieldbusVersion }}</span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { BaseObjectMapping } from '@c8y/ngx-components/device-protocol-object-mappings';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport class OpcuaCustomActionObjectMapping extends BaseObjectMapping {\n constructor() {\n super({\n icon: 'bell',\n label: gettext('Custom action'),\n formlyFieldConfig: {\n key: 'customAction',\n fieldGroup: [\n {\n type: 'array',\n key: 'headers',\n props: {\n label: gettext('headers'),\n addText: gettext('Add Header'),\n required: true\n },\n className: 'formly-group-array-cols d-block min-height-fit',\n fieldArray: {\n fieldGroup: [\n {\n key: 'key',\n type: 'string',\n focus: true,\n props: {\n placeholder: 'Authorization',\n label: gettext('Key'),\n required: true,\n smallFormGroup: true\n },\n wrappers: ['c8y-form-field']\n },\n {\n key: 'value',\n type: 'string',\n props: {\n placeholder: 'Basic <credentials>',\n label: gettext('Value'),\n required: true,\n smallFormGroup: true\n }\n }\n ]\n }\n },\n {\n className: 'row',\n wrappers: ['c8y-legend-wrapper'],\n props: {\n label: gettext('Action')\n },\n fieldGroup: [\n {\n type: 'string',\n key: 'endpoint',\n props: {\n label: gettext('Endpoint'),\n smallFormGroup: true,\n required: true\n },\n className: 'col-md-6 p-0'\n },\n {\n type: 'textarea',\n key: 'bodyTemplate',\n props: {\n label: gettext('Body template'),\n smallFormGroup: true,\n required: true,\n description: gettext(\n 'The following placeholders are available: ${value}`KEEP_ORIGINAL`, ${receivedTimestampInMs}`KEEP_ORIGINAL`, ${serverId}`KEEP_ORIGINAL`, ${nodeId}`KEEP_ORIGINAL`, ${deviceId}`KEEP_ORIGINAL`.'\n )\n },\n className: 'col-md-6'\n }\n ]\n }\n ]\n }\n });\n }\n}\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlarmObjectMapping,\n ALARM_SEVERITY,\n EventObjectMapping,\n MeasurementObjectMapping\n} from '@c8y/ngx-components/device-protocol-object-mappings';\n\nexport class OpcuaMeasurementObjectMapping extends MeasurementObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'measurementCreation', smallFormGroup);\n }\n}\n\nexport class OpcuaEventObjectMapping extends EventObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'eventCreation', smallFormGroup, undefined, [\n {\n key: 'type',\n type: 'string',\n props: {\n label: gettext('Type'),\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'text',\n type: 'string',\n props: {\n label: gettext('Text'),\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n }\n ]);\n }\n}\n\nexport class OpcuaAlarmObjectMapping extends AlarmObjectMapping {\n constructor(protected smallFormGroup = true) {\n super(null, 'alarmCreation', smallFormGroup, undefined, [\n {\n key: 'severity',\n type: 'select',\n props: {\n label: gettext('Severity'),\n options: [...Object.values(ALARM_SEVERITY).map(value => ({ label: value, value }))],\n required: true,\n smallFormGroup\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'type',\n type: 'string',\n props: {\n label: gettext('Type'),\n smallFormGroup,\n required: true\n },\n className: 'col-md-3 col-sm-6'\n },\n {\n key: 'text',\n type: 'string',\n props: {\n label: gettext('Text'),\n smallFormGroup,\n required: true\n },\n className: 'col-md-3 col-sm-6'\n }\n ]);\n }\n}\n","import { Directive, ElementRef, Injector, Input } from '@angular/core';\nimport { UpgradeComponent } from '@angular/upgrade/static';\n\n@Directive({ selector: 'c8y-object-mapping-status-icons' })\nexport class OpcuaDeviceProtocolObjectMappingStatus extends UpgradeComponent {\n @Input() mapping: any;\n constructor(elementRef: ElementRef, injector: Injector) {\n super('c8yObjectMappingStatusIcons', elementRef, injector);\n }\n}\n","import {\n Component,\n OnInit,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { ControlContainer, NgModelGroup, FormsModule } from '@angular/forms';\nimport { isNil, isEmpty, assign, unset, get, set, cloneDeep, isEqual } from 'lodash-es';\nimport { AddressSpaceService } from './address-space.service';\nimport {\n OpcuaMeasurementObjectMapping,\n OpcuaCustomActionObjectMapping,\n OpcuaAlarmObjectMapping,\n OpcuaEventObjectMapping\n} from './mappings';\nimport { NgClass, NgIf, JsonPipe } from '@angular/common';\nimport {\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { OpcuaDeviceProtocolObjectMappingStatus } from './opcua-device-protocol-object-mapping-status-icon.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { OpcuaDeviceProtocolBrowsePathValidation } from './opcua-device-protocol-browse-path-validation.directive';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { ObjectMappingComponent } from '@c8y/ngx-components/device-protocol-object-mappings';\n\n@Component({\n selector: 'opcua-device-protocol-mapping',\n templateUrl: './opcua-device-protocol-mapping.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgModelGroup }],\n imports: [\n NgClass,\n IconDirective,\n NgIf,\n OpcuaDeviceProtocolObjectMappingStatus,\n TooltipDirective,\n CollapseDirective,\n FormsModule,\n FormGroupComponent,\n BsDropdownDirective,\n RequiredInputPlaceholderDirective,\n OpcuaDeviceProtocolBrowsePathValidation,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n OpcuaAddressSpaceTreeComponent,\n MessagesComponent,\n MessageDirective,\n OpcuaDeviceProtocolDataReportingComponent,\n ObjectMappingComponent,\n C8yTranslatePipe,\n JsonPipe\n ]\n})\nexport class OpcuaDeviceProtocolMapping implements OnInit, OnChanges {\n @ViewChild('variableForm', { static: false }) subFormRef: NgModelGroup;\n @ViewChild('browsePathModel', { static: false }) browsePathModel: any;\n\n @Input('resource') _model;\n @Input() index;\n @Input() getParentAttr;\n @Input() referencedServerId;\n @Input() referencedRootNodeId;\n @Output() onAction: EventEmitter<any> = new EventEmitter<any>();\n\n mapping;\n\n isDetailOpen;\n referencedNode;\n isPathFocused = false;\n groupName: string;\n browsePath: string;\n nodeDisplayName: string;\n isBrowsePathUniq = true;\n dataReporting = 'default';\n isTreeOpen = false;\n isNew = false;\n resetModel = false;\n dataReportingName;\n\n mappingTypes = [\n OpcuaMeasurementObjectMapping,\n OpcuaAlarmObjectMapping,\n OpcuaEventObjectMapping,\n OpcuaCustomActionObjectMapping\n ];\n\n private objectMappingState = {\n valid: false,\n dirty: false\n };\n constructor(private addressSpaceService: AddressSpaceService) {}\n\n toggleDetail() {\n this.isDetailOpen = !this.isDetailOpen;\n if (this.resetModel) {\n this.initialFormSetup();\n }\n }\n\n getMappings = () => this.getParentAttr('mappings');\n\n ngOnInit() {\n this.dataReportingName = 'ReportingMode' + this.index;\n this.initialFormSetup();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // this is done to keep the \"onDelete\" logic in\n // opcua-device-protocol-detail.component intact\n if (\n !isNil(get(changes, '_model.previousValue')) &&\n !isEqual(this._model, changes._model.previousValue)\n ) {\n if (this.mapping && this.mapping.name === this._model.name) {\n this.mapping.id = this._model.id;\n }\n }\n }\n\n onMappingUpdate({ dirty, valid }: { dirty: boolean; valid: boolean; touched?: boolean }) {\n this.objectMappingState = {\n valid,\n dirty\n };\n }\n\n initialFormSetup() {\n const mapping = {\n id: '',\n browsePath: [],\n name: '',\n subscriptionType: {\n type: 'None'\n }\n };\n\n this.mapping = assign({}, mapping, cloneDeep(this._model));\n\n if (isEmpty(this.mapping.browsePath)) {\n this.isNew = true;\n this.isDetailOpen = true;\n } else {\n this.browsePath = this.stringfyBrowsePath(this.mapping.browsePath);\n this.nodeDisplayName = this.mapping.name;\n }\n\n if (this.referencedRootNodeId) {\n this.referencedNode = { nodeId: this.referencedRootNodeId };\n this.addressSpaceService.triggerNodeToOpen({\n node: {\n nodeId: this.referencedRootNodeId,\n children: [],\n expanded: false,\n absolutePaths: [[]]\n },\n selectedAncestorIds: []\n });\n } else {\n this.referencedNode = { nodeId: '' };\n }\n\n if (this.mapping?.customAction) {\n Object.assign(this.mapping, {\n customAction: {\n ...this.mapping.customAction,\n headers: this.mapHeadersObjectToList(this.mapping?.customAction?.headers)\n }\n });\n }\n\n if (get(this._model, 'subscriptionType')) {\n this.dataReporting = 'custom';\n } else {\n this.dataReporting = 'default';\n }\n this.resetModel = false;\n }\n\n showAddressSpaceTree() {\n return !isEmpty(this.referencedServerId);\n }\n\n ngAfterViewInit() {\n if (\n get(this.mapping, 'subscriptionType') &&\n get(this.mapping, 'subscriptionType.type') !== 'None'\n ) {\n this.dataReporting = 'custom';\n }\n }\n\n mapHeadersObjectToList(headers) {\n if (Object.keys(headers).length > 0) {\n return Object.keys(headers).map(item => {\n return { key: item, value: headers[item] };\n });\n }\n }\n\n stringfyBrowsePath(path) {\n return JSON.stringify(path);\n }\n\n updateBrowsePath(node) {\n this.mapping.browsePath = node.relativePath;\n this.nodeDisplayName = node.displayName;\n this.mapping.name = this.nodeDisplayName;\n this.browsePath = this.stringfyBrowsePath(this.mapping.browsePath);\n this.browsePathModel.control.markAsDirty();\n }\n\n updateDisplayname() {\n this.mapping.name = this.nodeDisplayName;\n }\n\n updateBrowsePathInput() {\n if (this.browsePath) {\n try {\n this.mapping.browsePath = JSON.parse(this.browsePath);\n } catch (error) {\n return;\n }\n }\n }\n\n save() {\n if (this.dataReporting === 'default') {\n unset(this.mapping, 'subscriptionType');\n }\n\n if (get(this.mapping, 'measurementCreation')) {\n const { measurementCreation } = this.mapping;\n set(measurementCreation, 'fragmentName', get(measurementCreation, 'type'));\n }\n\n if (this.mapping.customAction) {\n this.mapping.customAction.headers = this.mapping.customAction.headers.reduce(\n (result, item) => {\n result[item.key] = item.value;\n return result;\n },\n {}\n );\n }\n\n this.onAction.emit({\n action: 'save',\n data: this.mapping\n });\n this.isDetailOpen = false;\n }\n\n cancel() {\n this.isDetailOpen = false;\n this.resetModel = true;\n\n if (this.mapping.id === 'new') {\n this.onAction.emit({\n action: 'delete',\n data: assign({}, this.mapping)\n });\n }\n }\n\n onDelete() {\n this.onAction.emit({ action: 'delete', data: this.mapping });\n }\n\n canSave({ valid, dirty }) {\n const areValid = (): boolean => valid && this.objectMappingState.valid;\n const areDirty = (): boolean => dirty || this.objectMappingState.dirty;\n return areValid() && areDirty();\n }\n\n isActive() {\n return this.isDetailOpen;\n }\n\n setTreeFromRefNode() {\n if (this.referencedRootNodeId) {\n this.addressSpaceService.triggerNodeToOpen({\n node: {\n nodeId: this.referencedRootNodeId,\n children: [],\n expanded: false,\n absolutePaths: [[]]\n },\n selectedAncestorIds: []\n });\n }\n }\n\n updateSubscriptionType(value) {\n this.mapping.subscriptionType = value;\n }\n}\n","<div\n class=\"c8y-list__item\"\n [ngClass]=\"{ expanded: isDetailOpen }\"\n [attr.data-cy]=\"mapping.browsePath | json\"\n>\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"sliders\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-70\">\n <div class=\"col-5\">\n <p\n class=\"text-truncate\"\n title=\" {{ nodeDisplayName }} {{\n mapping.browsePath.length > 0 ? (mapping.browsePath | json) : ''\n }}\"\n (click)=\"toggleDetail()\"\n >\n {{ nodeDisplayName }}\n <small\n class=\"text-muted\"\n *ngIf=\"mapping.browsePath.length > 0\"\n >\n {{ mapping.browsePath | json }}\n </small>\n </p>\n </div>\n <div class=\"col-5\">\n <div class=\"list-functionalities\">\n <label class=\"small m-r-8 m-b-0 hidden-xs\">\n {{ 'Functionalities' | translate }}\n </label>\n <c8y-object-mapping-status-icons [mapping]=\"mapping\"></c8y-object-mapping-status-icons>\n </div>\n </div>\n <div class=\"flex-grow d-flex p-r-8\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n c8yIcon=\"minus-circle\"\n (click)=\"onDelete()\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\">\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ active: isDetailOpen }\"\n (click)=\"toggleDetail()\"\n [attr.data-cy]=\"'toggleDetail'\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"collapse\"\n [collapse]=\"!isDetailOpen\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <div\n class=\"form\"\n [ngModelGroup]=\"index\"\n #variableForm=\"ngModelGroup\"\n *ngIf=\"isDetailOpen\"\n >\n <div class=\"row p-t-8\">\n <c8y-form-group\n class=\"col-md-4\"\n [status]=\"!isBrowsePathUniq ? 'error' : ''\"\n *ngIf=\"showAddressSpaceTree(); else simpleInput\"\n >\n <label>{{ 'Path' | translate }}</label>\n <div\n class=\"dropdown fit-w\"\n dropdown\n #dropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ ['2:Node1', '2:SubNode1'] | json }}\"\n name=\"browsePath\"\n type=\"text\"\n autocomplete=\"off\"\n required\n c8yBrowsePathValidator\n [getMappings]=\"getMappings\"\n [model]=\"mapping\"\n [(ngModel)]=\"browsePath\"\n (change)=\"updateBrowsePathInput()\"\n (focus)=\"setTreeFromRefNode()\"\n #browsePathModel=\"ngModel\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Toggle address space' | translate }}\"\n type=\"button\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'caret-down'\"></i>\n </button>\n </span>\n </div>\n <div\n class=\"dropdown-menu panel-inner-scroll fit-w\"\n style=\"max-height: 240px\"\n *dropdownMenu\n >\n <opcua-address-space-tree\n [node]=\"referencedNode\"\n [moId]=\"referencedServerId\"\n (selectedNode)=\"updateBrowsePath($event); dropdown.hide()\"\n ></opcua-address-space-tree>\n </div>\n </div>\n <c8y-messages>\n <c8y-message\n name=\"invalidBrowsePathNotation\"\n text=\"{{ 'Must be a valid array of strings.' | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"browsePathNotUnique\"\n text=\"{{ 'Variable with this path is already added.' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <ng-template #simpleInput>\n <c8y-form-group class=\"col-md-4\">\n <label>{{ 'Path' | translate }}</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ ['2:Node1', '2:SubNode1'] | json }}\"\n name=\"browsePath\"\n type=\"text\"\n autocomplete=\"off\"\n required\n c8yBrowsePathValidator\n [getMappings]=\"getMappings\"\n [model]=\"mapping\"\n [(ngModel)]=\"browsePath\"\n (change)=\"updateBrowsePathInput()\"\n #browsePathModel=\"ngModel\"\n />\n <c8y-messages>\n <c8y-message\n name=\"invalidBrowsePathNotation\"\n text=\"{{ 'Must be a valid array of strings.' | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"browsePathNotUnique\"\n text=\"{{ 'Variable with this path is already added.' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </ng-template>\n\n <c8y-form-group class=\"col-md-4\">\n <label>{{ 'Name' | translate }}</label>\n <div class=\"input-group\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. childDevice2' | translate }} \"\n name=\"displayName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"nodeDisplayName\"\n (change)=\"updateDisplayname()\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div\n class=\"row\"\n ngModelGroup=\"dataReportingSection\"\n >\n <c8y-form-group class=\"col-sm-4 col-md-3 col-lg-2\">\n <label>\n <span>{{ 'Data reporting' | translate }}</span>\n </label>\n <div class=\"input-group\">\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Default' | translate }}\"\n >\n <input\n name=\"{{ dataReportingName }}\"\n type=\"radio\"\n value=\"default\"\n [(ngModel)]=\"dataReporting\"\n />\n <span></span>\n <span>{{ 'Default' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Custom' | translate }}\"\n >\n <input\n name=\"{{ dataReportingName }}\"\n type=\"radio\"\n value=\"custom\"\n [(ngModel)]=\"dataReporting\"\n />\n <span></span>\n <span>{{ 'Custom' | translate }}</span>\n </label>\n </div>\n </c8y-form-group>\n <div\n class=\"col-sm-8 col-md-9 col-lg-10\"\n *ngIf=\"dataReporting === 'custom'\"\n ngModelGroup=\"overriddenSubscription\"\n >\n <opcua-device-protocol-data-reporting\n [model]=\"mapping\"\n (onSubscriptionChange)=\"updateSubscriptionType($event)\"\n ></opcua-device-protocol-data-reporting>\n </div>\n </div>\n\n <c8y-device-protocol-object-mappings\n [data]=\"mapping\"\n [objectMappingTypes]=\"mappingTypes\"\n (onUpdate)=\"onMappingUpdate($event)\">\n </c8y-device-protocol-object-mappings>\n\n <button\n class=\"btn btn-default m-t-16 m-b-16\"\n title=\"{{ 'Cancel' | translate }}\"\n id=\"cancelBtn\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary m-t-16 m-b-16\"\n title=\"{{ 'Save' | translate }}\"\n id=\"saveBtn\"\n type=\"button\"\n (click)=\"save()\"\n [disabled]=\"!canSave(variableForm)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, ViewChildren, QueryList, ChangeDetectorRef } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { OpcuaService } from './opcuaService';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n EmptyStateComponent,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { OpcuaDeviceType } from './opcua-protocol-device-type.interface';\nimport { find, assign, omit, findIndex, pick, get, isNil } from 'lodash-es';\nimport { OpcuaDeviceProtocolMapping } from './opcua-device-protocol-mapping.component';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { OpcuaDeviceProtocolDescription } from './opcua-device-protocol-description.component';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { OpcuaAutoApplySettingsComponent } from './opcua-auto-apply-settings.component';\n\n@Component({\n selector: 'opcua-device-protocol-detail',\n templateUrl: './opcua-device-protocol-detail.html',\n imports: [\n NgIf,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n FormsModule,\n OpcuaDeviceProtocolDescription,\n C8yTranslateDirective,\n NgFor,\n OpcuaDeviceProtocolMapping,\n EmptyStateComponent,\n IconDirective,\n OpcuaDeviceProtocolDataReportingComponent,\n OpcuaAutoApplySettingsComponent,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaDeviceProtocolDetailComponent implements OnInit {\n @ViewChildren(OpcuaDeviceProtocolMapping) instanceList: QueryList<OpcuaDeviceProtocolMapping>;\n\n initialModel: OpcuaDeviceType = {\n id: '',\n fieldbusType: 'opcuaV2',\n description: '',\n unit: '',\n fieldbusVersion: 4,\n name: '',\n referencedServerId: '',\n referencedRootNodeId: '',\n subscriptionType: {\n type: 'None'\n },\n mappings: [],\n overriddenSubscriptions: [],\n applyConstraints: {\n browsePathMatchesRegex: '',\n matchesNodeIds: [],\n serverObjectHasFragment: '',\n matchesServerIds: []\n },\n enabled: ''\n };\n\n model: any;\n server: any;\n selectedNode: any;\n isLoaded = true;\n\n constructor(\n private changeDetectorRef: ChangeDetectorRef,\n private opcuaService: OpcuaService,\n private alertService: AlertService,\n private router: Router\n ) {}\n\n ngAfterContentChecked() {\n this.changeDetectorRef.detectChanges();\n }\n\n getParentAttr = key => get(this.model, key);\n\n getMapping() {\n return this.model.mappings;\n }\n\n getEmptyMappingObject() {\n const { mappings } = this.model;\n return {\n id: mappings.length > 0 ? Math.max(...mappings.map(m => m.id)) + 1 : 0,\n browsePath: []\n };\n }\n\n getOverriddenSubscriptionsByPath(browsePath: string[]): any {\n if (isNil(browsePath) || browsePath.length === 0) {\n return undefined;\n }\n return find(this.model.overriddenSubscriptions, { browsePath });\n }\n\n getStructuredResource(resource) {\n const overriddenSubscriptions: any = this.getOverriddenSubscriptionsByPath(resource.browsePath);\n let result = assign({}, resource);\n if (overriddenSubscriptions) {\n result = assign({}, resource, { subscriptionType: overriddenSubscriptions.subscriptionType });\n }\n return result;\n }\n\n async ngOnInit() {\n const id = this.opcuaService.getId();\n\n if (id) {\n const res = await this.opcuaService.getDeviceProtocol(id);\n if (res && res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n this.isLoaded = false;\n } else {\n const data = await res.json();\n if (data && data.applyConstraints === null) {\n delete data.applyConstraints;\n }\n if (data && data.subscriptionType === null) {\n delete data.subscriptionType;\n }\n this.model = assign(this.initialModel, data);\n if (!this.model.mappings) {\n this.model.mappings = [];\n }\n this.model = assign(this.initialModel, this.updateViableMapping(data));\n this.isLoaded = false;\n }\n }\n }\n\n updateViableMapping(model) {\n const { mappings } = model;\n let result = [];\n if (mappings) {\n result = mappings.map((item, i) => {\n return assign(this.getStructuredResource(item), { id: i });\n });\n }\n return assign(model, { mappings: result });\n }\n\n trackById(_index: number, el: any): number {\n return get(el, 'id');\n }\n\n addVariable() {\n this.model.mappings.push(this.getEmptyMappingObject());\n }\n\n updateVariable(mappingObject) {\n const { mappings } = this.model;\n const { id } = mappingObject;\n const index = findIndex(mappings, { id });\n mappings[index > -1 ? index : 0] = mappingObject;\n }\n\n removeVariable(mappingObject) {\n const { mappings } = this.model;\n const { id } = mappingObject;\n let index = -1;\n\n // id typeof string || number\n if (!isNil(id) && (id.length > 0 || id > -1)) {\n index = findIndex(mappings, { id });\n }\n\n if (index > -1) {\n mappings.splice(index, 1);\n }\n }\n\n actionHandler(actionObject) {\n switch (actionObject.action) {\n case 'save':\n this.updateVariable(actionObject.data);\n break;\n case 'delete':\n this.removeVariable(actionObject.data);\n break;\n }\n }\n\n extractOverridSubscriptionType(_mapping) {\n const overriddenSubscriptions = [];\n\n const variableMapping = [];\n _mapping.forEach(element => {\n if (element.id !== 'new') {\n if (element.subscriptionType) {\n overriddenSubscriptions.push(\n assign(\n { browsePath: element.browsePath },\n { subscriptionType: element.subscriptionType }\n )\n );\n }\n variableMapping.push(omit(element, ['subscriptionType']));\n }\n });\n return [variableMapping, overriddenSubscriptions];\n }\n\n prepareRequestJson(_model) {\n let requestJson = {};\n const [mappings, overriddenSubscriptions] = this.extractOverridSubscriptionType(\n _model.mappings\n );\n requestJson = assign(requestJson, pick(_model, Object.keys(this.initialModel)), {\n mappings,\n overriddenSubscriptions\n });\n return requestJson;\n }\n\n async save() {\n try {\n const res = await this.opcuaService.updateDeviceProtocol(this.prepareRequestJson(this.model));\n const data = await res.json();\n\n if (res && res.status === 200) {\n this.router.navigate(['deviceprotocols']);\n this.alertService.success(gettext('Device protocol saved.'));\n } else {\n const { details } = data;\n this.alertService.addServerFailure({ res, data: details });\n }\n } catch (ex) {\n this.alertService.danger(gettext('Failed to save. Try again.'));\n }\n }\n\n canSave(deviceTypeForm) {\n if (this.instanceList) {\n const activeInstances = this.instanceList.filter(item => item.isActive());\n\n if (activeInstances.length > 0) {\n return true;\n }\n }\n return !deviceTypeForm.form.valid;\n }\n}\n","<c8y-title *ngIf=\"!isLoaded\">{{ model.name }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-protocols'\"\n [label]=\"'Device types' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-protocols'\"\n [label]=\"'Device protocols' | translate\"\n [path]=\"'deviceprotocols'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [icon]=\"'c8y-device-protocols'\" [label]=\"model?.name\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <form #deviceTypeForm=\"ngForm\" name=\"detailForm\" *ngIf=\"!isLoaded\" class=\"card card--fullpage\">\n <opcua-device-protocol-description [model]=\"model\"></opcua-device-protocol-description>\n <div class=\"inner-scroll\">\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"h4\" translate>Variables</div>\n </div>\n <div class=\"p-l-16 p-r-16\">\n <div class=\"c8y-list__group\" *ngIf=\"model.mappings.length > 0\" ngModelGroup=\"variable\">\n <opcua-device-protocol-mapping\n *ngFor=\"let resource of getMapping(); index as i; trackBy: trackById\"\n [index]=\"i\"\n [referencedServerId]=\"model.referencedServerId\"\n [referencedRootNodeId]=\"model.referencedRootNodeId\"\n [resource]=\"getStructuredResource(resource)\"\n [getParentAttr]=\"getParentAttr\"\n (onAction)=\"actionHandler($event)\"\n ></opcua-device-protocol-mapping>\n </div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16\">\n <c8y-ui-empty-state\n *ngIf=\"model.mappings.length === 0\"\n [icon]=\"'sliders'\"\n [title]=\"'No variables to display.' | translate\"\n [subtitle]=\"'Click below to add your first variable.' | translate\"\n ></c8y-ui-empty-state>\n\n <div class=\"card-footer\">\n <button\n type=\"button\"\n title=\"{{ 'Add variable' | translate }}\"\n class=\"btn btn-default addVariableBtn\"\n (click)=\"addVariable()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add variable' | translate }}\n </button>\n </div>\n </div>\n </div>\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div class=\"h4\" translate>Data reporting</div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16\" ngModelGroup=\"subscription\">\n <opcua-device-protocol-data-reporting\n [groupName]=\"'subscription'\"\n [model]=\"model\"\n ></opcua-device-protocol-data-reporting>\n </div>\n </div>\n <div class=\"d-contents\">\n <div class=\"card-header separator-top-bottom sticky-top\">\n <div class=\"h4\" translate>Auto apply constraints</div>\n </div>\n <div class=\"p-l-16 p-r-16 p-t-16 overflow-visible\" ngModelGroup=\"autoApply\">\n <opcua-auto-apply [model]=\"model\"></opcua-auto-apply>\n </div>\n </div>\n\n <div class=\"card-footer sticky-bottom separator\" style=\"z-index: 101\">\n <button\n title=\"{{ 'Save' | translate }}\"\n id=\"deviceTypeSave\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"canSave(deviceTypeForm)\"\n type=\"button\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\n\nimport { AppStateService } from '@c8y/ngx-components';\n\n@Injectable()\nexport class OpcuaMicroserviceGuard {\n microserviceName = 'opcua-mgmt-service';\n checkApp: Promise<boolean>;\n\n constructor(private app: AppStateService) {}\n\n canActivate() {\n if (!this.checkApp) {\n this.checkApp = this.app.isApplicationAvailable(this.microserviceName);\n }\n return this.checkApp;\n }\n}\n","export const NEW_SERVER_ID = 'new';\nexport interface OpcuaServer {\n name: string;\n id: string;\n gatewayId?: string;\n subtitle?: string;\n connectionStatus?: any;\n enabeled?: any;\n config: OpcuaServerConfig;\n quickInfo?: {\n padlock?: string;\n padlockMsg?: string;\n };\n active: true | false;\n}\n\nexport interface OpcuaServerConfig {\n securityMode: string;\n keystorePass?: any;\n keystoreFilename?: string;\n keystoreBinaryId?: any;\n certificatePass?: any;\n userIdentityMode?: string;\n serverUrl?: string;\n userName?: string;\n userPassword?: string;\n passwordEncrypted?: boolean;\n rescanCron?: any;\n timeout?: number;\n autoReconnect?: boolean;\n targetConnectionState?: 'enabled' | 'disabled' | null;\n statusCheckInterval?: number;\n valid?: boolean;\n autoScanAddressSpace?: boolean;\n partialAddressScanNodeIds?: Array<string>;\n partialAddressScan?: boolean;\n}\n","import {\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n signal,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup, NgForm, FormsModule } from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n DropAreaComponent,\n DroppedFile,\n ModalService,\n Status,\n EmptyStateComponent,\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslateDirective,\n DeviceStatusComponent,\n DefaultValidationDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { cloneDeep, has } from 'lodash-es';\nimport { debounceTime, merge, Subject } from 'rxjs';\nimport { NEW_SERVER_ID, OpcuaServer, OpcuaServerConfig } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { NgIf, NgFor, NgClass } from '@angular/common';\nimport { ButtonCheckboxDirective } from 'ngx-bootstrap/buttons';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\n\n@Component({\n selector: 'opcua-server-config',\n templateUrl: './opcua-server-config.component.html',\n imports: [\n NgIf,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslateDirective,\n ButtonCheckboxDirective,\n DeviceStatusComponent,\n DefaultValidationDirective,\n NgFor,\n DropAreaComponent,\n NgClass,\n CollapseDirective,\n FormlyModule,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServerConfigComponent implements OnInit, OnChanges {\n currentSecMode: string;\n fileName = '';\n targetConnectionState = '1';\n minIntervalNumber = 1;\n connectionStatusLabel = '';\n autoScanAddressSpace = '0';\n advancedSettings = false;\n advancedSettingsForm = new FormGroup({});\n advancedSettingsFields: FormlyFieldConfig[] = [];\n isNew = signal<boolean>(false);\n @ViewChild('opcuaConfigForm', { static: false }) set opcuaConfigForm(opcuaConfigForm: NgForm) {\n if (opcuaConfigForm) {\n opcuaConfigForm.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(e => {\n this.opcuaConfigFormValueChange$.next(e);\n });\n }\n }\n @ViewChild(DropAreaComponent, { static: false }) dropArea: DropAreaComponent;\n @Output() canceled = new EventEmitter<OpcuaServer>();\n @Output() removed = new EventEmitter<OpcuaServer>();\n @Output() saved = new EventEmitter<OpcuaServer>();\n @Output() updated = new EventEmitter<OpcuaServer>();\n @Input() set server(server: OpcuaServer) {\n this._server = cloneDeep(server);\n if (server) {\n this.isNew.set(server.id === NEW_SERVER_ID);\n this.model = cloneDeep(server);\n this.fileName = this.model.config.keystoreFilename;\n\n if (this.isNew()) {\n // enabled connection state\n this.targetConnectionState = this.targetConnectionState ?? '1';\n this.model.config.targetConnectionState =\n this.model.config.targetConnectionState ?? 'enabled';\n this.model.config.statusCheckInterval = this.model.config.statusCheckInterval ?? 40;\n this.model.config.timeout = this.model.config.timeout ?? 30;\n this.model.config.autoScanAddressSpace = this.model.config.autoScanAddressSpace ?? true;\n this.model.config.partialAddressScan = this.model.config.partialAddressScan ?? false;\n } else {\n this.targetConnectionState =\n this.model.config.targetConnectionState === 'enabled' ? '1' : '0';\n }\n this.updateConnectionStatusLabel(this._server);\n this.setNewPassword();\n }\n }\n\n get server(): OpcuaServer {\n return this._server;\n }\n model: OpcuaServer;\n changePassword = false;\n initialPasswordRequired = true;\n securityModes: string[];\n authenticationMode: any;\n authenticationModes: any[];\n NONE = 'NONE';\n SIGN = 'SIGN';\n SIGN_ENC = 'SIGN_ENCRYPT';\n securityPolicies: any = {\n sign: [`BASIC256_${this.SIGN}`, `BASIC128RSA15_${this.SIGN}`, `BASIC256SHA256_${this.SIGN}`],\n sign_enc: [\n `BASIC256_${this.SIGN_ENC}`,\n `BASIC128RSA15_${this.SIGN_ENC}`,\n `BASIC256SHA256_${this.SIGN_ENC}`\n ]\n };\n private ANONYM = {\n id: 1,\n value: gettext('Anonymous')\n };\n private USER_PASSWORD = {\n id: 2,\n value: gettext('Username/Password')\n };\n private KEY_BASED = {\n id: 3,\n value: gettext('Key-based Authentication')\n };\n private _server: OpcuaServer;\n private initialKeystore = {\n lastModified: 0,\n name: '',\n type: '',\n slice: null,\n size: 0\n } as File;\n private keystore: File = this.initialKeystore;\n private authSwitch = false;\n private opcuaConfigFormValueChange$ = new Subject();\n private opcuaConfigFormChangesSubscribed = false;\n private destroyRef = inject(DestroyRef);\n\n constructor(\n private opcuaService: OpcuaService,\n private modalService: ModalService,\n private alertService: AlertService,\n private readonly changeDetectorRef: ChangeDetectorRef\n ) {\n this.advancedSettingsFields = this.getAdvancedSettingsFields();\n }\n\n async ngOnInit() {\n this.authSwitch = false;\n\n this.securityModes = [this.NONE, this.SIGN, this.SIGN_ENC];\n\n this.authenticationModes = [this.ANONYM, this.USER_PASSWORD, this.KEY_BASED];\n\n this.setCurrentAuthenticationMode();\n this.setCurrentSecurityMode();\n }\n\n ngOnChanges() {\n this.setCurrentSecurityMode();\n this.setCurrentAuthenticationMode();\n }\n\n ngAfterViewChecked(): void {\n this.changeDetectorRef.detectChanges();\n\n if (!this.opcuaConfigFormChangesSubscribed) {\n merge(this.opcuaConfigFormValueChange$, this.advancedSettingsForm.valueChanges)\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.updated.emit(this.model));\n this.opcuaConfigFormChangesSubscribed = true;\n }\n }\n\n cancel(): void {\n this.advancedSettingsForm.reset();\n this.canceled.emit(this.model);\n this._server = null;\n }\n\n async remove() {\n try {\n await this.modalService.confirm(\n gettext('Delete server'),\n gettext(\"You're about to delete server. Do you want to proceed?\"),\n Status.DANGER,\n {\n ok: gettext('Delete'),\n cancel: gettext('Cancel')\n }\n );\n await this.removeKeystore(this.model);\n this.removed.emit(this.model);\n this._server = null;\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async save() {\n if (\n this.keystore &&\n this.keystore.size > 0 &&\n this.keystore.name &&\n this.keystore.name.length > 0\n ) {\n const response = await this.uploadKeystore(this.model.config.keystoreBinaryId);\n\n if (response && response.data && response.data.id) {\n this.model.config.keystoreBinaryId = response.data.id;\n }\n\n // if the keystore was uploaded successful we can remove\n // the local keystore. This will prevent another request to binary api\n // when the user will edit other inputs in the form and hit save again.\n this.keystore = this.initialKeystore;\n }\n\n // will remove any empty or undefined strings from the UI before saving it to the config\n function notEmpty<TValue>(value: TValue | null | undefined | string): value is TValue {\n return value !== null && value !== undefined && value != '';\n }\n\n // clean up array of empty strings\n this.model.config.partialAddressScanNodeIds = (\n this.model.config.partialAddressScanNodeIds || []\n ).filter(notEmpty);\n\n // will remove keystore (binary) when the user switched\n // authentication settings from key-based to anonymous or username/password\n if (this.authSwitch) {\n this.removeKeystore(this.server);\n }\n\n // when the user sets a new password, make sure to mark it as\n // \"not encrypted\" by setting passwordEncrypted to false\n const userPassword: string = this.getModelConfig('userPassword');\n if (userPassword && userPassword.length > 0) {\n this.model.config.passwordEncrypted = false;\n }\n\n this.saved.emit(this.model);\n }\n\n uploadFile(droppedFiles: DroppedFile[]) {\n if (droppedFiles.length === 1) {\n this.keystore = droppedFiles[0].file;\n this.fileName = this.keystore.name;\n } else {\n }\n }\n\n setPolicy(data: any) {\n if (data === this.NONE) {\n this.model.config.securityMode = this.NONE;\n } else if (data === this.SIGN) {\n this.model.config.securityMode = this.securityPolicies.sign[0];\n } else if (data === this.SIGN_ENC) {\n this.model.config.securityMode = this.securityPolicies.sign_enc[0];\n }\n }\n\n setServerConnection(data: string) {\n this.model.config.targetConnectionState = data !== '0' ? 'enabled' : 'disabled';\n }\n\n updateAuthentication(data: any) {\n if (data && data.id) {\n switch (data.id) {\n // Anonymous\n case 1:\n this.resetUserAuthentication();\n this.resetKeyBasedAuthentication();\n break;\n\n // User/Password\n case 2:\n this.resetKeyBasedAuthentication();\n this.restoreUserData();\n this.setNewPassword();\n break;\n\n // Key-based\n case 3:\n this.resetUserAuthentication();\n this.restoreKeyBasedData();\n break;\n\n default:\n break;\n }\n }\n }\n\n updateConnectionStatusLabel(server) {\n const connected = server.c8y_Connection && server.c8y_Connection.status === 'CONNECTED';\n const label = connected ? gettext('Connected') : gettext('Disconnected');\n this.connectionStatusLabel = label;\n }\n\n setNewPassword() {\n const username: string = this.getModelConfig('userName');\n if (username && username.length > 0) {\n // userName is given, NO need to change the password because it is already set\n this.changePassword = false;\n this.initialPasswordRequired = false;\n } else {\n // no userName in response, so require the user to set the initial pw\n this.changePassword = true;\n this.initialPasswordRequired = true;\n }\n }\n\n toggleChangePassword() {\n this.changePassword = !this.changePassword;\n // When the user hides the pw-input field but has entered a\n // string to it before, we need to discard the changes reflected in the model\n // otherwise we PUT it with the model when user hits the save button\n if (!this.changePassword) {\n if (this.getModelConfig('userPassword')) {\n delete this.model.config.userPassword;\n }\n }\n }\n\n private uploadKeystore(binaryId?: string) {\n if (!binaryId) {\n return this.opcuaService.uploadKeystore(this.keystore);\n } else if (binaryId && binaryId.length > 0) {\n // update existing binary\n return this.opcuaService.updateKeystore(binaryId, this.keystore);\n }\n }\n\n private removeKeystore(server: OpcuaServer) {\n if (\n server &&\n server.config &&\n server.config.keystoreBinaryId &&\n server.config.keystoreBinaryId.length > 0\n ) {\n this.authSwitch = false;\n return this.opcuaService.removeKeystore(this.server.config.keystoreBinaryId);\n }\n }\n\n private resetUserAuthentication() {\n this.model.config.userName = null;\n this.model.config.userPassword = null;\n this.model.config.userIdentityMode = 'none';\n }\n\n private resetKeyBasedAuthentication() {\n this.authSwitch = true;\n\n this.model.config.keystorePass = null;\n this.model.config.certificatePass = null;\n this.model.config.keystoreBinaryId = '';\n this.model.config.keystoreFilename = '';\n this.model.config.userIdentityMode = 'none';\n }\n\n private restoreUserData() {\n this.model.config.userName = this._server.config.userName;\n this.model.config.userIdentityMode = 'userAndPassword';\n }\n\n private restoreKeyBasedData() {\n this.authSwitch = false;\n this.model.config.keystorePass = this._server.config.keystorePass;\n this.model.config.certificatePass = this._server.config.certificatePass;\n this.model.config.keystoreBinaryId = this._server.config.keystoreBinaryId;\n this.model.config.keystoreFilename = this._server.config.keystoreFilename;\n this.model.config.userIdentityMode = 'certificate';\n }\n\n private getServerConfig(): OpcuaServerConfig {\n let cfg: OpcuaServerConfig = {\n securityMode: this.NONE,\n userIdentityMode: 'none'\n };\n if (this.server && this.server.config) {\n cfg = this.server.config;\n }\n return cfg;\n }\n\n private setCurrentSecurityMode() {\n const { securityMode } = this.getServerConfig();\n if (securityMode) {\n const foundInSign = this.securityPolicies.sign.find(el => el === securityMode);\n if (foundInSign) {\n this.currentSecMode = this.SIGN;\n } else {\n const foundInSignEncrypt = this.securityPolicies.sign_enc.find(el => el === securityMode);\n foundInSignEncrypt\n ? (this.currentSecMode = this.SIGN_ENC)\n : (this.currentSecMode = this.NONE);\n }\n }\n }\n\n private setCurrentAuthenticationMode() {\n const { userIdentityMode } = this.getServerConfig();\n\n switch (userIdentityMode) {\n case 'certificate':\n this.authenticationMode = this.KEY_BASED;\n break;\n\n case 'userAndPassword':\n this.authenticationMode = this.USER_PASSWORD;\n break;\n\n case 'Anonymous':\n this.authenticationMode = this.ANONYM;\n break;\n\n case 'UserName':\n this.authenticationMode = this.USER_PASSWORD;\n break;\n\n case 'Certificate':\n this.authenticationMode = this.KEY_BASED;\n break;\n\n default:\n this.authenticationMode = this.ANONYM;\n break;\n }\n }\n\n private getModelConfig(fragment: string) {\n if (this.model && this.model.config) {\n if (fragment && fragment.length > 0) {\n return has(this.model.config, fragment) ? this.model.config[`${fragment}`] : undefined;\n }\n }\n return undefined;\n }\n\n private getAdvancedSettingsFields(): FormlyFieldConfig[] {\n return [\n {\n fieldGroupClassName: 'tight-grid',\n fieldGroup: [\n {\n key: 'timeout',\n type: 'number',\n className: 'col-xs-6',\n props: {\n label: gettext('Timeout'),\n placeholder: '30',\n required: true,\n min: this.minIntervalNumber,\n addonRight: {\n text: gettext('seconds')\n }\n }\n },\n {\n key: 'statusCheckInterval',\n type: 'number',\n className: 'col-xs-6',\n props: {\n label: gettext('Status check interval'),\n placeholder: '40',\n required: true,\n min: this.minIntervalNumber,\n addonRight: {\n text: gettext('seconds')\n }\n }\n }\n ]\n },\n {\n fieldGroupClassName: 'row',\n fieldGroup: [\n {\n key: 'autoScanAddressSpace',\n type: 'checkbox',\n className: 'col-sm-6',\n props: {\n label: gettext('Auto scan address space'),\n indeterminate: false\n }\n },\n {\n key: 'partialAddressScan',\n type: 'radio',\n className: 'col-sm-6',\n props: {\n label: gettext('Address scan type'),\n options: [\n { label: gettext('Partial'), value: true },\n { label: gettext('Full'), value: false }\n ]\n }\n }\n ]\n },\n {\n key: 'partialAddressScanNodeIds',\n type: 'array',\n props: {\n label: gettext('Partial address scan nodes'),\n description: gettext(\n 'Add node IDs to be scanned in the address space of the OPC UA server'\n ),\n required: true\n },\n fieldArray: {\n type: 'string',\n props: {\n label: gettext('Node ID'),\n placeholder: 'ns=2;s=Node1',\n required: true\n }\n },\n expressions: {\n hide: ({ parent }) => !parent?.model?.partialAddressScan\n }\n }\n ];\n }\n}\n","<c8y-ui-empty-state\n [icon]=\"'server'\"\n [title]=\"'No server to display.' | translate\"\n [subtitle]=\"'Add or select a server.' | translate\"\n *ngIf=\"!server\"\n></c8y-ui-empty-state>\n\n<form\n class=\"d-contents\"\n #opcuaConfigForm=\"ngForm\"\n *ngIf=\"server\"\n>\n <div class=\"card-header large-padding separator sticky-top visible-sm visible-xs\">\n <button\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n {{ 'Back' | translate }}\n </button>\n </div>\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\">\n <!-- SERVER NAME -->\n <c8y-form-group class=\"m-b-8\">\n <label>{{ 'Server name' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"name\"\n placeholder=\"{{ 'e.g. My server' | translate }}\"\n name=\"name\"\n type=\"text\"\n required\n [(ngModel)]=\"model.name\"\n />\n <c8y-messages>\n <c8y-message\n name=\"required\"\n text=\"{{ 'Server name is required' | translate }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"card-block large-padding bg-level-2\">\n <div class=\"tight-grid\">\n <div class=\"col-sm-6\">\n <label\n class=\"fit-w\"\n translate\n >\n Server connection\n </label>\n <button\n class=\"btn m-t-4\"\n name=\"serverConnection\"\n type=\"button\"\n [(ngModel)]=\"targetConnectionState\"\n (ngModelChange)=\"setServerConnection($event)\"\n btnCheckbox\n btnCheckboxTrue=\"1\"\n btnCheckboxFalse=\"0\"\n >\n <span\n title=\"{{ 'Enabled' | translate }}\"\n [hidden]=\"targetConnectionState !== '1'\"\n >\n {{ 'Enabled' | translate }}\n </span>\n <span\n title=\"{{ 'Disabled' | translate }}\"\n [hidden]=\"targetConnectionState !== '0'\"\n >\n {{ 'Disabled' | translate }}\n </span>\n </button>\n </div>\n <div class=\"col-sm-6\">\n <label translate>Connection status</label>\n <div class=\"form-control-static\">\n <device-status\n class=\"p-r-8\"\n [mo]=\"server\"\n ></device-status>\n <span>{{ connectionStatusLabel | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <!-- SERVER URL-->\n <c8y-form-group>\n <label\n for=\"configServerUrl\"\n translate\n >\n Server URL\n </label>\n <input\n class=\"form-control\"\n id=\"configServerUrl\"\n name=\"serverUrl\"\n type=\"text\"\n required\n [(ngModel)]=\"model.config.serverUrl\"\n c8yDefaultValidation=\"opcuaBrowsePath\"\n />\n </c8y-form-group>\n\n <!-- SECURITY MODE -->\n <div class=\"tight-grid\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <!-- NONE, SIGN, SIGN & ENCRYPT-->\n <label\n for=\"config.securityMode\"\n translate\n >\n Security mode\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.securityMode\"\n name=\"securityMode\"\n required\n [(ngModel)]=\"currentSecMode\"\n (ngModelChange)=\"setPolicy($event)\"\n >\n <option\n *ngFor=\"let mode of securityModes\"\n [ngValue]=\"mode\"\n >\n {{ mode }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"currentSecMode === NONE\"\n >\n <div class=\"form-group\">\n <label\n for=\"config.securityPolicy\"\n translate\n >\n Security policy\n </label>\n <input\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n type=\"text\"\n required\n [readonly]=\"true\"\n [(ngModel)]=\"model.config.securityMode\"\n />\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"currentSecMode !== NONE\"\n >\n <div class=\"form-group\">\n <label\n for=\"config.securityPolicy\"\n translate\n >\n Security policy\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n required\n *ngIf=\"currentSecMode === SIGN\"\n [(ngModel)]=\"model.config.securityMode\"\n >\n <option\n *ngFor=\"let policy of securityPolicies.sign\"\n [ngValue]=\"policy\"\n >\n {{ policy }}\n </option>\n </select>\n <select\n class=\"form-control\"\n id=\"config.securityPolicy\"\n name=\"securityPolicy\"\n required\n *ngIf=\"currentSecMode === SIGN_ENC\"\n [(ngModel)]=\"model.config.securityMode\"\n >\n <option\n *ngFor=\"let policy of securityPolicies.sign_enc\"\n [ngValue]=\"policy\"\n >\n {{ policy }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- AUTHENTICATION -->\n <div class=\"row tight-grid\">\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.authenticationMode\"\n translate\n >\n Authentication\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"config.authenticationMode\"\n name=\"authenticationMode\"\n required\n [(ngModel)]=\"authenticationMode\"\n (ngModelChange)=\"updateAuthentication($event)\"\n >\n <option\n *ngFor=\"let auth of authenticationModes\"\n [ngValue]=\"auth\"\n >\n {{ auth.value | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n <!-- User/Pw-->\n <div\n class=\"tight-grid\"\n *ngIf=\"authenticationMode.id === 2\"\n >\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.userName\"\n translate\n >\n Username\n </label>\n <input\n class=\"form-control\"\n id=\"config.userName\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n name=\"userName\"\n type=\"text\"\n autocomplete=\"new-password\"\n required\n [(ngModel)]=\"model.config.userName\"\n />\n </div>\n </div>\n\n <!-- change password section BEGINS-->\n <div class=\"col-md-6\">\n <div\n class=\"form-group\"\n *ngIf=\"!initialPasswordRequired\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n </div>\n\n <div class=\"form-group\">\n <div *ngIf=\"changePassword\">\n <label\n for=\"config.password\"\n translate\n >\n Password\n </label>\n <input\n class=\"form-control\"\n id=\"config.userPassword\"\n name=\"password\"\n type=\"password\"\n autocomplete=\"new-password\"\n required\n [(ngModel)]=\"model.config.userPassword\"\n />\n </div>\n </div>\n </div>\n <!-- change password section ENDS-->\n </div>\n\n <!-- Key-based -->\n <div\n class=\"tight-grid\"\n *ngIf=\"authenticationMode.id === 3\"\n >\n <!-- KEYSTORE PASSWORD -->\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.keystorePass\"\n translate\n >\n Keystore password\n </label>\n <input\n class=\"form-control\"\n id=\"config.keystorePass\"\n name=\"keystorePass\"\n type=\"password\"\n required\n [(ngModel)]=\"model.config.keystorePass\"\n />\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-group\">\n <label\n for=\"config.certificatePass\"\n translate\n >\n Certificate password\n </label>\n <input\n class=\"form-control\"\n id=\"config.certificatePass\"\n name=\"keystorePass\"\n type=\"password\"\n required\n [(ngModel)]=\"model.config.certificatePass\"\n />\n </div>\n </div>\n <!-- UPLOAD KEYSTORE -->\n <div class=\"col-md-12\">\n <div class=\"form-group\">\n <label\n for=\"certificateUpload\"\n translate\n >\n Upload keystore\n </label>\n <input\n class=\"form-control m-b-8\"\n placeholder=\"{{ 'e.g.' | translate }} yourKeystore.jks\"\n name=\"certificateUpload\"\n type=\"text\"\n required\n [readonly]=\"true\"\n [ngModel]=\"fileName\"\n />\n <c8y-drop-area\n [title]=\"'Import keystore with jks file extension' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n ></c8y-drop-area>\n </div>\n </div>\n </div>\n\n <div class=\"form-group m-b-0 d-flex a-i-center\">\n <button\n class=\"btn btn-dot collapse-btn\"\n title=\"{{ (advancedSettings ? collapse : expand) | translate }}\"\n [attr.aria-label]=\"(advancedSettings ? collapse : expand) | translate\"\n [attr.aria-expanded]=\"advancedSettings\"\n [ngClass]=\"{ active: advancedSettings }\"\n (click)=\"advancedSettings = !advancedSettings\"\n data-cy=\"opcua-server-config--advanced-settings-toggle\"\n >\n <i c8yIcon=\"chevron-right\"></i>\n </button>\n <label class=\"m-0\">\n <span>{{ 'Advanced settings' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div\n class=\"card-block collapse\"\n [collapse]=\"!advancedSettings\"\n [isAnimated]=\"true\"\n [ngClass]=\"{ 'bg-level-1': advancedSettings }\"\n >\n <formly-form\n [form]=\"advancedSettingsForm\"\n [fields]=\"advancedSettingsFields\"\n [model]=\"model.config\"\n ></formly-form>\n </div>\n </div>\n <div class=\"card-footer large-padding separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"remove()\"\n [disabled]=\"isNew()\"\n >\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"!opcuaConfigForm.valid || !advancedSettingsForm.valid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { OpcuaServer } from './opcua-server.interface';\nimport { NgIf, NgFor } from '@angular/common';\nimport {\n EmptyStateComponent,\n IconDirective,\n DeviceStatusComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'opcua-server-list',\n templateUrl: './opcua-server-list.component.html',\n imports: [\n NgIf,\n EmptyStateComponent,\n NgFor,\n IconDirective,\n DeviceStatusComponent,\n TooltipDirective,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServerListComponent {\n @Input() serverList: OpcuaServer[] = [];\n @Output() present = new EventEmitter<OpcuaServer>();\n\n presentConfig(server: OpcuaServer) {\n server.active = true;\n this.present.emit(server);\n }\n}\n","<!-- add active class to c8y-stacked-item when clicked -->\n<div class=\"card-block\" *ngIf=\"serverList.length === 0\">\n <c8y-ui-empty-state\n class=\"m-l-auto p-l-8 d-flex p-r-16\"\n [icon]=\"'server'\"\n [title]=\"'No servers found.' | translate\"\n [subtitle]=\"'Click below to add a new server.' | translate\"\n ></c8y-ui-empty-state>\n</div>\n<div\n class=\"c8y-stacked-item\"\n [class.active]=\"server.active\"\n *ngFor=\"let server of serverList\"\n (click)=\"presentConfig(server)\"\n>\n <i [c8yIcon]=\"'server'\" class=\"icon-20\"></i>\n <div class=\"p-l-16 text-truncate\">\n <p id=\"serverName\" class=\"text-truncate\">{{ server.name }}</p>\n <small id=\"serverUrl\" class=\"text-truncate text-muted\">{{ server.config.serverUrl }}</small>\n </div>\n <div class=\"m-l-auto p-l-8 d-flex p-r-16 a-i-center\">\n <device-status class=\"p-r-8\" [mo]=\"server\"></device-status>\n <button\n class=\"btn btn-dot text-gray-darker\"\n type=\"button\"\n [attr.aria-label]=\"server.quickInfo.padlockMsg | translate\"\n tooltip=\"{{ server.quickInfo.padlockMsg | translate }}\"\n placement=\"left\"\n container=\"body\"\n >\n <i [c8yIcon]=\"server.quickInfo.padlock\"></i>\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class OpcuaServerGuard {\n type = 'c8y_OpcuaServer';\n canActivate({ data }) {\n const { contextData } = data;\n return contextData && contextData.type === this.type;\n }\n}\n","import { Component, OnInit, Optional } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ContextRouteComponent,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep } from 'lodash';\nimport { NEW_SERVER_ID, OpcuaServer } from './opcua-server.interface';\nimport { OpcuaService } from './opcuaService';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { OpcuaServerListComponent } from './opcua-server-list.component';\nimport { OpcuaServerConfigComponent } from './opcua-server-config.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'opcua-servers',\n templateUrl: './opcua-servers.component.html',\n imports: [\n PopoverDirective,\n OpcuaServerListComponent,\n IconDirective,\n OpcuaServerConfigComponent,\n NgClass,\n C8yTranslatePipe\n ]\n})\nexport class OpcuaServersComponent implements OnInit {\n serverObjectList: OpcuaServer[] = [];\n initialServerObject: OpcuaServer = {\n id: NEW_SERVER_ID,\n name: gettext('New Server'),\n config: {\n securityMode: 'NONE',\n keystorePass: null,\n keystoreBinaryId: null,\n keystoreFilename: '',\n certificatePass: null,\n serverUrl: '',\n userName: '',\n userPassword: '',\n rescanCron: null,\n timeout: 30,\n statusCheckInterval: 40,\n autoReconnect: true,\n autoScanAddressSpace: true,\n partialAddressScan: false,\n valid: true\n },\n quickInfo: {\n padlock: 'unlock',\n padlockMsg: ''\n },\n active: true\n };\n server: OpcuaServer;\n active = false;\n private moId = '';\n\n constructor(\n private opcuaService: OpcuaService,\n private alertService: AlertService,\n private translateService: TranslateService,\n @Optional() private context: ContextRouteComponent\n ) {}\n\n async ngOnInit() {\n this.moId = this.opcuaService.getMoId();\n if (this.moId && this.moId.length > 0) {\n const res = await this.opcuaService.getServers(this.moId);\n if (res && res.status !== 200) {\n const data = res.json ? await res.json() : undefined;\n this.alertService.addServerFailure({ data, res });\n } else {\n this.serverObjectList = (await res.json()) as OpcuaServer[];\n this.serverObjectList.map(server => this.setQuickInfo(server));\n this.onPresent(this.serverObjectList[0], false);\n }\n }\n }\n\n localServerObjectExist() {\n return !!this.serverObjectList.find(server => server.id === NEW_SERVER_ID);\n }\n\n addServer() {\n const server: OpcuaServer = cloneDeep(this.initialServerObject);\n this.serverObjectList.push(server);\n this.onPresent(server);\n }\n\n onSaved(server: OpcuaServer) {\n if (server && server.id) {\n server.gatewayId = this.moId;\n if (server.id === NEW_SERVER_ID) {\n this.createServer(server);\n } else {\n this.updateServer(server);\n }\n }\n }\n\n onUpdated(server: OpcuaServer) {\n if (server.id === NEW_SERVER_ID) {\n this.serverObjectList.forEach(item => {\n if (item.id === server.id) {\n item.name = server.name;\n item.config = server.config;\n this.setQuickInfo(item);\n }\n });\n }\n }\n\n reloadTabs() {\n if (this.context) {\n this.context.refreshTabs();\n }\n }\n\n onCanceled(server: OpcuaServer) {\n if (server?.id === NEW_SERVER_ID) {\n this.removeServerObjectListById(server.id);\n } else {\n // update activity status for UI\n this.serverObjectList.forEach(item => {\n if (item.id === server.id) {\n item.active = false;\n }\n });\n // When server id is not 'new' we just close the details\n delete this.server;\n }\n }\n\n onRemoved(server: OpcuaServer) {\n if (server.id === NEW_SERVER_ID) {\n this.onCanceled(server);\n } else {\n this.removeServer(server);\n }\n }\n\n async getKeystore(binaryId: string) {\n const { data } = await this.opcuaService.getKeystore(binaryId);\n return data;\n }\n\n async onPresent(server: OpcuaServer, overridePresent = true) {\n if (server && server.id !== NEW_SERVER_ID && server.config && server.config.keystoreBinaryId) {\n try {\n const mo = await this.getKeystore(server.config.keystoreBinaryId);\n server.config.keystoreFilename = mo.name;\n } catch (ex) {\n this.server = Object.assign({}, server);\n }\n }\n if (this.serverObjectList.length > 0) {\n this.serverObjectList.forEach(item => {\n item.active = false;\n\n if (item.id === server.id) {\n item.active = true;\n server.active = item.active;\n }\n });\n this.setQuickInfo(server);\n if (overridePresent || !this.server) {\n this.server = Object.assign({}, server);\n }\n }\n }\n\n private async createServer(server: OpcuaServer) {\n const response = await this.opcuaService.createServer(server);\n const svr = (await response.json()) as OpcuaServer;\n this.updateServerObjectListById(NEW_SERVER_ID, svr);\n this.onPresent(svr);\n this.reloadTabs();\n }\n\n private async updateServer(server: OpcuaServer) {\n const updatedServer = (await this.opcuaService.updateServer(server)) as OpcuaServer;\n if (updatedServer) {\n this.updateServerObjectListById(updatedServer.id, updatedServer);\n }\n }\n\n private async removeServer(server: OpcuaServer) {\n try {\n await this.opcuaService.removeServer(server);\n this.removeServerObjectListById(server.id);\n this.reloadTabs();\n } catch (ex) {}\n }\n\n private removeServerObjectListById(id: string) {\n this.serverObjectList.forEach((item, index) => {\n if (item.id === id) {\n this.serverObjectList.splice(index, 1);\n delete this.server;\n }\n });\n }\n\n private updateServerObjectListById(id: string, server: OpcuaServer) {\n const idx = this.serverObjectList.findIndex(item => item.id === id);\n if (idx > -1) {\n this.setQuickInfo(server);\n this.serverObjectList[idx] = server;\n }\n delete this.server;\n }\n\n private setQuickInfo(server: OpcuaServer) {\n server.quickInfo = {\n padlock: 'unlock',\n padlockMsg: ''\n };\n\n if (server && server.config) {\n if (server.config.securityMode) {\n server.quickInfo.padlock = server.config.securityMode !== 'NONE' ? 'lock' : 'unlock';\n server.quickInfo.padlockMsg = this.translateService.instant(\n gettext('The security policy is set to {{param}}.'),\n { param: server.config.securityMode }\n );\n }\n }\n }\n}\n","<div class=\"card content-fullpage split-view--5-7\">\n <div class=\"card-header grid__col--fullspan separator\">\n <div class=\"h4 card-title\">OPC UA servers</div>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Below you can configure one or more OPC UA servers. The OPC UA agent will connect to these servers if they are enabled and the connection state is set to connected.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <div class=\"bg-level-1 flex-grow\">\n <div class=\"c8y-nav-stacked\">\n <opcua-server-list\n [serverList]=\"serverObjectList\"\n (present)=\"onPresent($event)\"\n ></opcua-server-list>\n </div>\n </div>\n <div class=\"card-footer separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Add server' | translate }}\"\n type=\"button\"\n [disabled]=\"localServerObjectExist()\"\n (click)=\"addServer()\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add server' | translate }}\n </button>\n </div>\n </div>\n\n <opcua-server-config\n class=\"inner-scroll split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': server }\"\n (canceled)=\"onCanceled($event)\"\n (removed)=\"onRemoved($event)\"\n (saved)=\"onSaved($event)\"\n (updated)=\"onUpdated($event)\"\n [server]=\"server\"\n ></opcua-server-config>\n</div>\n","import { CdkTreeModule } from '@angular/cdk/tree';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { RouterModule } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CoreModule,\n DeviceStatusModule,\n DropAreaModule,\n DynamicFormsModule,\n FormsModule,\n hookRoute,\n Route,\n ViewContext\n} from '@c8y/ngx-components';\nimport { ObjectMappingComponent } from '@c8y/ngx-components/device-protocol-object-mappings';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddressSpaceService } from './address-space.service';\nimport { OpcuaAddressSpaceDetailComponent } from './opcua-address-space-detail.component';\nimport { OpcuaAddressSpaceTreeComponent } from './opcua-address-space-tree.component';\nimport { OpcuaAddressSpaceComponent } from './opcua-address-space.component';\nimport { OpcuaAgentGuard } from './opcua-agent.guard';\nimport { OpcuaAutoApplySettingsComponent } from './opcua-auto-apply-settings.component';\nimport { OpcuaDeviceProtocolBrowsePathValidation } from './opcua-device-protocol-browse-path-validation.directive';\nimport { OpcuaDeviceProtocolDataReportingComponent } from './opcua-device-protocol-data-reporting.component';\nimport { OpcuaDeviceProtocolDescription } from './opcua-device-protocol-description.component';\nimport { OpcuaDeviceProtocolDetailComponent } from './opcua-device-protocol-detail.component';\nimport { OpcuaDeviceProtocolMapping } from './opcua-device-protocol-mapping.component';\nimport { OpcuaDeviceProtocolObjectMappingStatus } from './opcua-device-protocol-object-mapping-status-icon.component';\nimport { OpcuaMicroserviceGuard } from './opcua-microservice.guard';\nimport { OpcuaServerConfigComponent } from './opcua-server-config.component';\nimport { OpcuaServerListComponent } from './opcua-server-list.component';\nimport { OpcuaServerGuard } from './opcua-server.guard';\nimport { OpcuaServersComponent } from './opcua-servers.component';\nimport { OpcuaService } from './opcuaService';\n\nconst opcuaRoutes: Route[] = [\n {\n context: ViewContext.Device,\n path: 'opcua-servers',\n component: OpcuaServersComponent,\n label: gettext('OPC UA server'),\n icon: 'server',\n canActivate: [OpcuaAgentGuard, OpcuaMicroserviceGuard]\n },\n {\n context: ViewContext.Device,\n path: 'address-space',\n component: OpcuaAddressSpaceComponent,\n label: gettext('Address space'),\n icon: 'cloud-network',\n canActivate: [OpcuaServerGuard, OpcuaMicroserviceGuard]\n }\n];\n\nconst deviceProtocolRoutes: Route[] = [\n {\n path: 'deviceprotocols/opcuaV2/:id',\n component: OpcuaDeviceProtocolDetailComponent\n }\n];\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n ReactiveFormsModule,\n DropAreaModule,\n ButtonsModule,\n CdkTreeModule,\n RouterModule.forChild(deviceProtocolRoutes),\n TooltipModule.forRoot(),\n PopoverModule.forRoot(),\n DeviceStatusModule,\n OperationDetailsModule,\n BrowserAnimationsModule,\n CollapseModule.forRoot(),\n BsDropdownModule.forRoot(),\n ObjectMappingComponent,\n DynamicFormsModule,\n OpcuaServersComponent,\n OpcuaServerListComponent,\n OpcuaServerConfigComponent,\n OpcuaAddressSpaceComponent,\n OpcuaAddressSpaceTreeComponent,\n OpcuaAddressSpaceDetailComponent,\n OpcuaDeviceProtocolDescription,\n OpcuaDeviceProtocolDetailComponent,\n OpcuaDeviceProtocolDataReportingComponent,\n OpcuaDeviceProtocolMapping,\n OpcuaDeviceProtocolObjectMappingStatus,\n OpcuaAutoApplySettingsComponent,\n OpcuaDeviceProtocolBrowsePathValidation\n ],\n providers: [\n OpcuaAgentGuard,\n OpcuaServerGuard,\n OpcuaMicroserviceGuard,\n OpcuaService,\n AddressSpaceService,\n hookRoute(opcuaRoutes)\n ]\n})\nexport class OpcuaProtocolModule {}\n","import { downgradeComponent } from '@angular/upgrade/static';\nimport { OpcuaAddressSpaceTreeComponent } from '../opcua-address-space-tree.component';\nexport const opcuaAddressSpaceTreeComponentDowngradedComponent = downgradeComponent({\n component: OpcuaAddressSpaceTreeComponent,\n inputs: ['moId'],\n outputs: ['selectedNode']\n});\n","import * as angular from 'angular';\nimport { registerNgModule } from '@c8y/ng1-modules';\nimport { opcuaAddressSpaceTreeComponentDowngradedComponent } from './downgraded.components';\n\nconst NAME_OPCUA = 'c8y.upgrade.opcua';\n\nangular\n .module(NAME_OPCUA, [])\n .directive('c8yOpcuaAddressSpaceTree', opcuaAddressSpaceTreeComponentDowngradedComponent);\n\nexport const ng1ModulesOPCUA = [NAME_OPCUA];\n\nregisterNgModule(ng1ModulesOPCUA);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AddressSpaceService","i3","i2.OpcuaService","i4","i5","i2","i1","unset","set","i1.OpcuaService","cloneDeep","FormsModule"],"mappings":"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"}
|