Blog cleanup (#1715)
* Blog cleanup Signed-off-by: svrnm <neumanns@cisco.com> * fix zipkin UI url in apisix blog Signed-off-by: svrnm <neumanns@cisco.com>
|
Before Width: | Height: | Size: 401 KiB After Width: | Height: | Size: 401 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 179 KiB |
|
|
@ -2,7 +2,9 @@
|
||||||
title: Apache APISIX Integrates with OpenTelemetry to Collect Tracing Data
|
title: Apache APISIX Integrates with OpenTelemetry to Collect Tracing Data
|
||||||
linkTitle: Apache APISIX-Opentelemetry Integration
|
linkTitle: Apache APISIX-Opentelemetry Integration
|
||||||
date: 2022-03-26
|
date: 2022-03-26
|
||||||
author: Haochao Zhuang, Fei Han
|
author: >-
|
||||||
|
[Haochao Zhuang](https://github.com/dmsolr),
|
||||||
|
[Fei Han](https://github.com/hf400159)
|
||||||
canonical_url: https://apisix.apache.org/blog/2022/02/28/apisix-integration-opentelemetry-plugin/
|
canonical_url: https://apisix.apache.org/blog/2022/02/28/apisix-integration-opentelemetry-plugin/
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -19,7 +21,7 @@ backends, such as Jaeger, Zipkin, and OpenCensus. You can view the list of
|
||||||
plugins that have adapted the OpenTelemetry Collector in the
|
plugins that have adapted the OpenTelemetry Collector in the
|
||||||
[registry](/registry/?s=collector).
|
[registry](/registry/?s=collector).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Plugin Introduction
|
## Plugin Introduction
|
||||||
|
|
||||||
|
|
@ -170,7 +172,7 @@ After the access is successful, you can see the details of the span similar to
|
||||||
`/put` in the Jaeger UI, and you can see that the custom tags in the route are
|
`/put` in the Jaeger UI, and you can see that the custom tags in the route are
|
||||||
displayed in the Tags list: `http_x-custom-ot-key` and `route_id`.
|
displayed in the Tags list: `http_x-custom-ot-key` and `route_id`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
You need to note that the `additional_attributes` configuration is set to take
|
You need to note that the `additional_attributes` configuration is set to take
|
||||||
values from Apache APISIX and Nginx variables as `attribute` values, so
|
values from Apache APISIX and Nginx variables as `attribute` values, so
|
||||||
|
|
@ -206,23 +208,23 @@ successful.
|
||||||
|
|
||||||
The following screenshots show an example of successful access.
|
The following screenshots show an example of successful access.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Step 2: Configure the Test Environment
|
### Step 2: Configure the Test Environment
|
||||||
|
|
||||||
The Apache APISIX service is introduced, and the topology of the final
|
The Apache APISIX service is introduced, and the topology of the final
|
||||||
application is shown in the following figure.
|
application is shown in the following figure.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The Trace data reporting process is as follows. Among them, since Apache APISIX
|
The Trace data reporting process is as follows. Among them, since Apache APISIX
|
||||||
is deployed separately and not in the network of docker-compose, Apache APISIX
|
is deployed separately and not in the network of docker-compose, Apache APISIX
|
||||||
accesses the OTLP HTTP Receiver of OpenTelemetry Collector through the locally
|
accesses the OTLP HTTP Receiver of OpenTelemetry Collector through the locally
|
||||||
mapped port (`127.0.0.1:4138`).
|
mapped port (`127.0.0.1:4138`).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
You need to make sure you have enabled the `opentelemetry` plugin and reload
|
You need to make sure you have enabled the `opentelemetry` plugin and reload
|
||||||
Apache APISIX.
|
Apache APISIX.
|
||||||
|
|
@ -350,21 +352,21 @@ details, see [Installation via Docker](https://apisix.apache.org/docs/apisix/how
|
||||||
After the redeployment is completed, you can access the Jaeger UI or Zipkin UI
|
After the redeployment is completed, you can access the Jaeger UI or Zipkin UI
|
||||||
to see that the Span of APISIX is included in the Trace, as shown below:
|
to see that the Span of APISIX is included in the Trace, as shown below:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
When demo-server is not instrumented, you can still getting visibility of the
|
When demo-server is not instrumented, you can still getting visibility of the
|
||||||
demo-server behavior by enabling this plugin. Although this is not a typical
|
demo-server behavior by enabling this plugin. Although this is not a typical
|
||||||
case, it is a poor-man substitute of a real instrumentation of demo-server and
|
case, it is a poor-man substitute of a real instrumentation of demo-server and
|
||||||
provides a lot of value.
|
provides a lot of value.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
When the request does not reach the demo-server, the output would not include
|
When the request does not reach the demo-server, the output would not include
|
||||||
the span of demo-server.
|
the span of demo-server.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Disable the Plugin
|
## Disable the Plugin
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 217 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 403 KiB After Width: | Height: | Size: 403 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
|
@ -2,10 +2,10 @@
|
||||||
title: Announcing a Community Demo for OpenTelemetry
|
title: Announcing a Community Demo for OpenTelemetry
|
||||||
linkTitle: OpenTelemetry Community Demo
|
linkTitle: OpenTelemetry Community Demo
|
||||||
date: 2022-06-20
|
date: 2022-06-20
|
||||||
author: Carter Socha
|
author: "[Carter Socha](https://github.com/cartersocha)"
|
||||||
---
|
---
|
||||||
|
|
||||||
### TL;DR
|
## TL;DR
|
||||||
|
|
||||||
The OpenTelemetry community has taken a good pre-existing demo (thanks,
|
The OpenTelemetry community has taken a good pre-existing demo (thanks,
|
||||||
[Google](https://github.com/GoogleCloudPlatform/microservices-demo)!) and is in
|
[Google](https://github.com/GoogleCloudPlatform/microservices-demo)!) and is in
|
||||||
|
|
@ -24,7 +24,7 @@ some stretching and take a water break in the meantime.
|
||||||
|
|
||||||
Your command line output should look like this:
|
Your command line output should look like this:
|
||||||
|
|
||||||

|
"Screenshot of the console output")
|
||||||
|
|
||||||
- Once the images are built you can access the Webstore at:
|
- Once the images are built you can access the Webstore at:
|
||||||
|
|
@ -83,7 +83,7 @@ gRPC, Redis, and HTTP libraries
|
||||||
### Current Architecture
|
### Current Architecture
|
||||||
|
|
||||||

|
current architecture")
|
||||||
|
|
||||||
### BYOB (Bring Your Own Backend)
|
### BYOB (Bring Your Own Backend)
|
||||||
|
|
@ -143,7 +143,7 @@ ourselves to just the items listed here.
|
||||||
|
|
||||||
### Future Architecture
|
### Future Architecture
|
||||||
|
|
||||||

|
"Screenshot of the future architecture")
|
||||||
|
|
||||||
## Going Forward
|
## Going Forward
|
||||||
|
Before Width: | Height: | Size: 584 KiB After Width: | Height: | Size: 584 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
|
@ -4,7 +4,7 @@ linkTitle: Instrument Apache Http Server
|
||||||
date: 2022-05-27
|
date: 2022-05-27
|
||||||
spelling:
|
spelling:
|
||||||
cSpell:ignore Centos centos7 Debajit debuggability libmod OLTP uncompress
|
cSpell:ignore Centos centos7 Debajit debuggability libmod OLTP uncompress
|
||||||
author: Debajit Das
|
author: "[Debajit Das](https://github.com/DebajitDas) (Cisco)"
|
||||||
---
|
---
|
||||||
|
|
||||||
If you are using Apache Web Server and in dire need of some observability tool
|
If you are using Apache Web Server and in dire need of some observability tool
|
||||||
|
|
@ -59,13 +59,13 @@ To send a request to Apache webServer you can either use curl from terminal
|
||||||
landing page saying "Testing 123..." for Apache Http Server on Centos will be
|
landing page saying "Testing 123..." for Apache Http Server on Centos will be
|
||||||
displayed as below:
|
displayed as below:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Now, traces and spans can be seen on the Zipkin backend. To view them, visit
|
Now, traces and spans can be seen on the Zipkin backend. To view them, visit
|
||||||
[localhost:9411][] in your browser and click on **Run Query** button. Following
|
[localhost:9411][] in your browser and click on **Run Query** button. Following
|
||||||
is the screenshot from Zipkin UI showing spans emitted by the Apache webServer.
|
is the screenshot from Zipkin UI showing spans emitted by the Apache webServer.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This shows a list of queries or endpoints that have been triggered to Apache
|
This shows a list of queries or endpoints that have been triggered to Apache
|
||||||
WebServer, such as `/noindex/css`.
|
WebServer, such as `/noindex/css`.
|
||||||
|
|
@ -73,7 +73,7 @@ WebServer, such as `/noindex/css`.
|
||||||
To see the details click on any of the **SHOW** buttons. Below is the screenshot
|
To see the details click on any of the **SHOW** buttons. Below is the screenshot
|
||||||
from the Zipkin UI showing the span hierarchy.
|
from the Zipkin UI showing the span hierarchy.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The above shows that as a part of this request, `mod_proxy`,
|
The above shows that as a part of this request, `mod_proxy`,
|
||||||
`mod_proxy_balancer` and `mod_dav` got involved in the request processing and
|
`mod_proxy_balancer` and `mod_dav` got involved in the request processing and
|
||||||
|
|
@ -95,7 +95,7 @@ Zipkin backend. The following steps are required to be done.
|
||||||
- Add `AddType application/x-httpd-php .html` in `/etc/httpd/conf/httpd.conf` as
|
- Add `AddType application/x-httpd-php .html` in `/etc/httpd/conf/httpd.conf` as
|
||||||
mentioned below:
|
mentioned below:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Create a file named as `index.html` in the **/var/www/html** directory and add
|
- Create a file named as `index.html` in the **/var/www/html** directory and add
|
||||||
the following text
|
the following text
|
||||||
|
|
@ -123,13 +123,13 @@ Zipkin backend. The following steps are required to be done.
|
||||||
|
|
||||||
- Now, visit [localhost:9004/index.html][]. You should see something like this:
|
- Now, visit [localhost:9004/index.html][]. You should see something like this:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Now, traces and spans can be seen on the Zipkin backend. To view them, type
|
- Now, traces and spans can be seen on the Zipkin backend. To view them, type
|
||||||
[localhost:9411][] on the browser and click on the **Run Query** Button. To
|
[localhost:9411][] on the browser and click on the **Run Query** Button. To
|
||||||
see the details, click on the **SHOW** button corresponding to `/index.html`.
|
see the details, click on the **SHOW** button corresponding to `/index.html`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- We can see that, `mod_php5.c_handler` consumes around **1 second** which
|
- We can see that, `mod_php5.c_handler` consumes around **1 second** which
|
||||||
contributes to the overall time-consumption of the request.
|
contributes to the overall time-consumption of the request.
|
||||||
|
|
@ -208,17 +208,17 @@ writing this blog, support for other architectures is not provided.
|
||||||
`Include conf/opentelemetry_module.conf` at the end of the file as mentioned
|
`Include conf/opentelemetry_module.conf` at the end of the file as mentioned
|
||||||
below:
|
below:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Now let’s look at opentelemetry_module.conf and its contents:
|
- Now let’s look at opentelemetry_module.conf and its contents:
|
||||||
|
|
||||||
- The below LoadFile are the dependent libraries that come with the package.
|
- The below LoadFile are the dependent libraries that come with the package.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- The below configuration are for the OpenTelemetry Module
|
- The below configuration are for the OpenTelemetry Module
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
In the case of Apache 2.2, `libmod_apache_otel22.so` needs to be used
|
In the case of Apache 2.2, `libmod_apache_otel22.so` needs to be used
|
||||||
instead of `libmod_apache_otel.so`
|
instead of `libmod_apache_otel.so`
|
||||||
|
|
@ -226,12 +226,12 @@ writing this blog, support for other architectures is not provided.
|
||||||
- The following directive should be ON for the openTelemetry module to be
|
- The following directive should be ON for the openTelemetry module to be
|
||||||
enabled, else it would be disabled.
|
enabled, else it would be disabled.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Since the module works with the Collector and sends data in OLTP format, the
|
- Since the module works with the Collector and sends data in OLTP format, the
|
||||||
following directives are necessary.
|
following directives are necessary.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
_ApacheModuleOtelExporterEndpoint_ should point to the endpoint of the
|
_ApacheModuleOtelExporterEndpoint_ should point to the endpoint of the
|
||||||
collector
|
collector
|
||||||
|
|
@ -239,7 +239,7 @@ writing this blog, support for other architectures is not provided.
|
||||||
- ServiceNamespace, ServiceName and ServiceInstanceId should be provided by
|
- ServiceNamespace, ServiceName and ServiceInstanceId should be provided by
|
||||||
the following directives.
|
the following directives.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- All other directives are either optional and can be kept as it is for this
|
- All other directives are either optional and can be kept as it is for this
|
||||||
guide
|
guide
|
||||||
|
|
@ -247,7 +247,7 @@ writing this blog, support for other architectures is not provided.
|
||||||
- To verify whether Apache OpenTelemetry Module is properly enabled into Apache
|
- To verify whether Apache OpenTelemetry Module is properly enabled into Apache
|
||||||
Web Server, type `httpd -M` and look for `otel_apache_module (shared)`
|
Web Server, type `httpd -M` and look for `otel_apache_module (shared)`
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Now, restart the apache module and open telemetry module should be
|
- Now, restart the apache module and open telemetry module should be
|
||||||
instrumented.
|
instrumented.
|
||||||
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 315 KiB After Width: | Height: | Size: 315 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 459 KiB After Width: | Height: | Size: 459 KiB |
|
Before Width: | Height: | Size: 565 KiB After Width: | Height: | Size: 565 KiB |
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
|
|
@ -3,9 +3,9 @@ title: Learn how to instrument nginx with OpenTelemetry
|
||||||
linkTitle: Instrument Nginx
|
linkTitle: Instrument Nginx
|
||||||
date: 2022-08-22
|
date: 2022-08-22
|
||||||
author: >-
|
author: >-
|
||||||
[Debajit Das](https://github.com/debajitdas), [Kumar
|
[Debajit Das](https://github.com/debajitdas),
|
||||||
Pratyus](https://github.com/kpratyus), and [Severin
|
[Kumar Pratyus](https://github.com/kpratyus),
|
||||||
Neumann](https://github.com/svrnm)
|
[Severin Neumann](https://github.com/svrnm) (Cisco)
|
||||||
spelling: >
|
spelling: >
|
||||||
cSpell:ignore Debajit Kumar Pratyus Severin Neumann webserver xvfz tracestate
|
cSpell:ignore Debajit Kumar Pratyus Severin Neumann webserver xvfz tracestate
|
||||||
cSpell:ignore catalina javaagent jaegertracing protobuf WORKDIR
|
cSpell:ignore catalina javaagent jaegertracing protobuf WORKDIR
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ The processor internally maintains a list of pods and an associated attribute,
|
||||||
usually the IP address of the pod, and uses this attribute to know which pod
|
usually the IP address of the pod, and uses this attribute to know which pod
|
||||||
generates a certain span.
|
generates a certain span.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
In the figure above you can see how the data flows: The table of pods is fetched
|
In the figure above you can see how the data flows: The table of pods is fetched
|
||||||
using Kubernetes API, while the pod IP is extracted from the connection context
|
using Kubernetes API, while the pod IP is extracted from the connection context
|
||||||
|
|
@ -148,7 +148,7 @@ contains the permissions to fetch the pod list.
|
||||||
Next, deploy the manifest and the [vert.x example app][] to generate some
|
Next, deploy the manifest and the [vert.x example app][] to generate some
|
||||||
traces.
|
traces.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
As you can see, each span of the trace now has the corresponding pod attributes
|
As you can see, each span of the trace now has the corresponding pod attributes
|
||||||
attached to it.
|
attached to it.
|
||||||
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
|
@ -3,7 +3,7 @@ title: Distributed tracing in Knative
|
||||||
linkTitle: Tracing in Knative
|
linkTitle: Tracing in Knative
|
||||||
date: 2022-04-12
|
date: 2022-04-12
|
||||||
spelling: cSpell:ignore Cloudevents istio Loffay Pavol pavolloffay
|
spelling: cSpell:ignore Cloudevents istio Loffay Pavol pavolloffay
|
||||||
author: Pavol Loffay
|
author: "[Pavol Loffay](https://github.com/pavolloffay)"
|
||||||
---
|
---
|
||||||
|
|
||||||
In this article, you will learn how distributed tracing works in Knative and we
|
In this article, you will learn how distributed tracing works in Knative and we
|
||||||
|
|
@ -35,7 +35,7 @@ request or transaction. On the diagram below there are two user workloads (first
|
||||||
and second) and an incoming request marked as (1. HTTP) that goes to use
|
and second) and an incoming request marked as (1. HTTP) that goes to use
|
||||||
workload first and then to the workload second as a cloud event message.
|
workload first and then to the workload second as a cloud event message.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
There are two important facts about this diagram:
|
There are two important facts about this diagram:
|
||||||
|
|
||||||
|
|
@ -70,7 +70,7 @@ service receives an HTTP call and sends a cloud event to the second service. The
|
||||||
full demo source code can be found in
|
full demo source code can be found in
|
||||||
[pavolloffay/knative-tracing](https://github.com/pavolloffay/knative-tracing).
|
[pavolloffay/knative-tracing](https://github.com/pavolloffay/knative-tracing).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The trace shows the following services interacting: activator, first workload,
|
The trace shows the following services interacting: activator, first workload,
|
||||||
broker-ingress, imc-dispatcher, broker-filter, activator, and second workload.
|
broker-ingress, imc-dispatcher, broker-filter, activator, and second workload.
|
||||||
|
|
@ -166,7 +166,7 @@ The document standardizes attributes related to CloudEvents. The screenshot
|
||||||
below is from the demo application that is still not using the standardized
|
below is from the demo application that is still not using the standardized
|
||||||
attribute names:
|
attribute names:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
|
@ -3,7 +3,7 @@ title: >-
|
||||||
Introducing new resources for OpenTelemetry end users to connect and discover
|
Introducing new resources for OpenTelemetry end users to connect and discover
|
||||||
best practices
|
best practices
|
||||||
linkTitle: End User Resources
|
linkTitle: End User Resources
|
||||||
author: OpenTelemetry End User Working Group
|
author: "[OpenTelemetry End User Working Group](https://github.com/open-telemetry/community/tree/main/working-groups/end-user)"
|
||||||
date: 2022-06-30
|
date: 2022-06-30
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: OpenTelemetry Tuesdays, Signing Off!
|
title: OpenTelemetry Tuesdays, Signing Off!
|
||||||
date: 2022-03-21
|
date: 2022-03-21
|
||||||
author: Austin Parker
|
author: "[Austin Parker](https://github.com/austinlparker)"
|
||||||
---
|
---
|
||||||
|
|
||||||
When we started running OpenTelemetry Tuesday live streams back in 2019, the
|
When we started running OpenTelemetry Tuesday live streams back in 2019, the
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ title: Checklist for TroublesShooting OpenTelemetry Node.js Tracing Issues
|
||||||
linkTitle: TroublesShooting Node.js Tracing Issues
|
linkTitle: TroublesShooting Node.js Tracing Issues
|
||||||
date: 2022-02-22
|
date: 2022-02-22
|
||||||
canonical_url: https://www.aspecto.io/blog/checklist-for-troubleshooting-opentelemetry-nodejs-tracing-issues
|
canonical_url: https://www.aspecto.io/blog/checklist-for-troubleshooting-opentelemetry-nodejs-tracing-issues
|
||||||
|
author: "[Amir Blum](https://github.com/blumamir) (Aspecto)"
|
||||||
---
|
---
|
||||||
|
|
||||||
I’ll try to make this one short and to the point. You are probably here because
|
I’ll try to make this one short and to the point. You are probably here because
|
||||||
|
|
|
||||||