From 3279c72bcb3c88d980361c1955beafa3cdf9e071 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Sun, 14 Jan 2024 22:51:46 -0800 Subject: [PATCH 01/19] WIP- Update README.md - opening --- README.md | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 9ab2a8c75a9..791dbac809a 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,26 @@

- Proton – open source, unified streaming and data processing engine for real-time analytics + Proton – open source, unified streaming and data processing engine for real-time analytics

+
+ A streaming SQL engine, fast and lightweight +

- License - - Slack - follow on LinkedIn - YouTube - Twitter(X) + πŸ“„ Documentation  + πŸš€ Live Demo + 🌎 Timeplus +

+

+ License   +   +   + YouTube 
+ Slack  + follow on LinkedIn  + Twitter(X) 

-

- Introduction Β· + Why use Proton Β· Architecture Β· Get Started Β· What's next Β· @@ -22,14 +29,11 @@ Need help?

-## Introduction - -Proton is a unified streaming and historical data analytics database in a single binary. It helps data engineers and platform engineers solve complex real-time analytics use cases, and powers the [Timeplus](https://timeplus.com) streaming analytics platform. - -Proton extends the historical data, storage, and computing functionality of the popular [ClickHouse project](https://github.com/clickhouse/clickhouse) with streaming and OLAP data processing. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. -Why use Proton? +Proton extends the historical data, storage, and computing functionality of the popular [ClickHouse project](https://github.com/clickhouse/clickhouse) with streaming data processing. It helps data engineers and platform engineers solve complex real-time analytics use cases, and powers the [Timeplus](https://timeplus.com) streaming analytics platform. +## Why use Proton? - **A unified, lightweight engine** to connect streaming and historical data processing tasks with efficiency and robust performance. - **A smooth developer experience** with powerful streaming and analytical functionality. - **Flexible deployments** with Proton's single binary and no external service dependencies. From c145843af595d6d0165426196c24d4006915b082 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 11:50:29 -0800 Subject: [PATCH 02/19] new Proton README --- README.md | 164 ++++++++++---------------------- design/proton-architecture.webp | Bin 0 -> 59044 bytes docker-compose.yml | 45 --------- 3 files changed, 50 insertions(+), 159 deletions(-) create mode 100644 design/proton-architecture.webp delete mode 100644 docker-compose.yml diff --git a/README.md b/README.md index 791dbac809a..4ed74c7fd65 100644 --- a/README.md +++ b/README.md @@ -1,133 +1,76 @@

- Proton – open source, unified streaming and data processing engine for real-time analytics -

-
- A streaming SQL engine, fast and lightweight -
-

+ Proton – open source, unified streaming and data processing engine for real-time analytics
+ A streaming SQL engine, fast and lightweight

πŸ“„ Documentation  πŸš€ Live Demo - 🌎 Timeplus -

-

- License   + 🌎 Timeplus

  -   - YouTube 
+   + Release  + YouTube  Slack  follow on LinkedIn  - Twitter(X)  + Twitter(X)  + License 

- Why use Proton Β· - Architecture Β· - Get Started Β· - What's next Β· - Documentation Β· + Why Use Proton Β· + Demo Video Β· + Get Started Β· + What's Next Β· + Integrations Β· Contributing Β· Need help?

+Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases, also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. -Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. - -Proton extends the historical data, storage, and computing functionality of the popular [ClickHouse project](https://github.com/clickhouse/clickhouse) with streaming data processing. It helps data engineers and platform engineers solve complex real-time analytics use cases, and powers the [Timeplus](https://timeplus.com) streaming analytics platform. - -## Why use Proton? -- **A unified, lightweight engine** to connect streaming and historical data processing tasks with efficiency and robust performance. -- **A smooth developer experience** with powerful streaming and analytical functionality. -- **Flexible deployments** with Proton's single binary and no external service dependencies. -- **Low total cost of ownership** compared to other analytical frameworks. - -Plus built-in support for powerful streaming and analytical functionality: +## πŸ’ͺ Why use Proton? -| Functionality | Description | -| ------------------------------------------------------------ | ------------------------------------------------------------ | -| [Data transformation](https://docs.timeplus.com/usecases#data) | Scrub sensitive fields, derive new columns from raw data, or convert identifiers to human-readable information. | -| [Joining streams](https://docs.timeplus.com/joins) | Combine data from different sources to add freshness to the resulting stream. | -| [Aggregating streams](https://docs.timeplus.com/functions_for_agg) | Developer-friendly functions to derive insights from streaming and historical data. | -| Windowed stream processing ([tumble](https://docs.timeplus.com/functions_for_streaming#tumble) / [hop](https://docs.timeplus.com/functions_for_streaming#hop) / [session](https://docs.timeplus.com/functions_for_streaming#session)) | Collect insightful snapshots of streaming data. | -| [Substreams](https://docs.timeplus.com/substream) | Maintain separate watermarks and streaming windows. | -| [Data revision processing (changelog)](https://docs.timeplus.com/changelog-stream) | Create and manage non-append streams with primary keys and change data capture (CDC) semantics. | -| [Federated streaming queries](https://docs.timeplus.com/external-stream) | Query streaming data in external systems (e.g. Kafka) without duplicating them. | -| [Materialized views](https://docs.timeplus.com/view#m_view) | Create long-running and internally-stored queries. | +1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative.** Proton provides powerful streaming SQL functionality, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, etc. +2. **Fast.** Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. +3. **Lightweight.** Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on AWS t2.nano instance (1 vCPU and 0.5 GiB memory). +4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. More than 1200 [SQL functions](https://docs.timeplus.com/functions) are available. Query billions of historical data in milliseconds. +5. **Best SQL engine for [Kafka](https://kafka.apache.org/)/[Redpanda](https://redpanda.com/)/[Confluent](https://www.confluent.io/).** Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). -## Architecture - -![Architecture](design/proton-high-level-arch.svg) - -See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and the [FAQ](https://docs.timeplus.com/proton-faq) for more information on the various editions of Proton, how it's related to ClickHouse, and why we chose Apache License 2.0. - -## Get started -### Single Binary - -If you’re an Apache Kafka or Redpanda user, you can install Proton as a single binary via: +![Proton Architecture](design/proton-architecture.webp) +See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and the [FAQ](https://docs.timeplus.com/proton-faq) for more information. +## 🎬 Demo Video + +## ⚑ Quick Start +### πŸ™ Docker Compose: +The [docker compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. +### 🐳 Docker: +```bash +docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest +``` +### ⬇️ Install Proton Without Docker +You can install Proton as a single binary via: ```shell curl -sSf https://raw.githubusercontent.com/timeplus-io/proton/develop/install.sh | sh ``` - -This will install the Proton binary in the current folder, then you can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. - For Mac users, you can also use [Homebrew](https://brew.sh/) to manage the install/upgrade/uninstall: - ```shell brew tap timeplus-io/timeplus brew install proton ``` +Then you can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. -Next, create an external stream in Proton with SQL to consume data from your Kafka or Redpanda. Follow this [tutorial](https://docs.timeplus.com/proton-kafka#tutorial) for SQL snippets. - -### Docker Compose - -If you don’t want to setup Kafka or Redpanda, you can use [the docker-compose.yml file](examples/carsharing/docker-compose.yml) in examples/carsharing. Download the file to a local folder. Make sure you have Docker Engine and Desktop installed. Use `docker compose up` to start the demonstration stack. - -Next, you can open the shell of the Proton container and run your first streaming SQL. To print out the new data being generated, you can run the following sample SQL: - -```sql -select * from car_live_data -``` - -To get the total number of events in the historical store, you can run the following SQL: - -```sql -select count() from table(car_live_data) -``` +### πŸ”Ž Query a test stream -To show the number of event events, at certain intervals (2 seconds, by default), you can run: +From `proton-client`, run the following SQL to create a stream of random data: ```sql -select count() from car_live_data -``` - -Congratulations! You have successfully installed Proton and run queries for both historical and streaming analytics. - -### Docker - -With [Docker engine](https://docs.docker.com/engine/install/) installed on your local machine, pull and run the latest version of the Proton Docker image. - -```bash -docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest +-- Create a stream with random data +CREATE RANDOM STREAM devices( + device string default 'device'||to_string(rand()%4), + temperature float default rand()%1000/10) ``` - -Connect to your `proton` container and run the `proton-client` tool to connect to the local Proton server: - -```bash -docker exec -it proton proton-client -n -``` - -If you stop the container and want to start it again, run `docker start proton`. - -### Query a test stream - -From `proton-client`, run the following SQL to create a stream of random data: - ```sql --- Create a stream with random data. -CREATE RANDOM STREAM devices(device string default 'device'||to_string(rand()%4), temperature float default rand()%1000/10); - --- Run the long-running stream query. -SELECT device, count(*), min(temperature), max(temperature) FROM devices GROUP BY device; +-- Run the streaming SQL +SELECT device, count(*), min(temperature), max(temperature) +FROM devices GROUP BY device ``` You should see data like the following: @@ -141,12 +84,12 @@ You should see data like the following: β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` -### What's next? - -Now that you're running Proton and have created your first stream, query, and view, you can explore [reading and writing data from Apache Kafka](https://docs.timeplus.com/proton-kafka#tutorial) with External Streams, or view the [Proton documentation](https://docs.timeplus.com/proton) to explore additional capabilities. - +### ⏩ What's next? To see more examples of using Proton, check out the [examples](https://github.com/timeplus-io/proton/tree/develop/examples) folder. +To access more features, such as sources, sinks, dashboards, alerts, data lineage, create a workspace at [Timeplus Cloud](https://us.timeplus.cloud) or try the [live demo](https://demo.timeplus.cloud) with pre-built live data and dashboards. + +## 🧩 Integrations The following drivers are available: * https://github.com/timeplus-io/proton-java-driver JDBC and other Java clients @@ -161,17 +104,12 @@ Integrations with other systems: * Homebrew https://github.com/timeplus-io/homebrew-timeplus * dbt https://github.com/timeplus-io/dbt-proton -## Get more with Timeplus - -To access more features, such as sources, sinks, dashboards, alerts, data lineage, create a workspace at [Timeplus Cloud](https://us.timeplus.cloud) or try the [live demo](https://demo.timeplus.cloud) with pre-built live data and dashboards. - ## Documentation -We publish full documentation for Proton at [docs.timeplus.com](https://docs.timeplus.com/proton) alongside documentation for the Timeplus (Cloud and Enterprise) platform. +We publish full documentation for Proton at [docs.timeplus.com](https://docs.timeplus.com/proton) alongside documentation for the Timeplus (Cloud and BYOC) platform. We also have a [FAQ](https://docs.timeplus.com/proton-faq/) for detailing how we chose Apache License 2.0, how Proton is related to ClickHouse, what features are available in Proton versus Timeplus, and more. - ## Contributing We welcome your contributions! If you are looking for issues to work on, try looking at [the issue list](https://github.com/timeplus-io/proton/issues). @@ -182,13 +120,11 @@ We also encourage you to join the [Timeplus Community Slack](https://timeplus.co ## Need help? -Join the [Timeplus Community Slack](https://timeplus.com/slack) to connect with Timeplus engineers and other Proton -users. +Join the [Timeplus Community Slack](https://timeplus.com/slack) to connect with Timeplus engineers and other Proton users. For filing bugs, suggesting improvements, or requesting new features, see the [open issues](https://github.com/timeplus-io/proton/issues) here on GitHub. ## Licensing -Proton uses Apache License 2.0. See details in the [LICENSE](https://github.com/timeplus-io/proton/blob/develop/LICENSE). - +Proton uses Apache License 2.0. See details in the [LICENSE](https://github.com/timeplus-io/proton/blob/master/LICENSE). diff --git a/design/proton-architecture.webp b/design/proton-architecture.webp new file mode 100644 index 0000000000000000000000000000000000000000..c30d3ff934e4f8414170fdfa5937f508b436b9c3 GIT binary patch literal 59044 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 z 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 /tmp/config.yml; /app/console" - environment: - CONFIG_FILEPATH: /tmp/config.yml - CONSOLE_CONFIG_FILE: | - kafka: - brokers: ["redpanda:9092"] - ports: - - 8080:8080 - depends_on: - - redpanda - - owl-shop: - image: quay.io/cloudhut/owl-shop:latest - #platform: 'linux/amd64' - environment: - - SHOP_KAFKA_BROKERS=redpanda:9092 - - SHOP_KAFKA_TOPICREPLICATIONFACTOR=1 - - SHOP_TRAFFIC_INTERVAL_RATE=1 - - SHOP_TRAFFIC_INTERVAL_DURATION=0.1s - depends_on: - - redpanda From 4f13a0bc178d32c83560315f93d5b8d5b46d1c42 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 11:55:05 -0800 Subject: [PATCH 03/19] add whitespace and newline in README --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4ed74c7fd65..42202af8604 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

Proton – open source, unified streaming and data processing engine for real-time analytics
A streaming SQL engine, fast and lightweight

- πŸ“„ Documentation  - πŸš€ Live Demo + πŸ“„ Documentation   + πŸš€ Live Demo   🌎 Timeplus

    @@ -38,23 +38,33 @@ See our [architecture](https://docs.timeplus.com/proton-architecture) doc for te ## 🎬 Demo Video + ## ⚑ Quick Start + ### πŸ™ Docker Compose: The [docker compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. + ### 🐳 Docker: + ```bash docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest ``` + ### ⬇️ Install Proton Without Docker + You can install Proton as a single binary via: + ```shell curl -sSf https://raw.githubusercontent.com/timeplus-io/proton/develop/install.sh | sh ``` + For Mac users, you can also use [Homebrew](https://brew.sh/) to manage the install/upgrade/uninstall: + ```shell brew tap timeplus-io/timeplus brew install proton ``` + Then you can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. ### πŸ”Ž Query a test stream From 9e761f28b38a2873a578a8d86bf1ce44c30cea0e Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 12:31:41 -0800 Subject: [PATCH 04/19] WIP README change, about to upload 2min video --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 42202af8604..098677f0036 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@

Why Use Proton Β· Demo Video Β· - Get Started Β· + Quick Start Β· What's Next Β· Integrations Β· Contributing Β· @@ -41,10 +41,10 @@ See our [architecture](https://docs.timeplus.com/proton-architecture) doc for te ## ⚑ Quick Start -### πŸ™ Docker Compose: +### πŸ™ Try Proton With Docker Compose: The [docker compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. -### 🐳 Docker: +### 🐳 Try Proton With Docker: ```bash docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest From 182aadc6afb7dfbc761ccaa68bea83e77dd6af59 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 12:39:40 -0800 Subject: [PATCH 05/19] Update README.md to use GitHub asset for video --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 098677f0036..da5840b802b 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,10 @@ Proton is a streaming SQL engine, a fast and lightweight alternative to Apache F See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and the [FAQ](https://docs.timeplus.com/proton-faq) for more information. ## 🎬 Demo Video - + +2-minute short videoπŸ‘‡. Check out [the full video at YouTube](https://youtu.be/vi4Yl6L4_Dw?t=283). + +https://github.com/timeplus-io/proton/assets/5076438/8ceca355-d992-4798-b861-1e0334fc4438 ## ⚑ Quick Start From 24987cf023124a3d33c1261e34a1ad6df7068321 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 14:33:09 -0800 Subject: [PATCH 06/19] update README and dockercompose for sensor app demo --- examples/awesome-sensor-logger/README.md | 40 +++- .../awesome-sensor-logger/docker-compose.yml | 33 ++- .../dashboards/grafana_dashboard.json | 220 ++++++++++++++++++ .../grafana_provisioning/dashboards/main.yaml | 24 ++ .../datasources/automatic.yml | 26 +++ 5 files changed, 332 insertions(+), 11 deletions(-) create mode 100644 examples/awesome-sensor-logger/grafana_provisioning/dashboards/grafana_dashboard.json create mode 100644 examples/awesome-sensor-logger/grafana_provisioning/dashboards/main.yaml create mode 100644 examples/awesome-sensor-logger/grafana_provisioning/datasources/automatic.yml diff --git a/examples/awesome-sensor-logger/README.md b/examples/awesome-sensor-logger/README.md index bab9e561cdf..13491948319 100644 --- a/examples/awesome-sensor-logger/README.md +++ b/examples/awesome-sensor-logger/README.md @@ -1,15 +1,35 @@ -# awesome-sensor-logger +# Demo to visualize the sensor data from your phone -To install dependencies: +[Sensor Logger](https://github.com/tszheichoi/awesome-sensor-logger) is a free, easy-to-use, cross-platform data logger that logs readings from common motion-related sensors on smartphones. Recordings can be exported as a zipped CSV file, or streamed to Proton via HTTP API. -```bash -bun install -``` +Demo video: https://youtu.be/vi4Yl6L4_Dw?t=1049 -To run: +## Setup Guide + +### Step 1: start docker compose +Install [Docker Desktop](https://docs.docker.com/desktop/) and fork this repo or download the [docker-compose.yml](docker-compose.yml) to a local folder. Start everything via `docker compose up`. The following containers will be started: +* latest version of Proton, to receive the live data and apply stream processing +* latest version of Grafana, to visualize the live data with streaming SQL +* a lightweight proxy server to convert JSON from sensor loggers to the format for Proton Ingest API +* a short-live container to start proton client and create the stream `phone` + +Wait for about half a minute to have all containers up running. + +### Step 2: install mobile app and push data to Proton +Download Sensor Logger at www.tszheichoi.com/sensorlogger. + +| Android | iOS | +|:-:|:-:| +| [](https://play.google.com/store/apps/details?id=com.kelvin.sensorapp&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1) | [](https://apps.apple.com/app/id1531582925) | + +Open the app, and go to the settings page, by clicking the button at the bottom. +1. Click the `Data Streaming` menu. +2. Turn on `Enable HTTP Push`. +3. Get your IP for your server (on Mac, you can hold Option key and click the WiFi icon to get the IP address), and set the `Push URL` as `http://:8000` +4. Optionally, you can turn on `Skip Writing`. + +### Step 3: view the live dashboard in Grafana + +In your laptop/server, access `http://localhost:3000` and open the `Phone Sensor` -```bash -bun run index.ts -``` -This project was created using `bun init` in bun v1.0.15. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/examples/awesome-sensor-logger/docker-compose.yml b/examples/awesome-sensor-logger/docker-compose.yml index e0aa130dfa1..62c65926445 100644 --- a/examples/awesome-sensor-logger/docker-compose.yml +++ b/examples/awesome-sensor-logger/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: proton: image: ghcr.io/timeplus-io/proton:latest @@ -7,6 +6,23 @@ services: - 3218:3218 #http port for JDBC driver, default streaming mode - 8123:8123 #http port for JDBC driver, default batch mode - 8463:8463 #tcp port for go driver or grafana plugin + healthcheck: + test: ["CMD", "curl", "http://localhost:3218/proton/ping"] + interval: 2s + timeout: 10s + retries: 3 + start_period: 10s + + init-proton: + image: ghcr.io/timeplus-io/proton:latest + command: + - sh + - -c + - | + proton-client -h proton -n --query "CREATE STREAM IF NOT EXISTS phone(raw string)" + depends_on: + proton: + condition: service_healthy proxy: image: timeplus/sensor-logger-proxy @@ -17,3 +33,18 @@ services: STREAM: phone depends_on: - proton + + grafana: + image: grafana/grafana:latest + pull_policy: always + ports: + - 3000:3000 + environment: + GF_AUTH_ANONYMOUS_ENABLED: 1 + GF_AUTH_ANONYMOUS_ORG_ROLE: Admin + GF_INSTALL_PLUGINS: timeplus-proton-datasource + volumes: + - ./grafana_provisioning:/etc/grafana/provisioning + depends_on: + init-proton: + condition: service_completed_successfully \ No newline at end of file diff --git a/examples/awesome-sensor-logger/grafana_provisioning/dashboards/grafana_dashboard.json b/examples/awesome-sensor-logger/grafana_provisioning/dashboards/grafana_dashboard.json new file mode 100644 index 00000000000..04e34291d2d --- /dev/null +++ b/examples/awesome-sensor-logger/grafana_provisioning/dashboards/grafana_dashboard.json @@ -0,0 +1,220 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "isStreaming": true, + "queryText": "select array_join(xyz) as v, multi_if(v[1]=1,'x',v[1]=2,'y','z') as axis, v[2] as value, time from(\nselect to_datetime64((p:time::int64)/1000000000,3) as time,[[1,to_float32_or_zero(p:values.x)],[2,to_float32_or_zero(p:values.y)],[3,to_float32_or_zero(p:values.z)]] as xyz from (select array_join(json_extract_array(raw,'payload')) as p from phone where p:name='gyroscope')\n)", + "refId": "A" + } + ], + "title": "Bar Chart", + "type": "barchart" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "pointSize": { + "fixed": 5 + }, + "scaleDistribution": { + "type": "linear" + }, + "show": "points" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "dims": { + "exclude": [ + "z" + ] + }, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "series": [], + "seriesMapping": "auto", + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "isStreaming": true, + "queryText": "select to_datetime64((p:time::int64)/1000000000,3) as time,to_float32_or_zero(p:values.x) as x,to_float32_or_zero(p:values.y) as y,to_float32_or_zero(p:values.z) as z from (select array_join(json_extract_array(raw,'payload')) as p from phone where p:name='gyroscope')\n", + "refId": "A" + } + ], + "title": "XY Chart", + "type": "xychart" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-3m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Phone Sensor", + "uid": "a3406569-2c08-454c-8791-64064366e107", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/examples/awesome-sensor-logger/grafana_provisioning/dashboards/main.yaml b/examples/awesome-sensor-logger/grafana_provisioning/dashboards/main.yaml new file mode 100644 index 00000000000..c19eef2f224 --- /dev/null +++ b/examples/awesome-sensor-logger/grafana_provisioning/dashboards/main.yaml @@ -0,0 +1,24 @@ +apiVersion: 1 + +providers: + # an unique provider name. Required + - name: 'a unique provider name' + # Org id. Default to 1 + orgId: 1 + # name of the dashboard folder. + folder: '' + # folder UID. will be automatically generated if not specified + folderUid: '' + # provider type. Default to 'file' + type: file + # disable dashboard deletion + disableDeletion: false + # how often Grafana will scan for changed dashboards + updateIntervalSeconds: 10 + # allow updating provisioned dashboards from the UI + allowUiUpdates: true + options: + # path to dashboard files on disk. Required when using the 'file' type + path: /etc/grafana/provisioning/dashboards + # use folder names from filesystem to create folders in Grafana + foldersFromFilesStructure: true \ No newline at end of file diff --git a/examples/awesome-sensor-logger/grafana_provisioning/datasources/automatic.yml b/examples/awesome-sensor-logger/grafana_provisioning/datasources/automatic.yml new file mode 100644 index 00000000000..aa9cf0f5cf4 --- /dev/null +++ b/examples/awesome-sensor-logger/grafana_provisioning/datasources/automatic.yml @@ -0,0 +1,26 @@ +apiVersion: 1 + +datasources: +- name: Proton + type: timeplus-proton-datasource + uid: c24e0faf-1490-4321-a373-7b2b07ca2e38 + typeName: Proton + access: proxy + url: + password: + user: + database: + isDefault: true + basicAuth: false + basicAuthUser: + basicAuthPassword: + withCredentials: + jsonData: + host: proton + readOnly: false + secureJsonData: + tlsCACert: "" + tlsClientCert: "" + tlsClientKey: "" + version: 1 + editable: true \ No newline at end of file From 00397d2cf73756446f08d77359925ed0a3f4edf7 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 14:48:57 -0800 Subject: [PATCH 07/19] update README and docker compose for grafana demo --- examples/grafana/README.md | 44 +-- examples/grafana/docker-compose.yml | 17 +- .../dashboards/carsharing.json | 348 ++++++++++++++++++ .../grafana_provisioning/dashboards/main.yaml | 24 ++ .../datasources/automatic.yml | 26 ++ 5 files changed, 418 insertions(+), 41 deletions(-) create mode 100644 examples/grafana/grafana_provisioning/dashboards/carsharing.json create mode 100644 examples/grafana/grafana_provisioning/dashboards/main.yaml create mode 100644 examples/grafana/grafana_provisioning/datasources/automatic.yml diff --git a/examples/grafana/README.md b/examples/grafana/README.md index aecd06baa54..5e271516b03 100644 --- a/examples/grafana/README.md +++ b/examples/grafana/README.md @@ -1,54 +1,18 @@ # Demo for Grafana plugin with carsharing data - - This docker compose file demonstrates how to use Grafana to connect to Proton and visualize the data. A YouTube video tutorial is available for visual learners: https://www.youtube.com/watch?v=cBRl1k9qWZc ## Start the example -Simply run `docker compose up` in this folder. Two docker containers in the stack: +Simply run `docker compose up` in this folder. Three docker containers in the stack: -1. ghcr.io/timeplus-io/proton:latest, as the streaming database. Port 8463 is exposed so that Grafana can connect to it. +1. ghcr.io/timeplus-io/proton:latest, as the streaming SQL engine. Port 8463 and 3218 are exposed so that Grafana can connect to it. 2. timeplus/cardemo:latest, as the data generator +3. grafana/grafana:latest, with pre-configured Proton dashboard and a live dashboard -TODO: we will update the compose file later to include a preconfigured Grafana. - -## Install and configure Grafana - -Install Grafana if you haven't. Please note, this plugin is not available for Grafana Cloud users yet. It's being reviewed. - -For Mac users, simply run `brew install grafana`. - -Before the plugin is approved by Grafana, you need to set your Grafana running in development mode via changing /opt/homebrew/etc/grafana/grafana.ini, setting `app_mode = development`. - -Also searching for key word "plugin", and change `enable_alpha` and `allow_loading_unsigned_plugins` to -``` -enable_alpha = true -allow_loading_unsigned_plugins = timeplus-proton-datasource -``` - -## Install the Proton plugin for Grafana - -Currently you have to download the plugin from https://github.com/timeplus-io/proton-grafana-source/releases. - -We have submited the plugin to Grafana. Once it's approved, you will be able to install it with Grafana UI and it will also work on Grafana Cloud. - -Install the timeplus-proton-datasource in your Grafana plugin folder, such as -- /var/lib/grafana/plugins (for Linux) -- /opt/homebrew/var/lib/grafana/plugins (for Homebrew on Mac) - -Unzip the file and restart Grafana. - - - -In the navigation menu, choose Connections -> Add new connection. -Search for Proton and accept the default settings (localhost:8463 as proton connection) - -Create a new dashboard or explore data with this Proton data source. - -By default, the "Streaming Query" toggle is off. If your SQL is a streaming SQL, make sure to turn it on to leverage Grafana's live chart to show the new results. +When all containers are up running, access http://localhost:3000 and open the `Carsharing Demo Dashboard` dashboard. ## Sample queries diff --git a/examples/grafana/docker-compose.yml b/examples/grafana/docker-compose.yml index fb9dcb0b0f2..602b752cf99 100644 --- a/examples/grafana/docker-compose.yml +++ b/examples/grafana/docker-compose.yml @@ -4,7 +4,8 @@ services: image: ghcr.io/timeplus-io/proton:latest pull_policy: always ports: - - 8463:8463 #port for go driver or grafana plugin + - 8463:8463 + - 3218:3218 carsharing_datagen: image: timeplus/cardemo:latest @@ -19,3 +20,17 @@ services: host: proton depends_on: - proton + + grafana: + image: grafana/grafana:latest + pull_policy: always + ports: + - 3000:3000 + environment: + GF_AUTH_ANONYMOUS_ENABLED: 1 + GF_AUTH_ANONYMOUS_ORG_ROLE: Admin + GF_INSTALL_PLUGINS: timeplus-proton-datasource + volumes: + - ./grafana_provisioning:/etc/grafana/provisioning + depends_on: + - proton \ No newline at end of file diff --git a/examples/grafana/grafana_provisioning/dashboards/carsharing.json b/examples/grafana/grafana_provisioning/dashboards/carsharing.json new file mode 100644 index 00000000000..eb1fcdc8908 --- /dev/null +++ b/examples/grafana/grafana_provisioning/dashboards/carsharing.json @@ -0,0 +1,348 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 3, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select now()", + "refId": "A" + } + ], + "title": "select now()", + "type": "table" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 3, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select count() from car_live_data", + "refId": "A" + } + ], + "title": "select count() from car_live_data", + "type": "stat" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 14, + "x": 10, + "y": 0 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select count() from car_live_data where _tp_time>earliest_ts()", + "refId": "A" + } + ], + "title": "select count() from car_live_data where _tp_time>earliest_ts()", + "type": "stat" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 4, + "options": { + "controls": { + "mouseWheelZoom": true, + "showAttribution": true, + "showDebug": false, + "showMeasure": false, + "showScale": false, + "showZoom": true + }, + "layers": [ + { + "config": { + "showLegend": true, + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "symbolAlign": { + "horizontal": "center", + "vertical": "center" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "location": { + "mode": "auto" + }, + "name": "Layer 1", + "tooltip": true, + "type": "markers" + } + ], + "tooltip": { + "mode": "details" + }, + "view": { + "allLayers": true, + "id": "coords", + "lat": 40.733985, + "lon": -73.995058, + "zoom": 12 + } + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select longitude, latitude,speed_kmh,cid from car_live_data where cid like '%1'", + "refId": "A" + } + ], + "title": "Panel Title", + "type": "geomap" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Carsharing Demo Dashboard", + "uid": "dd9e271d-7225-47d4-9e57-62133db0df62", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/examples/grafana/grafana_provisioning/dashboards/main.yaml b/examples/grafana/grafana_provisioning/dashboards/main.yaml new file mode 100644 index 00000000000..c19eef2f224 --- /dev/null +++ b/examples/grafana/grafana_provisioning/dashboards/main.yaml @@ -0,0 +1,24 @@ +apiVersion: 1 + +providers: + # an unique provider name. Required + - name: 'a unique provider name' + # Org id. Default to 1 + orgId: 1 + # name of the dashboard folder. + folder: '' + # folder UID. will be automatically generated if not specified + folderUid: '' + # provider type. Default to 'file' + type: file + # disable dashboard deletion + disableDeletion: false + # how often Grafana will scan for changed dashboards + updateIntervalSeconds: 10 + # allow updating provisioned dashboards from the UI + allowUiUpdates: true + options: + # path to dashboard files on disk. Required when using the 'file' type + path: /etc/grafana/provisioning/dashboards + # use folder names from filesystem to create folders in Grafana + foldersFromFilesStructure: true \ No newline at end of file diff --git a/examples/grafana/grafana_provisioning/datasources/automatic.yml b/examples/grafana/grafana_provisioning/datasources/automatic.yml new file mode 100644 index 00000000000..aa9cf0f5cf4 --- /dev/null +++ b/examples/grafana/grafana_provisioning/datasources/automatic.yml @@ -0,0 +1,26 @@ +apiVersion: 1 + +datasources: +- name: Proton + type: timeplus-proton-datasource + uid: c24e0faf-1490-4321-a373-7b2b07ca2e38 + typeName: Proton + access: proxy + url: + password: + user: + database: + isDefault: true + basicAuth: false + basicAuthUser: + basicAuthPassword: + withCredentials: + jsonData: + host: proton + readOnly: false + secureJsonData: + tlsCACert: "" + tlsClientCert: "" + tlsClientKey: "" + version: 1 + editable: true \ No newline at end of file From 8e1d3150507cf38b97291541efacee167f231871 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 15:11:06 -0800 Subject: [PATCH 08/19] update README and docker compose for hackernews demo --- examples/hackernews/README.md | 41 +- examples/hackernews/compose.yaml | 41 +- .../dashboards/grafana_dashboard.json | 692 ++++++++++++++++++ .../grafana_provisioning/dashboards/main.yaml | 24 + .../datasources/automatic.yml | 26 + 5 files changed, 815 insertions(+), 9 deletions(-) create mode 100644 examples/hackernews/grafana_provisioning/dashboards/grafana_dashboard.json create mode 100644 examples/hackernews/grafana_provisioning/dashboards/main.yaml create mode 100644 examples/hackernews/grafana_provisioning/datasources/automatic.yml diff --git a/examples/hackernews/README.md b/examples/hackernews/README.md index 946623b5e1a..4a8b1a33a39 100644 --- a/examples/hackernews/README.md +++ b/examples/hackernews/README.md @@ -4,18 +4,45 @@ Inspired by https://bytewax.io/blog/polling-hacker-news, you can call Hacker New ## Start the example -Simply run `docker compose up` in this folder. Two docker containers in the stack: - -1. ghcr.io/timeplus-io/proton:latest, as the streaming database +Simply run `docker compose up` in this folder and it will start +1. ghcr.io/timeplus-io/proton:latest, with pre-configured streams, materialized views and views. 2. timeplus/hackernews_bytewax:latest, leveraging [bytewax](https://bytewax.io) to call Hacker News HTTP API with Bytewax and send latest news to Proton. [Source code](https://github.com/timeplus-io/proton-python-driver/tree/develop/example/bytewax) +3. A pre-configured Grafana instance to visulaize the live data. -It will load ~100 items every 15 second and send the data to Proton. +It will load new items every 15 second and send the data to Proton. -A new stream `hn` will be created automatically, with a single string column `raw`. +## How it works -You can run SQL to analyze/transform the data, such as +When the Proton server is started, we create 2 streams to receive the raw JSON data pushed from Bytewax. +```sql +CREATE STREAM hn_stories_raw(raw string); +CREATE STREAM hn_comments_raw(raw string); +``` +Then we create 2 materialized view to extract the key information from the JSON and put into more meaningful columns: +```sql +CREATE MATERIALIZED VIEW hn_stories AS + SELECT to_time(raw:time) AS _tp_time,raw:id::int AS id,raw:title AS title,raw:by AS by, raw FROM hn_stories_raw; +CREATE MATERIALIZED VIEW hn_comments AS + SELECT to_time(raw:time) AS _tp_time,raw:id::int AS id,raw:root_id::int AS root_id,raw:by AS by, raw FROM hn_comments_raw; +``` +Finally we create 2 views to load both incoming data and existin data: +```sql +CREATE VIEW IF NOT EXISTS story AS SELECT * FROM hn_stories WHERE _tp_time>earliest_ts(); +CREATE VIEW IF NOT EXISTS comment AS SELECT * FROM hn_comments WHERE _tp_time>earliest_ts() +``` +With all those streams and views, you can query the data in whatever ways, e.g. ```sql -select raw:id as id, raw:by as by, to_time(raw:time) as time, raw:title as title from hn +select * from comment; + +select + story._tp_time as story_time,comment._tp_time as comment_time, + story.id as story_id, comment.id as comment_id, + substring(story.title,1,20) as title,substring(comment.raw:text,1,20) as comment +from story join comment on story.id=comment.root_id; ``` + +### Querying and visualizing with Grafana + +Please try the docker-compose file. The Grafana instance is setup to install [Proton Grafana Data Source Plugin](https://github.com/timeplus-io/proton-grafana-source). Create such a data source and preconfigure a dashboard. Open Grafana UI at http://localhost:3000 in your browser and choose the `Hackernews Live Dashboard`. diff --git a/examples/hackernews/compose.yaml b/examples/hackernews/compose.yaml index 49515a8a08b..155a01d3bce 100644 --- a/examples/hackernews/compose.yaml +++ b/examples/hackernews/compose.yaml @@ -2,9 +2,46 @@ services: proton: image: ghcr.io/timeplus-io/proton:latest pull_policy: always - hackernews_bytewax: + ports: + - 8463:8463 + - 3218:3218 + healthcheck: + test: ["CMD", "curl", "http://localhost:3218/proton/ping"] + interval: 2s + timeout: 10s + retries: 3 + start_period: 10s + init-proton: + image: ghcr.io/timeplus-io/proton:latest + command: + - sh + - -c + - | + proton-client -h proton -n --query "CREATE STREAM IF NOT EXISTS hn_stories_raw(raw string);CREATE STREAM IF NOT EXISTS hn_comments_raw(raw string);CREATE MATERIALIZED VIEW IF NOT EXISTS hn_stories AS SELECT to_time(raw:time) AS _tp_time,raw:id::int AS id,raw:title AS title,raw:by AS by, raw FROM hn_stories_raw;CREATE MATERIALIZED VIEW IF NOT EXISTS hn_comments AS SELECT to_time(raw:time) AS _tp_time,raw:id::int AS id,raw:root_id::int AS root_id,raw:by AS by, raw FROM hn_comments_raw;CREATE VIEW IF NOT EXISTS story AS SELECT * FROM hn_stories WHERE _tp_time>earliest_ts();CREATE VIEW IF NOT EXISTS comment AS SELECT * FROM hn_comments WHERE _tp_time>earliest_ts();" + depends_on: + proton: + condition: service_healthy + hn_stream: + build: + context: . image: timeplus/hackernews_bytewax:latest environment: - PROTON_HOST=proton depends_on: - - proton + init-proton: + condition: service_completed_successfully + grafana: + image: grafana/grafana:latest + pull_policy: always + ports: + - 3000:3000 + environment: + GF_AUTH_ANONYMOUS_ENABLED: 1 + GF_AUTH_ANONYMOUS_ORG_ROLE: Admin + GF_INSTALL_PLUGINS: timeplus-proton-datasource + volumes: + - ./grafana_provisioning:/etc/grafana/provisioning + depends_on: + - proton + + diff --git a/examples/hackernews/grafana_provisioning/dashboards/grafana_dashboard.json b/examples/hackernews/grafana_provisioning/dashboards/grafana_dashboard.json new file mode 100644 index 00000000000..2a73557c411 --- /dev/null +++ b/examples/hackernews/grafana_provisioning/dashboards/grafana_dashboard.json @@ -0,0 +1,692 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select count() from story", + "refId": "A" + } + ], + "title": "# of Stories", + "type": "stat" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select count() from comment", + "refId": "A" + } + ], + "title": "# of Comments", + "type": "stat" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "colorByField": "emit_version()", + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xField": "by", + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select `by`,count() as comments,emit_version() from comment where `by`<>'' group by `by` order by comments desc limit 5 by emit_version()", + "refId": "A" + } + ], + "title": "Most active commenters", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "emit_version()" + } + ] + } + }, + { + "id": "limit", + "options": { + "limitField": 5 + } + } + ], + "type": "barchart" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 97 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "_tp_time" + }, + "properties": [ + { + "id": "custom.width", + "value": 159 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "by" + }, + "properties": [ + { + "id": "custom.width", + "value": 113 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 1, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": true, + "fields": "", + "reducer": [ + "count" + ], + "show": true + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select _tp_time,id,`by`,title from story", + "refId": "A" + } + ], + "title": "Stories", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "_tp_time" + } + ] + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 95 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "_tp_time" + }, + "properties": [ + { + "id": "custom.width", + "value": 190 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "root_id" + }, + "properties": [ + { + "id": "custom.width", + "value": 95 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "by" + }, + "properties": [ + { + "id": "custom.width", + "value": 106 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 2, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": true, + "fields": "", + "reducer": [ + "count" + ], + "show": true + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select _tp_time,id,root_id,`by`,raw:text as text from comment", + "refId": "A" + } + ], + "title": "Comments", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "_tp_time" + } + ] + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 95 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "_tp_time" + }, + "properties": [ + { + "id": "custom.width", + "value": 163 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "root_id" + }, + "properties": [ + { + "id": "custom.width", + "value": 95 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "story_time" + }, + "properties": [ + { + "id": "custom.width", + "value": 182 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "comment_time" + }, + "properties": [ + { + "id": "custom.width", + "value": 189 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "story_id" + }, + "properties": [ + { + "id": "custom.width", + "value": 127 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "comment_id" + }, + "properties": [ + { + "id": "custom.width", + "value": 129 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "title" + }, + "properties": [ + { + "id": "custom.width", + "value": 325 + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 3, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.2.3", + "targets": [ + { + "addNow": false, + "datasource": { + "type": "timeplus-proton-datasource", + "uid": "c24e0faf-1490-4321-a373-7b2b07ca2e38" + }, + "queryText": "select \n story._tp_time as story_time,comment._tp_time as comment_time,\n story.id as story_id, comment.id as comment_id,\n story.title as title,comment.raw:text as comment\nfrom story join comment on story.id=comment.root_id", + "refId": "A" + } + ], + "title": "Stories&Comments", + "type": "table" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Hackernews Live Dashboard", + "uid": "d299c092-7bda-4a37-ba1d-5f484fa4db72", + "version": 5, + "weekStart": "" +} \ No newline at end of file diff --git a/examples/hackernews/grafana_provisioning/dashboards/main.yaml b/examples/hackernews/grafana_provisioning/dashboards/main.yaml new file mode 100644 index 00000000000..c19eef2f224 --- /dev/null +++ b/examples/hackernews/grafana_provisioning/dashboards/main.yaml @@ -0,0 +1,24 @@ +apiVersion: 1 + +providers: + # an unique provider name. Required + - name: 'a unique provider name' + # Org id. Default to 1 + orgId: 1 + # name of the dashboard folder. + folder: '' + # folder UID. will be automatically generated if not specified + folderUid: '' + # provider type. Default to 'file' + type: file + # disable dashboard deletion + disableDeletion: false + # how often Grafana will scan for changed dashboards + updateIntervalSeconds: 10 + # allow updating provisioned dashboards from the UI + allowUiUpdates: true + options: + # path to dashboard files on disk. Required when using the 'file' type + path: /etc/grafana/provisioning/dashboards + # use folder names from filesystem to create folders in Grafana + foldersFromFilesStructure: true \ No newline at end of file diff --git a/examples/hackernews/grafana_provisioning/datasources/automatic.yml b/examples/hackernews/grafana_provisioning/datasources/automatic.yml new file mode 100644 index 00000000000..aa9cf0f5cf4 --- /dev/null +++ b/examples/hackernews/grafana_provisioning/datasources/automatic.yml @@ -0,0 +1,26 @@ +apiVersion: 1 + +datasources: +- name: Proton + type: timeplus-proton-datasource + uid: c24e0faf-1490-4321-a373-7b2b07ca2e38 + typeName: Proton + access: proxy + url: + password: + user: + database: + isDefault: true + basicAuth: false + basicAuthUser: + basicAuthPassword: + withCredentials: + jsonData: + host: proton + readOnly: false + secureJsonData: + tlsCACert: "" + tlsClientCert: "" + tlsClientKey: "" + version: 1 + editable: true \ No newline at end of file From 6944772046206ae3a4e64517d52af5d629615a2d Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Mon, 15 Jan 2024 15:19:20 -0800 Subject: [PATCH 09/19] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index da5840b802b..8382689e2ea 100644 --- a/README.md +++ b/README.md @@ -23,18 +23,18 @@ Contributing Β· Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases, also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. ## πŸ’ͺ Why use Proton? -1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative.** Proton provides powerful streaming SQL functionality, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, etc. +1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative.** Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. 2. **Fast.** Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. -3. **Lightweight.** Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on AWS t2.nano instance (1 vCPU and 0.5 GiB memory). -4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. More than 1200 [SQL functions](https://docs.timeplus.com/functions) are available. Query billions of historical data in milliseconds. +3. **Lightweight.** Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). +4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. More than 1,200 [SQL functions](https://docs.timeplus.com/functions) are available. Query billions of historical data in milliseconds. 5. **Best SQL engine for [Kafka](https://kafka.apache.org/)/[Redpanda](https://redpanda.com/)/[Confluent](https://www.confluent.io/).** Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). ![Proton Architecture](design/proton-architecture.webp) -See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and the [FAQ](https://docs.timeplus.com/proton-faq) for more information. +See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and our [FAQ](https://docs.timeplus.com/proton-faq) for more information. ## 🎬 Demo Video @@ -45,7 +45,7 @@ https://github.com/timeplus-io/proton/assets/5076438/8ceca355-d992-4798-b861-1e0 ## ⚑ Quick Start ### πŸ™ Try Proton With Docker Compose: -The [docker compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. +The [Docker Compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. ### 🐳 Try Proton With Docker: @@ -100,7 +100,7 @@ You should see data like the following: ### ⏩ What's next? To see more examples of using Proton, check out the [examples](https://github.com/timeplus-io/proton/tree/develop/examples) folder. -To access more features, such as sources, sinks, dashboards, alerts, data lineage, create a workspace at [Timeplus Cloud](https://us.timeplus.cloud) or try the [live demo](https://demo.timeplus.cloud) with pre-built live data and dashboards. +To access more features, such as sources, sinks, dashboards, alerts, and data lineage, create a workspace on [Timeplus Cloud](https://us.timeplus.cloud) or try our [live demo](https://demo.timeplus.cloud) with pre-built live data and dashboards. ## 🧩 Integrations The following drivers are available: @@ -129,11 +129,11 @@ We welcome your contributions! If you are looking for issues to work on, try loo Please see the [wiki](https://github.com/timeplus-io/proton/wiki/Contributing) for more details, and [BUILD.md](https://github.com/timeplus-io/proton/blob/develop/BUILD.md) to compile Proton in different platforms. -We also encourage you to join the [Timeplus Community Slack](https://timeplus.com/slack) to ask questions and meet other active contributors from Timeplus and beyond. +We also encourage you to join our [Timeplus Community Slack](https://timeplus.com/slack) to ask questions and meet other active contributors from Timeplus and beyond. ## Need help? -Join the [Timeplus Community Slack](https://timeplus.com/slack) to connect with Timeplus engineers and other Proton users. +Join our [Timeplus Community Slack](https://timeplus.com/slack) to connect with Timeplus engineers and other Proton users. For filing bugs, suggesting improvements, or requesting new features, see the [open issues](https://github.com/timeplus-io/proton/issues) here on GitHub. From 88ea12d54dd24aac563d2a2365387c4025a3d7dd Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 13:10:04 -0800 Subject: [PATCH 10/19] minor change about ClickHouse in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8382689e2ea..81d06559f92 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Proton is a streaming SQL engine, a fast and lightweight alternative to Apache F 1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative.** Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. 2. **Fast.** Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. 3. **Lightweight.** Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). -4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. More than 1,200 [SQL functions](https://docs.timeplus.com/functions) are available. Query billions of historical data in milliseconds. +4. **Powered by the fast, resource efficient and mature [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. Thousands of SQL functions are available in Proton. Billions of rows in are queried in milliseconds. 5. **Best SQL engine for [Kafka](https://kafka.apache.org/)/[Redpanda](https://redpanda.com/)/[Confluent](https://www.confluent.io/).** Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). ![Proton Architecture](design/proton-architecture.webp) From f82c1c31d1ce9003d561fdc7ae912e4daf7f4b97 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 14:15:54 -0800 Subject: [PATCH 11/19] seems to be a bug of link in GitHub markdown, adding www --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 81d06559f92..64b9ceb80ed 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Contributing Β· Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://www.timeplus.com) streaming analytics platform. ## πŸ’ͺ Why use Proton? From fbfe1c05668b6a01a50e746c383da7067a20fafb Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 14:18:11 -0800 Subject: [PATCH 12/19] Markdown trick need a new line --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 64b9ceb80ed..270be22496a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,8 @@ Contributing Β· Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://www.timeplus.com) streaming analytics platform. + +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the[Timeplus Cloud](https://timeplus.com) streaming analytics platform. ## πŸ’ͺ Why use Proton? From 94612e10d4fa8568fdfca3f001424e912ccdbf6f Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 14:19:55 -0800 Subject: [PATCH 13/19] missing a space --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 270be22496a..d60b1419d3c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the[Timeplus Cloud](https://timeplus.com) streaming analytics platform. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. ## πŸ’ͺ Why use Proton? From c9217bda758ed31b7fe274ef0d1c6a90590666bf Mon Sep 17 00:00:00 2001 From: Ting Date: Tue, 16 Jan 2024 16:24:11 -0800 Subject: [PATCH 14/19] Update README.md Add my comments to simplify the messages, guides --- README.md | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index d60b1419d3c..8a423885a4d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- Proton – open source, unified streaming and data processing engine for real-time analytics
- A streaming SQL engine, fast and lightweight

+ Proton – An open-source, fast and lightweight streaming SQL engine, πŸš€ powered by ClickHouse
+ A fast and lightweight streaming SQL engine, πŸš€ powered by ClickHouse

πŸ“„ Documentation   πŸš€ Live Demo   🌎 Timeplus

@@ -24,15 +24,20 @@ Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It helps data engineers and platform engineers solve real-time data pipelines and stream processing use cases. Proton also powers the [Timeplus Cloud](https://timeplus.com) streaming analytics platform. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It enables developers to solve streaming data processing, routing and analytics challenges from Kafka, Redpanda and more sources, and send aggregated data to the downstream systems. Proton is core engine of [Timeplus](https://timeplus.com), which is a Cloud-native streaming analytics platform. ## πŸ’ͺ Why use Proton? -1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative.** Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. -2. **Fast.** Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. -3. **Lightweight.** Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). -4. **Powered by the fast, resource efficient and mature [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. Thousands of SQL functions are available in Proton. Billions of rows in are queried in milliseconds. -5. **Best SQL engine for [Kafka](https://kafka.apache.org/)/[Redpanda](https://redpanda.com/)/[Confluent](https://www.confluent.io/).** Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). +1. **A fast and lightweight [Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative**: Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. + +2. **High-performance**: Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. + +3. **Lightweight**: Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). + +4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse)**: Proton can connect stream processing to the historical data storage and processing in ClickHouse to enable a powerful unified processing in one single engine. With Proton, ClickHouse users can quickly connect, process and analyze streaming data with the same powerful compuation capabilties. + +5. **Best streaming SQL engine for [Kafka](https://kafka.apache.org/) or [Redpanda](https://redpanda.com/)**: + Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). ![Proton Architecture](design/proton-architecture.webp) See our [architecture](https://docs.timeplus.com/proton-architecture) doc for technical details and our [FAQ](https://docs.timeplus.com/proton-faq) for more information. @@ -43,35 +48,27 @@ See our [architecture](https://docs.timeplus.com/proton-architecture) doc for te https://github.com/timeplus-io/proton/assets/5076438/8ceca355-d992-4798-b861-1e0334fc4438 -## ⚑ Quick Start +## ⚑ Deployment -### πŸ™ Try Proton With Docker Compose: -The [Docker Compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. - -### 🐳 Try Proton With Docker: - -```bash -docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest -``` - -### ⬇️ Install Proton Without Docker - -You can install Proton as a single binary via: +### A single binary: ```shell curl -sSf https://raw.githubusercontent.com/timeplus-io/proton/develop/install.sh | sh ``` -For Mac users, you can also use [Homebrew](https://brew.sh/) to manage the install/upgrade/uninstall: +### Docker: -```shell -brew tap timeplus-io/timeplus -brew install proton +```bash +docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest ``` -Then you can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. +### Docker Compose: + +The [Docker Compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. + -### πŸ”Ž Query a test stream +## πŸ”Ž Usage +You can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. From `proton-client`, run the following SQL to create a stream of random data: From 5e4f22b17fd924bdcd359562f542f25653030164 Mon Sep 17 00:00:00 2001 From: Ting Date: Tue, 16 Jan 2024 16:30:34 -0800 Subject: [PATCH 15/19] Update README.md Added Timeplus cloud as one of options --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8a423885a4d..6a069ada8b3 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ docker run -d --pull always --name proton ghcr.io/timeplus-io/proton:latest The [Docker Compose stack](https://github.com/timeplus-io/proton/tree/develop/examples/ecommerce) demonstrates how to read/write data in Kafka/Redpanda with external streams. +### Timeplus Cloud: + +One step to try Proton in [Timeplus Cloud](https://us.timeplus.cloud/) + ## πŸ”Ž Usage You can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. From c937d03b5ed8c10f123c9db41d162c4d6e742dde Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 16:55:53 -0800 Subject: [PATCH 16/19] fix broken link, Apache Kafka, avoid repeating words --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6a069ada8b3..e004c66d2a5 100644 --- a/README.md +++ b/README.md @@ -17,20 +17,20 @@

Why Use Proton Β· Demo Video Β· - Quick Start Β· + Deployment Β· What's Next Β· Integrations Β· Contributing Β· Need help?

-Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It enables developers to solve streaming data processing, routing and analytics challenges from Kafka, Redpanda and more sources, and send aggregated data to the downstream systems. Proton is core engine of [Timeplus](https://timeplus.com), which is a Cloud-native streaming analytics platform. +Proton is a streaming SQL engine, a fast and lightweight alternative to Apache Flink, πŸš€ powered by ClickHouse. It enables developers to solve streaming data processing, routing and analytics challenges from Apache Kafka, Redpanda and more sources, and send aggregated data to the downstream systems. Proton is the core engine of [Timeplus](https://timeplus.com), which is a cloud native streaming analytics platform. ## πŸ’ͺ Why use Proton? -1. **A fast and lightweight [Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative**: Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. +1. **[Apache Flink](https://github.com/apache/flink) or [ksqlDB](https://github.com/confluentinc/ksql) alternative**: Proton provides powerful streaming SQL functionalities, such as streaming ETL, tumble/hop/session windows, watermarks, materialized views, CDC and data revision processing, and more. -2. **High-performance**: Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. +2. **Fast**: Proton is written in C++, with optimized performance through SIMD. [For example](https://www.timeplus.com/post/scary-fast), on an Apple MacBookPro with M2 Max, Proton can deliver 90 million EPS, 4 millisecond end-to-end latency, and high cardinality aggregation with 1 million unique keys. 3. **Lightweight**: Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). From ac4deb708c052685c631134d20adf98c1e894b35 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Tue, 16 Jan 2024 17:24:56 -0800 Subject: [PATCH 17/19] use `proton client` not `proton-client` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e004c66d2a5..241da40182b 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ One step to try Proton in [Timeplus Cloud](https://us.timeplus.cloud/) ## πŸ”Ž Usage You can start the server via `proton server start` and start a new terminal window with `proton client` to start the SQL shell. -From `proton-client`, run the following SQL to create a stream of random data: +From `proton client`, run the following SQL to create a stream of random data: ```sql -- Create a stream with random data From 99e20963770d7aca6b4d3566b6a254acdcc46dad Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Wed, 17 Jan 2024 16:39:04 -0800 Subject: [PATCH 18/19] minor README change to the hackernews demo --- examples/hackernews/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hackernews/README.md b/examples/hackernews/README.md index 4a8b1a33a39..086f9c05820 100644 --- a/examples/hackernews/README.md +++ b/examples/hackernews/README.md @@ -10,7 +10,7 @@ Simply run `docker compose up` in this folder and it will start 3. A pre-configured Grafana instance to visulaize the live data. -It will load new items every 15 second and send the data to Proton. +It will start 5 bytewax workers and load 150 items on startup, then load new items every 15 seconds and send the data to Proton. ## How it works From 7411d7400f8259780b3180ffeb012328d71d67d7 Mon Sep 17 00:00:00 2001 From: Jove Zhong Date: Wed, 17 Jan 2024 18:17:58 -0800 Subject: [PATCH 19/19] update high level diagram and revert change for No.4 --- README.md | 2 +- design/proton-architecture.webp | Bin 59044 -> 57044 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 241da40182b..a7c0895d974 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Proton is a streaming SQL engine, a fast and lightweight alternative to Apache F 3. **Lightweight**: Proton is a single binary (\<500MB). No JVM or any other dependencies. You can also run it with Docker, or on an AWS t2.nano instance (1 vCPU and 0.5 GiB memory). -4. **Powered by [ClickHouse](https://github.com/clickhouse/clickhouse)**: Proton can connect stream processing to the historical data storage and processing in ClickHouse to enable a powerful unified processing in one single engine. With Proton, ClickHouse users can quickly connect, process and analyze streaming data with the same powerful compuation capabilties. +4. **Powered by the fast, resource efficient and mature [ClickHouse](https://github.com/clickhouse/clickhouse).** Proton extends the historical data, storage, and computing functionality of ClickHouse with stream processing. Thousands of SQL functions are available in Proton. Billions of rows in are queried in milliseconds. 5. **Best streaming SQL engine for [Kafka](https://kafka.apache.org/) or [Redpanda](https://redpanda.com/)**: Query the live data in Kafka or other compatiable streaming data platforms, with [external streams](https://docs.timeplus.com/proton-kafka). diff --git a/design/proton-architecture.webp b/design/proton-architecture.webp index c30d3ff934e4f8414170fdfa5937f508b436b9c3..d828cc7b12dee65be85dcfb148ab6bef9b19f624 100644 GIT binary patch literal 57044 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

+P;6K=V>kf2d`K@M-Bp97ly1lR9UR@3qlLf6uZ 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 Dqj&*k literal 59044 zcmV)tK$pK#Nk><^TX!MM6+kP&iDF<^TXMX~nSsRS)B~jU3tI{;Qrm7v2#u0hs4z zK%eZI(W6R$cdF`QRXZwPXkTHl$x^IpYgEErNt)sSRBY81y|AVfMwZ!*mc|1`6INbkM(zQ5jk@4ff_`+Ps&^6S0#UcSHme0%$RKi}Sdy?wsD z{=Q|u<=1=t{Jz^u@@~ibcpvYC_vbV7iHSN5gE|ZogTgQ<%&A}-hRK$5TMUE3L=lBK z)eZ)ApfK46Dh9={1w|AFmBFB5nA2n%Q5X~xaiL<4!Jv+biOQA?26Y++gNj-dTQV3_ z41+pN6evt4+c0bkiY-w@VKUi!k~`9L}4Do78H{$Y{M`yY&*9w z7!(tOIt_zCVHgyKiD4V&7z~OnOcW;b+=7Z>qA(~>7!*;M%%Lz*L19n~29>B7RH87b zV=z%13WH+U5`|%6P`Go;sTj7PFbpOthB>xjn3$;3FbdkXVay+LcdDRm8y36W>Ax)6 zwyL&T+uYmI)KJp`A};~`pcGr1CAmQ)01^QakN`*kWB@jRF#!><0oVX605$;gsr>W* zzdxt_ew67{MC}Sv0vN2#XqFkXE=Cnm9KAG)M$nKFkr0TA))`Tt|LAowYDUG#2zqP0 z>DR7T0)i3=!6a>nYU@8FNRrz&bCh$qGpdd-1TNqJJmh5iuS$-Y7}zLC$p)CI#fq7k znVBo*ikX?2ndzMWJ^vF<6+3qg+%|9>tdH%|osfnFk8!Ye)0g^%*@PW z7&fyldzhJ-nRx_bMyb2SWDuj7-J_Ar%#8BjkN3IX_x;>*S?`x$>cA6b&d`sb!_3U+ z(uAX~QeYT@@`Mvtg_)s4`r(0a;wpuinG;t!oPUf19gf1ko-i}VP+z6KP>0iDRhXGc znF=aZ%;*X;DQQ=v2{SWu;*{bVm#d^uJIu_9%k9+IKh#xWW=@=6DZ2)$LJDdo%*@P* zJpomC8GD&|2f_^BGV^wANJ(9*Wm4wXGH98(6;2dpW@cs$EQFclKfz^Q4TRLo6y`+B zVaDa%kb9ZgTUrV;cDNL_ZQJ<&hue5EY}+<+$bWj*e_F6@yKS3w0T_} z&p(=PLaT4~pVog`|7rcF^`F*%TK{SNr}dxKf4(u7znGuEpTVlXfN$c;pUUseZ_TgH zFUCKBzb$`VnEIRZcjxEg7e@h8n{|Ib{?7a@z~7X=1AlLR4t`O7HNFMEAK#HbiN6XZ zoS(=a!LP*M3~=dhMYq2%x?d23BF4|dKajr%e|xxp;oJWD{Nemqlx+SQz87D`-xDzO z_vhDP-yg^K<%jVzAmvSeDSsA@@4+9*@64~j-xV-q{!RIw{M9JbAN}?K0J{Bp{L%bS z{#r=!Q{A7;AH?pz9RPsekZJ{*n~#9miGK_~8B!4SHvzyez;{Do=8vZ>pi?6M zl;ZzElmPhI`BPAk`4jm?0N#E-NTJkE;kRQp@T>3-Mj_@e;a3FsrC37>rv6HP5B@gb zZ$!s`6pHYR=&^Y{DV+KSI{qC&n?E1Lm!FOSIQ_#>LKEctR-nTgr8gVeY(V!HqLBWD zy!-31Ptj#PfR9NjmH(&sb@_*&-15f)U<4_sI)a~%zYL|8t^j^_NKw^8=;{>OToQjn zfJ9PO`G@n%gSYWYEML#SJ@|zorB$UrKPV|xVDm{FEq`}3pA=VFE%-H1UioEd_z>S8 zMK;~}9t==gX@OHXMT)GxJ!rT}VGWWrY%{c*Qd_+9uM8}~iYlM}E%|-G*Fg#`e+Av} zyP~AB7bDC+8>HB(9u1c(sQhw_o(3hiSm&qsEm2bc|6Q29niO2d;cq~uVoKuZFYu>9 zO0Iqx@LQmi@(f=*YD|JNmH2ijyO;uSSRuvo^YTmZ=pTwq@g*PqWqD!t zV~G6$ps_Ma623L~9U+C6XHzg)5oIlAV6v-@Kak&z6mtFR*94V{C?)fMR_2pyj&{J1 z27>CKo+zPYp%&9zb^Lh%u?+zH<)EQm0p$mSIQ$q~b^N&i$qfei)Bbc6P<{un>>UZ` z5VSl1s~nEwz?5hsxwqT5;~K_fefNBUq`4g7&j$Ee5T|7XgP&0p*vZ18xZ9 z2sq!40qcltDScpNmS`MfHbZ=|bNbiyj`^p~vMu;vv;2lk{|_joF4is;wvJxP@f8|l zs+Vu@TF(AV(v&bc*S^N5`LSN==FCjzXl%T^G(5NWo>d_R;^^mmZ$N0#3#AEd`#`5l z`UVJH0_9?m5{FvXEprvos`vhG09^&)03+r!+1xL5>0By(ZX#y45|$rQ!qOP!e!uv( zzf`GWyf{AN)4%X_bCtTV;Gmx4)7M&ETJ>DBVQ5|X8cmKjRX0tcdjqV<_3nML{IkfmRe?A! zJh2BHowJU*Er6W_{Lmi%m2th>X?`3)tr+wL;^d3p4B$J#$9DnvP0$?veC8hCn-~?Z ze%|7c655OpZvl_xG|fi*+tFa2P;jY#=$tPmx!%2E6uC8HoTF)O#^EI#n$9hmso+gV zGGcZyLo)weZaE&7hF8`ll5RiYGo$ZRSt`ls*AMlYg=F21=HlTCI#26)xZ@IX%sEfa z$Lv{U&j@Q5Nhsy15jP%qlDiFO+9J|X$Ij|Wpz9_QKLX&_LJSrHS9lK0`TQf%_%<5& zl(LBdz8XHh1As-nNt=HQDM}LuhEA#3M{&-eO1t%H$ zeejyw5=qJ27N;-gN8r_xp}40K+g>};gJWp&`OPt&oyk*$YecSv)_w7JtMej;*4>eV zWoym~tYZ_YpNFUccc7n16#h&^3U{UhH~74TpPRoD4X=x)9JU-5r+^Lo)i1)#frQ^N zBKr-1Nv#zAehw?1{N?~jyx+lJ-Gs+vuw!}8*t43B$flG^u!zEINSs-dLNUA=RQ`D4 zFG`Ss27)>`e-1w6Ex6X&G)sPv%CgJYbA;KuGlCczX`7h%(1yx8))80KQrIf+2O$b; zfO%rj8>r-D1c2Co1RBjX0LA(2U?>b!H|F>cq*soeT|+Za8vIjm%q>WYCkek}WdF4R zhqkDl78s#;5(;GTu@wtJqjW|LxiyXGDi@>4$r$R51gZ^ZgIZ#bq-mF9tj4f;ejvw& zQs}1@%^h>%xK=Zhy$uncQvh&RoE#_koe(Jw_Ap;y6&hZg&?^9l^JKWQQQ**c=2|Mj zp+X|*zGLM4vF*DP|1(I26mp%^W2@px6uJ=)Vbe6%5g7sh#C)M3%JXU%ZjCcTWRR1r z1axR2R!pY4S8g0xtmGp75i)rZhxoDy4Q=2<6V3Vc-xZ(u-ViC~_byN=2C={ofD_Z# zPz=~Kyxp@U02-x_KUD~D5fgT}chMaixG)n*_ZwsVbo7$_dyc?GcJ=iEXEemlB##rsnsE;&Uf0sm zV-#0W#zRX4(6b`BKlyN-V16cdxBhCBTT)q$jkSJLFOk~1`-dS0h5V62_TzsPUBx6U zKeL^u+VM;wBCA{Te;6!#{77bPIss1EuB@#p{g!}RcMiIXp5r8FiJ9V@@L^ctpcB2g z`HcapoZ+{NhTE8@d=@{BraW8)W579K2hNEgxMJ20B@uW}3^3_|5KS+xt9vy;stHHe z)>|PGsbfR*cxWRQniS!GpX-Rc4YvfkqT^11sW&95h5-w??A~e9@5S*fL6`wIQloxf z%m9#lGK?tx@VDgw#~UQ>k8<3GHFJL!0KoG56VJ}T%t6!dj2q+NSuqE{8ty+DJ6|%e z75jEct47A-0K$pE0VlpIJT>Y8>z(1Zi-t=mQapKyPk7jkY+*mqu!0L_dZ1Jy;yLyc z@Em`HT}XudSZbW;eIm!rF?Wz*ZOR7*>6Bm?lj~XGlMOJ}LWB_tmV^m^MDnySaD+ z??Fqfge#>(yc6FWZsLH2{QUk-H}+FLycJJ6U@-sZ9s+tY)ZN0!V5m-3jqvF2LXQ4k z#{#@+T)nG+#XHbCMZ#VYO6btU5ErxgZ2{7S@R$`H`m6D+xSsC8=di?@=!^|OIosjR zava{C&t?wCQ73y0STfiJ9r(%+#06NIQ+y!+tYVU#&WxQc%;w-b!5On~Ad-V#03f`K z!iT)c2oBl6qkRk?#OKOyLwE|^1nzJYdl(aQasp#BrSRoq=CF4-@8;qIFEN3+r@6}g zs{d8_7G$&eY25Af2LZr*C3M4pEMay*yUSsv;>l?w@xZ28NF~~fte|INU=lOLMlk|V zJq*o(n)}USbY^&)LPnUuxAqhJj4=3jsG*hR9E=OVH6hrXiR{Fk{`A026EhUNAj<-9 zB$=`gGXp?6i_U<985-XJ0Oc02oUXr!6_-yQPij&hzPFCnJ5e>Da%s$0QyCu2z~`}* z8FZaUF`Ow`OJl*3cRq`-awpEs>gs+DOf_Nh#)&8rOtBLyxCpBS5CtIe59aydQvfh0 zKm8TUQr`yw`6Ke37|BhJ4FHk>AeVP@aiA8B)Lz6z0W&(n z4ES8(Olj3$2c{~R3;|lPoqE{r5;bBb9J>Y%S!ftIb(n}sfu>Hx0Ku6x9F&!{=Fbj{65LcOpqRW&kJo_7s`|ustIpdNvOzx&w=eBPFtpk6|Czyx=0jy`T)QMN@tuxUHJ3D(D zZmE{W0%M3K&kbfdxwx|(ToJ7CJ`YNOd?s52lyBwQWfk1l7kw> zlgPFt_>(9pP$hU?|B1UyyKJGsG1iJ=CNnt0a7>poD9mD|ZrTOF62g%-D~>1@c)&R~?XaMS}j0|2)E%m~fLbc-ue_N#GX2vH#OxW6w@tYuL$l6X}G;3n%N!kxH4 z6baO`j{j|E#zCB;SM1aQ&6!anwmN4lKtB$)u#S;sngLrEMk>}fEEW>+ZZ2N%5)+`#0FsvrB@WOD zvx|mnc&>b+<6{GXp3xUYbC(8)1NIUTo5eBlEPbp;J0vWccSAX9-fecF1!FCMH6&Q} zs&W7*uVC(V*Hb5F`m#c=ffNMbN-z=4JOySX>N(~vxf!UUKcC-)WSb?lK3iZ?s$@H> zoiB_%{V3;y_oW=i@G}6|Zv(bqBFZcVQ$?Q4pD2~P24KYbP=T3UUc*i^FhL-*ngReK zlfiUgHvl$Het$SpI)t#|Z+CK8teh3lE(XrfVW8MEtVw9G?N0AYM8v)d0{*2&U`xr3~k3MKJ(#KEr8Er(poD5V0Jr*z z_VxnsuE_RmR0JnlF~Z)lG#P-|pIC0Gj~js0MQi2(z?=*VfW%TF8&Bcow*Y|Y1LQcf z3%~<@SjWmZ)Q?qE7~=VY_e`=`Z$vs!!r?(M3W`Yr;7?lM4snWqa}lr55+ea>R}KJX z?cS-+Ti+; z+qgDO>fWok#A38y)B+_YAtV8oB&Lh!XJZ6ZOMr#s=Y$)FyS0}p!KvX+GzFG2UCALT zQ3g)6CZcJ;N?OE~+BODACj;1WCvvj^h|44!Pk1#4OtD|i4}c)ob37{p2!kj)JK+Ln z1jli%kh2ZwmmRzUz)cq3fUZl}wPN5QQ6+Dh1^&&&4_snGG$96D;;ZU0n3czZ*De|c zE1|q2;?JDs4^tFVhdCTnUufBh0#G03a6tF50O8m8d<$ocJuikJ>e0+W^cKYHA{3#8 zV-DaaaJLsgZr5HuKAolks3n>K9H0q093&?DfK6mN3qCjYCSdbm9-K-dRdkYzN>&{k zoyjwXBekvr2&6@9>WSD1*$SNDe0zG?SZrm-vc{1RIx*QWY$2fb4ENFouHjbMXV0m{4_3uQda0B~=uBHI=2z$Pi#&PA~=g{9)umSh3{&=br4;pTp{Q9}}OO z?7`e9N&UGZAxi6ShLC+)NsgdMka832pqS7~4l*{S=kr?Sc^u!4{i`e%VR4L)?r|p7 zSj*s64iW1$P+tFlXyn`>X1<~$JcT45K}$>}d1jFW^qoMx@`;Tb!J-ZUiqUxmZs50; zrlo?W+rdN(E(_-hH7dL%V?BV>ksU`;9BRiHda+4)j$mjh1R`kU+Bhb;?jEY!v6R28 znl8Dl04Ybc36fSnppu&*v%|flm`ihBOS*l}{S7tb#p6 zW=3B94Hhu75_ok-^X4I^mycP$6d#jYzijR#9>np>#9A|Q#GdVSR>kWu>WCbb+=}f4 zL=+a1IWk2Y3w9R}FKf>Or()tIjfV|z<8XU(NCUK}n3LiHk|TCuyYdN0fC9X}+kz^RT1E53WiE%`VwNnCuH-aAr34hJ$L4>pDG>3CxJWxo^YDRE}G z%tFh=*zi^!+-y1Vp^-DfU_p?W?g}c*s{gma#z43Bcm|QAnFu6v9Wu)zO^|&(b2r0w z>*ggQS;7x}6;K34-KF_~Fu}0vy!463tUp2VQu=&t+nxtScV72qIW^u@fiMmDS1LhrUXwjQT&C$MrTn26mi)3!q zsK1@0uUuduu@f?slcp&9(zQhsNWL^y5k*MqNX=U3ra4PA^@zVfsIa#yygczq2JVuB zq~ML2kk?vuQZ^kocQE3BIJ$Yg%5$fQBjf1odvLICBJ+Sh1JYQ{&1SV>Hp0w-Mw1Sz8A3${^OlAjBc70XDQVS-CCt)c}>1ZcBx`08lv79VpRU#sSFYNHLp2t^_(OqU;pg{%6K_qQw`3r5l>d zO5h5)KIEl{@>6hSL2k(`rfTr1rvSePt`NQjiYTjGTaf86gOV^!##K_U!Iz3Ci(Fk0 zbvFR!=A^kw1{|&sd=*iWTwxF$-{nCXOxNUyFjolPiYQa1#E*LRz9Pyvg_!pgQNk5s zY86rDD#ZNKD57jvh%qRlTvUijRz!KO5L2RvQl$`6sEE=+Ax5W&;!eu2+A5;>Da6cI zL>a3P^Y=m#<@ZA&rdSbWjzY{!MU-g@F&z|9)+)s46;bjOVrDC%98`$etcY?$AqI*l zManQ?$|%1P$}ri=DBj92S;{D($}n}xD8CxYFwbP4DVFB;I8-T0b}Fv)T%Rh#jFfr8 zM>Cf9;;2p>dzDKclM!nU3Wti?V zjsvIbPw5FTF#seA8o7hssze!Pm3(8(%@QyXtHC+Ns16fzL&cJBbJwLO+*)7NM;WGC zzDei>#<#=yIN0wp0**V>Iv&6x&&#P;UK)MX&xtZjE7``IyVJE~yUr0n@PrSC>mD!@ zpd^PI^;9R6VUlDUcXGXD#eXMAgsb`JV*0YLr@F5Ub4|9Htji%O!d2LK9=$eF4gh#E zJ=IWUm|n7t9dl3ls1A^EC^bD*f-=k+S?7kHas;ZP8cSfa^U_AF>8Xm9VUEi- z6H+;rqo=@LO;8=tO>T0^y8_{X9s@kNp6aDCOt@_0%Bvf<=(l3F{N*WI-a1~t_rNGd z?y9Hy+oKFKSGKX`dB+Drc2JuyV>ykIEAHlvo$AP)+p6?HvtLPjZ~f5U8fBO=`OYy> zELR{0Nv+f9IX)`R)%6|uHkBV?kFN&_JrutLOjzY494F^^>w#>_Fn#44SGvpZeGM@7 z!Eru(u61v;kO0<7zxPhVd2&}3>xS$9Zz2QpYo2$=r^UJ%Jy`p$Ii!x7?VX zr^cacGj-DMWGTY9%YE(VMpy2N-&aV&U5(1St^L@R;7zC3)nd}J0#&WM$C1rwLMdW`GatQu;!a3nUt$gF?Wnw z5!!jiWvMkgt{u6?BvII&bB|4lJ?`UED6=B}U zINflMeB(LEnqD%zGGOh&yJ6`#a#w6v&wyi7u9ypqs^TTZYCm(%e|{{uC6`oIkqo|^ zEEWkc359cBAE<$4D#DDHZ`$Q{^O-e>dG`SLTciW89dFk*A#29?=IK|8Rm@EztC$P; z0`gY5Q3oe$^){4wK#-UvS;|U?_!`(xLJ{V-L$-0}$%X{nHQinM1RME?>xMr%0p6NWaU0fGHeYB;ooM9FNJe{oEq37MVN1aOk>T*o-F%4 z0mw2YmUACBhbQO!6hHddx(}29(0dlBau0WFo-qE7re9tVL$>WEzL|x9Ex4djGuj=o5gBTj%^YEw8NIn6q2u@Zv+`M(Wrb zVYF|Tb2}q+bi`J!vPg1miauB}DTUp9DuecwqzKbbo-y)#oYy1k{ns$cGP$MWbGOl5K7m&T$$;)pXon_c&w8LseNxJXBxt%Zr(Y2kq;cBFt}!JY&s=TtRY*T)qOA z!A}tYcCk;DQUP3VYqP}FHHYzXp}YU2q@i&oqnE$R3f!f73q_=Q+v4Y7HdMjXhHA?k zX*H={iZH)1@=O<;JQ{CZF_%dzTzari*ma+PdOtG23d971#z)E8Bc={CLzfXCiBGnh zRkKrZ88^wY=unF)P=xsnkZ0_?7+2o0qUGTq3`3ja1mI<7wzbD`j!jkUe&#KAZOPp4^6hmIqnwz+6{0nnpIesw7437L=_p6dZQI*xK0gGP zkNicQ=C1z^3`no6{Db+U7`CE*?(vT*vKu%_m2-COyQsR&S;LA=RGs3a^s=1EuDr;F zN;`UvD@4Z%sx29%EOSpr`2#;Ft%A$g#}VEXQaaAbD)o$@g2iqM$@~S)=K~jt;E&FJ zD~_bKJqn@f@O1TW!kf#}e;D}&>vCF4RC)62w_ zob2JrIc1Vj&T1BKj~r^L%tE0fTii*w%K7}Kx7T>)xA))G z=n|PCMk>av)lmX64|qFVrhU?E?BS&Cl({rv=&$3masWWjwu$41ITmmpO&IAjuInGp zo8N?Ao@g_K=v~^3^t%mkvo`yRT(8Ko`t)7jK=r$Yn4mhD5ql}Tt-=R4K0tMKyRwC? z8gRBGg~maJoF2-jqtk_o+IR;jttZ5p(Xo42_c$A1;wnp_bVu9S?vjwP;$a5>i2Q2G zR4nb+bHR^b@UEa=k3KEIuV%jjzYSV!8{&Sqz@x#69&(*yVoXl@B~tIlJ3?00@yu3z zG@-_3=;wd5@?Ve}^A&U?3F$~)r83e+*oqtu@_JlC~JRDrHs=o z>Qz(XDfw*K#&XAhFJOGc-K29_Nja5f>8dNP*r7KUO{^4K(^>B#;92&YVFr-!8`8o} zJ=X5OfaT?i zP`c&?RPv*W5sDa&0FHx;6tul?-F`B zIsth6-a{j0Id^by;Jh%F{(3~fB0n5(_27JH+RMmy2H?41@30FB+Hm~7$FL@k2W0SNfb z`C2j>a4^UVXL2j+~`COyHD{ercU^_^SxpF-cB8$PGQ z?4HOQW#lR1DqwlMFQ_S%T<$RxumeQq*6H{Uw12}ps1#;sU$%E!Yj#{7>!aa(C*=Js z=O5nz0Q`DLHHlovuLQKzD{m-((O*SD0}cCS`!GiryxlFC%g4x08~)OOSdPIsoF`ASAioJ!WHfT5B0U4+7r(kHtkAg^|#3G1!N-|%b24HZ{Z*U=5zT26Q zjIZ>!k$qc+=ecV7XT!lcJejoz@5*?Rd0Hde+v9igRfnOHdGMo!_s;F;q{}UH!NGI3%;krp<5wZ9XQ* z3;NJFo(yp6f){o-fH)eUG7o;NZPxE=tu~s_*>I)=2d$l=Lg%oBNJu&H_OCUNJqb4x zCv4?!v>gp~e@sP{vb`i0f=}S`xF<>dBgtU=?mhi4Pg%Q1T-mT|hRgj7t>$Zx=`s}l zAeQ0fk3$Q5Ih-^`-<4bdFtlhe;jISpX91vb-pzu1DXg5gYm2VC19VL`YP;eE^V~rj zgU8@PWi+AV1eX27p*ot-yC5p90H?L(EM)D%HBMY5t^vSj$$I<792CAVbffI-NWWhI zWygg4P?Fp+lg?djG@%2EKL$W@M`c+^ zBSVV-9?DH-FVzS9U{Wk}i&NnRIE((>SZw#p9b+PK@oWI25FUm)+c0pu=p zKVgskj|nOby(Tw#aA+`kd?K&pJOmzw=Nv)9@rN`w;qV3k=;za5L8Kh4Xu{sEb6)&H zn88rX6Ft6)$AfGvyiV5_X^&|Y=-<4UV!(+XYB zMvFO$KMXmgG-x(9{4h$jv#~+59oVl$2jFVn%mxYW%Sbw2{~yi8*1s8TCV?r-ufq60 zlKQD`@m6GF3BOTDltvSJUp)l&PGuhaxP-x|ne@3ieKbNp$*q{hP3z3Hdx?~Hgi`!sD!IzlI-6e*>33b#23PzhVE;vu0XbF!z%NCk1_qi*oX^v&>ay^wQ5(1lsOzX1i7z?iLKD7{ zijq6-{cly92mklYGu(>1>vK-y4?sr0YxnKC0SQLgh-EoD8o<@Z4GNS?I&Yda0yv`< zmQVlULo1`08^tT~Pw253M#ITR6Z$J>?cm|0&)JCI z583>#`3vcf zTdR-0KM&SS&Jk#CYo`y`d%($hgq&hYM%gaEql^EvY&4;V{0*%2yjhgKL!~To5cq9a zzBd(bWv0NhuFC)zH#HFOPP%0N#)v;xg#8P~?luD`PaRv3LPXDsZ0I?+xh>5cmZh1U zBhcf_x`QMOzj1*)H~HdChPZgBKlz-=Joxcj@7mijx07BcKo$r5#;q2EI^~b=d0KuF z!cCX~1R*uE0f3EvQ>03|8O5W-eeT2g044=iF6lxIbNfZDlG7M>g68|>QWv`vcS=K%xH z5{ZDRSL<`L0hkjXPxU0C_;IZRUjkE-KOO{p9HOF~Nt5s8wmD8fnrXRojzAy%vH`d& z6$-O0l#{0GWbXufU)3NT&XYSq&tpMv`CCVuqzz7A=|Xa)=DRVoH=c}ic0Q;=|wU2Y|SF&lwTCi)O_{0$s%thTI>CD18L_c{}w&vYL!TR4X0veEo=thC<&q(d+*MEgUQI)u zoY56eb_HOA45ld3d|=lNX}tenpBE2EgvZdbo66+vc-GT9t9sGd9Xa@oI8U0cbMq9{hD7Q z>$$o>t+vMDtSaqqj6n~UW+%3n%K5-%y#WfJ3$&8m!3aWQTSWZ=BI-Z!ThsV8pkMvF zF?Rva-^)ALszhtL?e4bu2`ck{#%O@Ky}p;7erg>eA-gFFEVe7o^E)r0Z`6>IY%5Ym{m~0{{g0)~J;K zyY(+e&t(!ZIMfvI;7XU!< z9Dx?iJ>`i3Jh^_V4-U!|egHaq%ItZ|)TiOw<2qfh&Z|rWXZt~OD$p9#Z*aI7dhn$v zYd8J3p#;FB-5sZT61{3aBo4srvoqNm#cAY8*P{PP=7BYQ&nhij7 zzhPrkNDKKJ0W1^iuSNNIkSI=-*JLc@R?J9GTDX3y1ViL%PDkNWH#u&5{H}&5buGqK zL_`BHXsgu{0I%}ZGYqWiC=YZW$1%5p${u=P^smC>YeW;m_g&ctVCch|YuPHHs9Rw~AaI=#_TN2#~(N4ch=%HXP2Rlr3jJz7OE#dzDKvRJFLz`@kSp3PVvp zb;pTi_?~p8J`jMR zrdk3&KusWk=!hmFeX05(^s}75=>F@G03dn%;Ad1l>_*&cz?Qpqdx$6{(jNtaOls*P z&?w`Fej5PT&?F~$o>K=%^~T)LSH12hLlj_WBXtz5pKbww494^xyF(hQ5&$<{by336 z00PUb(rGj`BmN>$jL6~|BaWO|vh~S80BKqWxvlSVUEiKD%-fT2K5eFQpm zt|i%=d*|9BIn}iu-g>K^MRN2&IEhVmSs<7SVV);4X|9d}2zT8@30GN3T5@;=FjlKt z*!)@|%pXRB^|kQI#CHIe#SCag;;Hhg8m9}Cwd{<~?AwDrH9gg}*3er`*&sV?hxir! zcy=uZoVeg~oU!hHfQLqp5EweFa)mM2i;;}1rb3!tM~x0Zf^dV$sha`dsv*chey1V< z1cY`hC>1wIk_MzXNNuw9;10HU`2RMT0l=Kjaik;$ z*bsBaqRaImP1JV*z@0i*S881&fB>%wDMyD?1qw9CtcrOF;Ph{Rdro}QZ9Rd}wZA)e z^GRf-OanIWBX!Ct8RtIkj%Bz`R}PNcqYEeKu^Rfy43B}fBSoeX00NsZo2+D?cy?(n z7}DIBS}lMLuBrqMiC~yiOaBKf^VK^WRIs`2?wbId2c9e%7xf5ecqebYS{i9`cN;i! zS*Wo=V1@BG_aegq(`OAlB`@q!NA&6i08#AJlM!Ic960BICnG6D^KeIh(kL|ru-?^l zIDR6Lqd3qw1h&%`!>1tYZAMUI9RKP&H|5YKray zC|~)>N9xRMz5)pY>PRWU<}D}K(*SjNIIBtkpx8a$iNPqWZ1mLtA;iMX2Bwy#5QPPS zp?U_U!HK%UbDiS_oYuSBs0=mZmH>2i?cj(=005n~nlwhC7|-@vn9~%*j@WOUC zbtljvBE^K3vcghepjwWenZoY?fNc(IH4}l!oJZx%F|CViKrNY?0 zKWmrPhbY1p=}(tzu-Mgp?GylOTr)6_ydkirLc>lT`UZFO1pvHem8e@X!+ok61H?)S z#v?Mq3aBv*nsf>Pa+zV^yIftZk`Jb9AAh~LoaO+w`jlXAU@B4kIiNUi)4O z)dC$|FU5i(z_*MvP=QDluoW2Tdv6SGG;#5b+WQRw!2FBxnO}H+rHT&k%LjiHfSQZ& zz7z?hGxmys0%s-=9R?1t@djIko-`H6wG+`jCk!lX08kEC%*a(cV_rh<;|j^*tEMPn z$&{cGiy}eWLL0!9zISBOifOlW0|D6jJk%Z@=a#KBG5VHl;IRx?mZb)+3>20yu(&x}%Jz(7WZg$Q$^Y>*CMmzv6w zIoQg?h?VFEEM<*)?O`I)p@=GhdKQg<!b@PG!qz+;Lz+957vjHe(Jh2OKkMZpTC3;cj9A&YN)`F)yIpq=wkNUWt_PX8_lu=b+G8wG zEsIR(lE1v&gA~a{2}dLV`rinV$`UWNp*)`iNN5Qf(iuLeo`xCg#VoWu+OI;1;$089 zIKQI8_5(vmI(jgwEMB#_2(KZjY$pO=Xe#zn>$3+HZm+6yGGC3!X_d6aG4A*WbIU#$ zGp2gc@Y{PoYLsE36#x8?nLE3Gf$~JHJa8LhUxt$Ol^Fv7&g-8_nn1i6 zlb%TsPmj81?V7uF_i5FrSEmmK_wCw#*Z{w=BZ7K&juEN`v*1N7WcL= zdeD*7-S5So`_Qnzaa^G;dQe>SviS)c%|_c*yzaUAs`*Zz+2GK|$kiXu8T`N`i74Ud zdpSfTCf-E$B&~t5`VxPl=3uq&EBodSAeyHH4OTWo(9?*&5mZXo0E7!GO~Vs#5Ru3R z>-?zo8CY}32EZ(=G>v#*IEkw=uK)mnqpS)N3Fl;@-tdIW<_Rv+n6PdWJF2$R-02fn zES$9|ees;FYnQHEoqK1{wzttI+78|EZqn%v#@SQ2UGENU+uol)v^*i8cw@Im=fSBd zv-P7VB@B&>?lZ^`75G`iTJ7Sq?!#7G9K6Kw(V{bMAeO#k9xZbDB0 z8*_(csq^~{>L{+p6D%dSuHSp6Z^vMwQVUSNJUb+vKk9aV7EnBOm(~&1ib? zSpD743wmw2_EFO9;ftz$R-NhIT(nYO{ku<{KC7RTLC=j(dZnntM2(JN27}zg%Q@|` z(+pT_fcd$dU4jNCo5Aa8WC8&0Oa$HtDNTc#0}Iqxhq@uCiB$=rTpk#QPT1~3b({BZ z4%_|wAn4Scl1OIC`^Y~W4qobq8YAto3@twk;|S&uY22PTgjm0 zJBBB<@7-E_c~*sIgSAOF&=|e|)kJ0N_>z5l;ykqHG4Qr_l%iEEC9rQ$kA9pvkQ1(5=q4*hDn3 zDn3NX0&jqXY?lZJ@RW$M9F@7V0bt4=^Sfn*=MwWqr0-ihZQtWhc8$>PTb#aW*WnfG z-Fx@GKBx7uu{8|W`}z95&aU^GUIl{>ELk%(Y0;|8nG2Rrh)*$*QR;pa?9qmPH7ApNg1PfP=Rcc}QRkmk8tmbbZ6cXa zyxZ7fv|QUx%)-P2n~+*n1q|+Wx9`oZH@pKAH&pIrMCURc@fA++m7pQXX7G9%?yMM! zlR&nB(lls{1iC!F%qswlml>?sF!YHmxG4a-x=aiKP7UfXXx-?Z(DxY7T|Rdgto4OG z2YxwIjDo?800PusWy53e$V_DFTMQHq0pPuz_)5@_WHWd@jSIj*V!Gu?0!q`M=HO3L zqsG``zz|fe$S^-w4mb{Avde@!Fnim3^9R0sSTD2Hws<7HZ=0g(7c2Y{0N{lbD)5@d zMY$n$NEMX^0@z@uDgcP*D?vk&&EWMk>RH3)XSZRFfYLOm6sVPm=T{Y|2Y{n7O_Ucb zX>vdn@Qz$0DjovHwvW0kog8c;nU(!eM2DAsRe7Bzi2x8Sk*aa70f6n{tSuusJ$zqJ zB1(!xoSmlx4Ouqhk9XX)<9&Ovo%)F+pfnAd2iQp}D)VI+7-OoH77Q{mD1W;Bq1@}AC90;@vEI|X2&G`Q> zXy)}q0!q`M{F-`6Me9@VsFoQ4z3)y^MH*LZ#y9ziK&0tlRZ?gp2Q&uq`B8hrZDjzT)OQIR6L$k|NWPcH zr$5}nPYj^fs_Lp~P_Y@`3V$e!KvXCwMBb5yuFe=ryr{q7wwlj_FGlY%Z@9J#vOeV@ zGn&rs$Qw`V<@}K=qRk8jz>5?VmhG2^`PBH37b!H{R@3o!Z-(OWtFmv){N?eyJ~DPM z-;O$Tu85DQdL7_PN(v{EWq>Z=?-~_(Z@4WHk^OFR&wzc+!zc^*k~c2kkYoFB4Ug@p?3p;+lSwL92)p9qy*8&`1EV()(d9=&N68V!=W!nAr|cQsl#w7cyGy%_Y;_Rqqg{5@+5Uku zC3=vwQdpbjtu;DEz`zAIaKr#Gl#zm>ifG`dlUW7(FIKBZf|nkC8eCW-r{^NIhTEpY ziK6B^M@0fUD-|;HZF-K1#LQ`ct*BDUG2g(J^F9t7X#D_fJ3;>u?Tg{5qO_|yQ0Q4VzvXjX3%!NKLjop?lWo$#wF`Wms zjSD?o$9#+GDpEWzeR92kCbWpVGMI9n01ean=96?aJZ`^mCv9hq!9_Kwh%o|&DpFPy z1OQ%E{*ZzfjCw?CXvEiS&P>3PYq)I{FoUC#?YK;?#*UW)<_AQy9e{0u6R!Zg@g$-U zpqQtYEYX?#@a-Dn;uvethX!56p2DJGZYDC_&V7`4d2GV$8ys8g6sDL@=w4z{-kGp5 zzN0Z^56EU^hIIB_J4lNGEG_U94%ZMa(gY2_;N=zpeN)}nJg zZ?VXpuJ38NesOxo&~nS+nV;z!Cb#%}afhB)>{NR3^m+4<%fmtuz(}Ss;qkyDjzS>$ zcrJj#McI3=;CxTxk&m+MQl+%(=(Vbs5*xrUu(}KdW~fp+rJ+43Evkry3a8d;^#x$m z$kmr4g^lzYZo8gcqFR9*e<%gQy}7umI@92vpk~_N-1Z0O~nw$x?%RaQ5^* z;$$21{uUOkye2j zveJ)Atcoy|7OIWTrmBRC^cuS8aEXNk8*b|lVBfXOPI)#!OKX5w7Tp0`=TrcR9_|1R zQ+zqtDz@JQj;k;3dg9s=G>p4xBBF|qk?iSgn=smW1W#YF>^3rt{w-f{BIoU*YmvMfI6Fq0!9=0F-@+^@lcw|{%&z{(GWl5Ga zSx{@q7sp?#3S>lINU6XKd1$3$VgdjJmXQLZDx=D!9#!Zxa~XtjEF{=)TS^C8YZ;Ed znOF)1L;dW`8ni;QRu!}HW7d+THg_T5X?G6lfjSt-uzYe z%+**I&n~xo_P}L(0KoQQIk}bCZiJDkqAAXA#?WhF6u%2Nf3yU+`eck-pO*88;YFmZ z`b<9%8%G68l8mL38i`r~LPA8f%TQnjRkM4mN>^niQef~Cr7#XJja(kG8%Qt3hTD?q zHM!?{OU#1O;S-8MN{qOJb^-P($6jSb} zH5?ebB_-=H(6VSe&hH2}<@bC2HY~*vc+!)|^U}SRC~hQ4NMRzgwjswj3FYJ%L35n6horrE^m@Z@V~i1*Rk~`ULvN!4!NE@0Mqs-E54yTbI?P z)hXyZN)mhc?8PESsCor3n&K%JXB_;jswmEEIHZn~J9Q#KtJIi~)d0Onp`r?%<}Jrj zL<~u-;kN2hA)?eNj- z>up>w%|zCRHXjs!kDq0r`DYxQ)g%@SRf>Dw{p|0rCQ@u3(J+YjH|M2sOFp7VK4b#4 z>a8U!k||ct(P6<*R*BmOL>`U$#>OT zOIF5wVOr`Tb7GvYHmPJL;BtY zGds;`TwGl5=`nMsogMo!{E~^nJh{CiBC^*tN^g3rsCSD)Bvn0`ug=yOBt%qe@EHgD z!HMg`!$dtDKKA*YHo&W(Xft}OSNo$%dja<^}1AT zzwE3Y>Tqc483zw{qWp2GxF!K!4fYAi>eCyA(d6Fm(5G^h<~)e1pjnF+^|BDJ6Nl?W zRcfCNmMPfm#`&E(m8@uAv~Y`Eh^(ovhB*i8t|OWD{<0)yOjr zUT*_nK5SRrL^+5O4h697Ue}$O$v}@??bP{@wdD-n$N?t-?90BQ{;T&6Fme9Qe5vBj zx=`!1TXVDZ_CEsO3SV)vN`za=1HHNM?wyh&QQ$j|a9dC26Rd)yCu?ho+oya8}&Cd?E^Vw*l_F?I)Lu z^bIX-Q6wj-OA-iC{jLA8Q$ojBOyDQK_kncuZZ>hAS9ltZ5gI#YZr7d~1mJ4nsjxovA zir;!SpSrBE>pNKYk;lWfMi4FU=z$-xY*_;?Hoj~bg+uVFpO>92cv-q5)>7QcC-bgO}%V9GjcWYFUNclvi^J62r5{4ev&D{qbtA z03b$Pt_tM*n?D>_QU6?22PCExm#sDpqUspHv4&U2sfuZnOyZWKRU2ynTGqYUfJlQ3 zrVRqp92HeD%K#wZO6BnkX+4Ol^+2LkBPf&72{t?gyhX{U6@Kcj0Q>+fQagojGdX&P zy_Ph92dlEgWb5cBKN0cCFrcF(BPJ`_zsFc@LQE5@l+QT$!LYn5iT$P}G27u`1Ryh6 z&pup;LjWw}AX)&fz7mqUCkw9O5j97Fxk{X-MpTfRak90BC@9~z|vC9N_{!m{njIFoaPwws$Lsf3}F6eO}g+sB(OwVH393S-IC!j z5GYEKwi5swyX+PY!h)dwo};2c>&~!3bE7q4w2n>vCe5o5k)YECA2r0}48n*ml1*gd zr33TWT($I@Y+K=%z+oaMoPZE3j|R(9{sOWMO_10I)oQ7yK2+qCqkc6|rCk~?k_)2N zI%R_+s;fh4kBg>^T6hi#Z-zB55oYn(@um5~0+L;tZkJvUt-@oYb@Nw_rV&gP9D}s~Jy2bPoF@O1ouf z0289l4;n5ab55_W7N1uJXr)}|Z$(X@9uOz{8c!h@>Z!NfSB?r&ScnjJh7fF7w?<1a ziL167D$CX?wIQv3Z;>4kHCI8ouSU&Pk_IN^4C_X8wypMPOT>Fi!mGaSn=%;t*G>m! zgM^ZxnN!6p$?xO&!2KH&CwveKFv&5Zibx`hv04MThCJ!?$l^qfTlEDuIRJMYbQBQD z?r8}J=NkwVs+r|&p5A711M^4&cy$Nsu8D~`Rtm$eO8oq5bOck49lwss;#PeOptG{Lhzf`Xr~9fYLMMT^dQ0Fe z%U5=@whF&WyaZ59?DM~>Y{d5EM*{dg$za7{6^fCqsPy*TMe!stt#VJaVG7WB6**G{ zR1wMP^3>c;8kC^i&SZj)$J5vZ*tnPp;10XW$U44B8RAg$yPtgG8iSvPO*5wLPeB}- z{qcxOpc+`U8lBsb^ySbRSh2;LY7!GVaimbPELaDI8=6cGCml&hgeUDLMJRRY;oG^{ek7&tI7S5zPS z{#QkU*uH-x2EfdYW;`YMXiivtU|~^xDZ>gg000sG^k;k`bn zueyBfNC1GNKLE~$l$I*#lZRuHU?(t(>#&-IlRLmz;-EKxKvs}f$J-k*SJWK1O^akY z>_Hk*gZGO2=uj^r`#RiGgYn%scrg<4Xv~+4stzZMWY42l+YNZKuOR1IrvqQdiWZwX z?(6)ScaQzLghx{#Smg$-BnBN?45V5IF!M@Mv3p zOKwdz069g9TB_pz%6Aa^_k-a+R(=;aMpRZFo6m{@WBz^k6awtt=gk9C#d~XkO!hvt z>c=}$CWLgq?KrT0;U}$o-zz%usUfcIyGK{Sr)F)m%#=;~Dk4cOkp8j+%j{BMEa1js z1P?iY&7XrzII)3!f^s}Ik5YF_ZmM(Je$Gf*+Dtw1Jz80vUDLeK*%&Y0^;M9_Z+M;uFr9e@G7+`fHL=-o?lJZh- zYHj~$@$)3K;4J-*&n2`|Nqmge7L#Wql&f~PW>v{bv?!E1br1l=VgiGS2QZpgoTSb3 ze&^V@d0;1w^0Cu1U>{K&u!g~Mpw4;c&jz3vKsu2dfZR7hj6v5xoQd(b2bjY+@W`)N z^}`r9xND2Em22n4g!X9j)>3Tb^wnRRm!-Ym^!g^}IVsd@uTN(4<#kI!o!A_d>9e;N z^E?Qo70+PR0UF?7CF0v7k>7v`0`Uc=@$CDsPP(%fki*{_2x5pWm~Q$a+UW}su87_LJN zfur}7P1HhCMpA9*< z^ta=}H0?(*&{>IOcnL)l39uL#z@n5%JusYT1rSPXUIFE$HY{a!sL^=-;3-g{PL4Nj zc9D5J_6MOEYz5MK3HXbca3<+?MKI@Y&0a@4W}NlMZZxuTTadFYOdsrSGva{=YUW+{wMR$rue&oST*cHDbtuG}o+4Z2NptUuwEu+s2O%>v&-e`A zyQQF0_<^$et}70=aQ`IzaqBtLE_@L&@3SJ`kB{7Xug5P-Zkxt&>z=lqpHTdAv~kbX zo&eayv1?CR2>^&BIs`mq&jysk$qYFUQ4~Ti5m8<5o>&&ppX&$yMf6* zA_C%A90G1Qkq$K;ARoE)5it6ViMwJ4Um}v{#T(PqPc~=Cd^)z@+L4lgVo%O&!Xt=m zj2|)=7D07Io>eD(BNM8K8i_uOwSwEtT%OHwRyk|_crK-IxYw_y-Fedaz(^AXSM)D6 z&HSY3%||98%4)T%_4-5Em6)>DlZTX79ZRkPKucXjHDy$GoAK(CqrjdwcFJCij}Ou3 zaaX?xcH&Gb%&k2{plm+g4Af%BXj^ym8!&8C*XeV^*KA43S(RCFD8H_h zFP_LVK0hS0dYt>c)d66LyAMSozb_f438TR7RH0(PkLXo70L0Tdl+egyw*u$n5Rn}m z&Whaz_#NsEAY4tv9}56ZPn*EgockJ*s(hW797(f95_9xz6IVoVERaH}PAsHApf%^c zo-o#v2#6^qHwa48rsji=UCZCyB#J>OiAmVv|^G8UMj6w-w%*H#LPpm$St< ze;%i=ccE8b%(%9E@kZ!x>?AsLHhIU(@|6XPVOhZ&AUxOscz0@TzrraUQrGy;!H3r) z&jWa`J9#{YcRmfCztN9~!oD{{k$am&-~$U@q>#EKsq@Qc#TPdb;($B+8go>QBY}wQ zz2^Y)0V2xjxcW7KLC0Q6n;$Rk`cy)B(_9$2vpF|o5H&`fZv{fCto8S;g0L~7>-xE* z5Q7;PQ8_Pk2apt<9M1%e0XxRuYkA*htp0?t&C4RL&Tgb!BuhvSAHVarwz?vX%b&>_Co zFIN#sdNE3SiNR|16LtG$aK!1Mnf#>Svd(y1f zot~@QYu47e^RC3cXu;0R`e4o^0H+_8`4f3ekGl$>Wyye2Co&e##*}W&TB6SZ`n-?1 z_ox#9BA-)+`wna#h)EIm@U))yfaVFHeDP1EZs!uOVq4Lf5!mynr}@PO=%!PAM;x(I z{pg{?h^XE8o~QSDh{5M=v63`i)mj7CN-#wDIVzZMUoXE1wuK_Kl8I!fe2t#%nF0A> zM;-x)-PKOQbRc>S2H;w*%polmW?Tghh}x?AYH-Ahwhf@Ir(RgbdM8L$(SoZ;PBi5K zDI}A0Q-*Ql0`L_5s05l*`FEQ8wNwpAubh_WTm)s*{`owep3}11P+jus#8Wr&u6J~A z|8*>xx+wFIDmC|c9AsmQ1bm6B?GbCc1GN+hY~kq|4mY+P&M}#xmdpXIPXM8Of8T!4 zS4%#c$LNqUKMWvU{dVtS0d&h*4IVma27m*hT(y$5GlN6PuM%M+e!e@v7PWp7FsWww zeRva*$uqdrqtxF&*u=}swFxb+Zoc|%T0ZlacGn|dv$;dhK3z+xyEg!HVYex5-R%_I zLXYzF{E=%hDV?sh*)ymOHa0%G$18hHA8gD!ez)w{4xFy!qo5Fzf}Rmk*vtsL{m#q* zVC%R1d-HO~0P^pMTmID7wsEY9Jf<&u{ltgFz!51I*MXKpYtVyJ(P>7o!q6uWhlOHYX-FZ_+qg5oT(Rw>53kL(UQR0)CS3tc37SYqMkBi-4&K<8v%S#^AVHl zs&R(oA_8jb_I{TE?79%$8Rs2F`63Ygo3b{yN&`a!%?Zm&a<4r6(yMptPZmx*P_Xw* z^JnTfBIFZehB?{$d5V7|D}M3#Lzp*QBbuu_NG$-{7*_n<rR^>g2iY<>Pq_Kf;tzu(18b74Ea@-S}{e7~OMz(c>Ef8*V6dg5ju7DV%n&`1SsA zbTyZK#ENSNp389nj(7GIqG zUITI`Gk*<_VcF$3K+jq?Q+4d&S3D>Ix1)`#^WMMNWuMp-kg8o7y1D2=FKe?nHbFQ6oYOT2S|~t#tOivo|6UF z#7K)QJalapQg;SPRHd>coXQ>!Zy$_}W_4am1YnJY7;qKY1&O>SA)L|N8jXD1M#hJc z^z`Rq7IM(sGY-JgPW^urRiOZq?(sS3_r(AF8~7TY0J>2E>fY6a(}}H?`f}*LBs$jf zj17$F-~j*-Q2~JC*xG|gAZ}%4Co9nvAe+p9?bg!AbLNHKv6Kh-6V;WKtGkmEPU7^( z%yf9m-+-y&8Xg`5jc&Pe(X+b4fUeBs#Fj$fonLnIwfdIxN}u-x46jUwwq7+~j~}oZ zOl^LzJ2@hOmMdRPIELJD^N==^sBXX`0PBwPknNEoo?I2OO{S>Q7cI4pu^BRn`xJZ(cdr!VW^csHbL*TUc!seoeGxp;{ zHxfa;1O6$gV-u3g{^nqs7=Fj5;YG=68HZQ0B_-d)Q!Pi2Uh>`{>G{x`NsJ)^QK9k_ zisB%)9>XDI2Bc-gf>W{YG*qnkwfj38Nft( z%#9)qosr_-#JaEfkT4MuH9t3%L5Rox*w*HuRmj0ULACb4tUbY2id` zUZUZLe>&vZWOnq;7q0_7smmwta6;QmKaVd;qzL6TlShVpJ!9L!M>QMJ}*v(gPT9;9w1JQH!V=;@y1j;`bf%jf? z;36d3SmLeL2&ZK-nerNDHi%*HV1K58jV99*|LMZPp+&AYBGHN9E8YYBgM2$Ll}BFiUr5sm*X}etyZ@$WHkgWb-)B6!(-J-)M&Ca z0EWB5;%>DhMV|G3u3>p6-oPe>2wO4-AJv>#Xz7R!ztf6>}*xRt3~6+n7Hx3jAh}TJri>pw``iVXzR)$E1DCTKEI0clP03uksI%QdH%%ng6r?F(a&w(`E8TA zDg7RpUvGT)*^4K|ugm?c?ZzXnIT4v0vlCW?joYJdYNF+j-=5YR@#q4H! zqAAt!0N|*7-}PY-f_8~0^-bwJCXo-o;gr;_a`Cfw__zNBoY->%&a%7 z`wEJWl5Avx4#?!)sDTn+o?w1+30VGTG9LYi&N#A}aUoV>lFC^=&& z?0oQQ+{xRt76!HF06h-CqFPA{T}GhLhf>y*ydJm_c9?dT zpR!kVoEygcaZeP`g3l)H4kOCy)Vgyb%9n_Q+gq%YJ(}PGE|TQbeh-8=9+_uz0lbSj zDN-_sVMY{&tID9SJR|yFzbEhxw{nsTzUID+g2mzjd2Vx1Q$bZh%`nEbnj6WYSKwGd zrc_>N=J$zRXR5Eu;ss{kT6BL9Sv`vw`&~K@cIZcW%?X6_AwxSw1~66>3K;7JuzRo| zFC`j(D;y+A@&ULBcwK2PduAm?9)_ZBY!`|7JZNty9X3_^%O4-pi9+?!u-8M@#aSPmM> zw*^=r(t6+94jAVp5eXp2hyeAzWVV}0rFLQqaS3Vw1WNaypS!#d3_w^dR1SK24qtb^ zp?MD;y~#2inlS~&qFH#?TDJ$7GJnXJkq6H|J)XJ;X!*hsygUz6wz+wFdZt(_wtP1( zx~<7(`nop<``=yrWrSa=IwCT~X9|etHI-VkRLmu6a(mkH3(>sFZD=NYd>J~6^tOahW zaB?}(RtdipM#(k%05p7|DyGs^;oqAd&H@jnQ~PSo$csp5PGK1tVMLViMbB+SVIJ8` zTkX9Arg}cIZ15)u$^S;rxOlO!4#H@c8%hWEeuF7<}aT=qSP8IwY7%j^BQ?|IbNFN^)7!`G=mSIWL zx5W$q$*jt}SSo(=Q{W*4FoX#|Jw4||!Y_qPdFC*j5hEqCJ(%;|Oxcb}6778=h5K-}zcAju<+FzvqX=1&3T zSyPqqxv1iJvAH@0sMv>uC z!t-mvz~Q2i-3FUwkhQod-9-5%z)~U+3?lETka?|o5RgzNke_h#3thj`@n8E>e+b{s zAGZM!-AWx0)!2ywayJ5?G4P0Ms@qFK_E)={ zG}KL2Au>f(3}0lb;!zt_Tu1jek>HliSw9T2Ujc0U{A}!65v_pPfBDH!8^9g1_fhqT ztwWEal3hjt%VZdj&A|N@7#JirVLsU7;Bf9&z?MPMm;F8L5HUAo8uTWY9O`leIQNP~ zF?hMMz0hQZ)>9Dv7kuO^z5g9Qv*<!_~FMH0cyE<~TJiQn$4Eie;w#2#y@yQw$bXqBq#_-=ryxG2E3 z_b(uxGp3~c5YZw451jd_uqyYl-{!e@ADx3)#Z2baQa+ETg}^pBz7ag3*`g0{b%gkC z$m`85IGp=ln9@lDXg3?)Vd4?>`cAeBn`1)IL6YKnB5@3^#-0^e6=%&=z*|__U+=Hn z`xnqRG+F-JX9eZ}ygu-_rEtY_5z4B8d4vWwX`Jym>xqEHCQq>#fDoeeq{|zDWGdi& z%}C@wZN*ywIPx-dW;f9Ta5T4xvY!Pe-YH5KLlZ}g$~Etf2M{->Q8rN|&ha#;$>zqY zqoROOJ0fT2L)(CM9C->Rs(h3tP{PYBz~U*h3dcIMVe4pXpf&?(sc&nh)B)u8~I)@NazjBZM%m1^5u3LB&c;6Qi zt**aNkNlJBV=(bE3bDrks*mpRl`kb!C9)3Ip0ENY+cF0mwXzu1Q}1RL=duC;B}nDs zI=jrWeXQ|1sAQdYR(_IuF4%dJ?G{n)tQT4dH&}cVaC*6{(ikvrA#$9@b@6xdBVMDL zquQMJUUz725})i~lekov&vzA(#La^;1X`eb3g%q^fW);rk-hISEy0jkWr zZ4D{%d>YVjm5fpd=+_X@)T`)i7oA=<_;LI<@ox%xg^5l^^bLQJL+@+*{WL`U*+Q>2 z{!4K2A=(OjC`zIe|E?b!!I1gk;Sk;gF{2@5#IoM|%Du0@{S)?n#y24MsUT58HLC(f zlN5!GBZz|!fnqXvkF6;2FN^}_1zy>lD|Zy)Ut=mmmQc#JodSr*HKM_>_`kmg-Fc&_ zE0SuF>nSV74GvlXv-rG#V$RZCyzg>kmhcwo=hq=ds;~Q70H8oN*A@vhWbB_@vtezp z=mf8x|23qrS^h=83X?htO?wq4@*=7&KOVU4klZm>6QDny`J#2^MgHMi4S^3o1E$ob zSM&UZt_D)``RMVLU-$Dr`(O0k01)45c4P#L=lDUN`s>3gkW3BiFfa$^%`YVgw;Ki_ zek>v@xtia$21ZE+F`8-HA}TKX)h#3g2gOnAc=C#VFI$|ED20k4}dqh62V3pGTiHgCe&Szm{K z8lEIN-8bUTK*D>ezI*!o3|s?{=R-6M7wy+*Kr9f|t_;Ao-UWPl>fiEZz*zm2U*hLq z`n~7>tSg9y%Pz}f$$=s-rJkv+EKPyT`gGXjNQN1DUB;xi14$$$B$G0N`_Ldp=O&4u zq+D+>{Vl~$)N!n=;jTu40ACWBA`bpkz}t@p!-3fE$05D|-1kJxR*_cgMOsDh2Qk3W zrau)DdvTXTGK+zstS$e+XhhVJ#;N-b+?8-`jx%g;Gv$xYnh_EhChD16UGiHEoVpgA z1`NG1y^iCrc?XOqx%q|aE5BL&sXPB9mKU;LoddwBtWU-1hm~>L14xV|+`b){oeA&! z%P)eb5d8qB@VEL`m^2sB7)`hMltZU5QCWZNus zkla>0`=j1AvIknW+0|5msVsR(bKbWD(~GezZbbue8$fgi5aocCB-8v9NP?8Q))2de zJFdu1obe@*DMl_&ma|&!V$jbDIA5=@D3LE?gDOC^qk;v!87B(&{&p2?R$uS_K!pJ+ z-@Q}j_}s>w9NyiGPZww&XO`jnk|JFqjL|uA#{rFj=!w{UO5rnNKadubv;a6C^_bao zl-58~4*p+1YklPx-}%oodCyA$Ic(X!zFcsXbSSfo+o7YQ`ER$L`Ztq?WHFFBI2TT} zv>_=W7EdYsIqz3l3}(Ekj=lllvglo};EL(Q8DA0`3wJ5!`Q<=)8JCl=RzPLl?xJ^) zY7HQ`@9O-wGn=9kFkZEUa0UQ|PlV+F8aEr5KUmiII{rqW?Ey|NsT(wLC;!J2jk$K| zGXBxiAA$Vwh2|Vb*e!lb<9`(UN`SY$|8(LLfVXQq5mC5~voSi`zVe$l#30e1OvO}@ zM0DfEBbCJ3nlGtpgAK6Yo`Vz=a~7g#C6rsCLtgreOT@Alqn5&+444S+=v5s}2X^u> zvuflIulQ~}VbWqt>8Isrco3jkZwrnMGxNfOZv@CFff0tT^N3||E3h183F zX26lr006_cMddit>E4?eC4>wYa#-Vp%>4p(2D}$=JNV^T_Y=@Oa^7ODr*zr(^29Y) z1Qgm$4OYFqFBy2+d7OPIP~Pw2g!m0GvJ)K@eq|0Lt|D=ldq6gv6Hj%B^N3`$G_y+$ z+FBe*{h43}J_@nP2Mhq4x86Q#(Z?!ZX9~BYX14Ls%t{^AqL9ZKxdi|)2X$d#Uy$Vl zPuDBBS~@gMXH^T_hrm4kaBQ6I6Y~XH^O)tr_JG7zAiVUb;v}QV(zjqpzd@X4thpWA z1^{X4mxQhU$O4%nWDx(L@K+ZidXbof1$#<@;oC6SBwgy4MHa{%cQp#CP}A=3F#~Yl zD?Dr>V0?eq1>jd>G6UULjyX4nIdwa%Hf{$2%5l3PMxXJV4Ih49zbabkM`y0pH*|1) zcUv~FECo~p8b_7957WtM3sJB_wyig*!!Zw{SHp1FU=gZ{t4y#HzW)20-&r>yfFBq3 zv0$q_lRYDpaLi7`-SrBt5qzOnPjTbF9I)|)X5+sD_wE3ZO&!eB(;UuC3*b13j#Y;$ z9mhe2+heb^1iXhh5qoo_cy@OzEeG&Aa2Ri%w50$d!(|CS0d9@0` z!0pE8zZWE3w(IU6mq%nzXVO;#mb@QA@OA)g0o!F~BEM2Y^#4n2#@Rz6bc=6bl02?C z*Bwv@k*b1pzBls47Thg)imZzT7(OLY(_lkjmuCs+rV@C-SF#;Sa+cqX1#CG)Im`fb z6%j|*E4WUGfzB9UB{h%}<0B{_$8uae$MU2$OHtE#h+6}WIt+**qH$jLfe$bBcLz#F zh<&)+KK;~70LGOQ1q`4z9!mrN7oir?`?WQlQZtGi$sVyX@?LsMI7eeh_g(%Up{Pk(;wY z;rQ^n^hv<^Z4!M|=xHjgBb`Csk~ zQ>teE_s|jDvNaHX)sv|#3BvtwP_5bX{uTnGxPMf@lFd=Y&jd3NRYyc&79fPH>lIuf zkHBbD%UD_r+}E0ch_Yv212DR%i8>vc$+I5r0TQ@F&x>aRM=Mj*OY?%0>2IN;c3j!_ zgXtm;%P#=7v%)snYKXg&KXt$Pd!jm~>}-?3+8%c`%^StY$o8jk=bba2?LHsz*_TWG zmMrjO5*F|8$wJ+2ewI5vU?HmpPwyT05&-ZY{gs>Voc}X-{{^YY`W(^X(%m{iNGfy6 z(9y%>T!b0-p3?>M&{>lFTp?y8Cao<;6;68_z|2h~&V1$B8yIDxDiKuy36^~LSV~Op z09yca3cD(;V9u^raAi;f-$XeZ_Y&)X6Tr&*Xbf!J@ZFg}>ejQv?*VvwGoNG6{0e}# z-wn0!=ksTBva%?*{5-f-;3UVy^e zr1E2O{SVk=aB?;bc1^9MQeugAA&{~e5!ywPG~^eBXS4Uj~2{v@q=o3r_VTxVc* z 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