From 4b06e35d3dc128d76b7221e769a8bb930c5a8526 Mon Sep 17 00:00:00 2001 From: Michael Matloka Date: Fri, 27 Oct 2023 14:06:31 +0200 Subject: [PATCH 1/8] ci: Don't build HogQL parser if version hasn't changed (#18244) --- .github/workflows/build-hogql-parser.yml | 27 ++++++++++++++---------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-hogql-parser.yml b/.github/workflows/build-hogql-parser.yml index 22ead983fd781..90395eaa52180 100644 --- a/.github/workflows/build-hogql-parser.yml +++ b/.github/workflows/build-hogql-parser.yml @@ -22,14 +22,14 @@ jobs: if: github.repository == 'PostHog/posthog' runs-on: ubuntu-22.04 outputs: - parser_any_changed: ${{ steps.changed-files-yaml.outputs.parser_any_changed }} + parser-release-needed: ${{ steps.version.outputs.parser-release-needed }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetching all for comparison since last push (not just last commit) - name: Check if hogql_parser/ has changed - id: changed-files-yaml + id: changed-files uses: tj-actions/changed-files@v39 with: since_last_remote_commit: true @@ -37,24 +37,29 @@ jobs: parser: - hogql_parser/** - - name: Notify about release needed - if: steps.changed-files-yaml.outputs.parser_any_changed == 'true' + - name: Check if version was bumped shell: bash + id: version run: | - published=$(curl -fSsl https://pypi.org/pypi/hogql-parser/json | jq -r '.info.version') - local=$(python hogql_parser/setup.py --version) - # TODO: Only comment if no comment alraedy exists for $local - if [[ "$published" == "$local" ]]; then - message_body="It looks like the code of \`hogql-parser\` has changed since last push, but its version stayed the same at $local. 👀\nMake sure to resolve this in \`hogql_parser/setup.py\` before merging!" - curl -s -u posthog-bot:${{ secrets.POSTHOG_BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} -X POST -d "{ \"body\": \"$message_body\" }" "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" + parser_release_needed='false' + if [[ ${{ steps.changed-files.outputs.parser_any_changed }} == 'true' ]]; then + published=$(curl -fSsl https://pypi.org/pypi/hogql-parser/json | jq -r '.info.version') + local=$(python hogql_parser/setup.py --version) + if [[ "$published" != "$local" ]]; then + parser_release_needed='true' + else + message_body="It looks like the code of \`hogql-parser\` has changed since last push, but its version stayed the same at $local. 👀\nMake sure to resolve this in \`hogql_parser/setup.py\` before merging!" + curl -s -u posthog-bot:${{ secrets.POSTHOG_BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} -X POST -d "{ \"body\": \"$message_body\" }" "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" + fi fi + echo "::set-output name=parser-release-needed::$parser_release_needed" build-wheels: name: Build wheels on ${{ matrix.os }} needs: check-version runs-on: ${{ matrix.os }} timeout-minutes: 30 - if: ${{ needs.check-version.outputs.parser_any_changed == 'true' }} + if: ${{ needs.check-version.outputs.parser-release-needed == 'true' }} strategy: matrix: # As of October 2023, GitHub doesn't have ARM Actions runners… and ARM emulation is insanely slow From b93a7e57e7fa7b930b8cbc3445a098c8d2f9e7a7 Mon Sep 17 00:00:00 2001 From: Juraj Majerik Date: Fri, 27 Oct 2023 15:38:53 +0200 Subject: [PATCH 2/8] fix(projects): reload organization after project creation (#18198) * reload org after project creation * call loadCurrentOrganization in createTeamSuccess listener --- frontend/src/scenes/teamLogic.tsx | 3 +++ hogql_parser/parser.cpp | 8 +++++--- hogql_parser/string.cpp | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frontend/src/scenes/teamLogic.tsx b/frontend/src/scenes/teamLogic.tsx index 17def88cb67ef..be21abb60f6da 100644 --- a/frontend/src/scenes/teamLogic.tsx +++ b/frontend/src/scenes/teamLogic.tsx @@ -206,6 +206,9 @@ export const teamLogic = kea([ ], })), listeners(({ actions }) => ({ + createTeamSuccess: () => { + organizationLogic.actions.loadCurrentOrganization() + }, deleteTeam: async ({ team }) => { try { await api.delete(`api/projects/${team.id}`) diff --git a/hogql_parser/parser.cpp b/hogql_parser/parser.cpp index 4d004e3d0086d..f2f6254be2192 100644 --- a/hogql_parser/parser.cpp +++ b/hogql_parser/parser.cpp @@ -37,7 +37,7 @@ err_indicator = PyObject_SetAttrString(py_err, "end", py_end); \ if (err_indicator == -1) goto exit##TYPE; \ PyErr_SetObject(error_type, py_err); \ - exit##TYPE:; \ + exit##TYPE :; \ Py_XDECREF(py_end); \ Py_XDECREF(py_start); \ Py_XDECREF(py_err); \ @@ -2096,7 +2096,8 @@ static PyMethodDef parser_methods[] = { .ml_meth = method_unquote_string, .ml_flags = METH_VARARGS, .ml_doc = "Unquote the string (an identifier or a string literal))"}, - {NULL, NULL, 0, NULL}}; + {NULL, NULL, 0, NULL} +}; static int parser_modexec(PyObject* module) { parser_state* state = get_module_state(module); @@ -2118,7 +2119,8 @@ static int parser_modexec(PyObject* module) { static PyModuleDef_Slot parser_slots[] = { {Py_mod_exec, (void*)parser_modexec}, // If Python were written in C++, then Py_mod_exec would be typed better, but // because it's in C, it expects a void pointer - {0, NULL}}; + {0, NULL} +}; static int parser_traverse(PyObject* module, visitproc visit, void* arg) { parser_state* state = get_module_state(module); diff --git a/hogql_parser/string.cpp b/hogql_parser/string.cpp index a5df4f4e89d6e..e5165bfaa37ab 100644 --- a/hogql_parser/string.cpp +++ b/hogql_parser/string.cpp @@ -40,7 +40,7 @@ string unquote_string(string text) { boost::replace_all(text, "\\r", "\r"); boost::replace_all(text, "\\t", "\t"); boost::replace_all(text, "\\v", "\v"); - boost::replace_all(text, "\\0", ""); // NUL characters are ignored + boost::replace_all(text, "\\0", ""); // NUL characters are ignored boost::replace_all(text, "\\\\", "\\"); return text; From 51b0711df73129ab00393bed582ea2741796878c Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 27 Oct 2023 15:08:53 +0100 Subject: [PATCH 3/8] chore: move to LemonInput (#18242) --- .../scenes-app-surveys--survey-view.png | Bin 58791 -> 47608 bytes .../filters/ActionFilter/RenameModal.tsx | 52 +++++------------- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/frontend/__snapshots__/scenes-app-surveys--survey-view.png b/frontend/__snapshots__/scenes-app-surveys--survey-view.png index 569cb11dbac2bd232edb74db5a894b03131d6d33..1fedb0eef095e0a7d792386d3ebb85ce2ac8cf58 100644 GIT binary patch delta 28494 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 J^6>fV{{h}O&+7mH delta 40424 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 X4y^viy^Oa~t*t(uM8~Kq$DG99=b~MlIswA#J^n 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 diff --git a/frontend/src/scenes/insights/filters/ActionFilter/RenameModal.tsx b/frontend/src/scenes/insights/filters/ActionFilter/RenameModal.tsx index 21645cd702d64..8e98a5fb83159 100644 --- a/frontend/src/scenes/insights/filters/ActionFilter/RenameModal.tsx +++ b/frontend/src/scenes/insights/filters/ActionFilter/RenameModal.tsx @@ -1,11 +1,9 @@ import { useActions, useValues } from 'kea' import { entityFilterLogic } from 'scenes/insights/filters/ActionFilter/entityFilterLogic' -import { useEffect, useRef } from 'react' import { InsightType } from '~/types' -import { Button, Input, Modal } from 'antd' import { getDisplayNameFromEntityFilter } from 'scenes/insights/utils' import { renameModalLogic } from 'scenes/insights/filters/ActionFilter/renameModalLogic' -import { InputFocusOptions } from 'antd/lib/input/Input' +import { LemonButton, LemonInput, LemonModal } from '@posthog/lemon-ui' interface RenameModalProps { typeKey: string @@ -20,64 +18,42 @@ export function RenameModal({ typeKey, view }: RenameModalProps): JSX.Element { const { name } = useValues(logic) const { setName } = useActions(logic) - const ref = useRef(null) - useSelectAllText(ref, { cursor: 'all' }, [modalVisible]) - const title = `Rename ${view === InsightType.FUNNELS ? 'funnel step' : 'graph series'}` return ( - - - + } - onCancel={hideModal} + onClose={hideModal} > Query series/steps can be renamed to provide a more{' '} meaningful label for you and your team members. Custom names are also shown on dashboards.
Name
- renameFilter(name)} - onChange={(e) => setName(e.target.value)} + onChange={(value) => setName(value)} suffix={ {getDisplayNameFromEntityFilter(selectedFilter, false) ?? ''} } + autoFocus + onFocus={(e) => e.target.select()} /> -
- ) -} - -function useSelectAllText( - ref: React.MutableRefObject, - options: InputFocusOptions, - dependencies: any[] = [] -): void { - // Hacky setTimeout is needed to select all text on modal open - // https://github.com/ant-design/ant-design/issues/8668#issuecomment-352955313 - useEffect( - () => { - const autoFocusTimeout = setTimeout(() => { - if (ref.current) { - ref.current?.focus(options) - } - }, 0) - return () => clearTimeout(autoFocusTimeout) - }, - - dependencies + ) } From c9a6adb5147e9d9ecb423c6e79d87091876516eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Fri, 27 Oct 2023 16:10:52 +0200 Subject: [PATCH 4/8] feat: Support for migrating bigquery and postgres (#18156) --- .../commands/create_batch_export_from_app.py | 49 ++- .../test/test_create_batch_export_from_app.py | 301 +++++++++++++----- 2 files changed, 274 insertions(+), 76 deletions(-) diff --git a/posthog/management/commands/create_batch_export_from_app.py b/posthog/management/commands/create_batch_export_from_app.py index 6fa577f582c55..2386d67e0a6f7 100644 --- a/posthog/management/commands/create_batch_export_from_app.py +++ b/posthog/management/commands/create_batch_export_from_app.py @@ -2,10 +2,11 @@ import json from django.core.management.base import BaseCommand, CommandError +from psycopg2.extensions import parse_dsn from posthog.batch_exports.models import BatchExport, BatchExportDestination from posthog.batch_exports.service import backfill_export, sync_batch_export -from posthog.models.plugin import PluginConfig +from posthog.models.plugin import PluginAttachment, PluginConfig from posthog.temporal.client import sync_connect @@ -169,6 +170,7 @@ def map_plugin_config_to_destination(plugin_config: PluginConfig) -> tuple[str, "exclude_events": plugin_config.config["eventsToIgnore"].split(","), } export_type = "S3" + elif plugin.name == "Snowflake Export": config = { "account": plugin_config.config["account"], @@ -181,6 +183,51 @@ def map_plugin_config_to_destination(plugin_config: PluginConfig) -> tuple[str, "role": plugin_config.config.get("role", None), } export_type = "Snowflake" + + elif plugin.name == "BigQuery Export": + config_file_contents = PluginAttachment.objects.get( + team=plugin_config.team, plugin_config=plugin_config, key="googleCloudKeyJson" + ).contents + config_json = json.loads(bytes(config_file_contents)) + + config = { + "project_id": config_json["project_id"], + "private_key": config_json["private_key"], + "private_key_id": config_json["private_key_id"], + "token_uri": config_json["token_uri"], + "client_email": config_json["client_email"], + "dataset_id": plugin_config.config["datasetId"], + "table_id": plugin_config.config["tableId"], + "exclude_events": plugin_config.config.get("exportEventsToIgnore", "").split(",") or None, + } + export_type = "BigQuery" + + elif plugin.name == "PostgreSQL Export Plugin": + if database_url := plugin_config.config.get("databaseUrl", None): + raw_config = parse_dsn(database_url) + else: + raw_config = { + "host": plugin_config.config["host"], + "port": plugin_config.config.get("port", "5432"), + "dbname": plugin_config.config["dbName"], + "user": plugin_config.config["dbUsername"], + "password": plugin_config.config["dbPassword"], + } + + has_self_signed_cert = plugin_config.config.get("hasSelfSignedCert", "No") == "Yes" + + config = { + "database": raw_config["dbname"], + "user": raw_config["user"], + "password": raw_config["password"], + "schema": "", + "host": raw_config["host"], + "port": int(raw_config["port"]), + "table_name": plugin_config.config.get("tableName", "posthog_event"), + "has_self_signed_cert": has_self_signed_cert, + "exclude_events": plugin_config.config.get("eventsToIgnore", "").split(",") or None, + } + export_type = "Postgres" else: raise CommandError( f"Unsupported Plugin: '{plugin.name}'. Supported Plugins are: 'Snowflake Export' and 'S3 Export Plugin'" diff --git a/posthog/management/commands/test/test_create_batch_export_from_app.py b/posthog/management/commands/test/test_create_batch_export_from_app.py index aabe5ad511c99..b6832221d2d71 100644 --- a/posthog/management/commands/test/test_create_batch_export_from_app.py +++ b/posthog/management/commands/test/test_create_batch_export_from_app.py @@ -1,9 +1,11 @@ +import asyncio +import collections import datetime as dt -import itertools import json import typing import pytest +import temporalio.client from asgiref.sync import async_to_sync from django.conf import settings from django.core.management import call_command @@ -15,7 +17,7 @@ from posthog.management.commands.create_batch_export_from_app import ( map_plugin_config_to_destination, ) -from posthog.models import Plugin, PluginConfig +from posthog.models import Plugin, PluginAttachment, PluginConfig from posthog.temporal.client import sync_connect from posthog.temporal.codec import EncryptionCodec @@ -58,6 +60,30 @@ def s3_plugin(organization) -> typing.Generator[Plugin, None, None]: plugin.delete() +@pytest.fixture +def bigquery_plugin(organization) -> typing.Generator[Plugin, None, None]: + plugin = Plugin.objects.create( + name="BigQuery Export", + url="https://github.com/PostHog/bigquery-plugin", + plugin_type="custom", + organization=organization, + ) + yield plugin + plugin.delete() + + +@pytest.fixture +def postgres_plugin(organization) -> typing.Generator[Plugin, None, None]: + plugin = Plugin.objects.create( + name="PostgreSQL Export Plugin", + url="https://github.com/PostHog/postgres-plugin", + plugin_type="custom", + organization=organization, + ) + yield plugin + plugin.delete() + + test_snowflake_config = { "account": "snowflake-account", "username": "test-user", @@ -77,68 +103,162 @@ def s3_plugin(organization) -> typing.Generator[Plugin, None, None]: "compression": "gzip", "eventsToIgnore": "$feature_flag_called", } +test_bigquery_config = { + "tableId": "my_table_id", + "datasetId": "my_dataset_id", + "googleCloudKeyJson": { + "type": "service_accout", + "project_id": "my_project_id", + "private_key_id": "my_private_key_id", + "private_key": "-----BEGIN PRIVATE KEY-----Wow much private, such key-----END PRIVATE KEY-----", + "client_email": "email@google.com", + "client_id": "client_id", + "auth_uri": "https://accouts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata", + }, + "exportEventsToIgnore": "$feature_flag_called,$pageleave,$pageview,$rageclick,$identify", +} +test_postgres_config = { + "host": "localhost", + "port": "5432", + "dbName": "dev", + "tableName": "posthog_event", + "dbPassword": "password", + "dbUsername": "username", + "databaseUrl": "", + "eventsToIgnore": "$feature_flag_called", + "hasSelfSignedCert": "Yes", +} +test_postgres_config_with_database_url = { + "port": "54322", + "dbName": "prod", + "host": "localhost", + "tableName": "posthog_event", + "dbPassword": "password_in_url", + "dbUsername": "username_in_url", + "databaseUrl": "postgres://username_in_url:password_in_url@localhost:54322/prod", + "eventsToIgnore": "$feature_flag_called,$pageleave,$pageview,$rageclick,$identify", + "hasSelfSignedCert": "Yes", +} + +PluginConfigParams = collections.namedtuple( + "PluginConfigParams", ("plugin_type", "disabled", "database_url"), defaults=(False, False) +) @pytest.fixture -def config(request): - if request.param == "S3": - return test_s3_config - elif request.param == "Snowflake": - return test_snowflake_config +def config(request) -> dict[str, str]: + """Dispatch into one of the configurations for testing according to export/plugin type.""" + if isinstance(request.param, tuple): + params = PluginConfigParams(*request.param) else: - raise ValueError(f"Unsupported plugin: {request.param}") + params = PluginConfigParams(request.param) + + match params.plugin_type: + case "S3": + return test_s3_config + case "Snowflake": + return test_snowflake_config + case "BigQuery": + return test_bigquery_config + case "Postgres": + if params.database_url is True: + return test_postgres_config_with_database_url + else: + return test_postgres_config + case _: + raise ValueError(f"Unsupported plugin: {request.param}") @pytest.fixture -def snowflake_plugin_config(snowflake_plugin, team) -> typing.Generator[PluginConfig, None, None]: +def plugin_config( + request, bigquery_plugin, postgres_plugin, s3_plugin, snowflake_plugin, team +) -> typing.Generator[PluginConfig, None, None]: + """Manage a PluginConfig for testing. + + We dispatch to each supported plugin/export type according to + request.param. + """ + if isinstance(request.param, tuple): + params = PluginConfigParams(*request.param) + else: + params = PluginConfigParams(request.param) + + attachment_contents = None + attachment_key = None + + match params.plugin_type: + case "S3": + plugin = s3_plugin + config = test_s3_config + case "Snowflake": + plugin = snowflake_plugin + config = test_snowflake_config + case "BigQuery": + plugin = bigquery_plugin + config = test_bigquery_config + + json_attachment = config["googleCloudKeyJson"] + attachment_contents = json.dumps(json_attachment).encode("utf-8") + attachment_key = "googleCloudKeyJson" + + # Merge these back so that we can assert their prescense later. + config = {**config, **json_attachment} + + case "Postgres": + plugin = postgres_plugin + + if params.database_url is True: + config = test_postgres_config_with_database_url + else: + config = test_postgres_config + + case _: + raise ValueError(f"Unsupported plugin: {params.plugin_type}") + plugin_config = PluginConfig.objects.create( - plugin=snowflake_plugin, + plugin=plugin, order=1, team=team, enabled=True, - config=test_snowflake_config, + config=config, ) - yield plugin_config - plugin_config.delete() - -@pytest.fixture -def s3_plugin_config(s3_plugin, team) -> typing.Generator[PluginConfig, None, None]: - plugin_config = PluginConfig.objects.create( - plugin=s3_plugin, order=1, team=team, enabled=True, config=test_s3_config - ) - yield plugin_config - plugin_config.delete() + attachment = None + if attachment_contents and attachment_key: + attachment = PluginAttachment.objects.create( + key=attachment_key, + plugin_config=plugin_config, + team=team, + contents=attachment_contents, + file_size=len(attachment_contents), + file_name=attachment_key, + ) + if params.disabled is True: + plugin_config.enabled = False + plugin_config.save() -@pytest.fixture -def plugin_config(request, s3_plugin_config, snowflake_plugin_config) -> PluginConfig: - if request.param == "S3": - return s3_plugin_config - elif request.param == "Snowflake": - return snowflake_plugin_config - else: - raise ValueError(f"Unsupported plugin: {request.param}") + yield plugin_config + plugin_config.delete() -@pytest.fixture -def disabled_plugin_config(request, s3_plugin_config, snowflake_plugin_config) -> PluginConfig: - if request.param == "S3": - s3_plugin_config.enabled = False - s3_plugin_config.save() - return s3_plugin_config - elif request.param == "Snowflake": - snowflake_plugin_config.enabled = False - snowflake_plugin_config.save() - return snowflake_plugin_config - else: - raise ValueError(f"Unsupported plugin: {request.param}") + if attachment: + attachment.delete() @pytest.mark.django_db @pytest.mark.parametrize( "plugin_config,config,expected_type", - [("S3", "S3", "S3"), ("Snowflake", "Snowflake", "Snowflake")], + [ + ("S3", "S3", "S3"), + ("Snowflake", "Snowflake", "Snowflake"), + ("BigQuery", "BigQuery", "BigQuery"), + ("Postgres", "Postgres", "Postgres"), + (("Postgres", False, True), ("Postgres", False, True), "Postgres"), + ], indirect=["plugin_config", "config"], ) def test_map_plugin_config_to_destination(plugin_config, config, expected_type): @@ -149,15 +269,33 @@ def test_map_plugin_config_to_destination(plugin_config, config, expected_type): result_values = list(export_config.values()) for key, value in config.items(): - if key == "eventsToIgnore": - assert value in export_config["exclude_events"] + if key == "eventsToIgnore" or key == "exportEventsToIgnore": + assert value.split(",") == export_config["exclude_events"] + continue + + if key == "hasSelfSignedCert": + assert (value == "Yes") == export_config["has_self_signed_cert"] + continue + + if key == "port": + value = int(value) + + if key in ( + "databaseUrl", + "googleCloudKeyJson", + ): + # We don't use these in exports, or we parse them and store them with a different key. continue assert value in result_values @pytest.mark.django_db -@pytest.mark.parametrize("plugin_config", ["S3", "Snowflake"], indirect=True) +@pytest.mark.parametrize( + "plugin_config", + ("S3", "Snowflake", "BigQuery", "Postgres", ("Postgres", False, True)), + indirect=True, +) def test_create_batch_export_from_app_fails_with_mismatched_team_id(plugin_config): """Test the create_batch_export_from_app command fails if team_id does not match PluginConfig.team_id.""" @@ -171,7 +309,11 @@ def test_create_batch_export_from_app_fails_with_mismatched_team_id(plugin_confi @pytest.mark.django_db -@pytest.mark.parametrize("plugin_config", ["S3", "Snowflake"], indirect=True) +@pytest.mark.parametrize( + "plugin_config", + ("S3", "Snowflake", "BigQuery", "Postgres", ("Postgres", False, True)), + indirect=True, +) def test_create_batch_export_from_app_dry_run(plugin_config): """Test a dry_run of the create_batch_export_from_app command.""" output = call_command( @@ -195,11 +337,13 @@ def test_create_batch_export_from_app_dry_run(plugin_config): @pytest.mark.django_db +@pytest.mark.parametrize("interval", ("hour", "day")) @pytest.mark.parametrize( - "interval,plugin_config,disable_plugin_config", - itertools.product(["hour", "day"], ["S3", "Snowflake"], [True, False]), - indirect=["plugin_config"], + "plugin_config", + (("S3", False), ("Snowflake", False), ("BigQuery", False), ("Postgres", False), ("Postgres", False, True)), + indirect=True, ) +@pytest.mark.parametrize("disable_plugin_config", (True, False)) def test_create_batch_export_from_app( interval, plugin_config, @@ -252,20 +396,22 @@ def test_create_batch_export_from_app( @pytest.mark.django_db +@pytest.mark.parametrize("interval", ("hour", "day")) @pytest.mark.parametrize( - "interval,disabled_plugin_config,migrate_disabled_plugin_config", - itertools.product(["hour", "day"], ["S3", "Snowflake"], [True, False]), - indirect=["disabled_plugin_config"], + "plugin_config", + (("S3", True), ("Snowflake", True), ("BigQuery", True), ("Postgres", True), ("Postgres", True, True)), + indirect=True, ) +@pytest.mark.parametrize("migrate_disabled_plugin_config", (True, False)) def test_create_batch_export_from_app_with_disabled_plugin( interval, - disabled_plugin_config, + plugin_config, migrate_disabled_plugin_config, ): """Test a live run of the create_batch_export_from_app command.""" args = [ - f"--plugin-config-id={disabled_plugin_config.id}", - f"--team-id={disabled_plugin_config.team.id}", + f"--plugin-config-id={plugin_config.id}", + f"--team-id={plugin_config.team.id}", f"--interval={interval}", ] if migrate_disabled_plugin_config: @@ -273,14 +419,14 @@ def test_create_batch_export_from_app_with_disabled_plugin( output = call_command("create_batch_export_from_app", *args) - disabled_plugin_config.refresh_from_db() - assert disabled_plugin_config.enabled is False + plugin_config.refresh_from_db() + assert plugin_config.enabled is False - export_type, config = map_plugin_config_to_destination(disabled_plugin_config) + export_type, config = map_plugin_config_to_destination(plugin_config) batch_export_data = json.loads(output) - assert batch_export_data["team_id"] == disabled_plugin_config.team.id + assert batch_export_data["team_id"] == plugin_config.team.id assert batch_export_data["interval"] == interval assert batch_export_data["name"] == f"{export_type} Export" assert batch_export_data["destination_data"] == { @@ -305,7 +451,7 @@ def test_create_batch_export_from_app_with_disabled_plugin( args = json.loads(decoded_payload[0].data) # Common inputs - assert args["team_id"] == disabled_plugin_config.team.pk + assert args["team_id"] == plugin_config.team.pk assert args["batch_export_id"] == str(batch_export_data["id"]) assert args["interval"] == interval @@ -315,26 +461,31 @@ def test_create_batch_export_from_app_with_disabled_plugin( @async_to_sync -async def list_workflows(temporal, schedule_id: str): - """List Workflows scheduled by given Schedule.""" - workflows = [] +async def wait_for_workflow_executions( + temporal: temporalio.client.Client, query: str, timeout: int = 30, sleep: int = 1 +): + """Wait for Workflow Executions matching query.""" + workflows = [workflow async for workflow in temporal.list_workflows(query=query)] - while len(workflows) == 0: - workflows = [workflow async for workflow in temporal.list_workflows(f'TemporalScheduledById="{schedule_id}"')] + total = 0 + while not workflows: + total += sleep + + if total > timeout: + raise TimeoutError(f"No backfill Workflow Executions after {timeout} seconds") + + await asyncio.sleep(sleep) + workflows = [workflow async for workflow in temporal.list_workflows(query=query)] return workflows @pytest.mark.django_db(transaction=True) +@pytest.mark.parametrize("interval", ("hour", "day")) @pytest.mark.parametrize( - "interval,plugin_config", - [ - ("hour", "S3"), - ("day", "S3"), - ("hour", "Snowflake"), - ("day", "Snowflake"), - ], - indirect=["plugin_config"], + "plugin_config", + (("S3", False), ("Snowflake", False), ("BigQuery", False), ("Postgres", False), ("Postgres", False, True)), + indirect=True, ) def test_create_batch_export_from_app_with_backfill(interval, plugin_config): """Test a live run of the create_batch_export_from_app command with the backfill flag set.""" @@ -352,8 +503,8 @@ def test_create_batch_export_from_app_with_backfill(interval, plugin_config): output = call_command("create_batch_export_from_app", *args) batch_export_data = json.loads(output) - # time.sleep(10) - workflows = list_workflows(temporal, str(batch_export_data["id"])) + batch_export_id = str(batch_export_data["id"]) + workflows = wait_for_workflow_executions(temporal, query=f'TemporalScheduledById="{batch_export_id}"') assert len(workflows) == 1 workflow_execution = workflows[0] From f54a544a245c248a0c418cec7b84fadb9f46e125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Fri, 27 Oct 2023 16:50:39 +0200 Subject: [PATCH 5/8] fix(batch-export-backfills): Cancel ongoing backfills on schedule delete (#18136) --- posthog/api/test/batch_exports/test_delete.py | 104 ++++++++++++++++++ posthog/batch_exports/http.py | 10 +- posthog/batch_exports/models.py | 7 ++ posthog/batch_exports/service.py | 24 +++- posthog/models/__init__.py | 32 +++--- 5 files changed, 156 insertions(+), 21 deletions(-) diff --git a/posthog/api/test/batch_exports/test_delete.py b/posthog/api/test/batch_exports/test_delete.py index 69a1e586f019e..20375cecbb768 100644 --- a/posthog/api/test/batch_exports/test_delete.py +++ b/posthog/api/test/batch_exports/test_delete.py @@ -1,10 +1,15 @@ +import asyncio + import pytest +import temporalio.client +from asgiref.sync import async_to_sync from django.test.client import Client as HttpClient from rest_framework import status from temporalio.service import RPCError from posthog.api.test.batch_exports.conftest import start_test_worker from posthog.api.test.batch_exports.operations import ( + backfill_batch_export_ok, create_batch_export_ok, delete_batch_export, delete_batch_export_ok, @@ -59,6 +64,105 @@ def test_delete_batch_export(client: HttpClient): describe_schedule(temporal, batch_export_id) +@async_to_sync +async def wait_for_workflow_executions( + temporal: temporalio.client.Client, query: str, timeout: int = 30, sleep: int = 1 +): + """Wait for Workflow Executions matching query.""" + workflows = [workflow async for workflow in temporal.list_workflows(query=query)] + + total = 0 + while not workflows: + total += sleep + + if total > timeout: + raise TimeoutError(f"No backfill Workflow Executions after {timeout} seconds") + + await asyncio.sleep(sleep) + workflows = [workflow async for workflow in temporal.list_workflows(query=query)] + + return workflows + + +@async_to_sync +async def wait_for_workflow_in_status( + temporal: temporalio.client.Client, + workflow_id: str, + status: temporalio.client.WorkflowExecutionStatus, + sleep: int = 1, + timeout: int = 30, +): + """Wait for a Workflow to be in a given status.""" + handle = temporal.get_workflow_handle(workflow_id) + workflow = await handle.describe() + + total = 0 + while workflow.status != status: + total += sleep + + if total > timeout: + break + + await asyncio.sleep(sleep) + workflow = await handle.describe() + + return workflow + + +@pytest.mark.django_db(transaction=True) +def test_delete_batch_export_cancels_backfills(client: HttpClient): + """Test deleting a BatchExport cancels ongoing BatchExportBackfill.""" + temporal = sync_connect() + + destination_data = { + "type": "S3", + "config": { + "bucket_name": "my-production-s3-bucket", + "region": "us-east-1", + "prefix": "posthog-events/", + "aws_access_key_id": "abc123", + "aws_secret_access_key": "secret", + }, + } + batch_export_data = { + "name": "my-production-s3-bucket-destination", + "destination": destination_data, + "interval": "hour", + } + + organization = create_organization("Test Org") + team = create_team(organization) + user = create_user("test@user.com", "Test User", organization) + client.force_login(user) + + with start_test_worker(temporal): + batch_export = create_batch_export_ok(client, team.pk, batch_export_data) + batch_export_id = batch_export["id"] + + start_at = "2023-10-23 00:00:00" + end_at = "2023-10-24 00:00:00" + batch_export_backfill = backfill_batch_export_ok(client, team.pk, batch_export_id, start_at, end_at) + + # In order for the backfill to be cancelable, it needs to be running and requesting backfills. + # We check this by waiting for executions scheduled by our BatchExport id to pop up. + _ = wait_for_workflow_executions(temporal, query=f'TemporalScheduledById="{batch_export_id}"') + + delete_batch_export_ok(client, team.pk, batch_export_id) + + response = get_batch_export(client, team.pk, batch_export_id) + assert response.status_code == status.HTTP_404_NOT_FOUND + + workflow = wait_for_workflow_in_status( + temporal, + workflow_id=batch_export_backfill["backfill_id"], + status=temporalio.client.WorkflowExecutionStatus.CANCELED, + ) + assert workflow.status == temporalio.client.WorkflowExecutionStatus.CANCELED + + with pytest.raises(RPCError): + describe_schedule(temporal, batch_export_id) + + def test_cannot_delete_export_of_other_organizations(client: HttpClient): temporal = sync_connect() diff --git a/posthog/batch_exports/http.py b/posthog/batch_exports/http.py index aa71cc9060a13..0c906c50b08b6 100644 --- a/posthog/batch_exports/http.py +++ b/posthog/batch_exports/http.py @@ -28,6 +28,7 @@ BatchExportServiceError, BatchExportServiceRPCError, backfill_export, + cancel_running_batch_export_backfill, delete_schedule, pause_batch_export, sync_batch_export, @@ -35,6 +36,7 @@ ) from posthog.models import ( BatchExport, + BatchExportBackfill, BatchExportDestination, BatchExportRun, Team, @@ -264,9 +266,9 @@ def backfill(self, request: request.Request, *args, **kwargs) -> response.Respon batch_export = self.get_object() temporal = sync_connect() - backfill_export(temporal, str(batch_export.pk), team_id, start_at, end_at) + backfill_id = backfill_export(temporal, str(batch_export.pk), team_id, start_at, end_at) - return response.Response() + return response.Response({"backfill_id": backfill_id}) @action(methods=["POST"], detail=True) def pause(self, request: request.Request, *args, **kwargs) -> response.Response: @@ -324,6 +326,10 @@ def perform_destroy(self, instance: BatchExport): delete_schedule(temporal, str(instance.pk)) instance.save() + for backfill in BatchExportBackfill.objects.filter(batch_export=instance): + if backfill.status == BatchExportBackfill.Status.RUNNING: + cancel_running_batch_export_backfill(temporal, backfill.workflow_id) + class BatchExportLogEntrySerializer(DataclassSerializer): class Meta: diff --git a/posthog/batch_exports/models.py b/posthog/batch_exports/models.py index dc86c2ce7286a..79a7928fd6b3c 100644 --- a/posthog/batch_exports/models.py +++ b/posthog/batch_exports/models.py @@ -289,3 +289,10 @@ class Status(models.TextChoices): auto_now=True, help_text="The timestamp at which this BatchExportBackfill was last updated.", ) + + @property + def workflow_id(self) -> str: + """Return the Workflow id that corresponds to this BatchExportBackfill model.""" + start_at = self.start_at.strftime("%Y-%m-%dT%H:%M:%S") + end_at = self.end_at.strftime("%Y-%m-%dT%H:%M:%S") + return f"{self.batch_export.id}-Backfill-{start_at}-{end_at}" diff --git a/posthog/batch_exports/service.py b/posthog/batch_exports/service.py index 008096d5f50bc..114f9693adec7 100644 --- a/posthog/batch_exports/service.py +++ b/posthog/batch_exports/service.py @@ -252,6 +252,18 @@ async def describe_schedule(temporal: Client, schedule_id: str): return await handle.describe() +@async_to_sync +async def cancel_running_batch_export_backfill(temporal: Client, workflow_id: str) -> None: + """Delete a running BatchExportBackfill. + + A BatchExportBackfill represents a Temporal Workflow. When deleting the Temporal + Schedule that we are backfilling, we should also clean-up any Workflows that are + still running. + """ + handle = temporal.get_workflow_handle(workflow_id=workflow_id) + await handle.cancel() + + @dataclass class BackfillBatchExportInputs: """Inputs for the BackfillBatchExport Workflow.""" @@ -270,7 +282,7 @@ def backfill_export( team_id: int, start_at: dt.datetime, end_at: dt.datetime, -) -> None: +) -> str: """Starts a backfill for given team and batch export covering given date range. Arguments: @@ -291,11 +303,12 @@ def backfill_export( start_at=start_at.isoformat(), end_at=end_at.isoformat(), ) - start_backfill_batch_export_workflow(temporal, inputs=inputs) + workflow_id = start_backfill_batch_export_workflow(temporal, inputs=inputs) + return workflow_id @async_to_sync -async def start_backfill_batch_export_workflow(temporal: Client, inputs: BackfillBatchExportInputs) -> None: +async def start_backfill_batch_export_workflow(temporal: Client, inputs: BackfillBatchExportInputs) -> str: """Async call to start a BackfillBatchExportWorkflow.""" handle = temporal.get_schedule_handle(inputs.batch_export_id) description = await handle.describe() @@ -304,13 +317,16 @@ async def start_backfill_batch_export_workflow(temporal: Client, inputs: Backfil # Adjust end_at to account for jitter if present. inputs.end_at = (dt.datetime.fromisoformat(inputs.end_at) + description.schedule.spec.jitter).isoformat() + workflow_id = f"{inputs.batch_export_id}-Backfill-{inputs.start_at}-{inputs.end_at}" await temporal.start_workflow( "backfill-batch-export", inputs, - id=f"{inputs.batch_export_id}-Backfill-{inputs.start_at}-{inputs.end_at}", + id=workflow_id, task_queue=settings.TEMPORAL_TASK_QUEUE, ) + return workflow_id + def create_batch_export_run( batch_export_id: UUID, diff --git a/posthog/models/__init__.py b/posthog/models/__init__.py index b5f0586a349bb..053eaf4c5afc5 100644 --- a/posthog/models/__init__.py +++ b/posthog/models/__init__.py @@ -1,3 +1,17 @@ +from ..batch_exports.models import ( + BatchExport, + BatchExportBackfill, + BatchExportDestination, + BatchExportRun, +) +from ..session_recordings.models.session_recording import SessionRecording +from ..session_recordings.models.session_recording_playlist import ( + SessionRecordingPlaylist, +) +from ..session_recordings.models.session_recording_playlist_item import ( + SessionRecordingPlaylistItem, +) +from ..warehouse.models import DataWarehouseTable from .action import Action from .action_step import ActionStep from .activity_logging.activity_log import ActivityLog @@ -5,12 +19,6 @@ from .annotation import Annotation from .async_deletion import AsyncDeletion, DeletionType from .async_migration import AsyncMigration, AsyncMigrationError, MigrationStatus -from ..batch_exports.models import ( - BatchExport, - BatchExportDestination, - BatchExportRun, -) -from ..warehouse.models import DataWarehouseTable from .cohort import Cohort, CohortPeople from .dashboard import Dashboard from .dashboard_tile import DashboardTile, Text @@ -25,6 +33,7 @@ from .experiment import Experiment from .exported_asset import ExportedAsset from .feature_flag import FeatureFlag +from .feedback.survey import Survey from .filters import Filter, RetentionFilter from .group import Group from .group_type_mapping import GroupTypeMapping @@ -41,28 +50,20 @@ Plugin, PluginAttachment, PluginConfig, - PluginSourceFile, PluginLogEntry, + PluginSourceFile, ) from .prompt.prompt import Prompt, PromptSequence, UserPromptState from .property import Property from .property_definition import PropertyDefinition from .sharing_configuration import SharingConfiguration from .subscription import Subscription -from .feedback.survey import Survey from .tag import Tag from .tagged_item import TaggedItem from .team import Team from .uploaded_media import UploadedMedia from .user import User, UserManager from .user_scene_personalisation import UserScenePersonalisation -from ..session_recordings.models.session_recording import SessionRecording -from ..session_recordings.models.session_recording_playlist import ( - SessionRecordingPlaylist, -) -from ..session_recordings.models.session_recording_playlist_item import ( - SessionRecordingPlaylistItem, -) __all__ = [ "Action", @@ -73,6 +74,7 @@ "AsyncMigration", "AsyncMigrationError", "BatchExport", + "BatchExportBackfill", "BatchExportDestination", "BatchExportRun", "Cohort", From c090b307439d7ac4ba5a75edd939521261bfa292 Mon Sep 17 00:00:00 2001 From: Marius Andra Date: Fri, 27 Oct 2023 17:42:00 +0200 Subject: [PATCH 6/8] feat(hogql): insights <-> persons connecting piece (#18067) --- ...nes-app-notebooks--recordings-playlist.png | Bin 84062 -> 82981 bytes frontend/src/queries/schema.json | 29 +++++- frontend/src/queries/schema.ts | 14 ++- .../scenes/saved-insights/SavedInsights.tsx | 6 ++ .../scenes/trends/viz/ActionsLineGraph.tsx | 30 ++++++- .../insights/insight_persons_query_runner.py | 59 ++++++++++++ .../insights/lifecycle_query_runner.py | 35 ++++++-- .../test/test_insight_persons_query_runner.py | 85 ++++++++++++++++++ posthog/hogql_queries/persons_query_runner.py | 9 +- posthog/hogql_queries/query_runner.py | 19 +++- .../test/test_persons_query_runner.py | 10 ++- posthog/schema.py | 53 ++++++----- 12 files changed, 309 insertions(+), 40 deletions(-) create mode 100644 posthog/hogql_queries/insights/insight_persons_query_runner.py create mode 100644 posthog/hogql_queries/insights/test/test_insight_persons_query_runner.py diff --git a/frontend/__snapshots__/scenes-app-notebooks--recordings-playlist.png b/frontend/__snapshots__/scenes-app-notebooks--recordings-playlist.png index fc45aca0387a32d8a478460c6992a26bf91b669b..7cc0f8cd4b4201f978f8268c80cf40caa7ebf705 100644 GIT binary patch literal 82981 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

_+I;lNIT@ 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%0D6@=%w`4B*uV=AHp89T)sByrZT&4%TLhP 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 literal 84062 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

5tdpWUC*wMj%OLn8fhI(NYUnt*x&0`LR9OUQ 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 z zz0lg-kQ{NNnltL(mg`ex)3_@L{;TYAdSDQFGtgk3y)O9@O-%XB$#&+9tc8mI3n-)6 zS~z(peaOhjR2iRwW!MwT#AQ9D66{SH-ibf;p+tuS4Xsz?DGP_Xw3nAK5u46hta>M@ zX!1D_BO6=~yPwW@=CDhRdSMe{ce+RU8FZqa-_AKd=zgFC0NTX0Q7>6I+0hY!m}88^n@H2UWU^*P)fo-XG%cj z8=FFsr`4*g*wyV6nbb>ov2!kLwtM$9WudU4A@=sNkE;f~>*1ovW4>(vFo-`bL2AjL zi#r$g=3GdtQB#WnX4MhZzWmmYri&qDau2f=(l(!eQTKOqYoeHm#akOlYq)Bqdc9Vq zP1Y4HfPM?#ouOYG%nrt}w7R*EX9CfSl*dwI%}Lu4-b}FO=H@|K^8uExXlVGpgu2JU z;kd5H!_DK#uab&CI(SguY=>;m(F#djLbiDs(3K-(!7106$gUSMN$}g0P z&wMUYZ?1wh<^IbdU)yJ+5I%|O_niXq;6{`LXmb&d`s!zo`MpFE)?D$H&(jS&WgA}S zO-4kNL(`j@AOzTY&p0nVJw3$G$Os1@PLpn%VhDMC7Q@qD**VwNX(GgV72uJ^ov$5mfe_y7ePq^G9)-iGt()nII5Sz!puS9X zi-q(%Q7PmkQaNI>wghL$ui2aQk>(X)JyUMe#mKBE(yNn8k*QS8u%7m+-s*|s%9GN{ zikY3FX|7|IS9T&$$2sldD(ktbG|ABBL7orlhpepZ$!ly;jg_c8 zq{XX~r#_cH812&7Icmj8KY#wr;+3V`-;W*4c=YHIx3xyC-e-Ybdnc!CndnaIxid0} z5L`Nt?;aoyXn~XEcVGQk8XI3U(jV8CRwms{#CXW$-_w<(O8~sWUf*RLwDBC`)ZAzb-KN2lp zm>zL6x3XS}fB8XOs{4S(x1h(++S>f1RirQ60TF z-HoA}Q!2~uj`!uC*aQENJ${OBXho^|SB4}%y ztS@9VZ>S%HhliW&C+XL@>;5468|yUH<~}g1I~OoyT6RSj>A2pK(c|5 zJ*}~2+_U`EYjTuF5B!X3-|=66Ig!z80CW20>Zh_*A1;bs!)#pX#LHz}T4{>ZTh4!- zW$vzvSG&0)Ap?R(r)nWygCd9LZd$yIi73)NOsR^}YHD%RL%^r@T+FK_FmiK1D*I{@ zhxtjC&JXop|0ZYgFPxIe1(LB*!NoQ%N;T2(W5Gvw&ln^n|56Ky<4!MYjt2n|+igtR z>iwXYs|~-iro@@edEMTc?l_lj4^!dg?643y(+S z*kW9`0`Vo^HBT@TX2ncR&qk%`RmFA&;^V0USE9>>OU^v@gM9Hs*)%t9tjd_u>O&cd zSkdyz&(*GN*o)i8;;L>H=wI;FzJ!OPWXQ%c=FAaL2Uf2+KgfQn!g;0qoafr=Rg!&( z;)pg$^hVi?X*C$sZ!{mAsA@x&)jBPdGN75wFC=7SM&I-;@MR&;Q)J}j*8qv< z6sQIRuZ&=_{cI(eX0fRFPtfiTBE_yQO(;>Ce6GUii!l@-Rdnhe9t=oO*$=fsT2axo zpFdxWjB?2~2#BL&?d@3?0Hv#>q=ex9!7K7Kg?BVKH0na9$)Y#sEl)uKBW}8i8m6tX zzT5{Ga|-#VPsd8x%KO}V)|Ik#9pIw{|7&%8SU!l+lCS=Oo_~Mj|Ng%phWyL3{v}(O z@`$e~*U5fi6cJHSp9u$Z(9#>vHrnVO zI$|6ApPR@gVk7)pK>bU$5u^XVJiz~NFIKSNdxfrCPCGA4&H6m5s`gVwRsHkHO^xxi z9t9nTB2#_r;>Z6PWzlVfmw_)iWT5YBoiAA#Tt~mr-XguNOYZD1BYuDI^QoNo|DO6r z@*#a>{h5n=%UoV>#MT+FG5_CV&;L30bAbgYirWs`v}(}*9d_lYx4>2XGX9&@+w%YX zZTPCdwi;L-=u!F>Tcqky|S&6&9rfkJUq{ z;GoKB+NaSD1GMqihr*F+D|HXpfk}B-axxj{Vi*i%yq=nwL9{>J5VM{tO9P#p?9pxW zk)IqO^=F#)lU}8@NZ}}%4x}XR>U1{4eagEBp|+Bh2JIfKI<;S9bFzHyuFnqP4{$J8 zN$KQ_L5*p;b5;QPv^^55C*qN`cVn@wr1P~_y!zL80>6P_)L_oI<#dG!R<=|)a9RKO z(RQ&v8>-V%rWi~(arikNHOW>De^uGThViiG7B?W>j}k$$w0G|Ak>UOA)mV{cWmU3r?vo9U(w-*;`1^W$$;L)8^IXY9x43%$zm4HQ5_T6?!;@%d8Cp9X-RS3sT-Rz0bi`*x>7Co_FT9)6x5WXVTX~b2xi*X4pQb{|^i6r8miFaY5jQHWf zqI6g9HMe_`|MNi8eI(;G5;+A0FnybR6MmTdZ@;Dxf6K#X(6f|D0gaWbV$0Hi4BY+f9pj5MKv0?b+8P*bJ15WAg z?hd286CM;kXEAdq~g`!|vGe<)#kheGwS%;o2$yT2N zF_n_Tw{HV!X!Yq4N&aoawESU(O=i#c0V$-V^7y5An~h!Bx4{T@3?^BJgpGF-RVLeZ zLk9v!BtNl(?hH-t+n)zWw5lO-b^51DT}>yr>T5JoE?lb$xP}au3D+)}oV*{RjzDRO zPt-iRLv`~C8)>#(U78fh-Ar#n4sJ#|PY+BWr@3I6Z}={jIY`#CI`3Sx%_A*oCU%it z`mQ-rj@!3s!P{V&(angGn-beby0wD5#pB7wLL3V1vDU#X$-!Jmo!lvF{G=6K=?#+m zqP9peA)Rk#j0Ify)_P-7(n=3H5i`sM(`odBJHzheh2dnzz@L~ZFJ&Eb$fHz;(m8NX)#$s zkt*bB+7rX@;>8P%JL3D>(?R)U-f&)szs9ah+S{d@bmNA zAI#MuLaDj9LbtZe+tmm3M1j}5tF`qr=xLMH0BtA?1#5%L@Xrxqx)QpwJ-GeU^vv-l zHSL+4lG5hX*VVC-4}}_oqd9U!zf=p_uFrRIW=r&2298&|NQB+&OHOWJhh|^^fZsDF zQtUnfw6eHNdY<5t|GigrJ6d|Z;IYdBj4FQ{-A}iMGLfi!E~z~)_BaZd0C6cd>LMT` z>-|A1cXafZ(lsF}>b0X|MYpy>UuEZztUX5xo3t_H^s$%ZZcXVhK_;DWT%$i)Puw!tfhRz1-R-XL>$$n5OrT z&lIs2JVi*4#Xe_mR`xRA;ZRy&FE*o<#8yDH>s@amTjjW77rgWp{VDf9&hQ^wiL@s34EbmjA*m$7i15>keXU|vd5!oIh$n`D6R)E&vOvDXWp6QVD zk+JFoMCygOriTR3$JRWNbXcs6Wl~?+-R<>9!LoO8q2uO`0caf^j6=q0Hb7qgX}fK2 zx>B>*t8O{rc44!~-Ivq#pjaEqX*Iz-Q)AORSLaj?g_@o3j9=-sSD5tXs}+-SnGO7z zolTAuz5a5#8B3qRa~SZLUUBVYz4u{hU_7P+#v5u;5S@io?dd+(7@(I6ZesyfN2O`M z;qF8+VK19rW5U(x=4iGw-o`+x+}-tgqM$P)y;9mw*TV(S$B$klx!9WyNKK_s5^aRLwoL!-k-6ch@UmWZ%n&b z%~Uw9%O-JKv;i6bdAJUMRb}mw%f*%j~Y{htXJNsf%>v3qmAa{ z1XIso(@g7_UCh3olv2E48aupy&tp(OfHv9SZ=*j?p|N>74h&bJP!n3VL*V})&V$XPQA#B>L}6B z(7{p-*jlGCP9eC-=R0Clb5t)BsZ#7kxxs2021= zwU4Q&A{Fzv0{sM2BY>q?M@I*9j?&fDH5hO3pgZ1aM2CndUS|_2M>;|_M?9OMCPWH7 zD#Xvv)%fERTPu)^}H0N%0N zFTEPGq(vAu=dQAuonZfj1~{D)HZl9}HFzXQHVI?dhu%Z=&Q_LVf1479{Sc5G`x)xN zGHjpApQu>}S&7bf39`<151PJzZ(cJ%DC!Lh%#7_c&X}wP^1U?lpmG@bdp1t-BA!o! zFW!m91Q5KfhH>pLKlVXM+sO>{^*9XYEtXzXDNJPpTTpI<+dY1l>E+H&1pZFaMX~A) zvXa#ftG3J{xBA)))!*HaO&Gg=eNZWa-AOFMbJm)um%LHtVs_xPuHHE{o6bO;vcNW5 z5u#*wMSknmN0q1k-E;c@@i;!#pn1~P6jsEA`;081oA;#NRhrTmr9Yi>K26;|F+TUa zqNVgMBinW)K>2G>9dv@2Bmc1>@R(Q4q$4_a(CzDpwib$smfvwR?$<=i* z?bD?4wJ)(S-j>Zq9-Fe7RCf^~ebW5ExcKLp-g313)+%8nwhnWZzyy_e>$UO+10wio z>tn_IC2a9OU;t$6HIGA3_4V>WtN|xp_PjehzaAP$g0-5Zd&fzJ5<0B+Je{eskcem1 zbvqm0i;~`-g$_CofaQ=pW>y5cbaaQ40(HPq_5J(rymTK~phspxvwQ+oKYn}$LX(b{ z_hB<`iEcwDnO$SlrqM^{mfc5y-8(W)#8?3f(A3n_yJD>mz|i5eU#i?5&1<8zy8a=A zgzG*M3C$!Q#Sk3Z9xt zy06$<`lyu58wZ~QN}f|&TN}U2UTx-FM<|hI+0tY1P1o5j zhcHwwA#J_i_X1rK^aVw3@9s2Pd_+L=5(Hz&XC$-@-;77817{MTv9Ff4&h+8e9~C8$ zjzKYaU$ghk*35Vn*!r2o<8%kV*i6rL%F`N+D=K1cM`LeVxu)qvqhd4D-(n#2=FR*o z5)2_73-%){^FUK|QT9l|IW%c5QZysoBeCPV*NcbQ{GNW4hO4^qch()Fr8giY*BxStPVRH5KWZgD;l>Th}#?0(xJNr3P z`9x`|YeVKonBxpowl2@(rAU(=8Rp$$51ib6UMLoGrpAw9a6>T1A&@=bs7Z6B1OX*YcnWO;(drj3EAwzVoGB_`fowmsJX4b3-1nPo;RUtKKifLFjzTTio<131D8s)FNDhHE$F3U3itc**c1TcA~^XO6H_mH@oP7?+8oAWwf9t_ z(r0Rfg>N-bSx8?>F!x&wL+*vMz5c4t`thoeaL#0Xwn(Jelo$ImsD~K7V;rK)hU0%s z^K9=)Bh+s<(eQu00QfV!>K;Fz2J+Zgyd#T92`VbuW8WS#>2;P`3|b|MxsZ1g^t{<* zin03EoGj8cbxeL*L?Kd&t<7z!Kw>07_xPZIpqe___26l6Dsg6(z2+fh%L`_vWv?M1`3ilx%ggu^JwtF{&sx*b&2xE`rj(!_c0!2w8w*s#&vXK{S5Auwy7)0ZOSAYmqFp z<5CKnbFT5Uzyz!o()%o?%BTVKaZblMMV0vX9D1{ZE$Hnbc%!urMx7B9y#PQHf%zQ} zRxV^y0r<0cl>y##VRr&5s$Sh3sP%LkDC^zecQ6E#za{0MVL4i&D+E|;JAiT!!wucv z*BUjPL_8*tD?l>4r;s&%gl{E$Wh}-`iUVpM@xt+y<>gk-!zQ_Cx^N5}92&3{3T($d zI%qh2U!1fZsE{o!rUd*60v=~CA3ajvo+u`}yG{%a1Oyf6SgmWl8i19%!{%KrhO-2G zfx8iS?t$wy-E|?+um+ZepS5;bbJS7ro_1%lFhts!%ZNKvrc|#96agCm6zhViNIaK= zh-$sAIJr#wJ_1rApDvpEnOJ*UkzmI~WrI9E5B+AZ?D3b5sh_bj#I zrHcEGpOWd(gq&Y% zGgF*AiRCZfSoC5c$?sO?$~#nE=uP~>^^E)-+*D>6Qt?+@ujz5PX1!}E?gv5&cbgK& ze*F@EBC)`5PlZTW(JyAg%1U&sFru>sLMfRbU)n1z)OE1InFsa|fFJMgH9YO?=KD+F z{U|*>W7*+SpS4C&t!6Pc(nA?z@V)k|X_0m7BuKREShuRwWEQ#JEwqEZ=>u!s(bG+y ze4&IahPRi;bfH>n|58H%pf_OyZt`(wtRQ$bD?2;%lgL#Q-Y-=~5Dc9ltxT62p|#v! zGXYN5&sW3^W`ieJDSZIw749JT>cIRdiQQFoobXtVEx{Ij%|N^s>9?dYsN}BgbPy90 zzcn|1nWvOa$Id<^u284xDMCp}d3%3zxHqdV&LsYz8LEHFK?9evvDzmxe)x5?4_!>K zF8oj!_rXcu&CQM7VFfw#rr09Vu{o*nV#Z1>wz@`+Pfz{ZM; zi;IkcQtq%S6&me=^l5)4*8Ozj7-$?1Tl9fXB!SN^ts8%VRkyzEV=E%q7V-v2glTDM z4@Dy&%YKc`lFR*N|jiVPjXm5aYF-?1i&I5Zi9$~M8a!LEOvVoFuvK{ z-7y^{nXY;7Tl129FSc%FVy~+470OGAy=D)zW(|ZE3cq@u*!1v_g>&?GYTWcxg{lM#i(J%v4++qKRy6+C_x&QzDq{xUQRHR5ErKzQbh&Iwrdq~mL&@_`u3hjX+ zq^-TBrG-@5yHwhHpU0c~{{DXFy3RR&o$ET+`CQlc{@&I7S+Do&^&F4K-9t)aTcT&7EPkx}@hRd1nomaT`DZCI$_ z&U4p{HLr!-W$bGYjXu6)vRHlUjY-Y4+Ky|1SylsY3&l^JEh^fc>F%zrdn3!ZZU4sZ zr3J_F@$AImaN7v;{gV^6HD<)=V88I<9_*6uBV{5@a|IIvn?hs>cY5;uP)UV1n`E?C`DsIMyp~@lSYD;?G`iP zcLF4CJh)?n?v0?)5T&#Hu3k!?i_e&WpEJ`BG%*_4OVP#sDc_p|eCsF+3q(&?3 zt%g^|v33%FV9`?IUJaMENKcjguSJU@ZHK(Sr|zm~jx3G3+mc~9(5UO)2SgsWD#rE> zXU_C8ydb@JSgxF)m2smLI#EoKOyT5SO42)p!$yDn>ID;rk&y2>;;nujX)Rrn<}dWz z41<4-w}-UxJ89oaXVGY>o3-U(V|#$17z1D=sJEV8kw0_h3~S!ijY;PPpSO9ETAEur zS8XP!%ysd5;!io{A5}cgvMyEjh4U9T+m}c2a+o}N_~&6Hw3+ni`~&uJmv$=ioD1t? zsm!(hd6wu!(uFg8@{uf$cTQNb1=%WEj9mZzx>~zNgk80O=P?&U(3K-tDLeuquF`C$ zskq?uNH`$&p`nR`)Zdrr4S7v<67qvT4}S}Jvj3YuR7s?Yj%OmaOiT`a!HllcKtu-Z zF@B@+?e-&!wC-ywgSTo>8PYh+eV1X9bR0kVsx15FaO4eFnF>VVh4JE3E(?7w80eil zQ^WrEYlMup=gA?yVKDl0X{m|5Ly7AEBcF}TLi0-&Sr z-@oO7<;EXPoRbfD8aU?bGyQ{-)ML^7(H}6w7D%JKSCCXq8xth?->HSv)>`hJot>Ru zxUP)FB_1hxq7I`3H-mn>{OMt8dwctkw$~QNaEXySXc!rNDvVfk^Ia+e3&7PB6&3B| z(hde}YhWIBa|7Fh`}eJ9hEyKyJ{D@Q{lZvC3~O4)UWQ{=)_HUl`L~KVN4-tDY7nj9 z*QS$jTBKZ;i(6z%Us85WeO#lkkWdEaf=hUK zI4KkAyGLXv^GpK*ez;j0eJtCS=1FnA~hvq4_(@c82aLsr~<)n8r0(lcK zoV2$q+fy%K{@?Olb13?t?mL8<|CLVOqTN{gT~J~NPlXs)2BK(l#+9o@9ac+#5aJHN z+<`wBe!AzSIwzFox-gov%kJ0s=E%sKgDn}%82);txX;h1WoB-!tfuC1M*9%79$P85 zi7^H+BH04s6tVwJkHMf50Emh!<2YI}#?GsR^b$TwH4!=LPIP~FG?Om$c21MM6~AwY z+1d=$C}6DmQ6KzIQtiHSTDIq6!19f{;#i1!Wiz(I>`$`7q*R6=4F}QAgnDCL=Mk0k z>n+mi>cLJ?1qG5qmhCZkyWPe?$Fyny(~i&1npB4}k53MLdV3LK_O-5D7qljZs2D+U zu}dx|g>K&Ur7pHM=boqMVc|JM_ll?vuW!+k3Nr$lbwPcVuIlL)3ccP2Pwf|l-62?l}zAb^Sdrm0Z=Y&PLuo|ea?ZXopCOdRoK|E{lifU z?)v8#_fFt2um$gt<%^7uzn&gUS=&7P)tRl~%h8U#e&S5W1vGBGo7vCVJd}bO1y)>> zQ?-&keSPZ-@#<#v@1LI?x*;!51=WD*kGB_(U;DA$V<6J`ahzIWic!TSF)^`+US0&? z3hE+kpn5N#(MI(21EW_eUjUqz(9W{C56t-x{ZvPiel*33&)V1cK{*QxP6-JK$cgV@ z+mJ5gI$9@O*<#T3>Ap<6UuIVUfNjzX6uXeFNBSQ;7wk!f^Y4Lv{{nh3+nmP44!x$7 zzJAw+Xa5OKA2{TcHU@i{r$&bQn)8h2X9LJ8|IgS%7XdaWZxlf%s zb?@H23yC^cy!j#{nJPArsF7i@cd>H)lUR2~F~{wY8{1}u3YcsDm>Pe3*U!(dM8f>b z=eg3o5ojWKJ7Td%$S*((in2Y@Nc`V#Amgraf)uQonEU-UwsEL(tfF;q`9;}hM@~V? zw26x9<9j#l#e@o@lzD!30^-J81&q6J<>x5M@NR9a7d&mt_%$e-vL$2_~_yRw{a zJvVvhn@3KFxi!X8^$V|<9ScGKjFQ4-aMqg<|S`=pukEcGE&f5AV%1WS5UTDvzhT;<0jwr{Rr`f#oNMTp;xvTBDAx>*(JKm`$vycEtm0aIcd@3Q&3fkMQVE|#*e|d#XNA+6gn0k? zlIk2%_<$Zdxw$)34Ix&CoC_Z8_Rys)cMp$Pi zh!J#|CTPC^eO-9tLjWd)*!d#1CSjG+zrNiC1`@y@OAbP9z>`^ZYBL!Y+K`=n#~k{%7^ozV*XTx?2gsSNC+2qCVJE)h&C?IG=}C+4>$T@ZX=k__$U!O zQN=kryH`Cq;6_MUbz3+J>Bc!!}E&^Mbxt^ z>kroyR`8eR%NoD1VYqsQTC-juKR+hwOGH-?_se@)%|qPnq@X)`%g%!>-2Sn?$P6(v z9M@U9Kh+k=FnL#!D1I$Vn_jz|NLCoQ*79joJcsO36^XN{Va7T;=vc5kn}LBr71?FN zF6IF>bJ62{Epr=8cCwAtPWW_$HYfI)>v#WH5|IY2nCjxU4X|=INqUz#X zhg9UWqWV90h?nVAQwxEM&5M_e2S(FoUsXTeB_H8qD#M%Zzh)7-r|$RdO;E~{?g`7?g@ zv#ieN{W_UX{#?lUdE)00TGT$Q5x%+`J8tl$d*_^vdMy3*oehIwhZn!}{=tI1z9jvQ z3h5B*6~4sU+V{-Mo#!OgkMEfr5SYE+zCQ6HPl9Fh-TN#}A=kg0W%85SMtSYW+ahF* zOqagRP_`W4V_By}yls!^2Fow)c}nQJXSfRFLedU%SIGqprA{#G1wmqFk5eY!<#7+w|GQXx0yXXh~X? z3159T(A#?to-yt1?Sl;_&>AT-Hk&Ij$Y{n7jgmI;krAI{mV!AeQ4PS9ucd zZ#mp#Qqg~wImZ&8s5U#^nQ6nCTjUzgF9+Uo`fZHv+X}5$e6oJEj~G#eHoIN@5wE6D zd^_r%2uJ7C*s-}4hiKlij*7MF#`zvW!?h0wzP>JbIu?Ci^?4VA2V(Bdm&m|KIZw<_ zHNIWw_U^SRpI}uy7VwU#n&R@fQg0KjHUH6ydN<~>yUx5{*6pOBk)iA<;9X^GY2=%4 zoRu1HGpCx%+i78uvGP@TgLG4-eBq{!n32|Ryh&HZkGnHRj%`fqxL2`uKd0-RWnBHq z`9Z(l$|?>0s&{iA_cW7pS==sA-AmR)*UG%D*sW;ai42~{x<3Qb?z(^D<#87{KDwpv z1cN)*Jeh$3e~#$}^Y%kdi(>wy{T`;dD%Xd9Oq_ocbAEOQ9fiy8yYAS6N!Ln#ecZTp ztMRv2XBoby3v}yhIXVh6yH5L;Oc1m+07CHF(P#W(XS9{V&OvZl5a{zu_gBb|`1vrE z=G`;oDTD6%imbJdOk1tpv)uoi$x-#TWPw1wSRDOQH{}u*`Uk$S(T+C_9)mot z?75dI^BK40wG@BR?G&)w=qG|c*Lm#QQ@q?&8WojzZ!XrvevGR2d(JeclL1-b(dThbM3tCY<$@G#gq1ZZHf*>Q zr+Phq#a<@B7;3sn^;2b;wup;d)z?|sI5~X~`(w?+0tD*cul`=Y#-|C`2=bVk-#18| zzkZd|>AL8zGVa{@`PEr(bx4&6C(S!OwE-Wd!}%&#_P$$gblz=-ey>*}Y0kaqmBhYd zb7kxO`>6yTEC*Wgr+0Nd=@hoUsl1oe`jOVHX={{o@h^$5>0~ZHcLn;~EvPLDic@aX z$=cBw%zyJ{r0Nw-`nbi?W2AMZvkly-tBfAQ4uy$JdPN)OGY@}!XStlEcW+|b_2!T! zahLS=*QPQLHjrZFLq9z!k|HH#WDL~#M~&Zz%J*V&*M`>Zvk~8+pYG_3(9Q8*shP;^ zUgu?vwqkrjBhpKJM};LVcu2vr~+NtFF32eZM7}OfkEKfPE_X6s2?E4DC^d?)-VJ@{0cvl2*j-_Oo;oG zs>Yc!6o5Bg=@&l$OY8$`DIAKQxSHpIOTicC4kg4By$*O#;E2U75VqCZE`l?tx(P94 zb(XEn8l{|UBe>@)$O(#hw`Lp{`hq5AX3{b{*u`5uTQsHIM*;jjNnZ*P+0adbz$Sn! z>^6oJp@@J6EGlspuQCe5`l+Xy- z_RGI|<#V8f_##NJfCfW`OGk20$8EUci|lf^i{_%mVpEiYP`B-SWrIs_ktxC!%5d^p{a_qAW@$lTH6Bc?z6eNydncwKV)4lW#sAKFtK+GydN znP?<>6JAOSc{zYAIS)DHXl2D)6?BHqcTr+s`Xc>s`F1LV?iAwquKX zjWwr*Bw`&zy@lvU!tvm?=Ji8@~C?gKUZEUsT)0OIrO`|B-)a1iP#;#m+u z4p)VX)M?wJx4d`%J``qU&>}Qt-{e4^wR+G6qRD!!T|C{gqXv!d0`|xbaZ|kQu|+`) zuu~Wl7(RNIpLoJvK?{P0+g)rFFCHW?#~VFX3DiOufG{j%^#^JqcCuf(2l!~6jASgB z0|Mqow=s|H&#sXYlclJcVEH{prZvww2&%?pmjxRa7Z=Wq`UH9>CP~_p6ksY5Ag8?;LMP3-?y)N ztYA$s$G-HlB!Lq1@H|1{CiWc!sD)@d`4UoDSSIBs+N_^R&PI0o<;9M-Sszzfii}ZS z+tOU3J0isU(&6QpkztO~;Yvg6o6OZz@)gM^-ztkt7%Ff0G)=AC*d8soydjE-X|i&V*CT z>h$$kDMJ{fRef#CrnEUhf2#3EYw>HzQ!|s}Q5QR(l`T34sThTk^w5Pjp^Gh%cv|rp z=k{txyG>vnHWRP$m&-V93WzcbzoPvJc1O=>P{87<(Z`P#O^?1sm$3?~{flr=RO+e& zQK}tIEKpoo-0IllE2Lhq+I6(7V0FkdNKFkUNbjqm071`poLb?r=oq^C!5{Bv5vvAP z=9aXKbV)9AZJSTnIj&c#&7K}<@k5hhrg+xrnlIYrqPvuan4d=)xxa<3f7+}k_F-P0 zI6x`w9DCoNKhWI@c8TU0y;nFg&^qZtg3~~Y zzV6()a}cjAbl#<|>L^CLy1Y1?NX0C{h~ERj{S0XJ`5W`c@U2FmHGqT)oC_r;x!T>= zT-{a|298H@WGw~zBUT=>w6sJ9D31^ovMg8;1jOf%vXYjTCeVofCdRZj5;{*wv+VrL zB>{ua8-dRF0`j)ZUwD(1Aka8|;Qk;|MXxGHx^!@$*vHkKDLKF6T|7wVwbTtqpYc6t z$hfZeQ6u3V&A42xee32^ZSVakNOOB^8T+l}+r%xdG}0$@yve6I>C$WzHl5n2Kf1vd*!wS|HSBz~uoxm1^7n{%MUQ3MruluEYFL+!_ydZvNsmGQH(bnb%tc z`>U7M2?+@yr*PH?;7^kS4hGY|l&Y5+K4=uH>8^P48kSy2Hdw!oT!|me0%i%vCnsNF zBF$x{e%%Ht`tpYOf+u)+ilRJNlY{;(L0<^b5ok6ugvX~%six#fE?Lw7e_W6!pK+)K z0$Vs7CU7vIeqnKO5`lHco;|YuEN3xEC_u@KJy0E_>sEod9U|t$N04pNeiGdXxEa~5 z5K`In@~ARqU>2=Blh{X5*s)pwyDkAxnwo&Id`Q8$p2u_?s#PwzXS~j>&KSMMX@xwv zgd;K6pxu-&q#P}KXzlY>S9$qcZ9(T+))CvQ#H#;Ujio|FZvuCM-^AF(L7?U>4cf)g zi2dwPh%eZB?Kre?+crV>8y)%Ly6!6iW4Tk?@XD_-jrX&eZDq|&P_V+3Oyc3KlRxer zvFR^^xdj;#5-DV}tmNf>q zR@%(kn@L(q4}D)JoB2k&hTZauF`wLOZeXo={#WNxXPOT0U7WD#r7(AMop0*+VyZsT zCF#$;THx%+{pmed>^sC(3F}hzw5FO_efMG2yEj|v3L+jW==Hj6%r~Y`uhn^Qal(dk zIX>6ZI8tuXCTcSfudC)!%iMw!PL7V9LqlIsUirX(hlCUu1MFwh1Cmmd#8w>q_T18r z%{Z~forTm@WeRMx2hTk|zP65Dl9Y+<1f7UJc<`T143<)W7QyyH=<)7Hym{}F-5jbu z*t9&B?R4O9x;i^OQd9X!TwGkFO>ShqUS9g+od=$=8!q?K^SqD*4#g8y3`7UR3XnF@ zk{+QHPcuKosh#EsdWANb-q24UUy* zZ?m(|I;?<{{>9jb)EQ|gLrHR-+vEOtIB0$%bG_81J<{Qwt+jX8ygZ{KCJX)6!n}+p zHvGIPJeb{}$h%{zT=JB>pG$f&?}G!>N-ok7oa}Mjll}p+#+{uNpZ(zaol7?%zDQ+g z=rgdptl2cUYE4b+P}+?0P)3E(g2?LX^o@bO4W&Rw9K9C)eS9b`V#l+ah)7WPV}t}I)RxkIOj1TM zeHL#gQYE|LQRodYlNTY9k&&t2SqEt|OvsYYaeO=U_C~9Fp!f{p)|L6HXw%xp{GdJ} zA|lIuO+t@ii`41UZ`BeL&N?a8eh~UC|9KBDFE2)*Lg~h!7Dy>sHY6h>`)JguX6vC+WqwLe~~e}ss%1E?QpEM3=`U4*)n+49?~^^lA3Ft35w zsdGudAOz2iR$+qe0-XUhUwIMi z-sGvMF)F%T{((b)V;$RDag>?JKmsVxz&nx-aZ|=Rzmgb{hs5Q52 zxzRHBf~sns=io>(xrgE?Lq?(WZJT$MEv|jfx1rg$8T!GVZm}Tw4{m?#3$hWPUg62r zrH-{rnMoYjf+_T0!om;91;P*isa`^naEI$a@mxnDk9)jkS^$(~ZOtQsGE{Sqyu8TH z^Hg!Zn`F^A3mgQwFKNCR?Ex0957*8VH)Z${r{;I+?uKu<3&m0PSl4JsCUY11!$8t( z#61sCqMAsIc6Wb*UhhwtiNOQIIa?srDA5Ru&~Z2p0c_cVqEO#j4Ery4`n#MR6xMDl z0rT8?9JNFM!$5)@B5I~h-)5vYg}=Lu4m%dmW_n3S`&rqU?{_ zQivJE&co(?g^zUn>Q_SUr}fMX=@Oc$*pdsQF}>VRxtn^RzMuZx^wi+2w{72$KvMF{ zi+80fxHt{2x9CxkuMR}Hqd6i2_#-qH1$`k}^VdiSE|@kWI3D!mAxnfKx?-f54A>ow zY&)|%&ieuV?Xxq}r!vjm89x1qu44VO-IgAeMbdlUZ6(=T7*Mc0sCwY#-5J!DWW$j= zw6*8}4`2KCl3Vq9EB5Li+ttPAqic86-g-0^q2_b4?n#q$OS^5?(AG*m@)O0Yv^-W1 zE~4oB#ZM#n`+RP7Rm1C&Vh;;hU5)xUZicDat>I*;EeO!-g5d7 zC(1)xN4QkLlm{1bA8Ksar}-;J=#(@%#5tWGwJaFv#YjVGhr9co+3u*GoH3V;n>Ojg zv=!xuC$JN8X{&^r!-Dd`Jdqfv3m(1#2KCo3`l%=FkQUdy_72J#nO~6|%C#s8X;`Rxout2Rl6Z_4?Uw}$8@O8mphkL%11VC zeZO~$?`PbQ;LFYVtGgLjThw>z8@M}~ic$TVw7M7&FrsJWP&9Q`#wYl&b}2sHs3dv)4a8&w{mNYsZmH6e zWg|jNa>D1T3WVPmkSXj}vUj2}%$=$cl@C20g41*n5F;1p8y^P#w<>Xh#2ArY)mdXh z!{VBVf~jtAflD{9K>dJ?_57W3>_o-kXu=c=dY}(imJGio16*BdF z7m@n+#;v_P8I~O|-17uLrL}9B+$z4Ss!#H+GFR~C1c7j6PTTo$eYmM8fd0k3j?A(n zA$wuXxq79xJaEbWDb3ftjns>uD|uu&!z?B?95ko)$u`@xdOO*w$T@MZZUwulus(@n z-2b+j*G#H|a}P(pTcU>BjgIp9TYHu}O^t489ON)1Yi=p>)G1YyofQ5QRQ#0tDY5!G ztPbu>;(^VJdRGc`&BA#u1YI2Ity#a8Ah+nKIoegnCda)lU^f8~T6KN89H&}s@K%{< zdUtcq2SD(iWYu;0=;gN{z+AyGhu8lxhd~o-j5#dudppqrXFH5Nh&JRR%0&q9?uCVM zpbhPdaA@akqIVWg{M< zgWvtu^-cO$iYzRU9b{qo)lndcSwx~0!_IhJnRONdmgtEw26wld3iX+}g1s-44!_l! z(UuILWYV z*67-o)bmmvQCkTLiv$i!DE9eq?T?iO)+>^?!jh&OnB%s_UUFjB7Vp~pohT(8!=om& z<_hO6eVkSTlv{U|&dE9V>)O9QP&hbj?HOSbI6X91cWcF~VzZRTE|SY50^TiHTlJ)t zTqdchsR08f5GR6w?kUrXDmqfTVLj<=%A2s*({zgzKIUZsWpRQNJ$ZZnloQ zA1Q43p?pi}veWZQ`csnYS9b)_+)n)u1-SUpkz9MT?3Fhrs+&l%v;MowXovrzu@bF=|VR_&0li-QGG8xYP z3K4BBpz&fay~o~g{!2!3T2X1ugH|q)3SG9oh1I_@mVjue&>o&=tH9H^2A-)+?fN4l zaAHgkX(RhrQ9x563~kuIoW7Ca|MG|P>H6m8&|_GbIP`?jLhTekQpaqNG<#w?(km_H z%baxo+{wT1$r?e-z2ab3jh6BctgbBK#~Ae*==EU*C2^bSbu|FO3RJI;`iSR#SZOc6 zs<~eM?~_w}F$uZjuNcZ63;p0))n{}ySJ8cqf6+Z_|sUKhKjVm z3yh`pw~Hm#{_o?wU|{$5P7e={!{4ZBWL|^)Hn#sqX>_KS{fPnT!l@1aUJn1*pa-PC z>H|Fae{(th{Dr-S>Uh_*|X8_Vrl$JX3eo!Z4}#OUT_=k4SBYN`IK)(UC+&pxR* zGsr~pVP1C5le%(Eg*)PER%T&G{R=HdVVl5h@#Yc@P8l~=)_VYgwVmwUv>Rh`P)b0; z-*1@4fq?brF?n2W?(9i?Nm<@`I@2ZQGL4TeqFaYmdE6B_=;-L6I6R{Ao)tO881t=+ z5-t?Fx*f+e{)!>-0+S!*8mS6X2kwg4uAbn2#vN%fK88heYyIelH8$&b&$fPQpsVwn z?fi(?V`rI0I}Q36y`npIqpcx84eJ06kU&qC5V#)*2piBB*BTQ_fV8sfi%B-ri%e>bo~}(f4%}!}JDbz?17!VjZ&S}7#B3hJL=2+#j3E79;r56?t%D$W z)S4b%8dHOe;~ETltx-yV!-xe})!$Pw!wY61qy1J`SFxnY>M}RX0g)?ZNFOxQ9$~iH z8hU&p`C_z!vnK3&n#|&f|5>!KtM>4Zga2G|C)L;H8#-@Co06`6i;)d5PG7SQU+_-1 z5%?uIdT2`+9m%@N*z%k7Er|9`kdfW)uSL(&15Oa7XV`O&g0gSCLdtLC*LNaRVQTUo z^n^(m1_qWBEa94c))}Kf2Hl^%kn`_hf)qrKzO@TdIMu!r_n_m6Ip;S@=-4Dze;P~V zTQu1O9@BaN6@hufvPX~_owVcQ!pPsa+&DROu8t(ICL= z7e+fiJK{Xpz>Ji0T1u)q3R4LWfGI)jNFoZk+vJj@{QyVs(QyNV`#{`LmV7o!(cbU$ z^@ZON<@4A=0B=9E5bz zajH7<4Qvf%!w8b=ycTd_ijlj7-Qax(Ye-jCw4f#hT7`I4& zcr~f##f$yGdwpYLJbTNB*FQ4TE`ppViz*+B zG=6%aJNH7qu%*4(v#TL3FXz~YRQF$5wCO3`>Nej+*_<&(Dnx!0vHP`sYM?gSv{uOM z$J+y4T{QiZ_#WXBuAv~acpb;}*yQPJ7iacfx>*DL-7$%=rc}?#KHrn3z~_%#ctP@{ zW_F6H(mAU7;i?KV?H_I6Zq9NvdN-2YJMulJHoqxLtLS;BawWt)ARiMnXDb7bnKh*x z!qqV~aX7~p(oXqj-DDKAO-O<4BVW1<2ZWs^go|YJ&$ey;&hJ&oTv*}GMTTL6NY+Z$ z0rU?fWbPoSd`pEoIHB6Ti^D|f?C!n;mKNhUAz&PkgLmaG+vI1hq7-qQYs&{CMGg%) z4pzjDL$d0wZn*BiKJG!yH#+)yVs6fK!G>94$>Pm|BWwqW*)vE#pRxDUKyNxeF`-`* z-lRIi`)+D>v@L9~&b0Gaa9E0Q)BwWZa>v?rnGADU|Ei1engUa^Fy7#NOptJ$oqAKV zP;oAvSqh9eR*-4vC=m*@ssJ*LiFe=ZG0>g$V@N zeiTU0j;cI@1n+y6t?88Y|E}j?M31e~9qqS)7Z?aQ8(8X|K%h!qT*fy*4;P9LWIfs{ z0?k9jyW3UA4s{=0{n~^zQ{W+)s|Eva#2R@Qr6d zmM<}AbDbq%<}>qb;#pVL=nl^hdv^ZKbHhJz%ZWF`mYcl;E#;<8Ga;PTWvER}|9)J~ z|6gjiUS3u@J6IqcCZ_Je;zGD8@h#ujR72qB^N=wq)x5)hvYkPMoi0UhHJ2~;Krlz+ zjaY5rNQ1MRS?L8iSy;TxfhQ@19*1!I{O*@?f2*PZ+}rUa;ONWm#~Gg=jk&Qg>7Tj` z64nAcY81a>L*KgY!W6s*Y->M83qj2%1MS=+a4Ylt1wgDEsvqZC}Va9GQaCjutDtn z1E66S@W{WiabQ~aqCTJ=U1ZXT_-%Oa!oJQ`%j=2?Do9Zy8LyYxe zyJWhpoInloxw_gHGKIQ$EupE+<0Ndzm*_gh9LGr>gj`_3h45Fx_aK3$D`{+`)6#0W ztm|;;(h_5LMp&~gbd2au8eXDS6}yN!fw*H{zuv}^78W0zmN4o;cn?5);e89%9KGQ7 zK3vHOL@b0U=Mr1XlbR^WS_mBIp)7~uLjL0_Fk^aN0}8~B-Aii= z1I!?qne&%MMF|as98|~Zjah)32}RAt0o3z^$_DjI3jW`yMadV!by$I0hTRPzVG4x6 z`vGh6Uj4ei-F2?*%rF<`iQx{S`FqRe%?7|!fi*INZ+BpibO)Y}X=B!+)lAcDvpTl? z#UYNVJLd<9`5*$s1P&iMcLio$#5-WW0rw?=1YfzF22C!Z<{^YXKbgTk;?r!TqB25G z$6cMnI-t>*Bp`Iqvt;yR>bNdDuDgQ^>>mN03B)8-)kOSnq^xj36IV_vVBLL&NzCyi zj{gz01V(@XFHpCUh)HIoXLzz~J^AwV{kKH~v-`ZzV*8Kl>+eb5t8 zybKi_;b{XkZx=Etk^Mjy6M|+xPtS9AEE3TWYErCirsJye=FTSs43yMNy@0GxNVU5Z z&=SThniLVTft)fB$0uWo1t0`geFxU|9JA|Zyv5V11bJ_OR5r7}H6HC`KMjV}3n(?J zDTF=paagxq{5!Mt;l|XrPF<)u-(7gQ4znxh@re;!EEmC>?BY<3fvYMBL9&#Q1PaCZ z71>FsKcHVgRSKC|>|i$S(}sbs@V_G=`xqze&G?&=BbokOs+&;2t=`k1sF0Jni8hA^?KNmIu~)ssQIUAq9{i zFjh~}BZD|&gO3H4Pcx*Y0MrvLn>-KYnvUy?io`-MtxbQ`CVB>2qygZ0TOo;HlMf~a zIjTmqoFmXBBe=ILFZc?z>k$>1+voMzK-wYAT46B+5&ugLie)5l3CtyJ!QC2h@7lHf&0f z7Bn&5*ose;B)XsiAnVK-%jc&gL0tF<`5wWKQN-pRf^`V_Cu=M*_l?#}vXh|Z-)f7j zs7@#j+s^ksRU%cA^janU)EQ2X@BDQnOy@Qfi5#}HkE z0OcA9SD*s&og-T5oO)D;d?mH(nujrT#epD7_5!>b#y*?7PmGL=;6SkA1k0w3{21ye zaKDrP?3h*{=$sHqW?`$s?##qQ?w2oLk}`90_;KECw{2s0{#OftJFdfP4DmX2?A#^5 zV0!Hcni(R$D6sT!ZkTI#_N$dx!fh2!#H@A)T!fSj_s}!jwpvs?KreKz13(Qe)qsL5 za*cYX)d8@+uot)9#5etWWaN*|C#t8`Zvff^o!3I}2|>7GyDGW5^enQ;{Yh5s-`vX= z#YZ~Z>vav~^{b^GO8s`Xr4iO)2hcJ|S9?4Vse{SypahB|N{&3vI}#JsA^c_G#wvt1 z!wt(eH48k`D{4Pk(-=|*^O z$~UHcEKFq$4S|Fi7gldwDSxtwx_P9S6PQ~jAiZ)a^2_p{u%$E@&2bA75m77D4(R$T zx*eBEdY5WB0C=RlnoZ)A$TAzin@K-Z13JM>ZDl=Zcu7c|fjb!ld zweW^VQDy_(-2p~fy^mk38ZGx9OJrxxuj-It2|Ph{2M@G*YdO*Td`LwM z`TkOha%%kN^s`oRpS8zgp)0|J$QHtwQbcl0Pw3q#G_!$><`lvZ%#jWfdAlvAF*nps zdfVFlD%Wj)K4rkdPSQ?)&I30le18xgdD&^k@$;ur%fyvzX80%fe4trtXWMmBevqDi zs!}1C2Xld&`9A3Y8RYzcm0Wm!qy+ zq=QnaP!@SHd25ZY4`51Id5b;U%D4>AoSjG%#ptEbT4}W%#`M}|ba7}zexhQBhJnxx z;2dx9KtZTgr4Z82*Yo!XobRtYTF4S`2xE+;xvr4UUT*X&*b`q+;2zM24_yU3OW5w$ zle6PTR~JyC1RJf)$Muya8pacCSbgm|wLaJH7<|3fF5xn770?$T8u)B^VXE%!#e+~} zR1?zo_NX7ZerC^G#alBhqnuir^{kgU^H7|@qNR?as30jR$*2X&^H}i09=!Kf%KZ=i z{+V1H?jKB3?EZ8zCi3o|qiQ7aXZJqb@`yA)KhG+1W(th};eUYhV+BlUY86FdSO!!b zigtE(uV&8q&=(Q&;`pC&^1Kwd@2VD@9M@OH=OC?wW2o^f*L2lokp^6ZQ}Xiiclg+z zR&^uDO(ew4VIjuyZGawn zAtHN5^*rc$gCSng{*jn|iPjWjxkn>}?^bRe&Y7*=H-s$YdyV>_ALqvgp8S{#{QJeO zpu{*I_?7t2ce1aeZ_>cvBr6Ncr&sbw<7h>Q`W4lK7d}JDE4NmIU1)U-k@qpV-r*vK z31zT#Ap_5C;VO@|dG}1uofDvs4bX<5tqbuxhuaBaI)Ca~35vPhr_Pzh~>*O28s9(H4BD8$AhhBy9#dg*eG@8?3}`2(SPJbq9jZ z4LD}Ixpgf3Z_+j5CdX4%QI(M0B{Xh_AOzBcV~hJxFhkT-HPs;^BBHU+&O2(?U{BA} z&Uw^brP!y+7Q_@~zrzd^0)icMm>-DqJQyo|OU!d#YO?16#~+xzyiUrNSRaB8#j6fB zCNe`Qh+bni-d;>htUQRDnP@<;ZTfvg&=etsUAJAq%k!i5Lh5)}Vf3l7F$j|f2#}|c zC4_ByABy}UC+b~Wk1hLAOZ)5y(j z-UCc0hejDfVM0hX;J~zdfan-u+| zU~+o2P4rt&OZs&~G!!xowa+=|AVrA9-re;0b^i%EPW30fR#nJbslX%AV22qwvqw}m z=d-GDp?HBq2CE2TmU^-Qj@&1MjU&<5QH^!SKgLd~~zKfG)x`hnRBlhRHS2Mb|1`iPudxQ%jWn<$)TC@S}7_2G>0XYyOgOkg6 zDO0!?5rhBeYD3h1AH#Mc24qmv$keO_?m?{=gC3C+Nd>o2ww>x%K$j(t+MBSose5)M zxE+E;Vl)PQ^bW#>4kw4e4Djg*_sc)nMSK<-Lr$%9AC&mxkRsVa^mJNEiV$&M{q_ns z0;c2UPGnUZc4fr=C8pmw)ssAceD2u2`vL61QKH3SoFaGp)0TJFxFLjtcvy`v&%uYM zMFarKY>kKnQ<}BfcGogvjTLuB_uC%(Gd(EOI$FIRuqpmv40*#gsAPLt6Jw#Nj3TnF zfz4lSo{?`+P)OB(BVzN$>`wEAaP~*!bbRaG+_h~g`=u>2{o8BH?ou}1jIfQE5^;F2 zI6;M?{w}PQG_I>8>O}Ave+gEMBzo326$O+tFV^;b2|QK_gQ*Z9OD2rdbmJrwH&@=h zyVTH6JkZekFO_F}b;FDE63>H7NV2QD_U@I#O;E@T861XI`fRl9P4qQe00h)vN}3c5 zU=imp#pcZ4Vnugw`*s?dimz}iQAqvqop$F=qik?Xb~o-l<0c?%tOB`o_w>8i$p1Vg ziXFTliy0xQL);_AhQGxsG1m>2RouUK4_a@_Y^8j<7e<`Cy#6>G))-bP6lTy|`t=u% zQT)#20cn&pLI~WbHgqD_g6Uy^01{vF-09QnOl!hrc$dcf&oL#JA7EN&f}H;gJ~{Se zikYPhdY@afzs>r}{{YUc1P{!o!10c!B zX@9wU8&Sm}kvuX*bKP)Y&))^;c}Cg^Hgy-c1PCq(pCJOACj8Z~L2%=S&-L}s31|5a z8vKNf=I`IrEixtubHtxO@S;P+U!^f3M!+ieSO2`|B=ZYpkF%5P5$pa2Ar_VwQvcA` z_}G&Ihe!}S{C!L&Yqxwfo0>gn(PT~G(eE2q_ey4_bx8B`P^r8oS>dzfEAfnf77nR) zxe-_SPs+tV&P&XGJxqeybA006O5q3&$I}~aI#n}n|9NSf?^02ukIx|4-M&4k>ecn5 zGXMCju&^`)9&{#gZJsZ&Ys*=x6Zv-baZ+k!+A*5{dhXfBRU|Q|{**xuAzan3Z!a3! zkF_fR4Kn*$7=)8cyL-3E`&7#giRKJTzeG!^#X06eRQd8_4eykN&N^2Hxy$6(yCJMV zm$GPs@Ok_uDqJ}@Xk5h$qdt}8y|%q}k1`1L>Kgv@gPSwQ?FfOfL& zSq6v)lsC8GasezEcY%J6I0}PwX6#wak4P~HTkXf)LJTIlONdGe+wHZPX;TVm-MV#- z0}&2yFTZ1PU!I^uJtD7ciFtVWaN%!18d3WLl;5ThDprD-69yi={dp$VuFf+?-`;y8IRsc_jWgDRz1dPXiuc#RF8o&G@br+ z5srRu%nlwna2pv5eXa~zQW7CSrQ?3U3jlHF%?=k^t87;hVd2jH{tX_u?-dC_)@0^C zU)g|NRf)u=YiE_oH=^o+AIQ23?=Q253SR$I$?Xt();kuOHxb;~ zTz1M0xCjaZc>YM1Oo0M@BSSLzp?0fkM3+g2VP%hE=t69W+dr!s&@$P_UWg>h5SWKr zNj_3+6AlzUYzbP8?>_(%Qx-M|_LV)=$qAXcS+MdSoq)P*zC6i<^~8x#tYv3UPcdPC zHL@pTNLKZ zar_N1nnvV2nWxLuqyP9DojLP)hXp2(INhkOf4@y>HTLyxb&Fq;aTyIMR475wo2~wK zxCq7P9q_imLY38w>O8gsq?Efddp`X}n?Xr=ufCD5)JcGskAu|Gw1@xY#3tV`%8>fu z+B;4L7?#>Hm-it`4J#mmC?2a(eAMKODJI!FvS?f)g4v(P$xVe+Z8*|!^BNyc6y1on z5Lo!`W059>9%K-uXo`yYbN-3Lf3EBciWleeUsL=W917ikBdS-pq6zFryMzoK@Z^c! zh}AzYZW9g)0p|&Mqzku{8L>hL^bZGlScDS{DP0+)`RmqiRu^Ucdjb6!>6n>oVeGnT z%a&;94{)v31(*=TSj#YpFyO^(_s{mqdUx{nI*bKUz{&^LBYt(xKr3#Ri)BF**hysY z&_B`8VC((OyI2GT8=CcxAeD$5K5&2xSJ~Y2z~9#~*oAu3$w1QOzsE`5|5rbJ9(sH~ zyhpt}i)ySodDOElx7A^fujba5B~zCCLv3fnCH9&OUf`cG7-P3+x93q?`WTa4O_{7$ zLEW(JuYZ+IQKVk*$}X4HW33O9?2kA2TMeJ+@@6yE;C6W_xhW%I;Pe@hvYKYHhvn`q z$xm#F*C$od`K&u{t(#>K!r7v}C)3NxyP@t|B5z{ek4GG8mfMpI`13a8DRt6~UHFuz zUbA(7NJY=BOW%tH)E0OAxn^0q#U@2Vx-WEY3Oj5vao@xddn#>Gq^{!ww|l8QvGVt5wkGPQ>h&=F9G}R$r)%l%Xi4TG ze#~@{vqztG@7P>hcz3fYqcvTP)vzbYU?ahFM5 zxzu3_Lc_7fQwL}iRvS|8XJq7Vblgz1>5e0QyJGakY{G^?s|TsHsu`{BGBE&4xo(GpZ)FTE#+@9k1ot9Z1{OoF3`imC*b2cJ$+Q4erWXxj$#rrZH0Q z;KJOD-4W&P_9>lOsi1Enjg|wuOVxCGdEIDEhO#2I>0XNP44M6NeR52PQ`b5rryX7Q z$dL1;Er+$doauv@_#dfnpLh*NJCTO2m@=vkhtdmu16 zJoRTg`-k%n%Z(qU&Y{~|QNR`LYf2Kb)DjXjpQ0~#`02V%e*-nyy@k00RRv1mL z2#j^f6LISnt6V4a?d@vb!kE%6H6yFFHS!m?>dVH51tV7|*IvrLP8m#Jx-4b6VQyG2 zTgcRcbV$67ekm~7NjkMuV55k2ZdA~pW7q2wV_Xowr&VtC5ZfO9wa1b7 zx>9}fW^IbM94snj8@?ry#wc>|o$0#%*j{ELUT~GCM);P3SO7cVu$>qIr zS=;M5##c)77-p4YtPb2bduHO>^38Bj_mG0I8d)DNU-B2m{KR$?XiPX~HPvvvX4Tn? zEN@wU%yjPWZlI}jc5wS*Tp&|XkQmEA>0!sP{#4niGV)b<`J-VX8ecpgo~8AO ztuc?XfB3v4KM|@D zsmY@Ew8nCe*E_cixkN?#V17Xl7<3(<3z-p{icVaZEffEEUBz$1%{<4~E&REHeL*udnnyMte_>VRePOt*spD#QGdz9^rW3KDwM*Lp_n zDz&wJ$Pd4F7MC_KU=es96pPLOcHzwWR{_;2ptX$4A`k9l*M1nuEm?V(pK`)|WKZ(w z(iM~Ev9Sooj8rESm)kyT;l9K8(p8EUp&W6^hc-#vI$FOXbMzU<^EWyHTf=6jT=wdg zQVmOc4(z!U^U(Iuq{06n@4e%({{R2cODav8_IMYP$d>FjvMOaX%#iGny-G^Vj*~bo+dIH+5aF>p32e`{O=NUwf;TumxK= z+0A%|GE;-V;qmO~e@{2wK~;m~9ow@WjgIEHTlVVoo&OOpW42T%zi}nxjm#MPbd=}( z?bF7j1Dva|e#6c>qXA)`x^D0C**`IsT*&G<+_Er{&y|p|gI49)S;Gu^+Ny~pkNo$J zdf~E{c6(}Me!f1}IG;t%4K)s*x0;yRAVbsWsWZ6om+Px_sC<b(%DywFi!8_o2z^Y%5h>51xdr4|*;;)8IEl|1{y)zU|<1k*?ZqPMFVqA1i zH8PM_=8xmg$4%BU^J>5Qwq(;K3tu#I$5>g}PbO@B7@T>wsKG$s~Oel+OL1 zw_ZLtLM`QT=MjhQ=ZWGd4~25~_rtC8V|}eoTeN%p)*D)s_kU{lQ=xL#G@-#@r+<31 zNABnTD%V9a>pFFdSS%CQo9afoY-I6c2JKv-LOEOybANwtRCvfe)O9N0L-mhLIaAUW zgs2w`P|lClT817q5Z|z+@j|ZsCGYJ+*VUbz85d>pyRDOwZ!~Q@VlFKoc40(`b(Zmw zTlB~Nxm3n0fhz8gGF+!O?lxY3uJO$d_WO1(FKwjqBvnj}mS?JkbjnUDo^}2z6tlW2 zXmg@W*(&15hx}hnJO?iqhJBR@h=^*h{%-+a`nAD%;dr#d*omzNyVgY~dBykW{yaKZ zy(HJys>*LVNo*?Qk!p#&L8~XR@`InLu&y3w?T4%V@1r~Jg-VpR`e`8 zJNx`lYW3WFpEAM128uX=46hpSG!}i?B`w;rN(Yl>*#*WDm`!9kIPUUY8*yXBFz+cm ztAS>_oWEGLAt2hRfiLqRJDnUu0g{! z(oml$>59JQ+&1sjpREhX@DQs~$T&i2HNB8+H<1v{ZXSS%G$@M#CV{eOn!uF}4HIt1 zc;g9Xq}}q-3Is>sSY8VAFr_ZJIGXeYUY$Uu3;_{A!#M$uT&r8-Y-C% zV%D@mwKM(oKz~DHbLZM!Aiq%}{ag*dblSa#VWJ76dQtNs91XiXsk~He_YFy8XNr}S z{>;}O*3NMaBV>Rkwbd|NTz3vLBtULWxvR6xs-!!DJp6GPnVAtEq@|@ZtjQ7}C|x89 zwEZ&sZof-i2gH^{tPK5mKbn6@hdT#T`nmJ8GIrQM4~up!x%bhO)-)CE04Y+|L#AjF za|1#9AxZA2_aNC|Lew?b@)(SUWXvD;^Z-_P4S0KQ;Yf_fDg{P_+~p}4)`8X=@#=X} z&X(@^zLwe-xA|c=yeoI*Yr#cYFzGQ^AUw5)TbOQvm87bvshL)M4UXr404rH_K&q;Y zkX6P^3vUuo<3=K}4?v+&V+p|3P${P^_zCQE&VU5eI3;fR`^yuIGoM(^+NlvUEZ`Bg z3sYfck4~SmY0Ehrt!X!JiGwWzF$>e)X;ydih z_75Yzz6;JP5th_OkRXB{z;XJ*p;F*PbFk$AX0Zb#k*`-))zm*+-3(l4J+w7F_vj>c z)6@IhzfXnkw>*XSGgfUf_(Na>!Cw zx7PV$MFHD{)Do&v{lVJ)rr! z5FUfKcDk#T{e}>aA|D*TF-a3d!W*O55u-xP^}O+QU~0V!sJdyq*!Az{%0l?5&iCBQ3ksMoZU(*(i$zKz*fgIkS|yaBb^7-Mmd=PG+40^`jb^Rn9ytG7 z-@Li85y_YLks*gS(iIndBn2aJ97D$e2O!;NKVW6U?~h+{&kVu_Sb%c^!_m|Dr=g4+ z`E+Ak1OT%bXByt>2!^-Bfp+%VJ`9o z{1K4<40|hvDzC$SZSC8W$Y%+gk5%s~>aQ(Gx$haH{_50bOdwPM%wmm50Y?>kc36ki z)9Ykej=7ncQUgKA0RiedxCls6^u=6U;QIH+yyX>7vZAL(QYS!WTDOCi_6+D(IADFV zv)z0pv>x$G!;o>HUO`@7H_!7nF~!Ar2V%`@%*;a!BK_OdSajMq;sx)3z1Yv!9v5IE z&g#_t#O%@EP6%tyM*YJu#axVoc-zooVo{JsgxKl{Ja-IWRebyK#Q}$`>%e3TARqt= z@=rN7Q8$XhB8Jh^a&op{$G~@pAnjqA#fPyqww5?1Mwnj|vw1L|9e1sc%9bLil_FI! zp@YBPos5>r4wH0S)el6iz;O*x`V|MHZO`L8LT5)}jN1u$MqqX_@}ldn!KZu?g;}r{Pk& z55q=5%N+4goE{ieC<1y@+I-BDPG`tFD2N^7Ln5)s(eddEP!T{++)V;$bt8>?5ZEw; zzW~r%9L6@mhVMW}V*waR`1Rn@K80l%Dsd}*fV4yLpytPaFh(SNf9?8z+=iiwp?D4l zP&^}yi0^u9cO;jv8sLY&5<-rM4|aDK{?3RNFsZo?BA+UlP5pHVbntAHKc9sCy$55u z=Fe`>d3`J@{vSL%SPwNv(9F@6MG>Q#EhJQ(H=oUN8UT7At_=hYrQgVW@ZbShh_~Tv zRGXDyMC#>)9b8FyLii;ELF z>nCqh1MYSs@?k;4B5ZBzspbAVUTgGzN|SWlU;d=z9P{0KD^^Xi{P449k)oh)<}6xB zV+EYG-Jks5vg+PWdkxbCCpm4c|Aq_`Iw48Hkaoow4YS$o-{1Rv>tYJ=$K_X^(j6$# zwA=i@Xvy7&&!S2G_glBY|Mrt+N`R2v6h(#k!}4Et(>$29{uHdZ&&pot!>ZI~rrB>% zx@5+@1Syd*Z}sU%rk+0XUsw#o=4|gg+TOUA)OX_CIjW*H*jV$~E)071)BGbrYw`Q* z>TD3#s>~{F+m**@Rc!^u4Sj>U{fa*ZoyggRr+oZ!RG=2Idkogj-zQ7Qg@K={ z5@b-E8HoPtIXgk~4zw@6RisJNkQblg>8J{KY zSsNvNFF1*ZRH~LJzLj4_n`^I6w_(YNs-Kqq_qn4E>j?Ok?Jd{j20;cP?oTl@IO^$TBV~b<9DOnBo+4CBhzGhQO zFL#7F7f(t^`_B(~%~0BXZeC1# zM6&W?j=8abGGpC~j}L=HzpagaN`uz0&kNVDbAYkj2h!(jj4L3o`qjMeK}^EM&5kK& zoBKkN^530%tIq13vwrlj{OYn?OYEv^zhZIbs`v4hGsPN#@jZT{K~yIc(ksa22@3gI z(TNAT?Dw3cvg`grb0`ioGUyB_NMxrsOn&4#+QXYu@hQZa>6aOQxGuba|TRu7~HmAv6rASh} zy^!?n($+q5Up4EUxcfZ2jd{5Mk&@aN(>)`0KH0|d;|UNJ8{z$d>BS6cT$CD?hFyL= zj?Q1gcis8BAAcYk!s#GLom78E2!V%_R25d88q|M$=A5#yWFAVk4iID?OHw=IRA*B> zslMIMFqf2WQP9`^En)Z{p{CWmyaP1x;2PBg7b2@y!?0ly)YRXsKvp8bK8_x)}6@kZh` z*SuE~R?BXhtheg;VU5+cPC)Ov!yye`gC^azD-r|$QY+^OB|m`5r%U>uh;;0_j$ zIBST!(XQRK9;|b_hqim?^D}PFx!H3&q$bIQi`C+{P!1*UeAV393ppZ*k>R&^{Wm=F zI*~Uw5-}vw#b1B&jhvpH>PLmU3w4jeyxYwb!boNpwr+GN|C$sT_;hNmS9?-H9DMUt zD8_5EHP)R=G|!jRYRGWkIy9V@ztYBf+o5aU5$djyV@hUa3&V^jGvmN~2@_o8=eh6C z&>k_PJTJu^#j(mW-{EH1jh%Zyg@*LvqvAdQ6W?kJp50UQz`*G!r(;pLIX~RPsW2_wqTZh7Xgqw7?X(b>gFxoxXnUfq5bFK-3C%0nNAKjW^YA zudp0$v9OcFwKw{>FDN^r*DwsMyNJy!?OI zx%-EPh(Bq=CI9zmzKgSV;+*2;k%%Y_9XC-r_MN4ywlkC!+jlSK|0)t#FqpHa{X!?a z>o)u>yGC_~q^zvHN6cT&PG-<);7NJY3>Dr!S>i;1xAxXu*_oSj)87BFy=|4#KF34= z=$5V`4DUgY&<}n{(U6=Aq)p&bxoY5O9i$!;L z?X|lpl%0P`OAU7;YLJ(YMN%z0YuJ>l&$hMB{vD?Z#bV0&{Tc>@_0-2t2@yxR%yZGB zMX48}XhScr6?B2s#QJtZ10sz^P<O#&o%3F{+t3PvQz-t6*{XH%&i&qE!9qMw35qDF!IHsuZAJCNC zwllS{@tFRr&#%9?KwiXho4CQgdqkYx<%#rh<=J_#9a1iFp|#z~-iCu~9f(Xaa~;cj zTx<+~otXfaao}NG92GkH*c331tjF~=y~l~M#HSnQ0fQ)mH-Q%;#?#gv_$S?@Hk_c; zAB>Q8p(aF(;a@6PCfNg|zG03mzf+`nCnlKT0{e)w|gf(TbsV2*BwndrVm6I5-bM)>T_?A@}XM<6$ZlfHf6MwtVY1e9n$tt7|T4@lw#UMIS?c%RpOE(FQDq z)In5$)(~4GB#5w00#P1562K`!445Wi)OQauHSn7X^1VDr9lgEb?*%zE5;X-;fufh- z0kw@CEZWx0*|FT!cl+ma!CbSQ-<>ojho&f;v%sWgED0pSB$TN?k6)~$+I zE#@(8viu3-#tvD?*{ag~51T4xtLb`^fEvi!haAfMe?tAY6Q_8ZgDXYJIbp< zA@?b3%g#-vl{VNKO@JDjk9{w!{-0@ zmnb1Y8)I)Cy%@h6%pqWt1Oe!-w|96Mp4@I0mPhci(y}I;L9ioi7H7;OVe5BmkQSWq zmtc;X{Bd@6K9`wB19(htX>KzdaH-)#$2Ye-0*KnXP+N0+0GsH8HW#O!dTSrbaG`-g^D~otd;T{7y5! zLck^8zVR7m9>#SCU0p%*=XR@(JcQC4;OO852y^qRFsYIySDajF5y9~25~~aW71(du z4bn*yBiVc!}vz0{S!YV{?GU6S_5+D@69N$Qo7Zn{?q51qic09@m=6+{DHN; z3*VKN{D1Y6C#zX zO)62;@_dffeCtW=yL$XuaUL16=YJ;iZvS2OpjPkc)IsVz%q}jv zWbs~;5GgGExvx?ZIv>J`pD=C)J@?!fD?R&>-wN2i*rhQ5h+@Cuye7D(&_o*X@Y%M( z?L`;5Uz{JC@D}`8rOR**WjIeC0@qn}_W4j@RCleaEZ8ejSH{<{68T;cpb8w%?ym0_ z+u$F4uTHolDE+1F)*E%C1v}5tzPu}~ovET@JsVBscxWEJ?bnR0&_0>0&!@!P`b>|q zSxSCjHCSp)V#CE?L!KO!*wuN%z zw(sg@YY%r5A%4sUN=P_|lQc8!593`AXm#BuvNcO@+@84B7D_u>}lZ-r-5o2JE>u}`NoCI*+SWHo4ZEo#fYy|(vG zK!MBF4zHduGGA!MwzmE)hXF~`d}>DU`;feH3Gfidmq zfu@gJFH_(3tv*R^GYNX7H9ddhiUDu-0mfVSRgbE?-$|XNbdRcan*;q8Jv8y@pZ#3I z_GYj(%zbh7=<)s{t4L-R$In-U4@vcwmVM5w$x6q?MbdWc+yM6|hCA0X85IhkGJ#zG zMm&)AON4VAfNvo`G7?OQl!#Mua>j$%7&455$d3%L4adONBoTlSmTYTU>TbzA$cKml zA28lh0qV7VTq;Ab>Qoo)ME4vdvE^=`PAHJH)oV?2>0x_MT0Q-vx#6waOTQxN)^1QU9u>WUI?;`Sy;>dt~Uh^e8et zC_lLx+CKZ$Twq1`h9;$q`_^5%^u`zbWE0-!77VJrn0P%_D)0D5fqwbHxK>yTS03G9 ze&#MEMiSkJJjKzxoYw+Q|A@Hn>V1EQ#pC*NJ73b4T-JPSGpY8k{sT>)2X~%2-5N38 z@aE)6|CMFSaA}x{h*KV$pXgDp#$C244+3mL?Kj{A#odKpiq*g&2m?@@#ZAsh#5fBY za=TpMsHESmt=#8do%(8S%r%3_-bYj;Aj_Twye#zZ1S>_(g(&USiz$t$k9>%pzL%@Q zRQhU0`H^vw43)B5N9mzrx1yBdZ8`1KOsTUYaz6y$uCCwn@g9xFv3GJE_XG0sskP}h z=e8=(No!ZltyDAIxLBLzD0^+gr4_1FZ-!x6HMSKA6AtR=52nAwS+-P*-S)41wCFAR zqNDYFC-YWD@&>X??L{8W!Atk8vmXs|CD5nt@Q~E!*jhQ@GVVNf$nuv01>6S7+9ZEwWg3-?d&A_-cRn zP9SShZ7Z4oLC|YTPHA7;;mhkk6kS!SwroEV>j6K;TQxiuhMdCO)X99oC-0@Ip z&*WF9w>Xp6&HtjBqu+g&_fBX9&4J2ab%SSWXgaKXo?N&6vRKXenKf6VI{WRo^hDd) zGG4N@^Mtm|&b$w#U$aM|xCUBT*NHI-)5P)L;}Lrilj)QUf1>Qcn&KE<3%Q7P*f8aD zUFs5<4h@vtweD6tLuoF@YaK5>D71IKxSEpsPoR;=*Vbj%t#m>;az)pfOA7v(2W=rM zbZbP~hBu+(Az!IIA3l7t&Cl0YNIDZalHoSCP;wbAKJO+DHSAX()S&2AFk0g-NUMD0 z1_LY1tD`X6y72D8n?--+HLRv)?YuJ?-^@L_yG!kWLb3bJAr^&t}Ny3LLEH292s>@>Kc-O}hWwt6P7@Sax5cHM|l z)myd;D)J(McBOmeZ$&S(7T&EWPyI8Q`@+$h?gYQKqV;#V=UhA;4PU8wa+`{tgRPPCvrW1x_6TMStjEX2OgwPU9S_PU)(q%8=f-! zg3K^`<-OFG92g5ar}0 zx)&yD2Fr735S3j9-R9p|`zqs@_^7~N5dPrp+qZjC$0}}he%pXLw+N~vczSZ9y>5&x zI~r%v^1CsJdi!Q-Y9mY=|c7{2R)v_8q_)}up&ci>w$*h&el;WZ%58`1n6+bWAQaO)dE&|B&aGM6LQmla;1Rub1CR^-W*hTI^S}Gxg;q%Epf^ zjgupjnTjFi0xCQC1}T;$j-QH2j??>dH|&0dHA(JK*%_VQ@9~xbfsaNjyms39Nwm=9 zy_@82F%jS4owcc2)SKe@%RZN}UZoqgJJMJ^_cH1IJc{R-)L-**pPJEoJ%tYSufL@? z)BkfwBKVo9gLT)h)1YmI_7eA0vQZ@?x;iBSYDi6G2ag7Bhc#&U%}Rd4{|9_-gpN?2 z_T3}6m<`#WEgmfiRW5^!>z8+C6`>w^S5p4t0tg~GJjMhM8F>S>Q+>n3+w+K_Bub7H zX_d8$E~Dh8Fp1y$TJ_gJpQXNAmIgz8Vy``$>g;a%ye$q3&Z!R}4b#C(UxwE3y zQ6oAjQ=Yi6(J^CtR$akSYlk0p2Al0>k8rnG+hnCHeK~!NEIhX;vMrnTr}d1@qpz}$))^v{M<95pm+ z5HXBMXVWY9XJ^QXXp`I@==Oh|M&^vpvYDG!h%n6rZtxO1`J3g2*e}hE%pI01HkV9` zOieT_e@l8&c0A7*t5lye{XDH-W{IlYYB=0_PHw!5&m?&H?1;;cXpOb)z(DjK6;C+x z!nk|1Dqal}lAt$=%`tj7FXs^_&)ckFQGU}*p@)ik$>LuBsR@1;NzJ3Q&VKj%HhSso zHmKJb-*2@{%e=(YEWIJ8t=|9F1nqla71oi4o$(q1M&cjln&^`>{Y?cqm)DLXj@fSK zbw3i$hS?d*kHl(HA{Mtz*Ak+PP|E*a=1YlW_|MK>#jj`3kaI5+o8<>wiYk^q>9 zUK6|dD-`nC$qM1a4Djr2N|y4eD1LH%euCemp(+3e7KEibh>yDA%Y=XcH;kQGb=tkB zMr9F?#HYpk*G2^Irqpd-hT_Z3xhS7&EF3R&J=5q|*#A0JIQe?E#TGo9QJof~&Go(a(oCY*m=%sm1@ zyFXgE|KSAbuz6yXF9?w{Uj9j#!mmR`tVZbSii#Q^XCt^1B%VzqfJkV}JzW&73%-3z z@gvA`=o-(bTvs3gd#Ug(`knmQGTL5Q--s+PFaHlRq##s$r@u618s>SHd~7`~3p4N+jBzMC}S22G+M2ion~Q%;E-8~O7_1_qS$o4-&{ zZX{qLI3_A%Nm^TdH2(2IjF79$`0KO!&rwx@%_Bt>W1>d!f7O%Fn{3)@=}v&J7&OR%9VENZ17@H9dw4si6w z}_D z5z~MUVmQ?=2)O;1_15;QFs1DY#E|qirDBL5L@(odv@YIh9GH@j+kzdK zd2k9hAY@Aal2(EbNAD96d8#Tif7Gy|=poDz3TB3LC%S_~xq&2sW(fxXFBk=b&}SmE zI8^)Z>jT#Wo*(c}Qv*^Zf{K_7s2p^;=8Jt08>57}kCH$QTr4ocXu)h*JZAl$5Yy+D zmO0dC6I~Bmt!!+r=ik`?Y=D|3U>AsE;n1qCD>lo?u$9%Ti7Cb6i#~KI{zrlae{n#x z?#%+oNujkBL~Ic@EAnbrl%7j$@K{x_8*YAvUlG3XgDGpe{tC^WaxVd6W;Bv8GPn(& zZ!6@p!?TD%u zI`3oVlA}8N%sLPo6i;W98k1*Lm!jU6FKk~tI?kvyT`Jkon0jN<}`ei zBm?hT*UJ(`m$F2Cf-8lhGiHaqm+xw475Bef1(`nN>U4a-g_n_WO~XA;0Yaf?=U4Hk zUc<_o#W*Am_$#;Ec{}6SWXA78jYi-1b0&%1Bur#xcN|~JO58H@{GeHIX@vn7-xxX8 zYs&SVIBUQjgNB^k`J0v0ZT+>yiS+(Uw}Q9oH3+>|t9gC2Ejnb<286{R?JNQ)uIl!t%E>0<=mEBf zwQD?4o}k=RZ^@>wx_y%Cpms&ro7-15=d#{@{aRX)GJRb~|BdQc^ZQ4w4zB0oqB>%} z^_6p-Uy#8|x&q?kC|j-eGHuvTbRAtqTkCqzOdKt;(US0pvK0fU60Qmaf%b!Pt$^=M=@}%fZ zvKf_pv@1H2`lr%0N$zX4hoobqakP8jtJ7O3#)fKDQ`{PUx;`f<$*5H!!hnd9a+x90 z)5d1kyl_q0<~?RcB>Bq!tdi#*K4P-+WD*s%en?q(?ZfZzuJ0)|N{8kAQ)(O$ssZ{CK+c92e8FIZkA`(J4ib7c1&?IY*2j|@f*MpobYz*9ui z7s-RQ8;I=RFhUt07nBhL zbIx_@r<@u1l3w}80$8OHRFG(*(^S!A3K262Gf6TM*J8m?C7CsTyp81@ml+J5v4C+E zGh7!{(Km!1F=za2+BfPRySAMJBnFqLkDcNW?&G`L)vtTs_Q5OqZ97=4spP0!wrv!k z&-+FMyKMPt;^jWL^B1u;5iz8E5~{Mn}?R=LR9uc}pz~ z5n_oQ_t?(O;aX8!s&+Ka#Bb}h|DSC1{i`-1UIkH;d_+lw#vtRe`L_Byz# z@Hg`U*;5EsLjZ__^s+%o{F%Gj8a9UzcL7dH;hVyL6QTs*wT5xRNfg*P9ccg@8zaUj z_ABAzgEqbg&I?AERuQg>aI!hjG6%yt3S71?xaX-bO$qG$4ChsER6<<{--Agk;TObr z<}Z>nLMVl$KCNut{5mpXE4%ie8<(S+U)%1k?PGl&K?;=#v9(nY3mVndIPuNO`q08? zO7mG>t(+ig^Fg($$_;dJuRcwDIGs1@pd%7^&BduRpw=T!apujX`a1E}wtE=^#(#$P zF14rUe(cLL`L_R6g^a`C2ZJn0Tk-n=8-J3+V#WW={=T=PcI!o<1sR@X>&<)kx^)+Z z`gKt*)Eiv-v5j7UMBL2|qbewM(x&;ZeJw=Ufl}5r_7(xa4h;<<8kCsrgE&LQ!^0Eh z{D&KZzw7bourGnp;4!dq3I7@_q3iGi%<$(={R#)l-_TRX#BfO1^%KZzO7`DQv^1Qc zQTz}xR=;c^YNENlZ`Z&qslrmQiDQ*?HF8vTq*;}5wn>tX*|)uyWaKfmJKAINq1J=E z8S_8FZZ;l_VsDG%r&q-PG?X10OiDZ|(fH=g8Y0wxnZZ*K&p%Zv zxQ5j&!$Yv~vnd_XdEl~#G0vg#zt9bb3&BWaz1;Kr>QPq_pVh?~x>~{9!xXXUd9fS` z7s`_EdjI^=xw|PXmP=vHNM$)^?xz8lIQj7`QciIJ1x6+o(xf8=rNc`SUU6 ziu%lksO4g7(}8ObZ(h2p_U!XmykYqHurQu|dPgOi$z2!sP*F)<7M<0drAn~fQ;^Yd zF7L}-aYKgGe5+YU_1|Sj$7g#6eUHB8|DckY z**dX;*VyOS&ieXY$}Xhh!b0-JSDQ9c{@xY08OV%B-V=*QrkiX#_MF_9))P=0 zqWRgK4L{tVi|vQQ>?xkW{8Ed~jrLggVBv2UnkQRqeDG`B_=|WZ&UW^K!&IA!!z|pd zP#ZRBXQc2wy(KymvD@(4b8d|zll0djeJ^}Y;pyWydd@55I>r2m>7p9aP$bX8 zv}O)>igF38J|ARex_oG1!6E{u`~~_5Pr-e2&}u~78iCCvJ&Zt5*1bW-YFIrFGAuE8 zWrR~>Cq}^VrMriLVXuVITDK>d;u{c9n^b>#%L`cLc6FYY)G;_}i?H&WzrKvx)AF{- z&%HnBY-dsC9ZmDIre*F-t@NTQac-G4x^C**b=t|`dOCA@!e{DmS19(ZRI8| z{{F?BAA4G_DlPu#iIw);9zl7OjafguN4=^tEPlkIY2#Q zTD7;}HjP)$S*2s28tw6VsCHgopZsnzX1p>1H^b(KKCcuCZaPg&Y~}pd{eQ~=Os~41 zJV`NTyPhR?%{@INBFtS&L2~Q)%@S*merM_SY$A%Kd!Joz1w&P&xWR(<>Y9c3li!3b z(1wf0TZlO*|G?kJQOZM8P#qrrUlEVj?fJhvFaF>CWFiz=S0lK7%(I*cX1z!MmnXog zj{fueNz?C-_tAU`$ogXm#!px5>LBr)CV!~aXFtNE`n z&0bk)(D67A)cNYwFehHY4^Auw7KXPh|NY{$M04An3}EQ`;OArUtpkVe9C1dI{}DMtb1 zw=>LO`LhP|>-c+lQ6jtf4QLTY(}dGCgmA?e86(tV4^SZ?P($kBPcde4^eDJt>9Otw_*Hlp#e1sZFoy1#24-v|Vi*C%6S=3y@QID*T6&uz z9m$)T`!Q5DV1l9ZW%UHsLs*TYPC9L4BZU5S zZebz3xK}%@^&tV0!mo-ksj%=A5ke0Y+;P-PqmspmQ2|3$XbcVl?=V7ZkK&ZbTL!8j zl=a_(WUqvEg4{Q-UkngAD38~yh1VE6tG?Da zb?ZHi6DCmxY)G{y-{u{h8tA=e>^7UV?c}K~grAy_Q3ZXiQU-DgCeUrc%14X@&*BoC z%1S+!+0(%Tzd<^n^_-h?>>`sv`YQVr9T)A+2#**jv*t!JM=M6!k;Do8P+(9HF{V+D zI8ym3;Axlv2}$PqphkiZwt)ni94vzL4+T7U@Dkdi*lLt?(2Z#(F2O>yyOb+hX|E1s zVVGSAyRD#~fFESwyXU}tgbj+f!7q8eXTI(W%!~=Sm;gjIc!H;3+f{qb#c1{$IBfVR zt$`3hV@SA96Ig_%pO!RR)AOx=$xB!N;#5*wCPXOuwc4M%QLS=xUq0pCV__Ki6ww>0 z@WLVg`EzsODjps1Kc#4tEg+VC8n7+fCh3V{^dlxL+cr|}J#?`HM7OY+puqJhFb&rg z2yI=3&7@|oyENd&SiF#_KXqFjW`|Z?uK<6=5c~*dIWDpi;$Fm^NPP^p>TpmLE!w+x zui;sJtyfE^ga>BoZ2=8V&tpXcQ`(EdxHdT^Cg$R;5f&F<9T?yUXSF4coCeQ|IA?%F zcLMQ>J@uATzv9olK;MFp3*TS7n{|Uz4pqm;z81k{uV_-}w1o$$Eh_oj#RL2GsbOaf zm!>n=?j+E41cyySF0dji8@`Gpa>_-41I~mWJ<++qo*L?wqW1Rou4N5u8H9pwNBak5 z8W3OtGiyq7f$b?Rucq!;2n+oZqmif9sXKs@Eus`(ZD-12k~UQmOhBbS2OJ^r--RN zI=x*22l_FYHoCkk)3BUYEpX=x5CK7O3vNlbB;1=|=y?kB%)=J||J+6z84S_==pzv#utZIMf;4m%kWqu$^`t%#7$#x%+^*;26Z$?cYr|ZKPFl=@nfde8 zQ8A(iQw#~84fvh~b?4nAOOJJwG<{dL?GLVj0XxLcr3h^$8JzflYa@1oRoa-enS^cNFd|gR$SfO!tlwX(|e8g z1mBGv3=Es;+h1gwH3>miy!{w}GJ0_v#G2q@vw;ylVX%sQh{q)Yz>Jo=`i6=58DPQ1 z_&;GAhcUtnh#!ggn@i8Jn+V@?{CQkr)pn7onRGZC^zdxAF&(LR^?!LzpW&kqaMPeU zKs_Z5Jb3tCO@JJ}GkHhC+}szb_KJgsrIyW{dEC*X_XDqn)iz4CfericzTB|uqfVUS zXzkc_3?5gwO;(B#d9|?FZq<+kLx`BP(LNXeGQBias~Wq!%DeZqy!}+)Gx>aCb%Xx0 znTCc7D-06ib9loSdrU$eZlt1`gd8@kjlLaM0LUEM3A+PBSrC`rU`x5eYx82F=Fh3# zIW%SCxG#uO1cx+{a)rE_0d1RU!czQCQDNa2`cI%1V|K!Wl@It690^hz#zloF1YqN6 z1lwi8O1N&K_7gd1XzwFFV^JOi57-tK?&i!OMy9a|(n9<50 zhMhdv5{-dgtf?u=KD?y+y_If`Gfl>Du73WG_uxSvToKUm%Pr2ZAi;+ljO?E=3bhw| zAkm94Z?VUHA0)fF6tucByA{ht8UFG|u~PgOCxOYKopW>%>#Ng{+rh}V1%~V`W7DDs zG^M4PkWi6Dl?O9AV!lxsu_&NlD1Z3cZYRHNq#n~;(mxEO4IdE3BnA>QAB)iS1;m2< zDui&IuC6Y^K1_RzQTYH(@q_~- z39q8;#c?m9j=`1Pdyh`L1Me7~hIbMFP@B<^q=V7X@u9Zt2yg?1Q7aK-K_rn~7!HdF zniKNv!{Q`93p@lttBzxs)_udTh{%tLEi4NhaFZMAgC`#!~ul>c!7uB3;` zxJkgdRH%+%B%;t1{oD?t^){zI7NpsP8n!^$YJ}hmpoRB=Fh1L|_Yje3nzOQCs>Whl zB6L`>&5Ia};L+BK;}(rUp)3BU&wYdtF7(Xr>QK&QrSP*{QtnhQe(>0Ir`f{vrfU1y zvf34xR$%4vBUfAw(J8wKU-FkHDR5vGUj!RE9H6m~`;sHJ1mRN+7EsYoYd&mpDqY+v zyxL3R@Kx_D~1!;0AwMM(908M$oIC&=GWDU)-j!+z>e9xP3jvC*-Cs+ zD2BIHOVx(qY@X-|(HTbxInnB%STVv6^#^vR0ESoyI3NZd==;go4l!8q`1csV&hNtU zi9n8HIIPjm5>CTJwGF%JV7%JU=~wH(ZQX-uEe=iy5&VN|e0}7jh$t^mIdyTCyTTlk zNYZ7fUxeBs!)@^h5g3XJV&e;__h5|twCEw7Ff8Jg7BLt!#v285DE8(kstY1r21gFb z6McXnAv#`~P&BHFG>NB!*DO$V<&0H;_3lE`_UeU^*;Wk*Sk&A`kQru@^Z{`va0-sVYTH^K zl7#G$o$uOaLLWcQ!?COE@ea*U6x>r(ei^3xHdUH+d-?xxcWt zpriFU12vm13KcHYD`?QVhKH50v1;m?u&dGEiEtW`Fk*(RNi9Cik>MRg`|;PA@<4Sb zX1QoNd(nhY__^HEcz>D5>kj`jycVTa9(Q@<3dYlE$P5@H_B!z5FJHdINaUjVBDx(E zCB`mpvpI>pZ?KdsLjBQN5%IINxds=yctCT9;YH;q5F$(`apF(nBB_P$2f@Kb$U%A< z@1J217W`&3e|g4M7BQ|I=@Yz&z7&a6zCuaSUy~n{@}Vj=1>e~Xbd)wfqH6pk`q;*T z^TM;fV%QZt{$mR`SGisC=urX_Z*!egMru@GXK}7cNT{fJ^Ig2JbwIqoVdsKO!JL-n zaGw_g>1*o_bIyl^JHT zcwZD#1w-Cxz3H9y+3|`Q9sb0~1PLmCe?Gj4kmPU<<%F znFv?Hf4l8^R8&+LMy4IGXd|E7%9!M15>JFi;Da~TsxB%j`V{S8KisP7io>Q_V5h?< zZ_XldkZnt1M+;s)iS1p4LKCS^-6;2oO9y{&_pV*~&Q1^hXRQP^5Nn0qX=2x7oba7D zZ>&e7)!)1igPd!UBH!No?bbNSuH>?z_uiK;M{&ATGg)RK2SLQNK2brV@5f8ei_x>A z?UoDg0WR|Zh=9%poKDVKx??9!yecApzUW~R6qk6C_LA-tgYL1(Wb=nf9Md8~g!M>_jgFEI@fW zT+C7hd>@#2L=0%c%>!TsQ6U85p^BQYxnM1IWr( zP`}WJc~%(SC_sQJ@lJ{I2dA6{0ZLhx>Fn>Y09^QuX!qm_wMUpu}ij-jKShtIqgvWn1VA}>9>RaLtkyU|Zmgd(&q z$0IEHm%Aq_%Cpl=&CTJSo+pVB2d82VxmJ}9j!0fma7INv()`%Lj*C?5JbNm|3xBlOm=CE5;x_y>goVVhmj5hG7?!8?YX({qTrQJ{4UY81D6BjaxUBX7Gkmd z0s;bxy0CO5blj%*0+rXry^7{LkXtSGBO26)9MOLolB!WU5KjyX=nV|K@xOa0XO7ga ze}N8_m}V0GF{tW0P=dgaSP+v@cT@ZGFAFXx35k0(0=ef^IL-nvkONz&A1_+%kY2Sk(0BGvTP}DVUN>}zfIPNm|)sn z$Rp3eJIwXbaiFLRlV?vA+8{a$epm4WoE#X@N`aQg!O01=p}(uY%Bk*r7kc;lPyO4D zd2P7xAo#{#Pv29lSx^}WfW?F09c4T?XaEg?4dRfQfa6Y&gColJ!yuE%!Cv9Jk82B1(duhty^QaB2UdJUjv@4tVCkAn8e{gQ$d1ZsDmf6`tqL|`&8x`(V3 zJ>gkVHY(eF>Qu!`9Zlkhl0Rg(@m zpLp}1!8x}h?-5D?&UvxH)|J`1sup2&O^zoA1Jx2J>3SVD9cUklC_d3{KF{KfPf1E2 zvrsKiNz>Ab*(PDEg<Obk^Ft+LzFXpYbZ`@>9Lsn@{ zvwoubN=1|laVuY!{>j`U*z!}+WkPa&&McU@rr=HVLg{(VP_fEH2Tw9 zwmhsPRjA-!)H&RmU-x6vg5Bh|)SN}HKbO0o1nDR~Mqv@7ivU<6#~F74Pr(E*d|a$w ztU3vkPO0(2-5?(BFf}Dh-G;y2I!a1HJ_jNRJRKR~AO+SK1##hsBmEKHXsA|yz<~?* zfrWaDiB|mkp+5&WIm61f18wC|FGPe2fVU$Szc=M!YJrsDofxvKG`QOv*dzgVUYX5Z zJr5s$m1r5nDsv%^sp6I&90rJ;>apq$YQf#lpGEP@F^I*})Y39+);V$F&HyvAABdcn zL&Z-Su5kAuO4|<|9CA+;Ass-?!4L&BkvIyIFbMxk!1=)e82hjj70AGdDQ+r?OysH(Dm{_WL_6fN@p{o=F7j7V)@ zwrFOKd!9C42gD^6&UMf@`-Oyvp|3Uoh(>Fw!>T%c=u@7DjZj-%l!Aln>UGL{L%!iT zs*BSxSCE}Ku|1mlx1L1x7E^Zyy5dA_Q>7B-Vc(ClmFt^bwmIrH5C*mZY&<*(+XC1? z7Db{hoND9%k9@HoW(52q_KZ!^-VeDHKXCmMzlDa-Wrkiu8JeV2uu}=cHXs{dXh%xB z)DNYN8kVM|B)9;ZLOFC2vRooV2^;~u;PYr((3Kj59}m;2*_R+#I@AovZ452~fLUkv zvU?&q0&20T!3NNdoWV4x0AQ6eRE?lcEI1&C16X`Gx66gvP%qTN#A9K0R29|_;8lq| zYj5$uMBykJ_E__0{5mpqq0Y|EMhph_4Tgq>r(yPo7V7}u+iyih_b~prfNMp`IK#+Z zCnzWgu9+KQhG-0%LgbW7)!pjt4lBROE9~;2(ygt6AtZ4`!#&`%dY{phYp5jO{y?1^`GfWIY76NuyTh%I2N75O>O6a)0oT@qB`ZRzYm?wNBy%6oKFv3<|}um z%t=%pExM$nbG*Udw*Q;@pQp3m>YG_T89!`4IMT25y3CwJrs=#@E>_aq>|K!GGP!U8 zmqNGT9y+=b)L`#0AOD(ykrE0X<8Un_OG{OZU9b`Fyz>WeO<)Iprr6m^z zAX0*aG)f6bcmKvCynFBO+xvIU`Q!X^KCbJ%Ucj{$Pu$Nv=Nx0qF+n0mtc2G@Yl)1p zjv^n5V04D(Z4t^Gu+i0CmfC0}Em6cnJB!Ys@9-4-_;mVeHG#MN8JVf1s=9TP*-PZ= z%3%z4js=ICe&i06*v=P49)BKiJ@Bil%T~`#-n~kvhfe%9rW-y|=hf~z`Ln0RBc;yc zYPi=LX|HIpuW8yman(;!LW=%+mN&7VgQ&3RS72i!24T4lGwp}!hl?q0fEeNO*h(<#^~)lv`Fa_kwG9GHmC zW&lpN#tr_$z19JI84=bF!kVnV7dN}0IhPBqOz=5X28R-ew~V5yx*Fl$sVnwn-l1ZU ze+SL?!u7(YDK}a-q*S;)$}6wGqD>y0>dduOFexb)sWXq1U<~qZ++x|kYa?s=&#(96 z?RMo75!{5BO?A@jTKYKbI*3&VIGK>>ut}q!MWYkpWgC%O1Hz49UoTsM_s87LL;U=H zNdJ-y>o_pM$j`WOchY&)`kKr9JD~Le#6i`5G#r&|3fZ;GUEF$r8Jn|MTztH&HyEY} ziGgr$^Kx{?UoOr<#7b$uy!Vy2_jb^{5yGKw-X!z0Ib>!g)p`0lX4KRS{*Ls@;?swOaXy`@utnd)sf;#1NlK zK<9FL0KV}g7J1F7=GyZTeH+zLbxJ9^_VJboh z3Q%xcbd_dSfH@P`Yws@F$b2ld)1f-H&GUL7d%MY72brVU%mv9NH{SM4g{)WASBmC6 zp^(lK^__ffXSzAIusw<<4+EdBpzri&r8;8A(V?<(>*A=8UWI1aTcaum$esfjLa6`;awP2=6WlFrYTS#1ZlyKk2WqL*sIEcPl0}x;JbSy zJN;X-9C7hkT46DR=NlFkZ!yg1+rlmEHpu?N{jXak{x1BqZ*prWhNU1B5!0a&GSKnH zZ$EYf^!$0BdHDpjdP^y!N+8ugUoB<9(@047qT`W|$jw%EDwrg&F(+py?k@23#EntL zjrrugvwdWL(ZP)FE}jdUk4pz3PdYNa=IyT%_UJD%rS=&v3A6sEtkyv^a;+w&#&Ld} z4=Im7Tqn8B+FUR32}+e*J2r%t@^E_#Ic$*M(~Sktx(={?{b_G?{$mSrLuZ1wN0|_WO6~R%yZaP{~}BkRZr<;8*@N)+#Bs>AmjHGR4If`1^XWWGLywg#(hf_9P946(KD#D=YmH4zbYY`}a%LTd^#W6Q z(J$&S-xleq$#Kv5q zrkm`LkmAsiKhi$(y67NZw?8)#$Q6c%Z|x{PnJc6XE4&xJBhxJ%nhnagCnX#-Ot#*s zOHkJ?@zI<@`q$Ii>bv>Sg_mh7Pa5;*x8%+eObK?n!{}xiXm)sOH(Eh(*{NQ2<>fT0 zjoEh9(8wU}&Q9)a^&e|Ab$H2ZxC3sur8xCpFhvnr%z2FbcEvHU8d5=m1=O=zdu51exb%EPghm@`DN%Uo%Fs#pf z^trwF`jj$vg)T|gE8hV{d`@q97{CGuj;;akCA8$bk87PzXdD?aAO;x_Ok#EPH<-=5 zMD`mIlVVga^SfV`(=gAb_WEd73*n~(dv{z0QJ{90i$z=seGKw*!WjS{GJBS#-2-e{ zPz4qXWN3f%%W@_Ki})^NgeNeuZpIX(Co^SHn|^v~J(hmbiI|WYQ+YR2Rb$ou`se4b z4be0R*FUVV&YRBvxpTO``A!9;{%o^~chvlif=hk<{AT{pi*AKRlq)>o*Y^Y}dS130 zN_<%UZh2FF8tSipWH7m&^_UPGYl<6nj+2D%k)@Cq|7tofHtjd`UtFa!Hf4cJ1Tc=}FjTFF@^zf+L^rn*U^Q z$!i)7wk-0c6)2WI#Q8F>*NY+$FQoH~;xIWQu+3;rxa~u_podaN0;~6zuV1oH7|u;t zFrRAQ9g#f|c%wT=;$GVdA z%{zTRe^<oA^zr8d6CS{~Xt-1J?E;vG(%lQUhz>}TV`wLfe(T-3A4HP=OyPu{wL`waZ ztSGNg<;z7B(U z0Pe2{CiZ86i4`5pRtMqL&sGnM;odaGaXwd{giejlzd zFCFr_AK|_l5K8TKXAlW$NE0IbzVWt#Zz;zIb4JsnP0-i%lBee~f|qO>;r$Ht9WlQ) zTBabdztQHU#<7Fbe-fVxDaykRn}w9Aau)?3tAVuN`GP)lFMWHz&$KR<;6KC6Yoevq zJ<$*5>?XJj`3Ab}T2DlOA$xB8-88$V!g}%m-iktxw+omT|ZpUYP46C)) zR!8YJMb^|u{{?DK?_1*SDIN!|kHqb`bV=~>V{x9SKB=TP_kVpWb89jxGcYu~oTOE# zDZHJ{V9wO`6P;TsJ6bA(i8d4h=qB_j7ip9Qsct^*(4^3JnI@=U06e5hlHmA1{i@W4 ze}4o}XlNXdVZ&du%eRAo3}M#%72-oc*B=cNbIakhkYY>$2(S$nU5794!C=-PEtoxR zW9|4%*yjL{xMjtD4)vs6Pq?p4jUkW*6#hIWzr~TXUn&w36x@YgLu{Fc(dB`^L)dPl zB&wfhj5IQi-~Ba`X+7oprx)$r5NT_%x;@G{XKA@lo;5q-RCjT2XT8IarB8pv+|R<= z+SNeyfAgE3?H< z9OqmXLp6+TdhO-j82H;-uyHmnc^(!^1pTJ^{x(R!DZBgkM)Ao|faajQL`qHpjlkGc z`Dl+-EB8^iJ!THNI7$6{8$z{F(=T8BY^WFCfFMzxF#aQ05<-C|rP$Ti=a!gg>eF4) z9{K3p<2jm>**sEzYXQ!zdpn||ZkuH#RBL+blZBJ2pOwe&uk-_Ub_c^{W zrKq1pTmUNjdC-h;Ju>#v!A+N9e4~9^4_u_0l#8{0cXFprbHv>UZK(pcEAQT}0AMI7 zKUtc|=Ed1fPJg_w#CVoiq8G2Pfg8d(7GJFhPS>!o8!5AVk%9N_F`iAhFI&^>jpOKP z&0d8anRLz6bS_Z2I#5aW6`#ok|7I5j<0UAug9*s5_nf3D=n7n`A}A#wODrLd%SlMA z8;~I9^rf=FO<}Gn>FHXhgMH4QZxOeOQ+GQR*J%0tn;ys39h(b64xRbk;6RR4X>pM` zmC+9hXjrb#KCYpy0vr3RDl;u3 z_$_a9Yy5Zb>zbl&C#$k!cgFHf$%d-%uO8EX@h7}tY1kEm8;}~@zm3K9Kgg>#Z9e{R zA%|c|UgV4%n~T%OI$Dx!6S&Bakblfkd~}hDup3?e`oHjl?yF_A{&PDsN+v)W(2j^p zNtF+pou^+9UJA%x`_G?eQ4Wp@?AvVTy6oxpVofh3wZy0hJe*h2&G|=H#`vP>EGiyY z$^SrULzMa3*?d|LJpR1m&GJzTUIAGRrPT%Q=jZ8e=1&~aM=xxkk%tbbmitg31_c=<(<`yadS zKTqSqRZHIA|JQyncDAN>?xTsUnEMzl!g*`qrxgj^J2#aw)-|6x@ulJ`aa4c4*4=Xy zNB>V@N>AM(s6he}j-vmkRa%WO%3l8ZL``o?J%q)soHD#WDQPWty}@zR!=Ef&rJmcFEuE6W=0$ex&23G=Oaqnk#6z zj{bRW>{iP4Qm=RZJa}ZC@KcL{qf_rsTC<#ThauMpC;jFZ4xPmt@*RAq6ynwPWN?*7 z%rB6#tZ$wljo_^cwE6LqmxL~(PEn<$D>w2yx_VV1%{{)=oi>a<?{d zc1ukJ`Oo9LVX1Z$z|q5FMx_wl3}(mAk-2t2A7mV11z1@Ox?qNDa!W@+o6);Hn%3_8s{~n_Pw`V7WpuTJ;=dh zcA?XkJvt9M&+C3}S+poni-7kbW$Cs#GFet(x?=U+1I@#LT~llZ^Bf-`2uFYVGqB*s zK;4S3JyuaI>l<>YC0(S{gS<9qCfrr{_}X6jrog`1fp@AJ(d$d+R?p|$@v-5p+OIUuwPkNes0*~`91t=wxq7eLgmza ze3ZL(Ua(8XC#$3X1@$yQ0zUVUt#Af$RYN8I3(**xJX(u{K*kGVeJ`SZGVMeH>rIlA` zK}pcqh;bpuns13vo^In%JIQeH4;L(MY_oquphm?{pj7eYYd+KYq`bFlstHA%lmtJ-elhRp?h&aL(R1x=WUap43AEni*5u^#a|cT z!>|2zOz&;-9nr1tvpFtJ?{mQbndqs-F3vQ?Vfx%G9#@a)0+T#3Q23|sAXJ*c>| z$GhztUx@s0K)UtdEG2@A6$ciXTyr>#cb zw{6>baK7jV0@O#7GdtiV*S&yVG)yOXffD^&64c&pJ@qf!+T8pmc5m9`3ab0ugB({N zc7Ug(6p3L1=z~mvLKHKa6u}Rfdwi*jR~3WS{bozkL&BsH{utq`B9^~42{}xJ*;z24 zf4>-Yekp6oMZiAj6*w28z4|Vdh=@p*bw9cH9e;cO;Gi_*JHrzu<*|t#`+0b(<3?qV zs!pr`Q5UJq&G}%X!+jLMVX6-TYNopnwR~(XS`XX+G<1gV-cHnm%m561%R{nNEfG&aD+8hU=BAE8^ZBP{00> z`sLg~O9PWjZ%F%cy2U6S8bbpmh2{@kx)1Zju8@6jHp6FV*tR{%NsRkhxYeOu+$2YV z)07D__I*2Ys4AxNn<@)WO&;DPqPdZmZEv6D#PNx%xd$Ed4qIjGYjbz|f8)~I&{Xn1 zr?PP5S>atVc_nk{J0(rFDL;Raj0K;zW(@N<*EihI5aFv^s5j6K6!moPF59>2P|*EH zjr`djsZK7rRK3F2FLhWM(2N%4Z`J*M!@I^}EI#;Fz|Ndo8D+`gGQkXv1usAS{zkLf z>cKceORfuST9cHh&CDo1XnPU$mI#0R^m4vP+lEH#MXJ*jdX4B_g=n=0d}21;WtGk7 ziPOa>np_jQy`2UVn${6g^RzoT)ULh1L#v!OCkD!*6sze{=RYN+Kc4axhM&qnnTUn~ z^v*X^n&G&025g3zO=5t4FgDFdREfldA&d{REOGTcI!)Mlj-YMkEvA1P)W*Fp;iLs| zQW!Uaf%Pe7KMr1aYX6kiP=VWiY}XFXg#f&odJ|w!_&5J*%wT|)uLwFt$VqRg`uM@f zix_ziO8RmULBFCw83=u8r7ajo0uTeVT~20d1sL!VQj${P#o0k$s99T&17dQX(PtO3 zx736EYP8m86Gxe!e=VtCF9R-v2g8Qr$19Jjrh9>29DxY7i&#;y%Tm{CY6-&EKTI7h zQY9j^IY-;JfIJd?#o2fl%87y7lyd{Mw^&!dxLU{*_)#~%ExNG%md#FL=6(MmWz>}<$Ko!oZA+3lk0@77g3lN`H+?C5iP@03v%&!(hNCE6FZPfF}n zb>01E6Z-mAx7T8iL%!yF{%3V$bBlhLm1jH~3hUij4pVMkD(&hxRW&hRCpr}8J)`uI zIfe2dE+|ywF859DGN)Y)TYVO(a}Vb?4Yn1=kBOfpbU$P4`9b5&!w}xpd^MY(pDRg? z)KogpBhU5Odlmh9-Tn*hRjtC!IYUu??^{!K4JzO0#8lvczV_kXS`w;)y=aIbpnpOq z8hRmDH^%VTE@EI8Ive7Sw}9|chKTfLa~3bwLFm;(?amL->Jf?3-mj3HJZIC8I!Sf2 zE`biCt?1Edb(r9+pA#1Jwn`#?lF^bd5{y}0I|n%0$2 zIARt2Hzc_Khp)V{E;OYQkQflXdT?(h#c5J*!;v{ml{%o=mYInObNx<&aih)$>`tHz zDdm8TbbG4830woZ$~~@7R6*VMWii91`v-sX^kR`_y~$&y^JlN9!fnoA{o|G4QQ>Jm zCw$UR)jm1M>hsb>_A!(E=w21}1{JM~vGWF%qDTq~$)IO_Uuv4V9fb!+g_*re#?8y8kE*@<$`$dp&+}W+uS(A1Z{K7gsrm|Wc{l{E z#RUbT#E+j}gg#N@q>OU;T{5?^@x9@!Mn@u%(xGXiaX3tQzW7qH)mONF|M;L$Ub|5# zw@jkqxVJ`#n25*RJ0Kv=hdr0w0$j$?GgXiutZM?1n~45Mwj($1?4vWC z`zs|m`REx9unyHB=NyD4n?`#f$vb8J`{vqX>l=I-K+cX2G^=VlXVz{xhBg9agvwIx zTK~TOPOJ9r{(*r6FRyK}U069iXk8o`EpbwePE35pM7nh8($TS*j-jzJFGeVMi(6VW zknQ-;n|mmG*{=%RiQ6Ng;3meXBN@M^aQU49k$pyUkhgbue*W<+`|%jqT_h;PJKo^p@9Fd{Qc-VgZI$ln>1m+2P-y68 zL;-8aff*j5W7xi(7?%*Go?Udb5si2eQBgOiXJ%B+hRzLSu^G8|Y-c-ogR3*o+L~{E zv?hSxV%yfOp~$)Qzj#I4_eL{s-?mNeSKb_=yeuTYw_*4g2ktBuM2kHvTDHSfd$)G~ zczSlTNQ&}t5pHf-@(q^~k-+8zjq7!hQE|~W%;Quf(v^3b9umP9I$LT}0{M;BITq%O z47{wDNh}Kc?%5?Tw<74d;~u}F+NguZEllxt=OrqRQ8))Qrr4T(EsoRAaYn}mkCj#mF|)nM2s;ja3g5m0jpFxKn+%jd|D&dnGu_RJ)Y9 zG*Ld^j6Rm;Cef>)EJIv)(3|%|F;R zzr|1^?u|~0eed`3oT#F*1Fsq7V^zdqMfGiFP|NG3Wo50g60Yq9H0{j{WN-8lJ4RV_ zmV9A=-qINC&QG2^sR}tqi2|cI?NL@*S`B$JFXmaI<+3T@c zclP(Q`9Xh!> zPEF=InC665`uE9hOOFwQ#U9D5J8!ml&ML*atdy#4YhKlz=&CvCQnt)2AHFqAXI7ZH z&kylhm~r%E%-}@TsIh^u-EUxwZx~4JLQTC!h?B#+m zIt!Goqc_= z;BVOk1=V!Eyp#(qJU0XWB=wfI7shQKShMEg*-2WuQ*z%T9~%7p^cb9E2+WDY;rdh3 zm>s?_{7nCp{a6$lN{AETh-5Y3HFfVU)Z+l=;=i=2ba#$e-g-T zxnE{uX;}@LlSjMo(&bk>4ni=8j*W}KF3#G19EJ(fSHH(V)%yxte5y`~0E=CM-m<1UCUxEyy|q?#p4HfGw7_cQoLE$-sV-Y}X(EJ@?G>Bjs_b&ea7gll~sv+JISE<1)=@mH{hB${6ILj9vTv*J#Y!(VeDW ze|-PeTc376=T&V@<<`dy4sGvbzHxayx4gPJHbb1eP}>&bXs8lvSZ9(c+}PL%?MI;b zty`52gSoL^zaC>(dv|5y9v-yyejJve8~HQr#4&}J?-xb^8Uv2C?q zu$DbrC0eGLb7s4GiNTk58sr=GUB7=bic3glM;OSn>3>>J*ZI@2dywj=czu06+(#49 zg`4O>H%eKtiHTD{K-JIBFLOr+{D*v@`+kGw7H=)RNgo`4)b)>!8gu5pVEJMo0R zSXB0Gw4q*nbf=4yZG)X1*V-!|lw-BoC`ooYngqwwn!} z93W;u^rGeN+xH~SShO0QvKtBODxddlfTpk^9x;k^I_V_8MEmNO6jFYz(GC*5zzfEn z!r8fil9R=)k+)A}mNeIJ zn+OS%I8-1+ri0f>X7duaf#mAoQAVA=zF4tSKKn^duWc`t zyu)yPV;HoP4^b6!yzCB9ha-ttnsyG`|}y3Nx@gET=@s5Qwm2bc3gkVy7XI8 zfv#r5#^vvi@UL`T`quUKW)k(%x2rFZuyvE#5|T4A6v4{qXHW^gO-@d}VJf|kBzSRZ zEA5|uMSd$GF3!?_!gY;;gv66ehh_1?Hjd zZa??)i-sFPFQU;EWF8XPbR?V2RQvG`*X$UG_TXIb4U62%%j;8ne!jYvsVS#taTto! z7{}?6@Map<>_?^XMLm3oC3+o40}fW205o75#VlNnL|iB~}Z%03(9 zn2eCs<4w}?%dhmO3{S4 zB_%7J-C*f$B-$riR9A*!J@^z^TFlLjoYs`g*rs+B?->aE%41clYiXhq4) za8W-VmEOwGhdNO9&U(Li5dsq5@cY{kpMEs2e8Ynf1-Bm69pj&${qqdByb_|GLo2oc z+QW#Cm?_ch)yFh}7=^NL$s*mA&B&}f{p*s$GZ_06M*j8B`@VP)q~36u^fq^CAH5LX za1KTXXqnNB5hA(rPC2c@LqRs@oKsKvw1aB-R$Q6+i?sahibJH8OIK}!`=3V*KO8$o zeR}D4`T75Ey^!q%Y3Spln@o)AsrHTtSE7zt@r)|Vr%Hd*Bb{ScTIXwzpp%gd3$w3+ zdTJVa`5$Um95E<4V`b9%?qZRfo15(Ed{@Cnlt*z-_fpto;>nhLGo}26K|qxdGa1W}}3rPF!YaC2tLA64wo zHvK+ioKP__VKdpIYxpsvYGCWqXVLC>6(Q{~LFdVcBRJ1demK5yQ)t2FS0=M3&2R?n z9^b>P_G)$fG^&zS&tVdO=prB+r|n>C+c6V^j?-c3u$9f6PD`74{w||Ee zklv(fE5>=T%g?mZIpHjSnZ@z9#mXfGc(M0?-yRD%fY<2CIkM%iI#~?$+k3+33Uun; z-rhR(P+fDH4*CFdD@=m)H55U)xRvr0s`f-QFepu+IWrpG1r2#l+0e}&5)pBM?Z8d+ zN>tdi7al2T&uwX8A1~Z%x+Aj!V%6e`3Qcszr5L>uv`dB;7Ox~N;K3?r-K!HdMbb?A zBVApofd5(Cwt_`lcuQ`X5bYiwCDn`;+d8dsyLk0%1!=*`0`sGWiADWgRIz^@Q~6s9 z@aGb?wP-bxhC2A=E!o+2>UnPQBr}PZy|PsvSnWP#`Rbr>vu+&d-DMn5Ezr~^Nlu0N5wa6a?ZTY63SrfFv|1XzzcV=w zcOa#%8#ito;o_2k163VVa$f%aF_@7dE;BpvOdqdd^kW#_NE4*gA#7L^6TVY(- zw{IGXgB3$6#?+U*#7>84^sqa1>GM`RtmGtQ!uR)rq<_UpEt5%}Hlf^GT;+;YBrfyw z@-wP#$KVuBUiNcjx#kqIN1&i$TsyQ^9Ch8oPWEgVIf<&I_iM;qi~y{8bALMb9=c$N zW)wyiHa1DOoi0&8ZlbIVN8d2P*X}FCD-m|13-Qo>iOZnQymRMpl!lPS&E30Bs-UoZ z!RUACFsdC%E|H(A0m4i@@WiRcHXn*kJ%v~WQPyK-so@EX*o`l17q0x$+Nwz&`+APH zrzuk;)u`UQBz+$eM3p?pOq_3Zg1V}>40c2B=g(iGDg8@Pkr>%4FfbmC7cnr!63wE| zC|}y`^K*+MsM^YGhU6#X7{#+}d!8^xKQ&z;`L3=o<4l4R|Cwv$boUC-c<*BFght4m z&RGaE^s#LHd03R-Wpm1L>TOrK6F&as%cy?>RB9e^aYs=Qb;tB{%GZtLW@l$(r5H8n z0mI}$$KGW>E>SdG^|n%6f~NTo=+ZC*E5L;OGdIWa<5wYk2TE&~(2rRmPu%Ai>(XDH z%Xyz!4|{6mr# zv!Zg>c$8$id*<}Yr5)WS6WY+PxPjvmT24os>$1`k6ErCah}Av5nl!P{v1bm%d4~N# zZ~V-SQ&LjchEn2Zc^E#<*~X_Kt9#Pq%iA8GNx!u9yql~aqjTN3_hoCeZ^|CCMUA`| zg*39x=1q8tI!!1N+e@NVY9xAFOBBhevo03q2H(k;Er>SKIJ9mUH@&+GA$ZE~Q6O!o z17S@dmu+oa;!E7&=3edZ2lq)zODoz=HQIN2E8;bzmJgb`$ zmhz`6`M4UZ#PX_ubwSJ&~<5@$vxwF^lp+T&_ z!Ad)=5uFUtNP}?2bP^^9#H(JPS<(6PXB>L3d*H${G8PvDoWKw?qXGj3nEbl6elcIa zUIDJh%42E&Vnz^nj}M1>giUK8C#urv>FMIe?E6Hu^Wno;_V#mU&u-hX1I>afYvNTE zq3swMAJ6Sif>*8`|EW_3$e+;35(har59DSg)cdEC3dWa~QGV`wjzfopvWKpVra0-v z`SV2^TD|o3_X#0ZZfj&-yy|gx^dziWx#25;zCn|sw*f6!tQgH;kvh_V z(_9|H*lF?1oeK&2-vme&+ju`)+&Zy&VL5y=u$zwQZdYkj@Aw9pUs!3Znk`W;I*V< zcH`c>8nk%u-uS%!iMx9>k^{&dBI!oh0W|1sNH#{HR5o(lEpL z?|R9+ym(&NFcIje-3B`ZFJ$4tbMuW+@R?Fc(S53;Da8QU^0)S9Hgbb4PGgAq20uQC z+W$_P=xxkMbY7V5K3G>Wm@_h~ymTF2|JtyZBmvWp%T^s113E|Xh7hzp=?^s7V1A`U z<~uKWrSBX5HThtsLGtk{U`}w}QWL2{A2>4~W5V49Ho-MGA2sduvB9WG(EW2cSXdnu z$yEb`81xv$2T>gD?x7(f;_+7I-o=GM3$QPepaT^W=rNTr9=<<@r7wNQ>-A!JO`2@6 z4dw|?cX+Bf{jT2{ijwIf_~jaS0eEAdNBF6JHyrBE-5vPf&u5>paw%dNGLcCAkQW6B zS1W6*pMB2C%IZZjV^2 z1wPOVgP*IXPrEYqz&K70d-RAPwVKj=Y3Zd^t1iP@K!Y5XpI_-OX!k^Z6igEaoQA+q zAnM%133Av&di#se{;Iq)3(+b4S-@a`UD}{ID~&N4Mrro_X>~lNEfn^7JzZUcv0uI& zJw4G#Re!}M=AkVvwBzT`H~0}A5?4hNd|T~0CzluP>B@Q@(!SxdV)3n;EW~*2Esd{- znuOsBM?(?pQ*qc+9KM?0P!nzg5!UMLCXX)A+q_S>i^|KT0JGQnY9`3zgb;M%kbD|e zzPVozGx#s5N1T7Kmsc2Y#LpFpRtffbdBQ%VW5_kSD}oiTd|kl6zlo3=XFBrYn7cae~y zxhH7k5^*F}o{hopl9c^)XVP>zXL-Or2z9IBWBMBYV1})E^SB2-^iE?}3ksTT8S5Kn z5HkyUIsZ^Sropq~gN-$+Ne9m!_AHKRSNZ5~ZzIF7w5DsZ{TvY|YNwVJMNfD$ke8!A z((@EXaHe&_L~T$SF^oN+wVynGTxrv4{8mr{ScR&2StjrEWL+s|c)yH&*X|$d^fgSg z8PphuC0xZzfoRjRIUAE4NBp`rM%D zz&ILoKiOOLjNF6la(p0r)S?EBd7goRf!K&*K+-7lM(#&SR>PKf2`OtJpb&?kc^ehV z+i94M63ZHNYP9~hvmKqC;cznRfo>+n{g#>8*RLVxc%AH{h`InP5j&r(zmP+EPOfS% z!{SR_E0Od#o4$$Lm4ctqS%8P%^Mh1MKVEx?L*IwE_1K&*=$F7=5?Q}x7%43qO3>|#r_R{8{g9`Uq)PB6C4qzlB#xPq!5C>zO z@a8>B*Lr}Oo@(`mCt|Kt`S$;ssc6QCtyy}-l{fzgvj4MCm47B9rNbusI(~-7s!$GG zSS!AhNxVj=xjNKvJsx2jKAPniEcjMJkd$NF6Vt`Hpnyc>Xd{_3{MYy5lsy7(_8!>3 ze6j9G%x!KP->c=doQqU_5Ax?pkIXSpysFZ`i%nFv>f!Q*rN7BU4_w1efm}_oF~r|u z&Un&Ed@G(TxW$nfmS-LP%~d0veT^y*4SfSLYG0H#D7uE0UJmQ0Ix8(0xn@Fpk@U7x z%)GqvFqyf6_}hV(Lq$^s1IjpeclYeC$Cr*wLbezStZ|M3RfnC8PUFBaq%v&cSr{Sf zJlzTVU4JH|&tR4-tk1(J-qw}1CYeCEqK)*r3lShu-Vd3HWh!bDR%N5Mb z-sa@=_D&6NwTEA38p@yC#RY19{?7UOrN5fL3m0uHMpm8xYD8i)qBS{316_g>=f%l# zq5iMRJlcQ!xIUc+$X7xt51!r!H*O~d3D`(ss(UTM65$4o9ON7fw2qpUBba*o_(VK< z)M;*Q?Za3Tr!0&3T-o-%LVtSXFFajiCaFs|%T?ye&u65`Ukzu=bpkBMKJn)Yxdal} zm6&vZr^RmO@m~#ZK6%X6Q5NJuTV|%mE2mt*HTI;q>>VF$)r3t}(r*GYYfSG?weD9D z8a}@>cc#~n9ELJ4hRBpAO+za~S6CriQ{!DicV<5W4}v*BE$l2us+;~`NXMU{*QFAh zbh0~3+(H>B?F6uDH@nN#3Dcq$JG}(#+bV5V7%3fyv18ZQE}Fwq?o6l{g>XyTZo5z$ z5Sn3AqLv2Tdv%QWv(8!gH1>eJ^bzx2LB0Csw}`ULu5F#Cmanxv)>D@J(a5Aj**&J? z3^Jm1$uYlF6kK8#pBH)@t>5k{4epdx-lS>!yZ;3iREYb_a_W@IXxF?d{Q1t{^sXWj z3yqeh;5K=qSq)&>(UK{Y<%TddT1P`u+glUNy1z{slMiujfj-A~@7_%$#wg#?&}{`^ zn-%;nd0o5<8wk`y|L?vx8#e zFn5jCt3bvC#DiU9E(C5;0IkcO9jJ@CdJZEH{JY9#Gob5ZBzQd{JQIq8Kgc*xa@?1L zFdu<@Kz?FTL+vF9A2cwrF*2S9MB#nIIrYSW183kH<_(`G9W`7Ya2HJC>o)9*FZL`8 zX~b(s<6Q&*S1UTs?UrnISr{#&PW%|`qVa-J90V1wP6|Ay`an1kvH zddP`p< zWK;K*`*DjwUV_r)6>QIAB7^K@U|_qdJTp!AOwrr)1q4juv2_{|52JUUx}FQI9dvsB zg&t1ISi3pK{ixnbkUw&;1imI@%6jEOv1$G5b8;Z&g)Tt(20+Mpc}`Ot(mDwLh=sMXp31H5l^sH)nI! z1<(mN69|%)e8s97ioAk?4~N80a7+E-HIS~;O;X;A`#8jEwEMLb)5REEJ#RIL&Iu2U9LFzzU1nCTsIz} zV$Tph0k3)Y>CPOXFcSdw#zLlAo(|FdY7~?U6H|KH^K;ynI4FC$zg1Y3#F60 zfOWMZ`bh5)cD#p;H2NXKf*Tx4$B|8s!!Gg{)F!M$S=+5W0Qg?PpW|_`eh2&Oc$nw) z-KA}*kTrzJz}(XE3UD>llW-o1ds}_v%kl$wx)RB>+M>EUW3+a5p+UQ7~x%dQL%3Jl$nj-tb8F#_mX%%#Q!ubszWLcFG9&TVKJ>MGh1}SgdDIg;kbtK9fgT zPz?pLpaljthQfRID+1+sqDz@P@B~)5sMiYdrGss;vXR!eg?3nbprrBVw|GDxg|1X9 z2znrQZbS*b-7JcM&!2CCDuYE>_zWcW#4*7I$jyq-e&XwzP`10fT^R@+yW8ocp_WZ;?C^4IK(Fu9a zZRyYoZ4x0I+Q>j9Z2dD%fk^tsE+y8E#K?{pmjBLaPcf}mXq!7r%)eumjc|ueHZyF_ zS!%Ga;Te^=*0u|y4^&}NcC=yb@(K|(<9vWm93-jbPB51o%HuzyLE{p?DH_fH=4K~a%odIq%4x$Sok9Ye zE24zYI5SPt8hBEBt9yxj{c{JK9-8c2AXH+?%F4+Z6gJZ~w&!K^RL%?a)-z+0qk#?; z6DEOrF5MGPYo<0^Y*H-a9&CSizpSF7v&2P$tfsEMexL7uO`ZN^?QoKW!EiLZ%#Lao zJ>8pVKc2&gsx*|>Zp7ZPBDvviiBPvyvF~288yL3@#?50sx^XW=`C7Zh|tuk z=*apgO%4bQtbV(2&Y->VGzvZwfz~|<3ELUPQF|!BG-;I17t|SAmLO*nth07;aS^@X zOrBNymvrfcVbi{aW~qNydq<&je%r}4?^@*&)Ra+S#AxJZ;je*sQ*2nmqp!(k3lF*0qsk)F(m=y-vQ z?MvH^ZQBo##1Jtv}~iKK(z4A06WAMu>Xk!FuNTxK4jK%Rh7=PGcVa^5#24+LaiIbQ4vXUEI z(HcUW{VlnwXovL|n52vKK(c)0_a4A^#MJ~iU4!NkLNEF8;j^!JfIB+gn$f_zxm7ZKL|5tm+>J|hBm}Fz)g@2A!FhRmA-Z4U8B6{+EAbM(0xM z>0C4XckEFP8@93U-oNyrt~nd5*0iDBy|cer2FAcg`W2q^Bc=g&>mLcPv(5Yzyu8-^wd=KzgY`}a_>jfICc;;4IaJ%`@9Nsz24<-b)kq!I zG$Jr7%3tqL?Z<%{kFzvqSO59+{M@2r&q#v}X_8=^?S~5v5Nmj#nQ!33-*^dH<`A~U zoShf!m%$GM7osgM+QxKrVL9IVIPK-Tz_LGopO(Et#!?u~`j328hX6Bj6Yy|KPHKks zt^XEkbKCot^lq-Rcdye^c|3Wd0J5v2qa&<{-r>^KtCa);qT_Pm!UF_KUYJ!v%u)98 zxGY-#?J>NWTyS9?Dz^e!!YlGH>;~<5Cs8f8I0v#v}k`j5B4sL++fo**g2oo#J1d`kj=aNu& z_YD|{AO<|$=N1Y#_Eu;|*qE4@6a(ibm=7Oj<>yysSK+DPZGi;l#f#u=-(MBqr~(+4 z>ar+YP*l{H(W>Pg6l79kx4rY-^teXog^j3TG%AE9a{z{g0oaNG<*z`uOsGtXoD-zp z_wNloztpH+2L`I&wp!PySx({lCVXCCU) ze=e`#s>6Bpqp?Zt|fKI!Y2trcYf{NF}e&WJ { if (!source) { return undefined diff --git a/frontend/src/scenes/saved-insights/SavedInsights.tsx b/frontend/src/scenes/saved-insights/SavedInsights.tsx index 2f01773ebd0b4..229ebc9b0c613 100644 --- a/frontend/src/scenes/saved-insights/SavedInsights.tsx +++ b/frontend/src/scenes/saved-insights/SavedInsights.tsx @@ -188,6 +188,12 @@ export const QUERY_TYPES_METADATA: Record = { icon: IconPerson, inMenu: false, }, + [NodeKind.InsightPersonsQuery]: { + name: 'Persons', + description: 'List of persons matching specified conditions, derived from an insight', + icon: IconPerson, + inMenu: false, + }, [NodeKind.DataTableNode]: { name: 'Data table', description: 'Slice and dice your data in a table', diff --git a/frontend/src/scenes/trends/viz/ActionsLineGraph.tsx b/frontend/src/scenes/trends/viz/ActionsLineGraph.tsx index 4da7d2cbad9c6..bb26ecec52e83 100644 --- a/frontend/src/scenes/trends/viz/ActionsLineGraph.tsx +++ b/frontend/src/scenes/trends/viz/ActionsLineGraph.tsx @@ -9,6 +9,11 @@ import { urlsForDatasets } from '../persons-modal/persons-modal-utils' import { DateDisplay } from 'lib/components/DateDisplay' import { PropertyKeyInfo } from 'lib/components/PropertyKeyInfo' import { trendsDataLogic } from '../trendsDataLogic' +import { insightDataLogic } from 'scenes/insights/insightDataLogic' +import { isInsightVizNode, isLifecycleQuery } from '~/queries/utils' +import { DataTableNode, NodeKind } from '~/queries/schema' +import { combineUrl, router } from 'kea-router' +import { urls } from 'scenes/urls' export function ActionsLineGraph({ inSharedMode = false, @@ -16,6 +21,7 @@ export function ActionsLineGraph({ context, }: ChartParams): JSX.Element | null { const { insightProps, hiddenLegendKeys } = useValues(insightLogic) + const { query } = useValues(insightDataLogic(insightProps)) const { indexedResults, labelGroupType, @@ -76,13 +82,31 @@ export function ActionsLineGraph({ const day = dataset?.days?.[index] ?? '' const label = dataset?.label ?? dataset?.labels?.[index] ?? '' + if (isLifecycle && query && isInsightVizNode(query) && isLifecycleQuery(query.source)) { + const newQuery: DataTableNode = { + kind: NodeKind.DataTableNode, + full: true, + source: { + kind: NodeKind.PersonsQuery, + source: { + kind: NodeKind.InsightPersonsQuery, + source: query.source, + day, + status: dataset.status, + }, + }, + } + router.actions.push(combineUrl(urls.persons(), undefined, { q: newQuery }).url) + return + } + if (!dataset) { return } - const urls = urlsForDatasets(crossDataset, index) + const datasetUrls = urlsForDatasets(crossDataset, index) - if (urls?.length) { + if (datasetUrls?.length) { const title = isStickiness ? ( <> stickiness on day {day} @@ -97,7 +121,7 @@ export function ActionsLineGraph({ ) openPersonsModal({ - urls, + urls: datasetUrls, urlsIndex: crossDataset?.findIndex((x) => x.id === dataset.id) || 0, title, }) diff --git a/posthog/hogql_queries/insights/insight_persons_query_runner.py b/posthog/hogql_queries/insights/insight_persons_query_runner.py new file mode 100644 index 0000000000000..9f03fa061d891 --- /dev/null +++ b/posthog/hogql_queries/insights/insight_persons_query_runner.py @@ -0,0 +1,59 @@ +from datetime import timedelta +from typing import Dict, Optional, Any, cast + +from posthog.hogql import ast +from posthog.hogql.query import execute_hogql_query +from posthog.hogql.timings import HogQLTimings +from posthog.hogql_queries.insights.lifecycle_query_runner import LifecycleQueryRunner +from posthog.hogql_queries.query_runner import QueryRunner, get_query_runner +from posthog.models import Team +from posthog.models.filters.mixins.utils import cached_property +from posthog.schema import InsightPersonsQuery, HogQLQueryResponse + + +class InsightPersonsQueryRunner(QueryRunner): + query: InsightPersonsQuery + query_type = InsightPersonsQuery + + def __init__( + self, + query: InsightPersonsQuery | Dict[str, Any], + team: Team, + timings: Optional[HogQLTimings] = None, + in_export_context: Optional[bool] = False, + ): + super().__init__(query, team, timings, in_export_context) + if isinstance(query, InsightPersonsQuery): + self.query = query + else: + self.query = InsightPersonsQuery.model_validate(query) + + @cached_property + def source_runner(self) -> QueryRunner: + return get_query_runner(self.query.source, self.team, self.timings, self.in_export_context) + + def to_query(self) -> ast.SelectQuery: + if isinstance(self.source_runner, LifecycleQueryRunner): + lifecycle_runner = cast(LifecycleQueryRunner, self.source_runner) + day = self.query.day + status = self.query.status + return lifecycle_runner.to_persons_query(day=day, status=status) + + raise ValueError(f"Cannot convert source query of type {self.query.source.kind} to persons query") + + def to_persons_query(self) -> ast.SelectQuery: + return self.to_query() + + def calculate(self) -> HogQLQueryResponse: + return execute_hogql_query( + query_type="InsightPersonsQuery", + query=self.to_query(), + team=self.team, + timings=self.timings, + ) + + def _is_stale(self, cached_result_package): + return True + + def _refresh_frequency(self): + return timedelta(minutes=1) diff --git a/posthog/hogql_queries/insights/lifecycle_query_runner.py b/posthog/hogql_queries/insights/lifecycle_query_runner.py index 87a8a345a8462..49d85e094ed48 100644 --- a/posthog/hogql_queries/insights/lifecycle_query_runner.py +++ b/posthog/hogql_queries/insights/lifecycle_query_runner.py @@ -87,17 +87,34 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: ) return lifecycle_query - def to_persons_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: - # TODO: add support for selecting and filtering by breakdowns + def to_persons_query( + self, day: Optional[str] = None, status: Optional[str] = None + ) -> ast.SelectQuery | ast.SelectUnionQuery: with self.timings.measure("persons_query"): + exprs = [] + if day is not None: + exprs.append( + ast.CompareOperation( + op=ast.CompareOperationOp.Eq, + left=ast.Field(chain=["start_of_period"]), + right=ast.Constant(value=day), + ) + ) + if status is not None: + exprs.append( + ast.CompareOperation( + op=ast.CompareOperationOp.Eq, + left=ast.Field(chain=["status"]), + right=ast.Constant(value=status), + ) + ) + return parse_select( - """ - SELECT - person_id --, start_of_period as breakdown_1, status as breakdown_2 - FROM - {events_query} - """, - placeholders={"events_query": self.events_query}, + "SELECT person_id FROM {events_query} WHERE {where}", + placeholders={ + "events_query": self.events_query, + "where": ast.And(exprs=exprs) if len(exprs) > 0 else ast.Constant(value=1), + }, ) def calculate(self): diff --git a/posthog/hogql_queries/insights/test/test_insight_persons_query_runner.py b/posthog/hogql_queries/insights/test/test_insight_persons_query_runner.py new file mode 100644 index 0000000000000..51c39bc0008e9 --- /dev/null +++ b/posthog/hogql_queries/insights/test/test_insight_persons_query_runner.py @@ -0,0 +1,85 @@ +from typing import Dict, Any + +from freezegun import freeze_time + +from posthog.hogql import ast +from posthog.hogql.query import execute_hogql_query +from posthog.test.base import ( + APIBaseTest, + ClickhouseTestMixin, + _create_event, + _create_person, +) + + +class TestInsightPersonsQueryRunner(ClickhouseTestMixin, APIBaseTest): + maxDiff = None + + def _create_events(self, data, event="$pageview"): + person_result = [] + for id, timestamps in data: + with freeze_time(timestamps[0]): + person_result.append( + _create_person( + team_id=self.team.pk, + distinct_ids=[id], + properties={ + "name": id, + **({"email": "test@posthog.com"} if id == "p1" else {}), + }, + ) + ) + for timestamp in timestamps: + _create_event(team=self.team, event=event, distinct_id=id, timestamp=timestamp) + return person_result + + def _create_test_events(self): + self._create_events( + data=[ + ( + "p1", + [ + "2020-01-11T12:00:00Z", + "2020-01-12T12:00:00Z", + "2020-01-13T12:00:00Z", + "2020-01-15T12:00:00Z", + "2020-01-17T12:00:00Z", + "2020-01-19T12:00:00Z", + ], + ), + ("p2", ["2020-01-09T12:00:00Z", "2020-01-12T12:00:00Z"]), + ("p3", ["2020-01-12T12:00:00Z"]), + ("p4", ["2020-01-15T12:00:00Z"]), + ] + ) + + def select(self, query: str, placeholders: Dict[str, Any]): + return execute_hogql_query( + query=query, + team=self.team, + placeholders=placeholders, + ) + + def test_insight_persons_lifecycle_query(self): + self._create_test_events() + + date_from = "2020-01-09" + date_to = "2020-01-19" + + response = self.select( + """ + select * from ( + + + } + series={[]} + /> + + + ) + """, + {"date_from": ast.Constant(value=date_from), "date_to": ast.Constant(value=date_to)}, + ) + + self.assertEqual([("p1",)], response.results) diff --git a/posthog/hogql_queries/persons_query_runner.py b/posthog/hogql_queries/persons_query_runner.py index d597f4bab1c2a..34c86ee13300b 100644 --- a/posthog/hogql_queries/persons_query_runner.py +++ b/posthog/hogql_queries/persons_query_runner.py @@ -192,11 +192,11 @@ def to_query(self) -> ast.SelectQuery: elif "count()" in self.input_columns(): order_by = [ast.OrderExpr(expr=parse_expr("count()"), order="DESC")] elif len(aggregations) > 0: - order_by = [ast.OrderExpr(expr=aggregations[0], order="DESC")] + order_by = [ast.OrderExpr(expr=self._remove_aliases(aggregations[0]), order="DESC")] elif "created_at" in self.input_columns(): order_by = [ast.OrderExpr(expr=ast.Field(chain=["created_at"]), order="DESC")] elif len(columns) > 0: - order_by = [ast.OrderExpr(expr=columns[0], order="ASC")] + order_by = [ast.OrderExpr(expr=self._remove_aliases(columns[0]), order="ASC")] else: order_by = [] @@ -227,3 +227,8 @@ def _is_stale(self, cached_result_package): def _refresh_frequency(self): return timedelta(minutes=1) + + def _remove_aliases(self, node: ast.Expr) -> ast.Expr: + if isinstance(node, ast.Alias): + return self._remove_aliases(node.expr) + return node diff --git a/posthog/hogql_queries/query_runner.py b/posthog/hogql_queries/query_runner.py index fe10fdbbba156..8f0656e7922bc 100644 --- a/posthog/hogql_queries/query_runner.py +++ b/posthog/hogql_queries/query_runner.py @@ -26,6 +26,7 @@ EventsQuery, WebStatsTableQuery, HogQLQuery, + InsightPersonsQuery, DashboardFilter, ) from posthog.utils import generate_cache_key, get_safe_cache @@ -70,6 +71,7 @@ class CachedQueryResponse(QueryResponse): HogQLQuery, TrendsQuery, LifecycleQuery, + InsightPersonsQuery, EventsQuery, PersonsQuery, SessionsTimelineQuery, @@ -80,7 +82,7 @@ class CachedQueryResponse(QueryResponse): def get_query_runner( - query: Dict[str, Any] | RunnableQueryNode, + query: Dict[str, Any] | RunnableQueryNode | BaseModel, team: Team, timings: Optional[HogQLTimings] = None, in_export_context: Optional[bool] = False, @@ -89,7 +91,9 @@ def get_query_runner( if isinstance(query, dict): kind = query.get("kind", None) elif hasattr(query, "kind"): - kind = query.kind + kind = query.kind # type: ignore + else: + raise ValueError(f"Can't get a runner for an unknown query type: {query}") if kind == "LifecycleQuery": from .insights.lifecycle_query_runner import LifecycleQueryRunner @@ -127,6 +131,15 @@ def get_query_runner( timings=timings, in_export_context=in_export_context, ) + if kind == "InsightPersonsQuery": + from .insights.insight_persons_query_runner import InsightPersonsQueryRunner + + return InsightPersonsQueryRunner( + query=cast(InsightPersonsQuery | Dict[str, Any], query), + team=team, + timings=timings, + in_export_context=in_export_context, + ) if kind == "HogQLQuery": from .hogql_query_runner import HogQLQueryRunner @@ -169,7 +182,7 @@ class QueryRunner(ABC): def __init__( self, - query: RunnableQueryNode | Dict[str, Any], + query: RunnableQueryNode | BaseModel | Dict[str, Any], team: Team, timings: Optional[HogQLTimings] = None, in_export_context: Optional[bool] = False, diff --git a/posthog/hogql_queries/test/test_persons_query_runner.py b/posthog/hogql_queries/test/test_persons_query_runner.py index 7460d8cd728b7..a5f09e3c6619f 100644 --- a/posthog/hogql_queries/test/test_persons_query_runner.py +++ b/posthog/hogql_queries/test/test_persons_query_runner.py @@ -12,6 +12,7 @@ DateRange, EventsNode, IntervalType, + InsightPersonsQuery, ) from posthog.test.base import ( APIBaseTest, @@ -152,6 +153,13 @@ def test_persons_query_order_by(self): results = runner.calculate().results self.assertEqual(results[0], [f"jacob9@{self.random_uuid}.posthog.com"]) + def test_persons_query_order_by_with_aliases(self): + # We use the first column by default as an order key. It used to cause "error redefining alias" errors. + self.random_uuid = self._create_random_persons() + runner = self._create_runner(PersonsQuery(select=["properties.email as email"])) + results = runner.calculate().results + self.assertEqual(results[0], [f"jacob0@{self.random_uuid}.posthog.com"]) + def test_persons_query_limit(self): self.random_uuid = self._create_random_persons() runner = self._create_runner( @@ -204,7 +212,7 @@ def test_source_lifecycle_query(self): query = PersonsQuery( select=["properties.email"], orderBy=["properties.email DESC"], - source=source_query, + source=InsightPersonsQuery(source=source_query), ) runner = self._create_runner(query) response = runner.calculate() diff --git a/posthog/schema.py b/posthog/schema.py index 58f4e1dfd5756..c4b33e70eb11a 100644 --- a/posthog/schema.py +++ b/posthog/schema.py @@ -338,6 +338,7 @@ class NodeKind(str, Enum): PathsQuery = "PathsQuery" StickinessQuery = "StickinessQuery" LifecycleQuery = "LifecycleQuery" + InsightPersonsQuery = "InsightPersonsQuery" WebOverviewQuery = "WebOverviewQuery" WebTopClicksQuery = "WebTopClicksQuery" WebStatsTableQuery = "WebStatsTableQuery" @@ -1697,6 +1698,36 @@ class PathsQuery(BaseModel): samplingFactor: Optional[float] = Field(default=None, description="Sampling rate") +class InsightVizNode(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + embedded: Optional[bool] = Field(default=None, description="Query is embedded inside another bordered component") + full: Optional[bool] = Field( + default=None, description="Show with most visual options enabled. Used in insight scene." + ) + kind: Literal["InsightVizNode"] = "InsightVizNode" + showCorrelationTable: Optional[bool] = None + showFilters: Optional[bool] = None + showHeader: Optional[bool] = None + showLastComputation: Optional[bool] = None + showLastComputationRefresh: Optional[bool] = None + showResults: Optional[bool] = None + showTable: Optional[bool] = None + source: Union[TrendsQuery, FunnelsQuery, RetentionQuery, PathsQuery, StickinessQuery, LifecycleQuery] + + +class InsightPersonsQuery(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + day: Optional[str] = None + kind: Literal["InsightPersonsQuery"] = "InsightPersonsQuery" + response: Optional[PersonsQueryResponse] = None + source: Union[TrendsQuery, FunnelsQuery, RetentionQuery, PathsQuery, StickinessQuery, LifecycleQuery] + status: Optional[str] = None + + class PersonsQuery(BaseModel): model_config = ConfigDict( extra="forbid", @@ -1740,7 +1771,7 @@ class PersonsQuery(BaseModel): response: Optional[PersonsQueryResponse] = Field(default=None, description="Cached query response") search: Optional[str] = None select: Optional[List[str]] = None - source: Optional[Union[LifecycleQuery, HogQLQuery]] = None + source: Optional[Union[InsightPersonsQuery, HogQLQuery]] = None class DataTableNode(BaseModel): @@ -1799,25 +1830,6 @@ class DataTableNode(BaseModel): ] = Field(..., description="Source of the events") -class InsightVizNode(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - embedded: Optional[bool] = Field(default=None, description="Query is embedded inside another bordered component") - full: Optional[bool] = Field( - default=None, description="Show with most visual options enabled. Used in insight scene." - ) - kind: Literal["InsightVizNode"] = "InsightVizNode" - showCorrelationTable: Optional[bool] = None - showFilters: Optional[bool] = None - showHeader: Optional[bool] = None - showLastComputation: Optional[bool] = None - showLastComputationRefresh: Optional[bool] = None - showResults: Optional[bool] = None - showTable: Optional[bool] = None - source: Union[TrendsQuery, FunnelsQuery, RetentionQuery, PathsQuery, StickinessQuery, LifecycleQuery] - - class QuerySchema(RootModel): root: Union[ DataTableNode, @@ -1838,6 +1850,7 @@ class QuerySchema(RootModel): TimeToSeeDataSessionsQuery, EventsQuery, PersonsQuery, + InsightPersonsQuery, SessionsTimelineQuery, HogQLQuery, HogQLMetadata, From ac2e49de9abcf6ae5f5c501b067bbbe8ea3864ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Fri, 27 Oct 2023 18:39:23 +0200 Subject: [PATCH 7/8] fix(postgres-batch-exports): The correct sslmode is disable (#18252) --- posthog/temporal/workflows/postgres_batch_export.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/posthog/temporal/workflows/postgres_batch_export.py b/posthog/temporal/workflows/postgres_batch_export.py index f47684242df6b..1844742880876 100644 --- a/posthog/temporal/workflows/postgres_batch_export.py +++ b/posthog/temporal/workflows/postgres_batch_export.py @@ -36,9 +36,9 @@ def postgres_connection(inputs): port=inputs.port, # The 'hasSelfSignedCert' parameter in the postgres-plugin was provided mainly # for users of Heroku and RDS. It was used to set 'rejectUnauthorized' to false if a self-signed cert was used. - # Mapping this to sslmode is not straight-forward, but going by Heroku's recommendation (see below) we should use 'no-verify'. + # Mapping this to sslmode is not straight-forward, but going by Heroku's recommendation (see below) we should use 'disable'. # Reference: https://devcenter.heroku.com/articles/connecting-heroku-postgres#connecting-in-node-js - sslmode="no-verify" if inputs.has_self_signed_cert is True else "prefer", + sslmode="disable" if inputs.has_self_signed_cert is True else "prefer", ) try: From 44e49cf06d850c5db4f45ce2b7df80e43f43f55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Fri, 27 Oct 2023 19:23:02 +0200 Subject: [PATCH 8/8] fix(postgres-batch-exports): Account for schema being empty string (#18254) --- posthog/temporal/workflows/postgres_batch_export.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/posthog/temporal/workflows/postgres_batch_export.py b/posthog/temporal/workflows/postgres_batch_export.py index 1844742880876..3c19c8eae8998 100644 --- a/posthog/temporal/workflows/postgres_batch_export.py +++ b/posthog/temporal/workflows/postgres_batch_export.py @@ -57,7 +57,8 @@ def copy_tsv_to_postgres(tsv_file, postgres_connection, schema: str, table_name: tsv_file.seek(0) with postgres_connection.cursor() as cursor: - cursor.execute(sql.SQL("SET search_path TO {schema}").format(schema=sql.Identifier(schema))) + if schema: + cursor.execute(sql.SQL("SET search_path TO {schema}").format(schema=sql.Identifier(schema))) cursor.copy_from( tsv_file, table_name, @@ -128,6 +129,11 @@ async def insert_into_postgres_activity(inputs: PostgresInsertInputs): ) with postgres_connection(inputs) as connection: with connection.cursor() as cursor: + if inputs.schema: + table_identifier = sql.Identifier(inputs.schema, inputs.table_name) + else: + table_identifier = sql.Identifier(inputs.table_name) + result = cursor.execute( sql.SQL( """ @@ -145,7 +151,7 @@ async def insert_into_postgres_activity(inputs: PostgresInsertInputs): "timestamp" TIMESTAMP WITH TIME ZONE ) """ - ).format(sql.Identifier(inputs.schema, inputs.table_name)) + ).format(table_identifier) ) schema_columns = [