From d298e85b326b812002da88c62dc26bc62901322c Mon Sep 17 00:00:00 2001 From: Dmitry Ledentsov Date: Fri, 28 Jan 2022 17:35:13 +0100 Subject: [PATCH] fixing golint ./... warnings & copyright year --- .link-checker-service.toml | 2 +- README.md | 2 +- cmd/check.go | 3 +- cmd/root.go | 3 +- cmd/serve.go | 3 +- cmd/version.go | 3 +- infrastructure/cache.go | 6 ++- infrastructure/cached_url_checker.go | 3 +- infrastructure/cc_limited_url_checker.go | 3 +- infrastructure/domain_rate_limited_checker.go | 3 +- infrastructure/stats_collector.go | 42 ++++++++++--------- infrastructure/stats_collector_test.go | 10 +++-- infrastructure/strings.go | 3 +- infrastructure/strings_test.go | 6 ++- infrastructure/url_checker.go | 7 ++-- infrastructure/url_checker_plugin.go | 3 +- infrastructure/url_checker_test.go | 3 +- infrastructure/urlcheckstatus.go | 3 +- infrastructure/version.go | 3 +- main.go | 3 +- main_test.go | 6 ++- main_test_support.go | 3 +- server/deduplicator.go | 3 +- server/deduplicator_test.go | 3 +- server/serialization.go | 3 +- server/server.go | 3 +- server/url_normalizer.go | 3 +- test/jquery_example/main.go | 2 +- test/jquery_example/public/index.html | 2 +- test/large_list_check/main.go | 2 +- test/large_list_check/serialization.go | 2 +- 31 files changed, 88 insertions(+), 58 deletions(-) diff --git a/.link-checker-service.toml b/.link-checker-service.toml index 2e674d9..de234f8 100644 --- a/.link-checker-service.toml +++ b/.link-checker-service.toml @@ -1,4 +1,4 @@ -# Copyright 2020-2021 Siemens AG +# Copyright 2020-2022 Siemens AG # This file is not subject to the MPLv2 license, and can be edited freely. # proxy = "http://:" diff --git a/README.md b/README.md index a46d5a7..2ef70ac 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ some URL check services exist, albeit not open source (as of 02.09.2020) ## License ```text - Copyright 2020-2021 Siemens AG and contributors as noted in the AUTHORS file. + Copyright 2020-2022 Siemens AG and contributors as noted in the AUTHORS file. This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/cmd/check.go b/cmd/check.go index 5bc4f0f..878cd8b 100644 --- a/cmd/check.go +++ b/cmd/check.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package cmd import ( diff --git a/cmd/root.go b/cmd/root.go index 7821655..2bfb960 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package cmd import ( diff --git a/cmd/serve.go b/cmd/serve.go index d45183c..7b49739 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package cmd import ( diff --git a/cmd/version.go b/cmd/version.go index 71cb901..0d30368 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package cmd import ( diff --git a/infrastructure/cache.go b/infrastructure/cache.go index dc8f8b7..6ebff77 100644 --- a/infrastructure/cache.go +++ b/infrastructure/cache.go @@ -1,15 +1,17 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( "encoding/json" + "time" + "github.com/dgraph-io/ristretto" "github.com/patrickmn/go-cache" - "time" ) type resultCache interface { diff --git a/infrastructure/cached_url_checker.go b/infrastructure/cached_url_checker.go index d65eec3..8306e5e 100644 --- a/infrastructure/cached_url_checker.go +++ b/infrastructure/cached_url_checker.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( diff --git a/infrastructure/cc_limited_url_checker.go b/infrastructure/cc_limited_url_checker.go index fdf2c90..529bcf6 100644 --- a/infrastructure/cc_limited_url_checker.go +++ b/infrastructure/cc_limited_url_checker.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( diff --git a/infrastructure/domain_rate_limited_checker.go b/infrastructure/domain_rate_limited_checker.go index 9c084b1..0706589 100644 --- a/infrastructure/domain_rate_limited_checker.go +++ b/infrastructure/domain_rate_limited_checker.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( diff --git a/infrastructure/stats_collector.go b/infrastructure/stats_collector.go index 5566eaf..d95411e 100644 --- a/infrastructure/stats_collector.go +++ b/infrastructure/stats_collector.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import "sync" @@ -12,7 +13,7 @@ type Stats struct { IncomingRequests int64 OutgoingRequests int64 IncomingStreamRequests int64 - DnsResolutionsFailed int64 + DNSResolutionsFailed int64 LinkChecksErrored int64 LinkChecksOk int64 LinkChecksBroken int64 @@ -22,7 +23,8 @@ type Stats struct { CacheMisses int64 } -type statsState struct { +// StatsState is the protected instance of the Stats object +type StatsState struct { sync.RWMutex s Stats } @@ -30,7 +32,7 @@ type statsState struct { var globalStatsState = newStatsState() // GlobalStats returns the global handler to the stats collector -func GlobalStats() *statsState { +func GlobalStats() *StatsState { return globalStatsState } @@ -40,89 +42,89 @@ func ResetGlobalStats() { } // OnIncomingRequest call on incoming request -func (stats *statsState) OnIncomingRequest() { +func (stats *StatsState) OnIncomingRequest() { stats.Lock() stats.s.IncomingRequests++ stats.Unlock() } // OnIncomingStreamRequest called on an incoming stream request -func (stats *statsState) OnIncomingStreamRequest() { +func (stats *StatsState) OnIncomingStreamRequest() { stats.Lock() stats.s.IncomingStreamRequests++ stats.Unlock() } // OnOutgoingRequest called on outgoing request -func (stats *statsState) OnOutgoingRequest() { +func (stats *StatsState) OnOutgoingRequest() { stats.Lock() stats.s.OutgoingRequests++ stats.Unlock() } -// OnDnsResolutionFailed called on dns resolution failure -func (stats *statsState) OnDnsResolutionFailed() { +// OnDNSResolutionFailed called on dns resolution failure +func (stats *StatsState) OnDNSResolutionFailed() { stats.Lock() - stats.s.DnsResolutionsFailed++ + stats.s.DNSResolutionsFailed++ stats.Unlock() } // OnLinkErrored called on link check error -func (stats *statsState) OnLinkErrored() { +func (stats *StatsState) OnLinkErrored() { stats.Lock() stats.s.LinkChecksErrored++ stats.Unlock() } // OnLinkOk called on link check ok -func (stats *statsState) OnLinkOk() { +func (stats *StatsState) OnLinkOk() { stats.Lock() stats.s.LinkChecksOk++ stats.Unlock() } // OnLinkBroken called on link check broken -func (stats *statsState) OnLinkBroken() { +func (stats *StatsState) OnLinkBroken() { stats.Lock() stats.s.LinkChecksBroken++ stats.Unlock() } // OnLinkDropped called on link check dropped -func (stats *statsState) OnLinkDropped() { +func (stats *StatsState) OnLinkDropped() { stats.Lock() stats.s.LinkChecksDropped++ stats.Unlock() } // OnLinkSkipped called on link check skipped -func (stats *statsState) OnLinkSkipped() { +func (stats *StatsState) OnLinkSkipped() { stats.Lock() stats.s.LinkChecksSkipped++ stats.Unlock() } // OnCacheHit called when the result is taken from the cache -func (stats *statsState) OnCacheHit() { +func (stats *StatsState) OnCacheHit() { stats.Lock() stats.s.CacheHits++ stats.Unlock() } // OnCacheMiss called when the requested URL wasn't found in the cache -func (stats *statsState) OnCacheMiss() { +func (stats *StatsState) OnCacheMiss() { stats.Lock() stats.s.CacheMisses++ stats.Unlock() } // GetStats returns a copy of the stats -func (stats *statsState) GetStats() Stats { +func (stats *StatsState) GetStats() Stats { stats.RLock() defer stats.RUnlock() return stats.s // a copy } -func newStatsState() *statsState { - return &statsState{} +func newStatsState() *StatsState { + return &StatsState{} } diff --git a/infrastructure/stats_collector_test.go b/infrastructure/stats_collector_test.go index 2865f21..066f234 100644 --- a/infrastructure/stats_collector_test.go +++ b/infrastructure/stats_collector_test.go @@ -1,14 +1,16 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( - "github.com/stretchr/testify/assert" "sync" "testing" + + "github.com/stretchr/testify/assert" ) func TestCollectingFromSeveralGoroutines(t *testing.T) { @@ -22,7 +24,7 @@ func TestCollectingFromSeveralGoroutines(t *testing.T) { IncomingRequests: expectedCount, OutgoingRequests: expectedCount, IncomingStreamRequests: expectedCount, - DnsResolutionsFailed: expectedCount, + DNSResolutionsFailed: expectedCount, LinkChecksErrored: expectedCount, LinkChecksOk: expectedCount, LinkChecksBroken: expectedCount, @@ -47,7 +49,7 @@ func addStats(numGoroutines int, count int) { s.OnIncomingStreamRequest() s.OnLinkBroken() s.OnLinkDropped() - s.OnDnsResolutionFailed() + s.OnDNSResolutionFailed() s.OnLinkErrored() s.OnLinkOk() s.OnLinkSkipped() diff --git a/infrastructure/strings.go b/infrastructure/strings.go index 7a2bf4d..fcc3cf6 100644 --- a/infrastructure/strings.go +++ b/infrastructure/strings.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import "strings" diff --git a/infrastructure/strings_test.go b/infrastructure/strings_test.go index 2f0e38d..61258e5 100644 --- a/infrastructure/strings_test.go +++ b/infrastructure/strings_test.go @@ -1,14 +1,16 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( - "github.com/stretchr/testify/assert" "strings" "testing" + + "github.com/stretchr/testify/assert" ) func TestSanitizingUserLogInputForNewlines(t *testing.T) { diff --git a/infrastructure/url_checker.go b/infrastructure/url_checker.go index cb4a8b9..bc3ed0e 100644 --- a/infrastructure/url_checker.go +++ b/infrastructure/url_checker.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( @@ -455,7 +456,7 @@ func (c *URLCheckerClient) checkURL(ctx context.Context, urlToCheck string, clie }, DNSDone: func(info httptrace.DNSDoneInfo) { if remoteAddr == "" { - GlobalStats().OnDnsResolutionFailed() + GlobalStats().OnDNSResolutionFailed() // this may not be as precise as ConnectDone, thus skipping caching remoteAddr = getDNSAddressesAsString(info.Addrs) } @@ -529,7 +530,7 @@ func (c *URLCheckerClient) resolveAndCacheTCPAddr(network string, err error, add remoteAddr = addr.String() c.dnsCache.Set(addrToResolve, remoteAddr, defaultCacheExpirationInterval) } else { - GlobalStats().OnDnsResolutionFailed() + GlobalStats().OnDNSResolutionFailed() c.dnsCache.Set(addrToResolve, "DNS resolution failed", defaultRetryFailedAfter) log.Printf("ERROR in resolveAndCacheTCPAddr: %v", err) } diff --git a/infrastructure/url_checker_plugin.go b/infrastructure/url_checker_plugin.go index 47316fe..a057a99 100644 --- a/infrastructure/url_checker_plugin.go +++ b/infrastructure/url_checker_plugin.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import "context" diff --git a/infrastructure/url_checker_test.go b/infrastructure/url_checker_test.go index 418421d..f5f531e 100644 --- a/infrastructure/url_checker_test.go +++ b/infrastructure/url_checker_test.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import ( diff --git a/infrastructure/urlcheckstatus.go b/infrastructure/urlcheckstatus.go index 111d114..d081e65 100644 --- a/infrastructure/urlcheckstatus.go +++ b/infrastructure/urlcheckstatus.go @@ -1,10 +1,11 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 //go:generate go get github.com/alvaroloes/enumer //go:generate enumer -type=URLCheckStatus -json -text -transform=lower + package infrastructure //run go generate to generate enum serialization code diff --git a/infrastructure/version.go b/infrastructure/version.go index 939b9ab..4f70294 100644 --- a/infrastructure/version.go +++ b/infrastructure/version.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package infrastructure import "runtime/debug" diff --git a/main.go b/main.go index 068e5b3..b758343 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package main import "github.com/siemens/link-checker-service/cmd" diff --git a/main_test.go b/main_test.go index a7c6714..f69e206 100644 --- a/main_test.go +++ b/main_test.go @@ -1,13 +1,13 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package main import ( "encoding/json" - "github.com/siemens/link-checker-service/infrastructure" "net/http" "net/http/httptest" "os" @@ -17,6 +17,8 @@ import ( "testing" "time" + "github.com/siemens/link-checker-service/infrastructure" + "github.com/gin-gonic/gin" "github.com/spf13/viper" diff --git a/main_test_support.go b/main_test_support.go index 70039c2..1945b6a 100644 --- a/main_test_support.go +++ b/main_test_support.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package main import ( diff --git a/server/deduplicator.go b/server/deduplicator.go index e6a0833..3b28e12 100644 --- a/server/deduplicator.go +++ b/server/deduplicator.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package server import "sync" diff --git a/server/deduplicator_test.go b/server/deduplicator_test.go index 5cad9da..e35d13c 100644 --- a/server/deduplicator_test.go +++ b/server/deduplicator_test.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package server import ( diff --git a/server/serialization.go b/server/serialization.go index 953344b..ea582ae 100644 --- a/server/serialization.go +++ b/server/serialization.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package server // URLRequest is a JSON structure for a single URL check request diff --git a/server/server.go b/server/server.go index b92ed53..f9bb643 100644 --- a/server/server.go +++ b/server/server.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package server import ( diff --git a/server/url_normalizer.go b/server/url_normalizer.go index 9058a71..bce63b3 100644 --- a/server/url_normalizer.go +++ b/server/url_normalizer.go @@ -1,8 +1,9 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. // SPDX-License-Identifier: MPL-2.0 + package server import ( diff --git a/test/jquery_example/main.go b/test/jquery_example/main.go index a36199d..10de03f 100644 --- a/test/jquery_example/main.go +++ b/test/jquery_example/main.go @@ -1,4 +1,4 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of // Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license // https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/test/jquery_example/public/index.html b/test/jquery_example/public/index.html index a3bd883..2a36271 100644 --- a/test/jquery_example/public/index.html +++ b/test/jquery_example/public/index.html @@ -1,4 +1,4 @@ - + diff --git a/test/large_list_check/main.go b/test/large_list_check/main.go index 12f0f6a..1abe07f 100644 --- a/test/large_list_check/main.go +++ b/test/large_list_check/main.go @@ -1,4 +1,4 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of // Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license // https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/test/large_list_check/serialization.go b/test/large_list_check/serialization.go index a36a88b..837edcc 100644 --- a/test/large_list_check/serialization.go +++ b/test/large_list_check/serialization.go @@ -1,4 +1,4 @@ -// Copyright 2020-2021 Siemens AG +// Copyright 2020-2022 Siemens AG // This Source Code Form is subject to the terms of // Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license // https://creativecommons.org/licenses/by-sa/4.0/