From 3e45d8ae83fbda518e0becf160ea2ef63c9d3590 Mon Sep 17 00:00:00 2001 From: Zach Waterfield Date: Thu, 5 Dec 2024 07:57:30 -0500 Subject: [PATCH 01/12] chore: type updates for rbac (#26647) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- frontend/src/lib/api.mock.ts | 1 + frontend/src/lib/api.ts | 25 +++++- frontend/src/models/dashboardsModel.tsx | 29 +++---- .../scenes/authentication/login2FALogic.ts | 2 +- .../src/scenes/authentication/loginLogic.ts | 4 +- .../scenes/authentication/setup2FALogic.ts | 6 +- .../FeatureFlagCodeInstructions.stories.tsx | 1 + .../feature-flags/activityDescriptions.tsx | 1 + .../scenes/feature-flags/featureFlagLogic.ts | 1 + .../instance/SystemStatus/staffUsersLogic.ts | 5 +- .../notebook-template-for-snapshot.ts | 1 + .../Notebook/migrations/migrate.test.ts | 2 + .../notebooks/Notebook/notebookLogic.ts | 1 + .../NotebookTemplates/notebookTemplates.ts | 1 + frontend/src/scenes/projectLogic.ts | 4 +- .../verifiedDomainsLogic.test.ts.snap | 1 + .../VerifiedDomains/verifiedDomainsLogic.ts | 21 ++--- .../settings/organization/inviteLogic.ts | 15 +++- frontend/src/scenes/teamActivityDescriber.tsx | 1 + frontend/src/scenes/userLogic.ts | 8 +- frontend/src/types.ts | 76 ++++++++++++++----- 21 files changed, 145 insertions(+), 61 deletions(-) diff --git a/frontend/src/lib/api.mock.ts b/frontend/src/lib/api.mock.ts index 0dacdcfa745546..e6dac16290e920 100644 --- a/frontend/src/lib/api.mock.ts +++ b/frontend/src/lib/api.mock.ts @@ -84,6 +84,7 @@ export const MOCK_DEFAULT_TEAM: TeamType = { autocapture_web_vitals_opt_in: false, autocapture_exceptions_errors_to_ignore: [], effective_membership_level: OrganizationMembershipLevel.Admin, + user_access_level: 'admin', access_control: true, has_group_types: true, primary_dashboard: 1, diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 7be5df3d764d69..81587232b3b077 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -921,6 +921,10 @@ class ApiRequest { return await api.update(this.assembleFullUrl(), options?.data, options) } + public async put(options?: ApiMethodOptions & { data: any }): Promise { + return await api.put(this.assembleFullUrl(), options?.data, options) + } + public async create(options?: ApiMethodOptions & { data: any }): Promise { return await api.create(this.assembleFullUrl(), options?.data, options) } @@ -2554,14 +2558,19 @@ const api = { }) }, - async update(url: string, data: any, options?: ApiMethodOptions): Promise { + async _update( + method: 'PATCH' | 'PUT', + url: string, + data: P, + options?: ApiMethodOptions + ): Promise { url = prepareUrl(url) ensureProjectIdNotInvalid(url) const isFormData = data instanceof FormData - const response = await handleFetch(url, 'PATCH', async () => { + const response = await handleFetch(url, method, async () => { return await fetch(url, { - method: 'PATCH', + method: method, headers: { ...objectClean(options?.headers ?? {}), ...(isFormData ? {} : { 'Content-Type': 'application/json' }), @@ -2576,7 +2585,15 @@ const api = { return await getJSONOrNull(response) }, - async create(url: string, data?: any, options?: ApiMethodOptions): Promise { + async update(url: string, data: P, options?: ApiMethodOptions): Promise { + return api._update('PATCH', url, data, options) + }, + + async put(url: string, data: P, options?: ApiMethodOptions): Promise { + return api._update('PUT', url, data, options) + }, + + async create(url: string, data?: P, options?: ApiMethodOptions): Promise { const res = await api.createResponse(url, data, options) return await getJSONOrNull(res) }, diff --git a/frontend/src/models/dashboardsModel.tsx b/frontend/src/models/dashboardsModel.tsx index 99c4cdf01ea96f..2c23d08675c2a0 100644 --- a/frontend/src/models/dashboardsModel.tsx +++ b/frontend/src/models/dashboardsModel.tsx @@ -114,10 +114,10 @@ export const dashboardsModel = kea([ const beforeChange = { ...values.rawDashboards[id] } - const response = (await api.update( + const response = await api.update( `api/environments/${teamLogic.values.currentTeamId}/dashboards/${id}`, payload - )) as DashboardType + ) const updatedAttribute = Object.keys(payload)[0] if (updatedAttribute === 'name' || updatedAttribute === 'description' || updatedAttribute === 'tags') { eventUsageLogic.actions.reportDashboardFrontEndUpdate( @@ -134,10 +134,10 @@ export const dashboardsModel = kea([ button: { label: 'Undo', action: async () => { - const reverted = (await api.update( + const reverted = await api.update( `api/environments/${teamLogic.values.currentTeamId}/dashboards/${id}`, beforeChange - )) as DashboardType + ) actions.updateDashboardSuccess(getQueryBasedDashboard(reverted)) lemonToast.success('Dashboard change reverted') }, @@ -160,31 +160,34 @@ export const dashboardsModel = kea([ }) ) as DashboardType, pinDashboard: async ({ id, source }) => { - const response = (await api.update( + const response = await api.update( `api/environments/${teamLogic.values.currentTeamId}/dashboards/${id}`, { pinned: true, } - )) as DashboardType + ) eventUsageLogic.actions.reportDashboardPinToggled(true, source) return getQueryBasedDashboard(response)! }, unpinDashboard: async ({ id, source }) => { - const response = (await api.update( + const response = await api.update( `api/environments/${teamLogic.values.currentTeamId}/dashboards/${id}`, { pinned: false, } - )) as DashboardType + ) eventUsageLogic.actions.reportDashboardPinToggled(false, source) return getQueryBasedDashboard(response)! }, duplicateDashboard: async ({ id, name, show, duplicateTiles }) => { - const result = (await api.create(`api/environments/${teamLogic.values.currentTeamId}/dashboards/`, { - use_dashboard: id, - name: `${name} (Copy)`, - duplicate_tiles: duplicateTiles, - })) as DashboardType + const result = await api.create( + `api/environments/${teamLogic.values.currentTeamId}/dashboards/`, + { + use_dashboard: id, + name: `${name} (Copy)`, + duplicate_tiles: duplicateTiles, + } + ) if (show) { router.actions.push(urls.dashboard(result.id)) } diff --git a/frontend/src/scenes/authentication/login2FALogic.ts b/frontend/src/scenes/authentication/login2FALogic.ts index 6232f6225312a2..6b6e63cde3f5f8 100644 --- a/frontend/src/scenes/authentication/login2FALogic.ts +++ b/frontend/src/scenes/authentication/login2FALogic.ts @@ -54,7 +54,7 @@ export const login2FALogic = kea([ submit: async ({ token }, breakpoint) => { breakpoint() try { - return await api.create('api/login/token', { token }) + return await api.create('api/login/token', { token }) } catch (e) { const { code, detail } = e as Record actions.setGeneralError(code, detail) diff --git a/frontend/src/scenes/authentication/loginLogic.ts b/frontend/src/scenes/authentication/loginLogic.ts index 19d73edc00158e..6ace53926171f9 100644 --- a/frontend/src/scenes/authentication/loginLogic.ts +++ b/frontend/src/scenes/authentication/loginLogic.ts @@ -86,7 +86,7 @@ export const loginLogic = kea([ } breakpoint() - const response = await api.create('api/login/precheck', { email }) + const response = await api.create('api/login/precheck', { email }) return { status: 'completed', ...response } }, }, @@ -102,7 +102,7 @@ export const loginLogic = kea([ submit: async ({ email, password }, breakpoint) => { breakpoint() try { - return await api.create('api/login', { email, password }) + return await api.create('api/login', { email, password }) } catch (e) { const { code } = e as Record let { detail } = e as Record diff --git a/frontend/src/scenes/authentication/setup2FALogic.ts b/frontend/src/scenes/authentication/setup2FALogic.ts index 7ea0f4a4985106..03b7a4957a4f4a 100644 --- a/frontend/src/scenes/authentication/setup2FALogic.ts +++ b/frontend/src/scenes/authentication/setup2FALogic.ts @@ -86,7 +86,7 @@ export const setup2FALogic = kea([ null as { backup_codes: string[] } | null, { generateBackupCodes: async () => { - return await api.create('api/users/@me/two_factor_backup_codes/') + return await api.create('api/users/@me/two_factor_backup_codes/') }, }, ], @@ -95,7 +95,7 @@ export const setup2FALogic = kea([ { disable2FA: async () => { try { - await api.create('api/users/@me/two_factor_disable/') + await api.create('api/users/@me/two_factor_disable/') return true } catch (e) { const { code, detail } = e as Record @@ -114,7 +114,7 @@ export const setup2FALogic = kea([ submit: async ({ token }, breakpoint) => { breakpoint() try { - return await api.create('api/users/@me/validate_2fa/', { token }) + return await api.create('api/users/@me/validate_2fa/', { token }) } catch (e) { const { code, detail } = e as Record actions.setGeneralError(code, detail) diff --git a/frontend/src/scenes/feature-flags/FeatureFlagCodeInstructions.stories.tsx b/frontend/src/scenes/feature-flags/FeatureFlagCodeInstructions.stories.tsx index 0c5bc5df8edff1..2878e8887e4c83 100644 --- a/frontend/src/scenes/feature-flags/FeatureFlagCodeInstructions.stories.tsx +++ b/frontend/src/scenes/feature-flags/FeatureFlagCodeInstructions.stories.tsx @@ -29,6 +29,7 @@ const REGULAR_FEATURE_FLAG: FeatureFlagType = { rollback_conditions: [], performed_rollback: false, can_edit: true, + user_access_level: 'editor', tags: [], surveys: [], } diff --git a/frontend/src/scenes/feature-flags/activityDescriptions.tsx b/frontend/src/scenes/feature-flags/activityDescriptions.tsx index 93fec0692b0c34..a85f73cde21ad7 100644 --- a/frontend/src/scenes/feature-flags/activityDescriptions.tsx +++ b/frontend/src/scenes/feature-flags/activityDescriptions.tsx @@ -252,6 +252,7 @@ const featureFlagActionsMapping: Record< analytics_dashboards: () => null, has_enriched_analytics: () => null, surveys: () => null, + user_access_level: () => null, } export function flagActivityDescriber(logItem: ActivityLogItem, asNotification?: boolean): HumanizedChange { diff --git a/frontend/src/scenes/feature-flags/featureFlagLogic.ts b/frontend/src/scenes/feature-flags/featureFlagLogic.ts index 48889df0f3d63e..3f73931970c85c 100644 --- a/frontend/src/scenes/feature-flags/featureFlagLogic.ts +++ b/frontend/src/scenes/feature-flags/featureFlagLogic.ts @@ -96,6 +96,7 @@ const NEW_FLAG: FeatureFlagType = { surveys: null, performed_rollback: false, can_edit: true, + user_access_level: 'editor', tags: [], } const NEW_VARIANT = { diff --git a/frontend/src/scenes/instance/SystemStatus/staffUsersLogic.ts b/frontend/src/scenes/instance/SystemStatus/staffUsersLogic.ts index 51054ab2fa8ac7..3ac34a80e733b6 100644 --- a/frontend/src/scenes/instance/SystemStatus/staffUsersLogic.ts +++ b/frontend/src/scenes/instance/SystemStatus/staffUsersLogic.ts @@ -33,8 +33,7 @@ export const staffUsersLogic = kea([ actions.setStaffUsersToBeAdded([]) const newStaffUsers = await Promise.all( staffUsersToBeAdded.map( - async (userUuid) => - (await api.update(`api/users/${userUuid}`, { is_staff: true })) as UserType + async (userUuid) => await api.update(`api/users/${userUuid}`, { is_staff: true }) ) ) const updatedAllUsers: UserType[] = [ @@ -45,7 +44,7 @@ export const staffUsersLogic = kea([ return updatedAllUsers }, deleteStaffUser: async ({ userUuid }) => { - await api.update(`api/users/${userUuid}`, { is_staff: false }) + await api.update(`api/users/${userUuid}`, { is_staff: false }) if (values.user?.uuid === userUuid) { actions.loadUser() // Loads the main user object to properly reflect staff user changes router.actions.push(urls.projectHomepage()) diff --git a/frontend/src/scenes/notebooks/Notebook/__mocks__/notebook-template-for-snapshot.ts b/frontend/src/scenes/notebooks/Notebook/__mocks__/notebook-template-for-snapshot.ts index 175647c05a7a62..e1cdf46446ef81 100644 --- a/frontend/src/scenes/notebooks/Notebook/__mocks__/notebook-template-for-snapshot.ts +++ b/frontend/src/scenes/notebooks/Notebook/__mocks__/notebook-template-for-snapshot.ts @@ -14,6 +14,7 @@ export const notebookTestTemplate = ( last_modified_at: '2023-06-02T00:00:00Z', created_by: MOCK_DEFAULT_BASIC_USER, last_modified_by: MOCK_DEFAULT_BASIC_USER, + user_access_level: 'editor' as const, version: 1, content: { type: 'doc', diff --git a/frontend/src/scenes/notebooks/Notebook/migrations/migrate.test.ts b/frontend/src/scenes/notebooks/Notebook/migrations/migrate.test.ts index d1409e1716f6da..2dd7b6aa1915de 100644 --- a/frontend/src/scenes/notebooks/Notebook/migrations/migrate.test.ts +++ b/frontend/src/scenes/notebooks/Notebook/migrations/migrate.test.ts @@ -933,10 +933,12 @@ describe('migrate()', () => { it.each(contentToExpected)('migrates %s', (_name, prevContent, nextContent) => { const prevNotebook: NotebookType = { ...mockNotebook, + user_access_level: 'editor' as const, content: { type: 'doc', content: prevContent }, } const nextNotebook: NotebookType = { ...mockNotebook, + user_access_level: 'editor' as const, content: { type: 'doc', content: nextContent }, } diff --git a/frontend/src/scenes/notebooks/Notebook/notebookLogic.ts b/frontend/src/scenes/notebooks/Notebook/notebookLogic.ts index 5b9396ecdc94b8..bc0593c22bff30 100644 --- a/frontend/src/scenes/notebooks/Notebook/notebookLogic.ts +++ b/frontend/src/scenes/notebooks/Notebook/notebookLogic.ts @@ -232,6 +232,7 @@ export const notebookLogic = kea([ content: null, text_content: null, version: 0, + user_access_level: 'editor', } } else if (props.shortId.startsWith('template-')) { response = diff --git a/frontend/src/scenes/notebooks/NotebookTemplates/notebookTemplates.ts b/frontend/src/scenes/notebooks/NotebookTemplates/notebookTemplates.ts index f1c63fe1336740..7206f48eaf4a42 100644 --- a/frontend/src/scenes/notebooks/NotebookTemplates/notebookTemplates.ts +++ b/frontend/src/scenes/notebooks/NotebookTemplates/notebookTemplates.ts @@ -19,6 +19,7 @@ export const LOCAL_NOTEBOOK_TEMPLATES: NotebookType[] = [ last_modified_at: '2023-06-02T00:00:00Z', created_by: TEMPLATE_USERS.posthog, last_modified_by: TEMPLATE_USERS.posthog, + user_access_level: 'viewer' as const, version: 1, content: { type: 'doc', diff --git a/frontend/src/scenes/projectLogic.ts b/frontend/src/scenes/projectLogic.ts index d2b71d5f5e35e8..b9d29ff625136d 100644 --- a/frontend/src/scenes/projectLogic.ts +++ b/frontend/src/scenes/projectLogic.ts @@ -52,10 +52,10 @@ export const projectLogic = kea([ throw new Error('Current project has not been loaded yet, so it cannot be updated!') } - const patchedProject = (await api.update( + const patchedProject = await api.update( `api/projects/${values.currentProject.id}`, payload - )) as ProjectType + ) breakpoint() // We need to reload current org (which lists its projects) in organizationLogic AND in userLogic diff --git a/frontend/src/scenes/settings/organization/VerifiedDomains/__snapshots__/verifiedDomainsLogic.test.ts.snap b/frontend/src/scenes/settings/organization/VerifiedDomains/__snapshots__/verifiedDomainsLogic.test.ts.snap index 01691f96754511..47c205486a7e84 100644 --- a/frontend/src/scenes/settings/organization/VerifiedDomains/__snapshots__/verifiedDomainsLogic.test.ts.snap +++ b/frontend/src/scenes/settings/organization/VerifiedDomains/__snapshots__/verifiedDomainsLogic.test.ts.snap @@ -115,6 +115,7 @@ exports[`verifiedDomainsLogic values has proper defaults 1`] = ` "test_account_filters_default_checked": false, "timezone": "UTC", "updated_at": "2022-03-17T16:09:21.566253Z", + "user_access_level": "admin", "uuid": "TEAM_UUID", }, ], diff --git a/frontend/src/scenes/settings/organization/VerifiedDomains/verifiedDomainsLogic.ts b/frontend/src/scenes/settings/organization/VerifiedDomains/verifiedDomainsLogic.ts index de997f5d7b1cc9..90ad7dc2d04358 100644 --- a/frontend/src/scenes/settings/organization/VerifiedDomains/verifiedDomainsLogic.ts +++ b/frontend/src/scenes/settings/organization/VerifiedDomains/verifiedDomainsLogic.ts @@ -78,9 +78,12 @@ export const verifiedDomainsLogic = kea([ (await api.get(`api/organizations/${values.currentOrganization?.id}/domains`)) .results as OrganizationDomainType[], addVerifiedDomain: async (domain: string) => { - const response = await api.create(`api/organizations/${values.currentOrganization?.id}/domains`, { - domain, - }) + const response = await api.create( + `api/organizations/${values.currentOrganization?.id}/domains`, + { + domain, + } + ) return [response, ...values.verifiedDomains] }, deleteVerifiedDomain: async (id: string) => { @@ -93,18 +96,18 @@ export const verifiedDomainsLogic = kea([ false, { updateDomain: async (payload: OrganizationDomainUpdatePayload) => { - const response = await api.update( + const response = await api.update( `api/organizations/${values.currentOrganization?.id}/domains/${payload.id}`, { ...payload, id: undefined } ) lemonToast.success('Domain updated successfully! Changes will take immediately.') - actions.replaceDomain(response as OrganizationDomainType) + actions.replaceDomain(response) return false }, verifyDomain: async () => { - const response = (await api.create( + const response = await api.create( `api/organizations/${values.currentOrganization?.id}/domains/${values.verifyModal}/verify` - )) as OrganizationDomainType + ) if (response.is_verified) { lemonToast.success('Domain verified successfully.') } else { @@ -158,12 +161,12 @@ export const verifiedDomainsLogic = kea([ if (!id) { return } - const response = (await api.update( + const response = await api.update( `api/organizations/${values.currentOrganization?.id}/domains/${payload.id}`, { ...updateParams, } - )) as OrganizationDomainType + ) breakpoint() actions.replaceDomain(response) actions.setConfigureSAMLModalId(null) diff --git a/frontend/src/scenes/settings/organization/inviteLogic.ts b/frontend/src/scenes/settings/organization/inviteLogic.ts index 878961f7332bf4..3492c95ab2be13 100644 --- a/frontend/src/scenes/settings/organization/inviteLogic.ts +++ b/frontend/src/scenes/settings/organization/inviteLogic.ts @@ -1,7 +1,7 @@ import { actions, connect, events, kea, listeners, path, reducers, selectors } from 'kea' import { loaders } from 'kea-loaders' import { router, urlToAction } from 'kea-router' -import api from 'lib/api' +import api, { PaginatedResponse } from 'lib/api' import { OrganizationMembershipLevel } from 'lib/constants' import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast' import { organizationLogic } from 'scenes/organizationLogic' @@ -49,7 +49,7 @@ export const inviteLogic = kea([ { inviteTeamMembers: async () => { if (!values.canSubmit) { - return { invites: [] } + return [] } const payload: Pick[] = @@ -57,7 +57,10 @@ export const inviteLogic = kea([ if (values.message) { payload.forEach((payload) => (payload.message = values.message)) } - return await api.create('api/organizations/@current/invites/bulk/', payload) + return await api.create( + 'api/organizations/@current/invites/bulk/', + payload + ) }, }, ], @@ -66,7 +69,11 @@ export const inviteLogic = kea([ { loadInvites: async () => { return organizationLogic.values.currentOrganization - ? (await api.get('api/organizations/@current/invites/')).results + ? ( + await api.get>( + 'api/organizations/@current/invites/' + ) + ).results : [] }, deleteInvite: async (invite: OrganizationInviteType) => { diff --git a/frontend/src/scenes/teamActivityDescriber.tsx b/frontend/src/scenes/teamActivityDescriber.tsx index bc08596af9a230..4bde2cf4d8e50c 100644 --- a/frontend/src/scenes/teamActivityDescriber.tsx +++ b/frontend/src/scenes/teamActivityDescriber.tsx @@ -362,6 +362,7 @@ const teamActionsMapping: Record< id: () => null, updated_at: () => null, uuid: () => null, + user_access_level: () => null, live_events_token: () => null, product_intents: () => null, } diff --git a/frontend/src/scenes/userLogic.ts b/frontend/src/scenes/userLogic.ts index 9db1e96fa8806d..a3adad1c6f50e7 100644 --- a/frontend/src/scenes/userLogic.ts +++ b/frontend/src/scenes/userLogic.ts @@ -55,7 +55,7 @@ export const userLogic = kea([ { loadUser: async () => { try { - return await api.get('api/users/@me/') + return await api.get('api/users/@me/') } catch (error: any) { console.error(error) actions.loadUserFailure(error.message) @@ -67,12 +67,13 @@ export const userLogic = kea([ throw new Error('Current user has not been loaded yet, so it cannot be updated!') } try { - const response = await api.update('api/users/@me/', user) + const response = await api.update('api/users/@me/', user) successCallback && successCallback() return response } catch (error: any) { console.error(error) actions.updateUserFailure(error.message) + return values.user } }, setUserScenePersonalisation: async ({ scene, dashboard }) => { @@ -80,13 +81,14 @@ export const userLogic = kea([ throw new Error('Current user has not been loaded yet, so it cannot be updated!') } try { - return await api.create('api/users/@me/scene_personalisation', { + return await api.create('api/users/@me/scene_personalisation', { scene, dashboard, }) } catch (error: any) { console.error(error) actions.updateUserFailure(error.message) + return values.user } }, }, diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 8ad57c8964ec92..6c9910e5481393 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -233,6 +233,10 @@ export interface ColumnConfig { active: ColumnChoice } +export type WithAccessControl = { + user_access_level: 'none' | 'member' | 'admin' | 'viewer' | 'editor' +} + interface UserBaseType { uuid: string distinct_id: string @@ -456,7 +460,7 @@ export interface ProjectBasicType { name: string } -export interface TeamBasicType { +export interface TeamBasicType extends WithAccessControl { id: number uuid: string organization: string // Organization ID @@ -494,6 +498,7 @@ export interface ProjectType extends ProjectBasicType { export interface TeamSurveyConfigType { appearance?: SurveyAppearance } + export interface TeamType extends TeamBasicType { created_at: string updated_at: string @@ -2940,7 +2945,7 @@ export interface FeatureFlagBasicType { ensure_experience_continuity: boolean | null } -export interface FeatureFlagType extends Omit { +export interface FeatureFlagType extends Omit, WithAccessControl { /** Null means that the flag has never been saved yet (it's new). */ id: number | null created_by: UserBasicType | null @@ -3831,7 +3836,6 @@ export interface RoleType { name: string feature_flags_access_level: AccessLevel members: RoleMemberType[] - associated_flags: { id: number; key: string }[] created_at: string created_by: UserBasicType | null } @@ -3840,14 +3844,6 @@ export interface RolesListParams { feature_flags_access_level?: AccessLevel } -export interface FeatureFlagAssociatedRoleType { - id: string - feature_flag: FeatureFlagType | null - role: RoleType - updated_at: string - added_at: string -} - export interface RoleMemberType { id: string user: UserBaseType @@ -3888,6 +3884,50 @@ export type APIScopeObject = | 'user' | 'webhook' +export interface AccessControlTypeBase { + created_by: UserBasicType | null + created_at: string + updated_at: string + resource: APIScopeObject + access_level: string | null // TODO: Change to enum + organization_member?: OrganizationMemberType['id'] | null + role?: RoleType['id'] | null +} + +export interface AccessControlTypeProject extends AccessControlTypeBase {} + +export interface AccessControlTypeMember extends AccessControlTypeBase { + organization_member: OrganizationMemberType['id'] +} + +export interface AccessControlTypeRole extends AccessControlTypeBase { + role: RoleType['id'] +} + +export type AccessControlType = AccessControlTypeProject | AccessControlTypeMember | AccessControlTypeRole + +export type AccessControlUpdateType = Pick & { + resource?: AccessControlType['resource'] +} + +export type AccessControlResponseType = { + access_controls: AccessControlType[] + available_access_levels: string[] // TODO: Change to enum + user_access_level: string + default_access_level: string + user_can_edit_access_levels: boolean +} + +// TODO: To be deprecated +export interface FeatureFlagAssociatedRoleType { + id: string + feature_flag: FeatureFlagType | null + role: RoleType + updated_at: string + added_at: string +} +// TODO: To be deprecated + export interface OrganizationResourcePermissionType { id: string resource: Resource @@ -3973,12 +4013,13 @@ export type NotebookListItemType = { last_modified_by?: UserBasicType | null } -export type NotebookType = NotebookListItemType & { - content: JSONContent | null - version: number - // used to power text-based search - text_content?: string | null -} +export type NotebookType = NotebookListItemType & + WithAccessControl & { + content: JSONContent | null + version: number + // used to power text-based search + text_content?: string | null + } export enum NotebookNodeType { Mention = 'ph-mention', @@ -4426,6 +4467,7 @@ export enum SidePanelTab { Discussion = 'discussion', Status = 'status', Exports = 'exports', + // AccessControl = 'access-control', } export interface SourceFieldOauthConfig { From 85e7457b541a3a6c8aa458fa8ec96e0ed6d8a945 Mon Sep 17 00:00:00 2001 From: Ben White Date: Thu, 5 Dec 2024 13:58:54 +0100 Subject: [PATCH 02/12] feat: hackathon metalytics (tracking team usage metrics) (#26304) --- .../navigation-3000/components/TopBar.scss | 1 - .../navigation-3000/components/TopBar.tsx | 9 +- .../panels/activity/SidePanelActivity.tsx | 131 ++++++++------- .../activity/SidePanelActivityMetalytics.tsx | 74 +++++++++ .../panels/activity/activityForSceneLogic.ts | 1 + .../activity/sidePanelActivityLogic.tsx | 8 + .../Metalytics/MetalyticsSummary.tsx | 39 +++++ .../components/Metalytics/metalyticsLogic.ts | 97 +++++++++++ frontend/src/lib/constants.tsx | 1 + frontend/src/scenes/actions/actionLogic.ts | 15 +- frontend/src/types.ts | 1 + posthog/api/__init__.py | 9 +- posthog/api/metalytics.py | 43 +++++ posthog/hogql/database/database.py | 3 + posthog/hogql/database/schema/app_metrics2.py | 28 ++++ .../test/__snapshots__/test_database.ambr | 154 ++++++++++++++++++ 16 files changed, 549 insertions(+), 65 deletions(-) create mode 100644 frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivityMetalytics.tsx create mode 100644 frontend/src/lib/components/Metalytics/MetalyticsSummary.tsx create mode 100644 frontend/src/lib/components/Metalytics/metalyticsLogic.ts create mode 100644 posthog/api/metalytics.py create mode 100644 posthog/hogql/database/schema/app_metrics2.py diff --git a/frontend/src/layout/navigation-3000/components/TopBar.scss b/frontend/src/layout/navigation-3000/components/TopBar.scss index 6273642ace3267..b797fd97bf2f8a 100644 --- a/frontend/src/layout/navigation-3000/components/TopBar.scss +++ b/frontend/src/layout/navigation-3000/components/TopBar.scss @@ -155,7 +155,6 @@ .TopBar3000__actions { display: flex; - flex-grow: 1; gap: 0.5rem; align-items: center; justify-content: flex-end; diff --git a/frontend/src/layout/navigation-3000/components/TopBar.tsx b/frontend/src/layout/navigation-3000/components/TopBar.tsx index e666bc094e9116..0e9f9dde9cd5d9 100644 --- a/frontend/src/layout/navigation-3000/components/TopBar.tsx +++ b/frontend/src/layout/navigation-3000/components/TopBar.tsx @@ -6,6 +6,8 @@ import clsx from 'clsx' import { useActions, useValues } from 'kea' import { router } from 'kea-router' import { EditableField } from 'lib/components/EditableField/EditableField' +import { FlaggedFeature } from 'lib/components/FlaggedFeature' +import { MetalyticsSummary } from 'lib/components/Metalytics/MetalyticsSummary' import { IconMenu } from 'lib/lemon-ui/icons' import { Link } from 'lib/lemon-ui/Link' import { Popover } from 'lib/lemon-ui/Popover/Popover' @@ -101,7 +103,12 @@ export function TopBar(): JSX.Element | null { )} -
+ +
+ +
+
+
) : null diff --git a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivity.tsx b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivity.tsx index b49152b98c7a8c..21a52abe269362 100644 --- a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivity.tsx +++ b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivity.tsx @@ -31,6 +31,7 @@ import { import { ActivityScope, AvailableFeature } from '~/types' import { SidePanelPaneHeader } from '../../components/SidePanelPaneHeader' +import { SidePanelActivityMetalytics } from './SidePanelActivityMetalytics' const SCROLL_TRIGGER_OFFSET = 100 @@ -126,11 +127,11 @@ export const SidePanelActivity = (): JSX.Element => { -
-
+
+
setActiveTab(key)} @@ -143,76 +144,82 @@ export const SidePanelActivity = (): JSX.Element => { key: SidePanelActivityTab.All, label: 'All activity', }, + ...(featureFlags[FEATURE_FLAGS.METALYTICS] + ? [ + { + key: SidePanelActivityTab.Metalytics, + label: 'Analytics', + }, + ] + : []), ]} />
{/* Controls */} -
- {activeTab === SidePanelActivityTab.Unread ? ( - <> - - Notifications shows you changes others make to{' '} - Insights and{' '} - Feature Flags that you created. Come - join our community forum and tell us - what else should be here! - + {activeTab === SidePanelActivityTab.Unread ? ( +
+ + Notifications shows you changes others make to{' '} + Insights and{' '} + Feature Flags that you created. Come join{' '} + our community forum and tell us what + else should be here! + -
- {toggleExtendedDescription} - {hasUnread ? ( - markAllAsRead()}> - Mark all as read - - ) : null} -
- - ) : activeTab === SidePanelActivityTab.All ? (
-
- {toggleExtendedDescription} - {allActivityResponseLoading ? : null} -
+ {toggleExtendedDescription} + {hasUnread ? ( + markAllAsRead()}> + Mark all as read + + ) : null} +
+
+ ) : activeTab === SidePanelActivityTab.All ? ( +
+
+ {toggleExtendedDescription} + {allActivityResponseLoading ? : null} +
-
- Filter for activity on: - - setFilters({ - ...filters, - scope: value ?? undefined, - item_id: undefined, - }) - } - dropdownMatchSelectWidth={false} - /> +
+ Filter for activity on: + + setFilters({ + ...filters, + scope: value ?? undefined, + item_id: undefined, + }) + } + dropdownMatchSelectWidth={false} + /> - by - - setFilters({ - ...filters, - user: user?.id ?? undefined, - }) - } - /> -
+ by + + setFilters({ + ...filters, + user: user?.id ?? undefined, + }) + } + />
- ) : null} -
+
+ ) : null}
{activeTab === SidePanelActivityTab.Unread ? ( <> {importantChangesLoading && !hasNotifications ? ( - + ) : hasNotifications ? ( notifications.map((logItem, index) => ( { /> )) ) : ( -
+
You're all caught up!
)} @@ -230,7 +237,7 @@ export const SidePanelActivity = (): JSX.Element => { ) : activeTab === SidePanelActivityTab.All ? ( <> {allActivityResponseLoading && !allActivity.length ? ( - + ) : allActivity.length ? ( <> {allActivity.map((logItem, index) => ( @@ -241,7 +248,7 @@ export const SidePanelActivity = (): JSX.Element => { /> ))} -
+
{allActivityResponseLoading ? ( <> Loading older activity @@ -261,7 +268,7 @@ export const SidePanelActivity = (): JSX.Element => {
) : ( -
+
No activity yet {filters ? ( setFilters(null)}> @@ -271,6 +278,8 @@ export const SidePanelActivity = (): JSX.Element => {
)} + ) : activeTab === SidePanelActivityTab.Metalytics ? ( + ) : null}
diff --git a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivityMetalytics.tsx b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivityMetalytics.tsx new file mode 100644 index 00000000000000..146cb6f96f5fab --- /dev/null +++ b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/SidePanelActivityMetalytics.tsx @@ -0,0 +1,74 @@ +import { Spinner, Tooltip } from '@posthog/lemon-ui' +import { useValues } from 'kea' +import { humanizeScope } from 'lib/components/ActivityLog/humanizeActivity' +import { metalyticsLogic } from 'lib/components/Metalytics/metalyticsLogic' +import { ProfileBubbles } from 'lib/lemon-ui/ProfilePicture/ProfileBubbles' + +export function SidePanelActivityMetalytics(): JSX.Element { + const { scope, instanceId, viewCount, recentUserMembers, viewCountLoading, recentUsersLoading } = + useValues(metalyticsLogic) + + if (!instanceId) { + return ( +

+ You can see internal analytics of how your Organization members are using PostHog for things such as + Dashboards, Insights, Playlists etc. Open an app to see the viewership data here. +

+ ) + } + + const humanizedScope = `this ${scope ? humanizeScope(scope, true) : 'app'}` + + return ( +
+

+ You are viewing "meta" analytics of how your organization members are interacting with{' '} + {humanizedScope}. +

+
+ +
+
Views
+
+ {viewCountLoading ? : viewCount?.views ?? 0} +
+
+
+ + +
+
Viewers
+
+ {viewCountLoading ? : viewCount?.users ?? 0} +
+
+
+ + +
+
Recent viewers (30 days)
+ {recentUsersLoading ? ( + + ) : ( + ({ + email: member.user.email, + name: member.user.first_name, + title: member.user.email, + }))} + limit={3} + /> + )} +
+
+
+
+ ) +} diff --git a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic.ts b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic.ts index 180461c465996b..641c0900638efd 100644 --- a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic.ts +++ b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic.ts @@ -37,6 +37,7 @@ export const activityForSceneLogic = kea([ connect({ values: [sceneLogic, ['sceneConfig']], }), + selectors({ sceneActivityFilters: [ (s) => [ diff --git a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/sidePanelActivityLogic.tsx b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/sidePanelActivityLogic.tsx index 69554124d4fbff..81b31df6457063 100644 --- a/frontend/src/layout/navigation-3000/sidepanel/panels/activity/sidePanelActivityLogic.tsx +++ b/frontend/src/layout/navigation-3000/sidepanel/panels/activity/sidePanelActivityLogic.tsx @@ -10,6 +10,7 @@ import { toParams } from 'lib/utils' import posthog from 'posthog-js' import { projectLogic } from 'scenes/projectLogic' +import { sidePanelStateLogic } from '../../sidePanelStateLogic' import { ActivityFilters, activityForSceneLogic } from './activityForSceneLogic' import type { sidePanelActivityLogicType } from './sidePanelActivityLogicType' @@ -29,12 +30,14 @@ export interface ChangesResponse { export enum SidePanelActivityTab { Unread = 'unread', All = 'all', + Metalytics = 'metalytics', } export const sidePanelActivityLogic = kea([ path(['scenes', 'navigation', 'sidepanel', 'sidePanelActivityLogic']), connect({ values: [activityForSceneLogic, ['sceneActivityFilters'], projectLogic, ['currentProjectId']], + actions: [sidePanelStateLogic, ['openSidePanel']], }), actions({ togglePolling: (pageIsVisible: boolean) => ({ pageIsVisible }), @@ -183,6 +186,11 @@ export const sidePanelActivityLogic = kea([ actions.loadOlderActivity() } }, + openSidePanel: ({ options }) => { + if (options) { + actions.setActiveTab(options as SidePanelActivityTab) + } + }, })), selectors({ allActivity: [ diff --git a/frontend/src/lib/components/Metalytics/MetalyticsSummary.tsx b/frontend/src/lib/components/Metalytics/MetalyticsSummary.tsx new file mode 100644 index 00000000000000..67230d017641cd --- /dev/null +++ b/frontend/src/lib/components/Metalytics/MetalyticsSummary.tsx @@ -0,0 +1,39 @@ +import { IconPulse } from '@posthog/icons' +import { LemonBadge, LemonButton } from '@posthog/lemon-ui' +import { useActions, useValues } from 'kea' + +import { sidePanelStateLogic } from '~/layout/navigation-3000/sidepanel/sidePanelStateLogic' +import { SidePanelTab } from '~/types' + +import { metalyticsLogic } from './metalyticsLogic' + +export function MetalyticsSummary(): JSX.Element | null { + const { instanceId, viewCount, viewCountLoading } = useValues(metalyticsLogic) + const safeViewCount = viewCount?.views ?? 0 + const safeUniqueUsers = viewCount?.users ?? 0 + const { openSidePanel } = useActions(sidePanelStateLogic) + + if (!instanceId || viewCountLoading) { + return null + } + + return ( + + } + size="small" + onClick={() => openSidePanel(SidePanelTab.Activity, 'metalytics')} + tooltip={`${safeUniqueUsers} PostHog members have viewed this a total of ${safeViewCount} times. Click to see more.`} + /> + + + ) +} diff --git a/frontend/src/lib/components/Metalytics/metalyticsLogic.ts b/frontend/src/lib/components/Metalytics/metalyticsLogic.ts new file mode 100644 index 00000000000000..8ddc8387011218 --- /dev/null +++ b/frontend/src/lib/components/Metalytics/metalyticsLogic.ts @@ -0,0 +1,97 @@ +import { connect, kea, path, selectors } from 'kea' +import { loaders } from 'kea-loaders' +import { subscriptions } from 'kea-subscriptions' +import api from 'lib/api' +import { membersLogic } from 'scenes/organization/membersLogic' + +import { activityForSceneLogic } from '~/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic' +import { HogQLQuery, NodeKind } from '~/queries/schema' +import { hogql } from '~/queries/utils' + +import type { metalyticsLogicType } from './metalyticsLogicType' + +export const metalyticsLogic = kea([ + path(['lib', 'components', 'metalytics', 'metalyticsLogic']), + connect({ + values: [activityForSceneLogic, ['sceneActivityFilters'], membersLogic, ['members']], + }), + + loaders(({ values }) => ({ + viewCount: [ + null as { views: number; users: number } | null, + { + loadViewCount: async () => { + const query: HogQLQuery = { + kind: NodeKind.HogQLQuery, + query: hogql`SELECT SUM(count) AS count, COUNT(DISTINCT app_source_id) AS unique_users + FROM app_metrics + WHERE app_source = 'metalytics' + AND instance_id = ${values.instanceId}`, + } + + // NOTE: I think this gets cached heavily - how to correctly invalidate? + const response = await api.query(query, undefined, undefined, true) + const result = response.results as number[][] + return { + views: result[0][0], + users: result[0][1], + } + }, + }, + ], + recentUsers: [ + [] as string[], + { + loadUsersLast30days: async () => { + const query: HogQLQuery = { + kind: NodeKind.HogQLQuery, + query: hogql`SELECT DISTINCT app_source_id + FROM app_metrics + WHERE app_source = 'metalytics' + AND instance_id = ${values.instanceId} + AND timestamp >= NOW() - INTERVAL 30 DAY + ORDER BY timestamp DESC`, + } + + const response = await api.query(query, undefined, undefined, true) + return response.results.map((result) => result[0]) as string[] + }, + }, + ], + })), + + selectors({ + instanceId: [ + (s) => [s.sceneActivityFilters], + (sceneActivityFilters) => + sceneActivityFilters?.item_id ? `${sceneActivityFilters.scope}:${sceneActivityFilters.item_id}` : null, + ], + scope: [(s) => [s.sceneActivityFilters], (sceneActivityFilters) => sceneActivityFilters?.scope], + + recentUserMembers: [ + (s) => [s.recentUsers, s.members], + (recentUsers, members) => { + if (!members || !recentUsers) { + return [] + } + // Filter members whose IDs match the recentUsers array + const filteredMembers = members.filter((member) => recentUsers.includes(String(member.user.id))) + return filteredMembers + }, + ], + }), + + subscriptions(({ actions }) => ({ + instanceId: async (instanceId) => { + if (instanceId) { + actions.loadViewCount() + actions.loadUsersLast30days() + + await api.create('/api/projects/@current/metalytics/', { + metric_name: 'viewed', + instance_id: instanceId, + }) + } + }, + })), +]) diff --git a/frontend/src/lib/constants.tsx b/frontend/src/lib/constants.tsx index 6273bf6b75180e..a184257cca70d2 100644 --- a/frontend/src/lib/constants.tsx +++ b/frontend/src/lib/constants.tsx @@ -228,6 +228,7 @@ export const FEATURE_FLAGS = { CUSTOM_CHANNEL_TYPE_RULES: 'custom-channel-type-rules', // owner: @robbie-c #team-web-analytics SELF_SERVE_CREDIT_OVERRIDE: 'self-serve-credit-override', // owner: @zach CUSTOM_CSS_THEMES: 'custom-css-themes', // owner: @daibhin + METALYTICS: 'metalytics', // owner: @surbhi EXPERIMENTS_MULTIPLE_METRICS: 'experiments-multiple-metrics', // owner: @jurajmajerik #team-experiments WEB_ANALYTICS_WARN_CUSTOM_EVENT_NO_SESSION: 'web-analytics-warn-custom-event-no-session', // owner: @robbie-c #team-web-analytics REMOTE_CONFIG: 'remote-config', // owner: @benjackwhite diff --git a/frontend/src/scenes/actions/actionLogic.ts b/frontend/src/scenes/actions/actionLogic.ts index e3a7791b6cdc1b..a3101cb8d9dafc 100644 --- a/frontend/src/scenes/actions/actionLogic.ts +++ b/frontend/src/scenes/actions/actionLogic.ts @@ -5,7 +5,8 @@ import { DataManagementTab } from 'scenes/data-management/DataManagementScene' import { Scene } from 'scenes/sceneTypes' import { urls } from 'scenes/urls' -import { ActionType, Breadcrumb, HogFunctionType } from '~/types' +import { ActivityFilters } from '~/layout/navigation-3000/sidepanel/panels/activity/activityForSceneLogic' +import { ActionType, ActivityScope, Breadcrumb, HogFunctionType } from '~/types' import { actionEditLogic } from './actionEditLogic' import type { actionLogicType } from './actionLogicType' @@ -104,6 +105,18 @@ export const actionLogic = kea([ (s) => [s.action], (action) => action?.steps?.some((step) => step.properties?.find((p) => p.type === 'cohort')) ?? false, ], + + activityFilters: [ + (s) => [s.action], + (action): ActivityFilters | null => { + return action?.id + ? { + scope: ActivityScope.ACTION, + item_id: String(action.id), + } + : null + }, + ], }), listeners(({ actions, values }) => ({ checkIsFinished: ({ action }) => { diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 6c9910e5481393..5d3514b425f802 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -3970,6 +3970,7 @@ export type PromptFlag = { // Should be kept in sync with "posthog/models/activity_logging/activity_log.py" export enum ActivityScope { + ACTION = 'Action', FEATURE_FLAG = 'FeatureFlag', PERSON = 'Person', INSIGHT = 'Insight', diff --git a/posthog/api/__init__.py b/posthog/api/__init__.py index bf1db10b864a5d..6a94d2b76b5871 100644 --- a/posthog/api/__init__.py +++ b/posthog/api/__init__.py @@ -2,7 +2,7 @@ from rest_framework_extensions.routers import NestedRegistryItem -from posthog.api import project +from posthog.api import metalytics, project from posthog.api.routing import DefaultRouterPlusPlus from posthog.batch_exports import http as batch_exports from posthog.settings import EE_AVAILABLE @@ -549,6 +549,13 @@ def register_grandfathered_environment_nested_viewset( ["team_id"], ) +register_grandfathered_environment_nested_viewset( + r"metalytics", + metalytics.MetalyticsViewSet, + "environment_metalytics", + ["team_id"], +) + projects_router.register( r"insight_variables", insight_variable.InsightVariableViewSet, diff --git a/posthog/api/metalytics.py b/posthog/api/metalytics.py new file mode 100644 index 00000000000000..c4ae5027866542 --- /dev/null +++ b/posthog/api/metalytics.py @@ -0,0 +1,43 @@ +from typing import Any + +from posthog.kafka_client.client import KafkaProducer +from posthog.kafka_client.topics import KAFKA_APP_METRICS2 +from posthog.models.event.util import format_clickhouse_timestamp +from posthog.utils import cast_timestamp_or_now +from posthog.api.routing import TeamAndOrgViewSetMixin + +from rest_framework import request, response, viewsets, serializers +from rest_framework.serializers import BaseSerializer + +from posthog.models.plugin import PluginConfig + + +class MetalyticsCreateRequestSerializer(serializers.Serializer): + metric_name = serializers.ChoiceField(choices=["viewed"], required=True) + instance_id = serializers.CharField(required=True) + + +class MetalyticsViewSet(TeamAndOrgViewSetMixin, viewsets.GenericViewSet): + scope_object = "INTERNAL" + queryset = PluginConfig.objects.all() + + def get_serializer_class(self) -> type[BaseSerializer]: + return MetalyticsCreateRequestSerializer if self.action == "create" else MetalyticsCreateRequestSerializer + + def create(self, request: request.Request, *args: Any, **kwargs: Any) -> response.Response: + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + validated_data = serializer.validated_data + + payload = { + **validated_data, + "team_id": self.team_id, + "app_source_id": self.request.user.pk, + "app_source": "metalytics", + "count": 1, + "timestamp": format_clickhouse_timestamp(cast_timestamp_or_now(None)), + } + + KafkaProducer().produce(topic=KAFKA_APP_METRICS2, data=payload) + + return response.Response({}) diff --git a/posthog/hogql/database/database.py b/posthog/hogql/database/database.py index 94f9e1729ac41d..37370800f30c3c 100644 --- a/posthog/hogql/database/database.py +++ b/posthog/hogql/database/database.py @@ -28,6 +28,7 @@ Table, VirtualTable, ) +from posthog.hogql.database.schema.app_metrics2 import AppMetrics2Table from posthog.hogql.database.schema.channel_type import create_initial_channel_type, create_initial_domain_type from posthog.hogql.database.schema.cohort_people import CohortPeople, RawCohortPeople from posthog.hogql.database.schema.events import EventsTable @@ -108,6 +109,7 @@ class Database(BaseModel): cohort_people: CohortPeople = CohortPeople() static_cohort_people: StaticCohortPeople = StaticCohortPeople() log_entries: LogEntriesTable = LogEntriesTable() + app_metrics: AppMetrics2Table = AppMetrics2Table() console_logs_log_entries: ReplayConsoleLogsLogEntriesTable = ReplayConsoleLogsLogEntriesTable() batch_export_log_entries: BatchExportLogEntriesTable = BatchExportLogEntriesTable() sessions: Union[SessionsTableV1, SessionsTableV2] = SessionsTableV1() @@ -134,6 +136,7 @@ class Database(BaseModel): "cohort_people", "static_cohort_people", "log_entries", + "app_metrics", "sessions", "heatmaps", ] diff --git a/posthog/hogql/database/schema/app_metrics2.py b/posthog/hogql/database/schema/app_metrics2.py new file mode 100644 index 00000000000000..323b127cd87b38 --- /dev/null +++ b/posthog/hogql/database/schema/app_metrics2.py @@ -0,0 +1,28 @@ +from posthog.hogql.database.models import ( + Table, + IntegerDatabaseField, + StringDatabaseField, + DateTimeDatabaseField, + FieldOrTable, +) + +APP_METRICS2_FIELDS: dict[str, FieldOrTable] = { + "team_id": IntegerDatabaseField(name="team_id"), + "app_source": StringDatabaseField(name="app_source"), + "app_source_id": StringDatabaseField(name="app_source_id"), + "instance_id": StringDatabaseField(name="instance_id"), + "timestamp": DateTimeDatabaseField(name="timestamp"), + "metric_name": StringDatabaseField(name="metric_name"), + "metric_kind": StringDatabaseField(name="metric_kind"), + "count": IntegerDatabaseField(name="count"), +} + + +class AppMetrics2Table(Table): + fields: dict[str, FieldOrTable] = APP_METRICS2_FIELDS + + def to_printed_clickhouse(self, context): + return "app_metrics2" + + def to_printed_hogql(self): + return "app_metrics2" diff --git a/posthog/hogql/database/test/__snapshots__/test_database.ambr b/posthog/hogql/database/test/__snapshots__/test_database.ambr index e3939d569468fc..0eaa25fbe1f07f 100644 --- a/posthog/hogql/database/test/__snapshots__/test_database.ambr +++ b/posthog/hogql/database/test/__snapshots__/test_database.ambr @@ -1157,6 +1157,83 @@ "name": "log_entries", "type": "posthog" }, + "app_metrics": { + "fields": { + "app_source": { + "chain": null, + "fields": null, + "hogql_value": "app_source", + "id": null, + "name": "app_source", + "schema_valid": true, + "table": null, + "type": "string" + }, + "app_source_id": { + "chain": null, + "fields": null, + "hogql_value": "app_source_id", + "id": null, + "name": "app_source_id", + "schema_valid": true, + "table": null, + "type": "string" + }, + "instance_id": { + "chain": null, + "fields": null, + "hogql_value": "instance_id", + "id": null, + "name": "instance_id", + "schema_valid": true, + "table": null, + "type": "string" + }, + "timestamp": { + "chain": null, + "fields": null, + "hogql_value": "timestamp", + "id": null, + "name": "timestamp", + "schema_valid": true, + "table": null, + "type": "datetime" + }, + "metric_name": { + "chain": null, + "fields": null, + "hogql_value": "metric_name", + "id": null, + "name": "metric_name", + "schema_valid": true, + "table": null, + "type": "string" + }, + "metric_kind": { + "chain": null, + "fields": null, + "hogql_value": "metric_kind", + "id": null, + "name": "metric_kind", + "schema_valid": true, + "table": null, + "type": "string" + }, + "count": { + "chain": null, + "fields": null, + "hogql_value": "count", + "id": null, + "name": "count", + "schema_valid": true, + "table": null, + "type": "integer" + } + }, + "id": "app_metrics", + "name": "app_metrics", + "type": "posthog" + }, "sessions": { "fields": { "id": { @@ -2705,6 +2782,83 @@ "name": "log_entries", "type": "posthog" }, + "app_metrics": { + "fields": { + "app_source": { + "chain": null, + "fields": null, + "hogql_value": "app_source", + "id": null, + "name": "app_source", + "schema_valid": true, + "table": null, + "type": "string" + }, + "app_source_id": { + "chain": null, + "fields": null, + "hogql_value": "app_source_id", + "id": null, + "name": "app_source_id", + "schema_valid": true, + "table": null, + "type": "string" + }, + "instance_id": { + "chain": null, + "fields": null, + "hogql_value": "instance_id", + "id": null, + "name": "instance_id", + "schema_valid": true, + "table": null, + "type": "string" + }, + "timestamp": { + "chain": null, + "fields": null, + "hogql_value": "timestamp", + "id": null, + "name": "timestamp", + "schema_valid": true, + "table": null, + "type": "datetime" + }, + "metric_name": { + "chain": null, + "fields": null, + "hogql_value": "metric_name", + "id": null, + "name": "metric_name", + "schema_valid": true, + "table": null, + "type": "string" + }, + "metric_kind": { + "chain": null, + "fields": null, + "hogql_value": "metric_kind", + "id": null, + "name": "metric_kind", + "schema_valid": true, + "table": null, + "type": "string" + }, + "count": { + "chain": null, + "fields": null, + "hogql_value": "count", + "id": null, + "name": "count", + "schema_valid": true, + "table": null, + "type": "integer" + } + }, + "id": "app_metrics", + "name": "app_metrics", + "type": "posthog" + }, "sessions": { "fields": { "id": { From d1b9d4c66d6a212be15e49ebdf9f204db31171a2 Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Thu, 5 Dec 2024 14:45:59 +0100 Subject: [PATCH 03/12] fix: replay auth url construction (#26674) --- .../src/lib/components/AuthorizedUrlList/AuthorizedUrlList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/AuthorizedUrlList/AuthorizedUrlList.tsx b/frontend/src/lib/components/AuthorizedUrlList/AuthorizedUrlList.tsx index 1169702c255fa6..aa95376c5fa9c8 100644 --- a/frontend/src/lib/components/AuthorizedUrlList/AuthorizedUrlList.tsx +++ b/frontend/src/lib/components/AuthorizedUrlList/AuthorizedUrlList.tsx @@ -186,7 +186,7 @@ export function AuthorizedUrlList({ type === AuthorizedUrlListType.TOOLBAR_URLS ? launchUrl(keyedURL.url) : // other urls are simply opened directly - keyedURL.url + query + `${keyedURL.url}${query ? query : ''}` } targetBlank tooltip={ From e62f82abad36c7d15f05daebfe334c83057d1094 Mon Sep 17 00:00:00 2001 From: Tom Owers Date: Thu, 5 Dec 2024 14:06:32 +0000 Subject: [PATCH 04/12] fix(data-warehouse): Add support for sql arrays (#26633) --- .../pipelines/sql_database_v2/schema_types.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/posthog/temporal/data_imports/pipelines/sql_database_v2/schema_types.py b/posthog/temporal/data_imports/pipelines/sql_database_v2/schema_types.py index cc744eed0c9f62..6f6e883b3dc0d6 100644 --- a/posthog/temporal/data_imports/pipelines/sql_database_v2/schema_types.py +++ b/posthog/temporal/data_imports/pipelines/sql_database_v2/schema_types.py @@ -123,11 +123,16 @@ def sqla_col_to_column_schema( col["data_type"] = "date" elif isinstance(sql_t, sqltypes.Time): col["data_type"] = "time" - elif isinstance(sql_t, sqltypes.JSON) or isinstance(sql_t, BigQueryJSON) or isinstance(sql_t, BigQueryStruct): + elif ( + isinstance(sql_t, sqltypes.JSON) + or isinstance(sql_t, BigQueryJSON) + or isinstance(sql_t, BigQueryStruct) + or isinstance(sql_t, ARRAY) + ): col["data_type"] = "json" elif isinstance(sql_t, sqltypes.Boolean): col["data_type"] = "bool" - elif isinstance(sql_t, sqltypes.Interval) or isinstance(sql_t, INTERVAL) or isinstance(sql_t, ARRAY): + elif isinstance(sql_t, sqltypes.Interval) or isinstance(sql_t, INTERVAL): # No support for interval columns yet - we filter out binary columns, so reusing the DLT type for interval columns to be removed col["data_type"] = "interval" # type: ignore else: From 5e4bf78acd102b611f7f325ba8090d2300e73e3d Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:08:56 +0100 Subject: [PATCH 05/12] chore: flutter session replay onboarding (#26673) --- .../onboarding/sdks/feature-flags/flutter.tsx | 2 + .../onboarding/sdks/feature-flags/ios.tsx | 2 +- .../sdks/product-analytics/flutter.tsx | 6 + .../sdks/sdk-install-instructions/android.tsx | 2 +- .../sdks/sdk-install-instructions/flutter.tsx | 124 +++++++++++++++++- .../sdks/sdk-install-instructions/ios.tsx | 2 +- .../sdk-install-instructions/react-native.tsx | 3 + .../sdks/session-replay/flutter.tsx | 11 ++ 8 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 frontend/src/scenes/onboarding/sdks/session-replay/flutter.tsx diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/flutter.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/flutter.tsx index ac4e3750e6d6ec..01c641837a24b0 100644 --- a/frontend/src/scenes/onboarding/sdks/feature-flags/flutter.tsx +++ b/frontend/src/scenes/onboarding/sdks/feature-flags/flutter.tsx @@ -1,6 +1,7 @@ import { SDKKey } from '~/types' import { SDKInstallFlutterInstructions } from '../sdk-install-instructions' +import { AdvertiseMobileReplay } from '../session-replay/SessionReplaySDKInstructions' import { FlagImplementationSnippet } from './flagImplementationSnippet' export function FeatureFlagsFlutterInstructions(): JSX.Element { @@ -8,6 +9,7 @@ export function FeatureFlagsFlutterInstructions(): JSX.Element { <> + ) } diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/ios.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/ios.tsx index 4ee24956e05647..a0416883f0667b 100644 --- a/frontend/src/scenes/onboarding/sdks/feature-flags/ios.tsx +++ b/frontend/src/scenes/onboarding/sdks/feature-flags/ios.tsx @@ -9,7 +9,7 @@ export function FeatureFlagsIOSInstructions(): JSX.Element { <> - + ) } diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/flutter.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/flutter.tsx index aa02bdb26a604e..e09f47ecbe5e16 100644 --- a/frontend/src/scenes/onboarding/sdks/product-analytics/flutter.tsx +++ b/frontend/src/scenes/onboarding/sdks/product-analytics/flutter.tsx @@ -1,6 +1,10 @@ import { CodeSnippet, Language } from 'lib/components/CodeSnippet' +import { SDKKey } from '~/types' + import { SDKInstallFlutterInstructions } from '../sdk-install-instructions' +import { AdvertiseMobileReplay } from '../session-replay/SessionReplaySDKInstructions' +import { PersonModeEventPropertyInstructions } from '../shared-snippets' function FlutterCaptureSnippet(): JSX.Element { return ( @@ -18,6 +22,8 @@ export function ProductAnalyticsFlutterInstructions(): JSX.Element {

Send an Event

+ + ) } diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/android.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/android.tsx index 20020ad69393a3..76be40a10ca561 100644 --- a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/android.tsx +++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/android.tsx @@ -42,7 +42,7 @@ function AndroidSetupSnippet({ includeReplay }: AndroidSetupProps): JSX.Element ${ includeReplay ? ` - // check https://posthog.com/docs/session-replay/android#installation + // check https://posthog.com/docs/session-replay/installation?tab=Android // for more config and to learn about how we capture sessions on mobile // and what to expect config.sessionReplay = true diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/flutter.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/flutter.tsx index e5164e93d378ef..d9c2860b784fc2 100644 --- a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/flutter.tsx +++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/flutter.tsx @@ -1,17 +1,108 @@ +import { LemonBanner, Link } from '@posthog/lemon-ui' import { useValues } from 'kea' import { CodeSnippet, Language } from 'lib/components/CodeSnippet' import { useJsSnippet } from 'lib/components/JSSnippet' import { apiHostOrigin } from 'lib/utils/apiHost' import { teamLogic } from 'scenes/teamLogic' +export interface FlutterSetupProps { + includeReplay?: boolean +} + +export interface FlutterInstallProps { + apiToken?: string +} + function FlutterInstallSnippet(): JSX.Element { return posthog_flutter: ^4.0.0 } -function FlutterAndroidSetupSnippet(): JSX.Element { +function InstallFlutterSessionReplay(props: FlutterInstallProps): JSX.Element { + return ( + + {`import 'package:flutter/material.dart'; + +import 'package:posthog_flutter/posthog_flutter.dart'; + +Future main() async { + // init WidgetsFlutterBinding if not yet + WidgetsFlutterBinding.ensureInitialized(); + final config = PostHogConfig('${props.apiToken}'); + config.host = '${apiHostOrigin()}'; + config.debug = true; + config.captureApplicationLifecycleEvents = true; + + // check https://posthog.com/docs/session-replay/installation?tab=Flutter + // for more config and to learn about how we capture sessions on mobile + // and what to expect + config.sessionReplay = true; + // choose whether to mask images or text + config.sessionReplayConfig.maskAllTexts = false; + config.sessionReplayConfig.maskAllImages = false; + + // Setup PostHog with the given Context and Config + await Posthog().setup(config); + runApp(MyApp()); +}`} + + ) +} + +function InstallFlutterWidgetsSessionReplay(): JSX.Element { + return ( + + {`import 'package:flutter/material.dart'; + +import 'package:posthog_flutter/posthog_flutter.dart'; + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + // Wrap your App with PostHogWidget + return PostHogWidget( + child: MaterialApp( + // Add PosthogObserver to your navigatorObservers + navigatorObservers: [PosthogObserver()], + title: 'My App', + home: const HomeScreen(), + ), + ); + } +}`} + + ) +} + +function FlutterAndroidSetupSnippet({ includeReplay }: FlutterSetupProps): JSX.Element { const { currentTeam } = useValues(teamLogic) const url = apiHostOrigin() + const props = { apiToken: currentTeam?.api_token } + if (includeReplay) { + return ( + <> + + { + '\n\t\n\t\t[...]\n\t\n\t\n' + } + + + + + ) + } return ( {'\n\t\n\t\t[...]\n\t\n\t + 🚧 NOTE: Mobile recording is + currently in beta. We are keen to gather as much feedback as possible so if you try this out please + let us know. You can send feedback via the{' '} + + in-app support panel + {' '} + or one of our other support options. + + ) : null}

Install

Android Setup

Add these values in AndroidManifest.xml

- +

iOS/macOS Setup

Add these values in Info.plist

- +

Web Setup

Add these values in index.html

diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/ios.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/ios.tsx index fdafc655609349..8f64d7c261ba7f 100644 --- a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/ios.tsx +++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/ios.tsx @@ -40,7 +40,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { ${ includeReplay ? ` - // check https://posthog.com/docs/session-replay/ios#installation + // check https://posthog.com/docs/session-replay/installation?tab=iOS // for more config and to learn about how we capture sessions on mobile // and what to expect config.sessionReplay = true diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/react-native.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/react-native.tsx index 782fc947ba72f3..f60c20c0c65ac6 100644 --- a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/react-native.tsx +++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/react-native.tsx @@ -58,6 +58,9 @@ export function MyApp() { ${ includeReplay ? ` + // check https://posthog.com/docs/session-replay/installation?tab=React+Native + // for more config and to learn about how we capture sessions on mobile + // and what to expect enableSessionReplay: true, sessionReplayConfig: { // Whether text inputs are masked. Default is true. diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/flutter.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/flutter.tsx new file mode 100644 index 00000000000000..b5a20645e256ce --- /dev/null +++ b/frontend/src/scenes/onboarding/sdks/session-replay/flutter.tsx @@ -0,0 +1,11 @@ +import { SDKInstallFlutterInstructions } from '../sdk-install-instructions' +import { SessionReplayFinalSteps } from '../shared-snippets' + +export function FlutterInstructions(): JSX.Element { + return ( + <> + + + + ) +} From 428c4a4b9307d8af8b7afe584fe52b9310328d6a Mon Sep 17 00:00:00 2001 From: Michael Matloka Date: Thu, 5 Dec 2024 15:11:51 +0100 Subject: [PATCH 06/12] chore(environments): Sync project name with team name (#26638) --- posthog/migrations/0527_project_name_sync.py | 19 +++++++++++++++++++ posthog/migrations/max_migration.txt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 posthog/migrations/0527_project_name_sync.py diff --git a/posthog/migrations/0527_project_name_sync.py b/posthog/migrations/0527_project_name_sync.py new file mode 100644 index 00000000000000..23c29ffe82fb19 --- /dev/null +++ b/posthog/migrations/0527_project_name_sync.py @@ -0,0 +1,19 @@ +# Created manually + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [("posthog", "0526_remoteconfig")] + + operations = [ + migrations.RunSQL( + """ + UPDATE posthog_project AS proj + SET name = team.name + FROM posthog_team AS team + WHERE proj.id = team.project_id AND proj.name != team.name""", + reverse_sql=migrations.RunSQL.noop, + elidable=True, + ), + ] diff --git a/posthog/migrations/max_migration.txt b/posthog/migrations/max_migration.txt index 4ef90b28a1e45e..4dd4a8fb39bbc1 100644 --- a/posthog/migrations/max_migration.txt +++ b/posthog/migrations/max_migration.txt @@ -1 +1 @@ -0526_remoteconfig +0527_project_name_sync From 6459e6c47e5cca40a4085d515a17488ea49012ab Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Thu, 5 Dec 2024 15:36:41 +0100 Subject: [PATCH 07/12] fix: date_to must be less than daily interval (#26656) --- ...est_session_recording_list_from_query.ambr | 82 +++--- .../session_recording_list_from_query.py | 2 +- ...est_session_recording_list_from_query.ambr | 276 +++++++++--------- ...est_session_recording_list_from_filters.py | 45 ++- .../test_session_recording_list_from_query.py | 81 ++++- 5 files changed, 301 insertions(+), 185 deletions(-) diff --git a/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr b/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr index bcd1ed1e3c8cb7..7c4d474405fc4b 100644 --- a/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr +++ b/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr @@ -19,7 +19,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) @@ -51,7 +51,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -95,7 +95,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -139,7 +139,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) @@ -171,7 +171,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) @@ -203,7 +203,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -238,7 +238,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -278,7 +278,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -313,7 +313,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -353,7 +353,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -388,7 +388,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -428,7 +428,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -463,7 +463,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -503,7 +503,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -538,7 +538,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -593,7 +593,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -628,7 +628,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -683,7 +683,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -718,7 +718,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -773,7 +773,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -808,7 +808,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -863,7 +863,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -898,7 +898,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -938,7 +938,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -973,7 +973,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -1013,7 +1013,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1048,7 +1048,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -1088,7 +1088,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1123,7 +1123,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) @@ -1166,7 +1166,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1204,7 +1204,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1242,7 +1242,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1280,7 +1280,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1324,7 +1324,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1368,7 +1368,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1412,7 +1412,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1456,7 +1456,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1500,7 +1500,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1544,7 +1544,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1588,7 +1588,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1632,7 +1632,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC diff --git a/posthog/session_recordings/queries/session_recording_list_from_query.py b/posthog/session_recordings/queries/session_recording_list_from_query.py index fe08fb85590f25..c75d5412fcb0f5 100644 --- a/posthog/session_recordings/queries/session_recording_list_from_query.py +++ b/posthog/session_recordings/queries/session_recording_list_from_query.py @@ -247,7 +247,7 @@ def _order_by_clause(self) -> ast.Field: @cached_property def query_date_range(self): return QueryDateRange( - date_range=DateRange(date_from=self._query.date_from, date_to=self._query.date_to), + date_range=DateRange(date_from=self._query.date_from, date_to=self._query.date_to, explicitDate=True), team=self._team, interval=None, now=datetime.now(), diff --git a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr index 34f0b42e609707..610866ee9dc7b5 100644 --- a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr +++ b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr @@ -19,7 +19,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0), ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) @@ -59,7 +59,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) @@ -99,7 +99,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) @@ -139,7 +139,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) @@ -188,7 +188,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-22 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-04 00:00:00.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-22 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-22 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-04 00:00:00.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-22 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-04 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-21 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-04 00:00:00.000000', 6, 'UTC')), or(equals(events.event, 'custom-event'), equals(events.event, '$pageview'))) @@ -228,7 +228,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) @@ -268,7 +268,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) @@ -308,7 +308,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) @@ -348,7 +348,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) @@ -388,7 +388,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) @@ -428,7 +428,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) @@ -468,7 +468,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -503,7 +503,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(duration, 60.0), 0) ORDER BY start_time DESC @@ -538,7 +538,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(active_seconds, '60'), 0) ORDER BY start_time DESC @@ -573,7 +573,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(inactive_seconds, '60'), 0) ORDER BY start_time DESC @@ -608,7 +608,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY active_seconds DESC @@ -643,7 +643,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY console_error_count DESC @@ -678,7 +678,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -713,7 +713,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -748,7 +748,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -783,7 +783,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -818,7 +818,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -853,7 +853,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-30 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-30 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -888,7 +888,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-12 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-12 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 12:46:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -923,7 +923,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 12:46:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -958,7 +958,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-10 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-10 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 12:46:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -993,7 +993,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-28 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-28 00:00:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1028,7 +1028,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 12:46:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1063,7 +1063,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(duration, 60.0), 0) ORDER BY start_time DESC @@ -1098,7 +1098,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(less(duration, 60.0), 0) ORDER BY start_time DESC @@ -1133,7 +1133,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1173,7 +1173,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) @@ -1213,7 +1213,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1253,7 +1253,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1288,7 +1288,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1328,7 +1328,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1368,7 +1368,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT JOIN @@ -1413,7 +1413,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT JOIN @@ -1458,7 +1458,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT JOIN @@ -1503,7 +1503,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1543,7 +1543,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1598,7 +1598,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1653,7 +1653,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -1693,7 +1693,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1748,7 +1748,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1803,7 +1803,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1858,7 +1858,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -1913,7 +1913,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) @@ -1953,7 +1953,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) @@ -1993,7 +1993,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) @@ -2033,7 +2033,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) @@ -2073,7 +2073,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -2113,7 +2113,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) @@ -2153,7 +2153,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) @@ -2193,7 +2193,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) @@ -2233,7 +2233,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) @@ -2273,7 +2273,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Safari'), 0))) @@ -2313,7 +2313,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) @@ -2353,7 +2353,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) @@ -2393,7 +2393,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) @@ -2433,7 +2433,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Safari'), 0))) @@ -2473,7 +2473,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -2528,7 +2528,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -2568,7 +2568,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -2623,7 +2623,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -2663,7 +2663,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, '$pageleave'))) @@ -2703,7 +2703,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -2744,7 +2744,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -2785,7 +2785,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -2826,7 +2826,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -2867,7 +2867,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(equals(argMinMerge(s.snapshot_source), 'web'), 0) ORDER BY start_time DESC @@ -2902,7 +2902,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(equals(argMinMerge(s.snapshot_source), 'mobile'), 0) ORDER BY start_time DESC @@ -2937,7 +2937,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -2978,7 +2978,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3019,7 +3019,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3060,7 +3060,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3101,7 +3101,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3142,7 +3142,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3183,7 +3183,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3224,7 +3224,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -3270,7 +3270,7 @@ in(s.session_id, ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001' /* ... */], ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), - ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3310,7 +3310,7 @@ in(s.session_id, ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001' /* ... */], ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), - ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3365,7 +3365,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, (SELECT person_distinct_id2.distinct_id AS distinct_id FROM person_distinct_id2 WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, @@ -3434,7 +3434,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), and(in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), and(in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -3488,7 +3488,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), and(in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), and(in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, 'custom_event')) @@ -3542,7 +3542,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -3597,7 +3597,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -3701,7 +3701,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, (SELECT person_distinct_id2.distinct_id AS distinct_id FROM person_distinct_id2 WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, @@ -3750,7 +3750,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, (SELECT person_distinct_id2.distinct_id AS distinct_id FROM person_distinct_id2 WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, @@ -3799,7 +3799,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 20:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, (SELECT person_distinct_id2.distinct_id AS distinct_id FROM person_distinct_id2 WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, @@ -3854,7 +3854,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-08-30 11:55:01.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-09 12:00:01.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-27 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-30 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-09 12:00:01.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-27 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-30 12:00:01.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3889,7 +3889,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event'))) @@ -3929,7 +3929,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) @@ -3969,7 +3969,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) @@ -4009,7 +4009,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'bar'), ''), 'null'), '^"|"$', ''), 'foo'), 0)))) @@ -4049,7 +4049,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) @@ -4089,7 +4089,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) @@ -4129,7 +4129,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) @@ -4169,7 +4169,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) @@ -4209,7 +4209,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -4250,7 +4250,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -4291,7 +4291,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level @@ -4332,7 +4332,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.message AS message @@ -4373,7 +4373,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT console_logs_log_entries.log_source_id AS log_source_id FROM (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message @@ -4423,7 +4423,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -4472,7 +4472,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -4512,7 +4512,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_one']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_one']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_one'])) @@ -4552,7 +4552,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_two']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_two']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_two'])) @@ -4592,7 +4592,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -4647,7 +4647,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -4702,7 +4702,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4737,7 +4737,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY mouse_activity_count DESC @@ -4781,7 +4781,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4816,7 +4816,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4851,7 +4851,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -4891,7 +4891,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$host'), ''), 'null'), '^"|"$', '')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) @@ -4931,7 +4931,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -4971,7 +4971,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(nullIf(nullIf(events.`mat_$host`, ''), 'null')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) @@ -5011,7 +5011,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5051,7 +5051,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) @@ -5091,7 +5091,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5131,7 +5131,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) @@ -5171,7 +5171,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5211,7 +5211,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) @@ -5251,7 +5251,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5291,7 +5291,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) @@ -5331,7 +5331,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5371,7 +5371,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'true'), 0)) @@ -5411,7 +5411,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5451,7 +5451,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'true'), 0)) @@ -5491,7 +5491,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5531,7 +5531,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -5586,7 +5586,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5626,7 +5626,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -5681,7 +5681,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5721,7 +5721,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN @@ -5776,7 +5776,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) @@ -5816,7 +5816,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events LEFT OUTER JOIN diff --git a/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py b/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py index f8ce2daccf3d58..41f1226fff27b3 100644 --- a/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py +++ b/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, UTC from typing import Literal from unittest.mock import ANY from uuid import uuid4 @@ -37,6 +37,49 @@ ) +@freeze_time("2021-01-01T13:46:23") +class TestSessionRecordingFilterDateRange(APIBaseTest): + def test_with_relative_dates(self) -> None: + the_filter = SessionRecordingsFilter(team=self.team, data={"date_from": "-3d", "date_to": "-24h"}) + + assert the_filter.date_from == datetime(2020, 12, 29, 0, 0, 0, 0, UTC) + assert the_filter.date_to == datetime(year=2020, month=12, day=31, hour=13, minute=0, second=0, tzinfo=UTC) + + def test_with_string_dates(self) -> None: + the_filter = SessionRecordingsFilter(team=self.team, data={"date_from": "2020-12-29", "date_to": "2021-01-01"}) + + assert the_filter.date_from == datetime(2020, 12, 29, 0, 0, 0, 0, UTC) + assert the_filter.date_to == datetime( + year=2021, month=1, day=1, hour=23, minute=59, second=59, microsecond=999999, tzinfo=UTC + ) + + def test_with_string_date_times(self) -> None: + the_filter = SessionRecordingsFilter( + team=self.team, data={"date_from": "2020-12-29T12:23:45Z", "date_to": "2021-01-01T13:34:42Z"} + ) + + assert the_filter.date_from == datetime(2020, 12, 29, 12, 23, 45, tzinfo=UTC) + assert the_filter.date_to == datetime(year=2021, month=1, day=1, hour=13, minute=34, second=42, tzinfo=UTC) + + def test_with_no_date_from(self) -> None: + the_filter = SessionRecordingsFilter( + team=self.team, data={"date_from": None, "date_to": "2021-01-01T13:34:42Z"} + ) + + # defaults to start of 7 days ago + assert the_filter.date_from == datetime(2020, 12, 25, 0, 0, 0, 0, UTC) + assert the_filter.date_to == datetime(year=2021, month=1, day=1, hour=13, minute=34, second=42, tzinfo=UTC) + + def test_with_no_date_to(self) -> None: + the_filter = SessionRecordingsFilter( + team=self.team, data={"date_from": "2021-01-01T11:34:42Z", "date_to": None} + ) + + assert the_filter.date_from == datetime(2021, 1, 1, 11, 34, 42, tzinfo=UTC) + # defaults to now + assert the_filter.date_to == datetime(year=2021, month=1, day=1, hour=13, minute=46, second=23, tzinfo=UTC) + + @freeze_time("2021-01-01T13:46:23") class TestSessionRecordingsListFromFilters(ClickhouseTestMixin, APIBaseTest): def setUp(self): diff --git a/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py b/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py index abfd8ab98b9566..35116f4085e55a 100644 --- a/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py +++ b/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, UTC from typing import Literal from unittest.mock import ANY from uuid import uuid4 @@ -11,11 +11,12 @@ from posthog.clickhouse.client import sync_execute from posthog.clickhouse.log_entries import TRUNCATE_LOG_ENTRIES_TABLE_SQL from posthog.constants import AvailableFeature +from posthog.hogql_queries.utils.query_date_range import QueryDateRange from posthog.models import Cohort, GroupTypeMapping, Person from posthog.models.action import Action from posthog.models.group.util import create_group from posthog.models.team import Team -from posthog.schema import RecordingsQuery +from posthog.schema import RecordingsQuery, DateRange from posthog.session_recordings.queries.session_recording_list_from_query import ( SessionRecordingQueryResult, ) @@ -38,6 +39,74 @@ ) +@freeze_time("2021-01-01T13:46:23") +class TestSessionRecordingQueryDateRange(APIBaseTest): + def test_with_relative_dates(self) -> None: + query_date_range = QueryDateRange( + date_range=DateRange(date_from="-3d", date_to="-24h", explicitDate=True), + team=self.team, + interval=None, + now=datetime.now(UTC), + ) + + assert query_date_range.date_from() == datetime(2020, 12, 29, 0, 0, 0, 0, UTC) + assert query_date_range.date_to() == datetime( + year=2020, month=12, day=31, hour=13, minute=46, second=23, tzinfo=UTC + ) + + def test_with_string_dates(self) -> None: + query_date_range = QueryDateRange( + date_range=DateRange(date_from="2020-12-29", date_to="2021-01-01", explicitDate=True), + team=self.team, + interval=None, + now=datetime.now(UTC), + ) + + assert query_date_range.date_from() == datetime(2020, 12, 29, 0, 0, 0, 0, UTC) + assert query_date_range.date_to() == datetime(year=2021, month=1, day=1, hour=0, minute=0, second=0, tzinfo=UTC) + + def test_with_string_date_times(self) -> None: + query_date_range = QueryDateRange( + date_range=DateRange(date_from="2020-12-29T12:23:45Z", date_to="2021-01-01T13:34:42Z", explicitDate=True), + team=self.team, + interval=None, + now=datetime.now(UTC), + ) + + assert query_date_range.date_from() == datetime(2020, 12, 29, 12, 23, 45, tzinfo=UTC) + assert query_date_range.date_to() == datetime( + year=2021, month=1, day=1, hour=13, minute=34, second=42, tzinfo=UTC + ) + + def test_with_no_date_from(self) -> None: + query_date_range = QueryDateRange( + date_range=DateRange(date_from=None, date_to="2021-01-01T13:34:42Z", explicitDate=True), + team=self.team, + interval=None, + now=datetime.now(UTC), + ) + + # defaults to start of 7 days ago + assert query_date_range.date_from() == datetime(2020, 12, 25, 0, 0, 0, 0, UTC) + assert query_date_range.date_to() == datetime( + year=2021, month=1, day=1, hour=13, minute=34, second=42, tzinfo=UTC + ) + + def test_with_no_date_to(self) -> None: + query_date_range = QueryDateRange( + date_range=DateRange(date_from="2021-01-01T11:34:42Z", date_to=None, explicitDate=True), + team=self.team, + interval=None, + now=datetime.now(UTC), + ) + + assert query_date_range.date_from() == datetime(2021, 1, 1, 11, 34, 42, tzinfo=UTC) + # defaults to now + assert query_date_range.date_to() == datetime( + year=2021, month=1, day=1, hour=13, minute=46, second=23, tzinfo=UTC + ) + + @freeze_time("2021-01-01T13:46:23") class TestSessionRecordingsListFromQuery(ClickhouseTestMixin, APIBaseTest): def setUp(self): @@ -778,6 +847,9 @@ def test_listing_ignores_future_replays(self): with freeze_time("2023-08-29T12:00:01Z"): produce_replay_summary(team_id=self.team.id, session_id="29th Aug") + with freeze_time("2023-08-30T14:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="30th Aug 1400") + with freeze_time("2023-09-01T12:00:01Z"): produce_replay_summary(team_id=self.team.id, session_id="1st-sep") @@ -787,6 +859,7 @@ def test_listing_ignores_future_replays(self): with freeze_time("2023-09-03T12:00:01Z"): produce_replay_summary(team_id=self.team.id, session_id="3rd-sep") + # before the recording on the thirtieth so should exclude it with freeze_time("2023-08-30T12:00:01Z"): recordings = self._filter_recordings_by() @@ -1896,11 +1969,11 @@ def test_date_to_filter(self): ) assert session_recordings == [] + # we have to change this test because the behavior of the API did change 🙈 (session_recordings, _, _) = self._filter_recordings_by( - {"date_to": (self.an_hour_ago - relativedelta(days=3)).strftime("%Y-%m-%d")} + {"date_to": (self.an_hour_ago - relativedelta(days=3)).strftime("%Y-%m-%dT%H:%M:%S")} ) - assert len(session_recordings) == 1 assert [s["session_id"] for s in session_recordings] == ["three days before base time"] def test_recording_that_spans_time_bounds(self): From 7cf87c8d81e7b6fa9849cb12b6f3002cca4b0e39 Mon Sep 17 00:00:00 2001 From: Eric Duong Date: Thu, 5 Dec 2024 09:42:41 -0500 Subject: [PATCH 08/12] chore(editor-3000): reintegrate editor variables in editor 3000 (#26587) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../navigation-3000/navigationLogic.tsx | 2 +- frontend/src/lib/monaco/CodeEditor.tsx | 12 +- frontend/src/lib/monaco/codeEditorLogic.tsx | 10 + .../data-warehouse/editor/EditorScene.tsx | 2 + .../data-warehouse/editor/OutputPane.tsx | 180 ++++++----------- .../data-warehouse/editor/QueryPane.tsx | 4 + .../data-warehouse/editor/QueryWindow.tsx | 126 ++++++++++-- .../editor/multitabEditorLogic.tsx | 183 ++++++++---------- 8 files changed, 272 insertions(+), 247 deletions(-) diff --git a/frontend/src/layout/navigation-3000/navigationLogic.tsx b/frontend/src/layout/navigation-3000/navigationLogic.tsx index 8507fe104dade7..5467937a674f6c 100644 --- a/frontend/src/layout/navigation-3000/navigationLogic.tsx +++ b/frontend/src/layout/navigation-3000/navigationLogic.tsx @@ -512,7 +512,7 @@ export const navigation3000Logic = kea([ featureFlags[FEATURE_FLAGS.SQL_EDITOR] ? { identifier: Scene.SQLEditor, - label: 'Data warehouse 3000', + label: 'SQL Editor', icon: , to: urls.sqlEditor(), logic: editorSidebarLogic, diff --git a/frontend/src/lib/monaco/CodeEditor.tsx b/frontend/src/lib/monaco/CodeEditor.tsx index aaa5303d35451a..f824b982d7f63d 100644 --- a/frontend/src/lib/monaco/CodeEditor.tsx +++ b/frontend/src/lib/monaco/CodeEditor.tsx @@ -32,9 +32,15 @@ export interface CodeEditorProps extends Omit sourceQuery?: AnyDataNode globals?: Record schema?: Record | null + + onError?: (error: string | null, isValidView: boolean) => void } let codeEditorIndex = 0 +export function initModel(model: editor.ITextModel, builtCodeEditorLogic: BuiltLogic): void { + ;(model as any).codeEditorLogic = builtCodeEditorLogic +} + function initEditor( monaco: Monaco, editor: importedEditor.IStandaloneCodeEditor, @@ -44,7 +50,9 @@ function initEditor( ): void { // This gives autocomplete access to the specific editor const model = editor.getModel() - ;(model as any).codeEditorLogic = builtCodeEditorLogic + if (model) { + initModel(model, builtCodeEditorLogic) + } if (editorProps?.language === 'hog') { initHogLanguage(monaco) @@ -112,6 +120,7 @@ export function CodeEditor({ globals, sourceQuery, schema, + onError, ...editorProps }: CodeEditorProps): JSX.Element { const { isDarkModeOn } = useValues(themeLogic) @@ -130,6 +139,7 @@ export function CodeEditor({ sourceQuery, monaco: monaco, editor: editor, + onError, }) useMountedLogic(builtCodeEditorLogic) diff --git a/frontend/src/lib/monaco/codeEditorLogic.tsx b/frontend/src/lib/monaco/codeEditorLogic.tsx index 05506028c1c933..63290fa0012b7f 100644 --- a/frontend/src/lib/monaco/codeEditorLogic.tsx +++ b/frontend/src/lib/monaco/codeEditorLogic.tsx @@ -1,6 +1,7 @@ import type { Monaco } from '@monaco-editor/react' import { actions, connect, kea, key, listeners, path, props, propsChanged, reducers, selectors } from 'kea' import { loaders } from 'kea-loaders' +import { subscriptions } from 'kea-subscriptions' import { FEATURE_FLAGS } from 'lib/constants' import { featureFlagLogic } from 'lib/logic/featureFlagLogic' // Note: we can oly import types and not values from monaco-editor, because otherwise some Monaco code breaks @@ -48,6 +49,7 @@ export interface CodeEditorLogicProps { editor?: editor.IStandaloneCodeEditor | null globals?: Record multitab?: boolean + onError?: (error: string | null, isValidView: boolean) => void } export const codeEditorLogic = kea([ @@ -270,6 +272,14 @@ export const codeEditorLogic = kea([ }, ], }), + subscriptions(({ props, values }) => ({ + isValidView: (isValidView) => { + props.onError?.(values.error, isValidView) + }, + error: (error) => { + props.onError?.(error, values.isValidView) + }, + })), propsChanged(({ actions, props }, oldProps) => { if ( props.query !== oldProps.query || diff --git a/frontend/src/scenes/data-warehouse/editor/EditorScene.tsx b/frontend/src/scenes/data-warehouse/editor/EditorScene.tsx index 3576303ebddd97..edf174a7cf2167 100644 --- a/frontend/src/scenes/data-warehouse/editor/EditorScene.tsx +++ b/frontend/src/scenes/data-warehouse/editor/EditorScene.tsx @@ -8,6 +8,7 @@ import { useRef } from 'react' import { Sidebar } from '~/layout/navigation-3000/components/Sidebar' import { navigation3000Logic } from '~/layout/navigation-3000/navigationLogic' +import { ViewLinkModal } from '../ViewLinkModal' import { editorSceneLogic } from './editorSceneLogic' import { editorSizingLogic } from './editorSizingLogic' import { QueryWindow } from './QueryWindow' @@ -47,6 +48,7 @@ export function EditorScene(): JSX.Element { )}
+ ) } diff --git a/frontend/src/scenes/data-warehouse/editor/OutputPane.tsx b/frontend/src/scenes/data-warehouse/editor/OutputPane.tsx index 988323bd020936..af571d78b8aa7e 100644 --- a/frontend/src/scenes/data-warehouse/editor/OutputPane.tsx +++ b/frontend/src/scenes/data-warehouse/editor/OutputPane.tsx @@ -3,7 +3,7 @@ import 'react-data-grid/lib/styles.css' import { IconGear } from '@posthog/icons' import { LemonButton, LemonTabs, Spinner } from '@posthog/lemon-ui' import clsx from 'clsx' -import { BindLogic, useActions, useValues } from 'kea' +import { useActions, useValues } from 'kea' import { router } from 'kea-router' import { AnimationType } from 'lib/animations/animations' import { Animation } from 'lib/components/Animation/Animation' @@ -11,51 +11,49 @@ import { ExportButton } from 'lib/components/ExportButton/ExportButton' import { useMemo } from 'react' import DataGrid from 'react-data-grid' import { InsightErrorState } from 'scenes/insights/EmptyStates' -import { insightDataLogic } from 'scenes/insights/insightDataLogic' -import { insightLogic } from 'scenes/insights/insightLogic' import { HogQLBoldNumber } from 'scenes/insights/views/BoldNumber/BoldNumber' import { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut' import { themeLogic } from '~/layout/navigation-3000/themeLogic' -import { dataNodeLogic, DataNodeLogicProps } from '~/queries/nodes/DataNode/dataNodeLogic' +import { dataNodeLogic } from '~/queries/nodes/DataNode/dataNodeLogic' import { LineGraph } from '~/queries/nodes/DataVisualization/Components/Charts/LineGraph' import { SideBar } from '~/queries/nodes/DataVisualization/Components/SideBar' import { Table } from '~/queries/nodes/DataVisualization/Components/Table' import { TableDisplay } from '~/queries/nodes/DataVisualization/Components/TableDisplay' -import { variableModalLogic } from '~/queries/nodes/DataVisualization/Components/Variables/variableModalLogic' +import { AddVariableButton } from '~/queries/nodes/DataVisualization/Components/Variables/AddVariableButton' import { VariablesForInsight } from '~/queries/nodes/DataVisualization/Components/Variables/Variables' import { variablesLogic } from '~/queries/nodes/DataVisualization/Components/Variables/variablesLogic' import { DataTableVisualizationProps } from '~/queries/nodes/DataVisualization/DataVisualization' -import { - dataVisualizationLogic, - DataVisualizationLogicProps, -} from '~/queries/nodes/DataVisualization/dataVisualizationLogic' -import { displayLogic } from '~/queries/nodes/DataVisualization/displayLogic' +import { dataVisualizationLogic } from '~/queries/nodes/DataVisualization/dataVisualizationLogic' import { DataVisualizationNode, HogQLQueryResponse, NodeKind } from '~/queries/schema' -import { ChartDisplayType, ExporterFormat, ItemMode } from '~/types' +import { ChartDisplayType, ExportContext, ExporterFormat } from '~/types' -import { DATAWAREHOUSE_EDITOR_ITEM_ID } from '../external/dataWarehouseExternalSceneLogic' import { dataWarehouseViewsLogic } from '../saved_queries/dataWarehouseViewsLogic' import { multitabEditorLogic } from './multitabEditorLogic' import { outputPaneLogic, OutputTab } from './outputPaneLogic' interface OutputPaneProps { - onSave: () => void + onSaveInsight: () => void + onSaveView: () => void saveDisabledReason?: string onQueryInputChange: () => void - logicKey: string + onQueryChange: (query: DataVisualizationNode) => void query: string + exportContext?: ExportContext } export function OutputPane({ onQueryInputChange, - onSave, + onQueryChange, + onSaveView, + onSaveInsight, saveDisabledReason, - logicKey, query, + exportContext, }: OutputPaneProps): JSX.Element { const { activeTab } = useValues(outputPaneLogic) const { setActiveTab } = useActions(outputPaneLogic) + const { variablesForInsight } = useValues(variablesLogic) const codeEditorKey = `hogQLQueryEditor/${router.values.location.pathname}` @@ -65,31 +63,12 @@ export function OutputPane({ }) ) const { isDarkModeOn } = useValues(themeLogic) - const { response, responseLoading } = useValues( - dataNodeLogic({ - key: logicKey, - query: { - kind: NodeKind.HogQLQuery, - query, - }, - doNotLoad: !query, - }) - ) + const { response, responseLoading } = useValues(dataNodeLogic) const { dataWarehouseSavedQueriesLoading } = useValues(dataWarehouseViewsLogic) const { updateDataWarehouseSavedQuery } = useActions(dataWarehouseViewsLogic) + const { visualizationType } = useValues(dataVisualizationLogic) - const { insightProps } = useValues( - insightLogic({ - dashboardItemId: DATAWAREHOUSE_EDITOR_ITEM_ID, - cachedInsight: null, - doNotLoad: true, - }) - ) - const { setQuery } = useActions( - insightDataLogic({ - ...insightProps, - }) - ) + const vizKey = `SQLEditorScene` const columns = useMemo(() => { return ( @@ -138,8 +117,8 @@ export function OutputPane({
) : (
-
) @@ -158,6 +141,11 @@ export function OutputPane({ return (
+ {variablesForInsight.length > 0 && ( +
+ +
+ )}
+ + + {exportContext && ( + + )} + {editingView ? ( <> ) : ( - onSave()} disabledReason={saveDisabledReason}> + onSaveView()} disabledReason={saveDisabledReason}> Save as view )} @@ -211,65 +221,9 @@ export function OutputPane({ ) } -function DataTableVisualizationContent({ - query, - setQuery, - activeTab, -}: { - query: DataVisualizationNode - setQuery: (query: DataVisualizationNode) => void - activeTab: OutputTab -}): JSX.Element { - const vizKey = `SQLEditorScene.${activeTab}` - const dataVisualizationLogicProps: DataVisualizationLogicProps = { - key: vizKey, - query, - dashboardId: undefined, - dataNodeCollectionId: vizKey, - insightMode: ItemMode.Edit, - loadPriority: undefined, - setQuery, - cachedResults: undefined, - variablesOverride: undefined, - } - - const dataNodeLogicProps: DataNodeLogicProps = { - query: query.source, - key: vizKey, - cachedResults: undefined, - loadPriority: undefined, - dataNodeCollectionId: vizKey, - variablesOverride: undefined, - } - - return ( - - - - - - - - - - - - ) -} - -function InternalDataTableVisualization(props: DataTableVisualizationProps): JSX.Element { - const logic = insightLogic({ - dashboardItemId: DATAWAREHOUSE_EDITOR_ITEM_ID, - cachedInsight: null, - }) - const { saveAs } = useActions(logic) - +function InternalDataTableVisualization( + props: DataTableVisualizationProps & { onSaveInsight: () => void } +): JSX.Element { const { query, visualizationType, @@ -361,27 +315,7 @@ function InternalDataTableVisualization(props: DataTableVisualizationProps): JSX tooltip="Visualization settings" /> - {props.exportContext && ( - - )} - - saveAs(true, false)}> + props.onSaveInsight()}> Create insight
@@ -389,8 +323,6 @@ function InternalDataTableVisualization(props: DataTableVisualizationProps): JSX
)} - -
) diff --git a/frontend/src/scenes/data-warehouse/editor/QueryPane.tsx b/frontend/src/scenes/data-warehouse/editor/QueryPane.tsx index 10e36c436e739a..502084bee80e60 100644 --- a/frontend/src/scenes/data-warehouse/editor/QueryPane.tsx +++ b/frontend/src/scenes/data-warehouse/editor/QueryPane.tsx @@ -3,12 +3,15 @@ import { Resizer } from 'lib/components/Resizer/Resizer' import { CodeEditor, CodeEditorProps } from 'lib/monaco/CodeEditor' import { AutoSizer } from 'react-virtualized/dist/es/AutoSizer' +import { HogQLQuery } from '~/queries/schema' + import { editorSizingLogic } from './editorSizingLogic' interface QueryPaneProps { queryInput: string promptError: string | null codeEditorProps: Partial + sourceQuery: HogQLQuery } export function QueryPane(props: QueryPaneProps): JSX.Element { @@ -31,6 +34,7 @@ export function QueryPane(props: QueryPaneProps): JSX.Element { className="border" language="hogQL" value={props.queryInput} + sourceQuery={props.sourceQuery} height={height} width={width} {...props.codeEditorProps} diff --git a/frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx b/frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx index fa8f52c6047816..52bd671775772f 100644 --- a/frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx +++ b/frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx @@ -1,39 +1,121 @@ import { Monaco } from '@monaco-editor/react' -import { useActions, useValues } from 'kea' +import { BindLogic, useActions, useValues } from 'kea' import { router } from 'kea-router' import type { editor as importedEditor } from 'monaco-editor' import { useState } from 'react' +import { dataNodeLogic, DataNodeLogicProps } from '~/queries/nodes/DataNode/dataNodeLogic' +import { variableModalLogic } from '~/queries/nodes/DataVisualization/Components/Variables/variableModalLogic' +import { + variablesLogic, + VariablesLogicProps, +} from '~/queries/nodes/DataVisualization/Components/Variables/variablesLogic' +import { + dataVisualizationLogic, + DataVisualizationLogicProps, +} from '~/queries/nodes/DataVisualization/dataVisualizationLogic' +import { displayLogic } from '~/queries/nodes/DataVisualization/displayLogic' +import { insightVizDataNodeKey } from '~/queries/nodes/InsightViz/InsightViz' +import { DataVisualizationNode, NodeKind } from '~/queries/schema' +import { ItemMode } from '~/types' + +import { DATAWAREHOUSE_EDITOR_ITEM_ID } from '../external/dataWarehouseExternalSceneLogic' import { multitabEditorLogic } from './multitabEditorLogic' import { OutputPane } from './OutputPane' import { QueryPane } from './QueryPane' import { QueryTabs } from './QueryTabs' +const dataNodeKey = insightVizDataNodeKey({ + dashboardItemId: DATAWAREHOUSE_EDITOR_ITEM_ID, + cachedInsight: null, + doNotLoad: true, +}) + export function QueryWindow(): JSX.Element { + const [querySource, localSetQuerySource] = useState({ + kind: NodeKind.DataVisualizationNode, + source: { + kind: NodeKind.HogQLQuery, + query: '', + }, + } as DataVisualizationNode) + + const dataVisualizationLogicProps: DataVisualizationLogicProps = { + key: dataNodeKey, + query: querySource, + dashboardId: undefined, + dataNodeCollectionId: dataNodeKey, + insightMode: ItemMode.Edit, + loadPriority: undefined, + cachedResults: undefined, + variablesOverride: undefined, + setQuery: localSetQuerySource, + } + + const dataNodeLogicProps: DataNodeLogicProps = { + query: querySource.source, + key: dataNodeKey, + cachedResults: undefined, + loadPriority: undefined, + dataNodeCollectionId: dataNodeKey, + variablesOverride: undefined, + } + + const variablesLogicProps: VariablesLogicProps = { + key: dataVisualizationLogicProps.key, + readOnly: false, + } + + return ( + + + + + + + + + + + + ) +} + +interface InternalQueryWindowProps { + setQuery: (query: DataVisualizationNode) => void + query: DataVisualizationNode +} + +function InternalQueryWindow({ setQuery, query }: InternalQueryWindowProps): JSX.Element { + const [error, setError] = useState(null) + const [isValidView, setIsValidView] = useState(true) + const [monacoAndEditor, setMonacoAndEditor] = useState( null as [Monaco, importedEditor.IStandaloneCodeEditor] | null ) const [monaco, editor] = monacoAndEditor ?? [] - const codeEditorKey = `hogQLQueryEditor/${router.values.location.pathname}` + const { setEditorQuery } = useActions(variablesLogic) + const logic = multitabEditorLogic({ key: codeEditorKey, monaco, editor, + sourceQuery: query, + onRunQuery: (query) => { + setQuery({ + kind: NodeKind.DataVisualizationNode, + source: query, + } as DataVisualizationNode) + }, + onQueryInputChange: (queryInput) => { + setEditorQuery(queryInput) + }, }) - const { - allTabs, - activeModelUri, - queryInput, - activeQuery, - activeTabKey, - hasErrors, - error, - isValidView, - editingView, - } = useValues(logic) - const { selectTab, deleteTab, createTab, setQueryInput, runQuery, saveAsView } = useActions(logic) + + const { allTabs, activeModelUri, queryInput, activeQuery, editingView, exportContext } = useValues(logic) + const { selectTab, deleteTab, createTab, setQueryInput, runQuery, saveAsView, saveAsInsight } = useActions(logic) return (
@@ -51,8 +133,10 @@ export function QueryWindow(): JSX.Element { )} { setQueryInput(v ?? '') }, @@ -66,16 +150,20 @@ export function QueryWindow(): JSX.Element { runQuery() } }, + onError: (error, isValidView) => { + setError(error) + setIsValidView(isValidView) + }, }} />
) diff --git a/frontend/src/scenes/data-warehouse/editor/multitabEditorLogic.tsx b/frontend/src/scenes/data-warehouse/editor/multitabEditorLogic.tsx index c6b9e4ed575c99..c53a94f9dfc937 100644 --- a/frontend/src/scenes/data-warehouse/editor/multitabEditorLogic.tsx +++ b/frontend/src/scenes/data-warehouse/editor/multitabEditorLogic.tsx @@ -1,23 +1,30 @@ import { Monaco } from '@monaco-editor/react' import { LemonDialog, LemonInput, lemonToast } from '@posthog/lemon-ui' -import { actions, connect, kea, key, listeners, path, props, propsChanged, reducers, selectors } from 'kea' +import { actions, afterMount, connect, kea, key, listeners, path, props, propsChanged, reducers, selectors } from 'kea' +import { router } from 'kea-router' import { subscriptions } from 'kea-subscriptions' import { LemonField } from 'lib/lemon-ui/LemonField' -import { ModelMarker } from 'lib/monaco/codeEditorLogic' -import { editor, MarkerSeverity, Uri } from 'monaco-editor' +import { initModel } from 'lib/monaco/CodeEditor' +import { codeEditorLogic } from 'lib/monaco/codeEditorLogic' +import { editor, Uri } from 'monaco-editor' +import { insightsApi } from 'scenes/insights/utils/api' +import { urls } from 'scenes/urls' import { dataNodeLogic } from '~/queries/nodes/DataNode/dataNodeLogic' -import { performQuery } from '~/queries/query' -import { HogLanguage, HogQLMetadata, HogQLMetadataResponse, HogQLNotice, HogQLQuery, NodeKind } from '~/queries/schema' -import { DataWarehouseSavedQuery } from '~/types' +import { queryExportContext } from '~/queries/query' +import { HogQLMetadataResponse, HogQLQuery, NodeKind } from '~/queries/schema' +import { DataVisualizationNode } from '~/queries/schema' +import { DataWarehouseSavedQuery, ExportContext } from '~/types' import { dataWarehouseViewsLogic } from '../saved_queries/dataWarehouseViewsLogic' import type { multitabEditorLogicType } from './multitabEditorLogicType' - export interface MultitabEditorLogicProps { key: string monaco?: Monaco | null editor?: editor.IStandaloneCodeEditor | null + onRunQuery?: (query: HogQLQuery) => void + onQueryInputChange?: (query: string) => void + sourceQuery?: DataVisualizationNode } export const editorModelsStateKey = (key: string | number): string => `${key}/editorModelQueries` @@ -53,15 +60,16 @@ export const multitabEditorLogic = kea([ initialize: true, saveAsView: true, saveAsViewSubmit: (name: string) => ({ name }), - reloadMetadata: true, setMetadata: (query: string, metadata: HogQLMetadataResponse) => ({ query, metadata }), + saveAsInsight: true, + saveAsInsightSubmit: (name: string) => ({ name }), }), propsChanged(({ actions, props }, oldProps) => { if (!oldProps.monaco && !oldProps.editor && props.monaco && props.editor) { actions.initialize() } }), - reducers(({ props }) => ({ + reducers({ queryInput: [ '', { @@ -100,57 +108,10 @@ export const multitabEditorLogic = kea([ setTabs: (_, { tabs }) => tabs, }, ], - metadata: [ - null as null | [string, HogQLMetadataResponse], - { - setMetadata: (_, { query, metadata }) => [query, metadata], - }, - ], - modelMarkers: [ - [] as ModelMarker[], - { - setMetadata: (_, { query, metadata }) => { - const model = props.editor?.getModel() - if (!model || !metadata) { - return [] - } - const markers: ModelMarker[] = [] - const metadataResponse = metadata - - function noticeToMarker(error: HogQLNotice, severity: MarkerSeverity): ModelMarker { - const start = model!.getPositionAt(error.start ?? 0) - const end = model!.getPositionAt(error.end ?? query.length) - return { - start: error.start ?? 0, - startLineNumber: start.lineNumber, - startColumn: start.column, - end: error.end ?? query.length, - endLineNumber: end.lineNumber, - endColumn: end.column, - message: error.message ?? 'Unknown error', - severity: severity, - hogQLFix: error.fix, - } - } - - for (const notice of metadataResponse?.errors ?? []) { - markers.push(noticeToMarker(notice, 8 /* MarkerSeverity.Error */)) - } - for (const notice of metadataResponse?.warnings ?? []) { - markers.push(noticeToMarker(notice, 4 /* MarkerSeverity.Warning */)) - } - for (const notice of metadataResponse?.notices ?? []) { - markers.push(noticeToMarker(notice, 1 /* MarkerSeverity.Hint */)) - } - - props.monaco?.editor.setModelMarkers(model, 'hogql', markers) - return markers - }, - }, - ], - })), + }), listeners(({ values, props, actions, asyncActions }) => ({ createTab: ({ query = '', view }) => { + const mountedCodeEditorLogic = codeEditorLogic.findMounted() let currentModelCount = 1 const allNumbers = values.allTabs.map((tab) => parseInt(tab.uri.path.split('/').pop() || '0')) while (allNumbers.includes(currentModelCount)) { @@ -161,6 +122,11 @@ export const multitabEditorLogic = kea([ const uri = props.monaco.Uri.parse(currentModelCount.toString()) const model = props.monaco.editor.createModel(query, 'hogQL', uri) props.editor?.setModel(model) + + if (mountedCodeEditorLogic) { + initModel(model, mountedCodeEditorLogic) + } + actions.addTab({ uri, view, @@ -218,6 +184,13 @@ export const multitabEditorLogic = kea([ initialize: () => { const allModelQueries = localStorage.getItem(editorModelsStateKey(props.key)) const activeModelUri = localStorage.getItem(activemodelStateKey(props.key)) + const mountedCodeEditorLogic = + codeEditorLogic.findMounted() || + codeEditorLogic({ + key: props.key, + query: props.sourceQuery?.source.query ?? '', + language: 'hogQL', + }) if (allModelQueries) { // clear existing models @@ -237,6 +210,7 @@ export const multitabEditorLogic = kea([ uri, view: model.view, }) + mountedCodeEditorLogic && initModel(newModel, mountedCodeEditorLogic) } }) @@ -273,8 +247,9 @@ export const multitabEditorLogic = kea([ } } }, - setQueryInput: () => { + setQueryInput: ({ queryInput }) => { actions.updateState() + props.onQueryInputChange?.(queryInput) }, updateState: async (_, breakpoint) => { await breakpoint(100) @@ -288,17 +263,14 @@ export const multitabEditorLogic = kea([ localStorage.setItem(editorModelsStateKey(props.key), JSON.stringify(queries)) }, runQuery: ({ queryOverride }) => { - if (values.activeQuery === queryOverride || values.activeQuery === values.queryInput) { - dataNodeLogic({ - key: values.activeTabKey, - query: { - kind: NodeKind.HogQLQuery, - query: queryOverride || values.queryInput, - }, - alwaysRefresh: true, - }).actions.loadData(true) - } - actions.setActiveQuery(queryOverride || values.queryInput) + const query = queryOverride || values.queryInput + + actions.setActiveQuery(query) + props.sourceQuery && + props.onRunQuery?.({ + ...props.sourceQuery.source, + query, + }) }, saveAsView: async () => { LemonDialog.openForm({ @@ -336,24 +308,33 @@ export const multitabEditorLogic = kea([ await dataWarehouseViewsLogic.asyncActions.createDataWarehouseSavedQuery({ name, query, types }) }, - reloadMetadata: async (_, breakpoint) => { - const model = props.editor?.getModel() - if (!model || !props.monaco) { - return - } - await breakpoint(300) - const query = values.queryInput - if (query === '') { - return - } - - const response = await performQuery({ - kind: NodeKind.HogQLMetadata, - language: HogLanguage.hogQL, - query: query, + saveAsInsight: async () => { + LemonDialog.openForm({ + title: 'Save as new insight', + initialValues: { + name: '', + }, + content: ( + + + + ), + errors: { + name: (name) => (!name ? 'You must enter a name' : undefined), + }, + onSubmit: async ({ name }) => actions.saveAsInsightSubmit(name), }) - breakpoint() - actions.setMetadata(query, response) + }, + saveAsInsightSubmit: async ({ name }) => { + const insight = await insightsApi.create({ + name, + query: props.sourceQuery, + saved: true, + }) + + lemonToast.info(`You're now viewing ${insight.name || insight.derived_name || name}`) + + router.actions.push(urls.insightView(insight.short_id)) }, deleteDataWarehouseSavedQuerySuccess: ({ payload: viewId }) => { const tabToRemove = values.allTabs.find((tab) => tab.view?.id === viewId) @@ -396,25 +377,23 @@ export const multitabEditorLogic = kea([ }).mount() } }, - queryInput: () => { - actions.reloadMetadata() - }, })), selectors({ activeTabKey: [(s) => [s.activeModelUri], (activeModelUri) => `hogQLQueryEditor/${activeModelUri?.uri.path}`], - isValidView: [(s) => [s.metadata], (metadata) => !!(metadata && metadata[1]?.isValidView)], - hasErrors: [ - (s) => [s.modelMarkers], - (modelMarkers) => !!(modelMarkers ?? []).filter((e) => e.severity === 8 /* MarkerSeverity.Error */).length, - ], - error: [ - (s) => [s.hasErrors, s.modelMarkers], - (hasErrors, modelMarkers) => { - const firstError = modelMarkers.find((e) => e.severity === 8 /* MarkerSeverity.Error */) - return hasErrors && firstError - ? `Error on line ${firstError.startLineNumber}, column ${firstError.startColumn}` - : null + exportContext: [ + () => [(_, props) => props.sourceQuery], + (sourceQuery) => { + // TODO: use active tab at some point + const filename = 'export' + + return { + ...queryExportContext(sourceQuery.source, undefined, undefined), + filename, + } as ExportContext }, ], }), + afterMount(({ props, values }) => { + props.onQueryInputChange?.(values.queryInput) + }), ]) From 65592273e43c2d46c454a0e91931150bab95ad76 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> Date: Thu, 5 Dec 2024 16:34:59 +0100 Subject: [PATCH 09/12] fix: added missing sdk for flutter onboarding session replay (#26680) --- ...her-onboarding--onboarding-sd-ks--dark.png | Bin 96826 -> 98549 bytes ...er-onboarding--onboarding-sd-ks--light.png | Bin 98697 -> 100280 bytes .../experiments/ExperimentCodeSnippets.tsx | 6 +++--- .../feature-flags/FeatureFlagSnippets.tsx | 2 +- .../SessionReplaySDKInstructions.tsx | 2 ++ .../WebAnalyticsSDKInstructions.tsx | 2 ++ 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png b/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png index e23d1c60a85ce146167cdda375253d9656cb0068..535804d77de4ef8821ccbe2ed4164e72e3f0b37c 100644 GIT binary patch literal 98549 zcmdSBXHZn__a%z2BEFy?L69VhARsws5NUD{MY7Nmo1CG^s7R6|3N$(A3{4J=faE6U zEIH?#ntAYle|J92tvjElW~Rz2o71Pe&lAqxYp=ET2~<&*d4NlSi-m>tKu#9&4h!q{ z2^JPM{k?y{k%^`hKk(lzhj%isu?l;r*08XiV#z@y-n+zaPQx`xM$d6};gkwH_3(5B zoR%5)FxDu|ACGxkF9)m*)|J>t4^0gCOGY(cVM`H0ZV|qBD@r}gV6DBlFtkOcu;6|9 zwS3{a?T|E%g!R-pEa$tz1stM`EyTZqpTxp?6N?12w$>=b$D`qb@d)|bS@ z8He5i(xKs5cJ>|h#~h3TLKAs;Im1IE$MB~^J3dygoTQ+?VB}a>A78B<2UGKgYO||X zl$JeB{nGSW(237V`wfKO`Zu(el$kZ2+dZ>9M9o-gcw6*>Buu8F`}m@Q=>y6#ClR&H zKYQ8db8K9qnGYMyf2XElWo~+YRJmnPa>_}$`EKV})8BJACOP?2t6yvSWCvQoTfCvO zv$H96-a1htNyVsm&!z7BpQj8k94FqR*w~51#fY!Jb?WU8_118gJBh*}v^iu$Sy?b? zXb@o_MAS5^Eh(XgaiAWIeD}BG#hT7|^(pD{GR@UV8fRJ?2RnjI@4Vkz+yFUFt-k#| zBhpycO4rHB3DI_B>tHAz`#e1_&%)She7gN2sJy&9x8^0`-tg(j$jF<`s;dFR#>USx zGkODv3j!)!yoTL7p?UYD?oOWC8G3lsTjW~UOaf*g!_{NUmAHV*euUlOpXoU*Qs^W<#&dZ4($>Mn(p#*O#A%uan8fa4_>I z@=;{%$z?zC$wIMUO0y(Y0@dlu%eu=i?d|R7ej{m!$eE&o0tegTtK-_F#ly&kh9pE* z?MrBRRr=z<60@3`TAoJ1Q(95aX{ET4>+`Oi2O%M)64n!CsO;obeJS6#I163f>1v0S zuI*WkVgh$xTA%Kjnb3fyCibDBA-d@rYNCBO{xrrTuzd<``8#0l?%lf&9y}=F9No#t za8e&zc5@Pl7uulJ3Q-E-UswoaTvH#IfNALH=)7~xn(Lre*q3fv3|!Ftpo>o}qW$5W zfrPGN{|_&3N15-Z4uCj zp*vf1v(q87ub?tAS)Pkj_-!*i%41XZOzY+jhRFJQQJG9FNy*!yqV-Ml2F#RseSP}6 zQI&&hJI@@)4N+cVlAiSn@?BiWQmTYanc#bo+ZL7v>75$YcH9!m(6h7i`!r8J=;*+O z>05?=8#P`Eiagl?`!&<~a9C4cLE++QH@bU>m#35q>3HPW7DCxg;ymtu--)+8hC3@S zr=sVUs;Zh!-71q4uhdEylfc-^moEcNTMwDQ1Pl)i)6%jtWKFGYdIXvdEdDDrF;V&R zXIv}=gCbSi?^*p6OASZ9zbl3Q!^6>cvU~V6bwcQK{O)2Xz3cO5+`|3=ECnplafgtI z$jGD9X*_USi?+O@V?_-AjO3Y=eWT!Xvdh8ETZ?e(o$Y-CeP`>~R!JMAT-qeJ;fE%LA|xV5!)Gd})VA)B*vMNCY=zds?gf=8p|q(Mhh$UG}6 zt8{lK^`2+}eJW&1R#BIwe^SHP^b-YT<&MtI+=7C^!9fQ*J3cP1bNAU7bKv%+|KWW< zkKda%!^2GP&YbN_vk-x9IR`@rH#a}ap4@^AHHK_Md(_1V z&BO4h%ohjOU)*l}G?|vKVVz7)L=`5Y*a#nykjmjKJD_wT=4JUmZnVK4@>DE90k8#6O~J|12k41U^Ad%wKN z?|hS6$V)bNbbH^&#dgBGch4gu)hzLKj?Hi-JU!z`8a$z#qDYT3A~R}F(dqd3(8Bop zYmVW|CMkX<8}*B97b@$W!>j#i(mnBFApy8}L2NR*Tk|elBvh8e!^3T%N$)jOk);)f zwhqX$iu=@@EG(C=VJnn&Yx}EjpC`JR7iLREBqTV@8PL6L^DPykR8DYuOPTd1DNe-f zAO9}7ngsOaowmqv-WavvpzrQ}ZH6nx zLZ_LQcN|9%$1^ls{eg|pEIY38?H^#8K9ZrowK`{=MlcM<4{;oPz~vi~?h%V!RDfj3V}%5N&N~39mU2{>dM& z!ktl;e6_iy=GUK_MV^dy4Gy|z!|d!jwiY9feXUUX&V2DCZ?)b=#>A9oT{eDOQV^Y< zUYNJ$gq36`Vz{M5J@{+zg;KFm{<%t zX7FKSlauzYQ$y}%11)MVf@wCEx7YuCM8wASpi$9cR^K#f=WGQ91--?q$FyAG9c!FV z{M!}|E^m8;+gesb!x5g)UaJ+wrW@jv}MDlX+33;3{67ur%Sy)(L-#u?@ znSRe9d*(SdGn_X{VyPv+*Ql`_;xoTVa+jGJ$rk5qeZiQBP08Vhm0>-FdK(jYivY; z5Jr+jaqrKXJZAGQ%X;=OA&cwI$kq8K13ZU=To8eCD=h8_2?`Rv)jpp+5#S!+4s0JE zk8#yf)6&(@fazQ7MMD{DD?DLKr3QuzKQONTRXU>1&uB|4Dtfwyd6|W?a^B7u1>;|= zn|NH7Ta5CS^IUp(2CNn}^pHM^eAwU8uJGmj9Lu|bZKqSAW2ad!<@96iW4kryci##V ztv@v+WkyLGydEfz)}&qE^=L8J>uBhCuciTzLv&2+@77jhBO_M|Iz;QlLLL^!`7sj{+VvN;B5$4~^=g1I+OP8FY2@bSdR;g7;%-llN5r8{TT(x7 z+MTONbaIZl{o!nT2W~lW@uXE|PJUt`3<)=;{3bzje0OqhRrbmL+_rsq)_xo*?7ndt z_;XtH5Q~I}WOZrFRhUUjO-W5s^*MWGa>H{9kHl9rFWWx4|IlO^iRd7<$}f;&O?A)7 z*=J632Q}8+WKg|iu+mS6NFgr=qJC`q^F%}1e($TDS#MiIBErL+1i5l=zNXLr_V>iZ z!i0o^WR#c?tu)4w8Vvbybd9K?e}Ln7O{RycQS01U4&v&;N6&YN>dh*i}OWdRKXu5JX zp3Bw18~blD*caqhswYOMl*lvZ4fV{-%zP0p3)X~{1x>~lFK*achTvP@eTeKTnAF`aYK<9vW#cP zN5DO_#lT66K~!|%!>-5qrqae*)e-I3N3iPTrWERFX;tsFAiBD`0<%GSUkGB? zP**oMHy5jS{8u$3hUj2wVz>yk|L!uxqC<{f>|#-pci0>4xl$}>Q-_iNVEMkO+hV8w z;6+j|0%fePUvZSzYyF|YjX`j3aj%&hri_^GpPt^TgnHLS+FmK!H;oUrX|Q-}pOZRF zg;0)oB9DUH;Y3i6J?u;m$m*^t1AZ1=8;#&$R&8yZr9~+cUUT0a93RXI&74A=t)O&6 zL-DV~j_%!zA~_@xJx0#!c85?mxavK_Ls>lRqa(8CY~4xxFo1iKypA)H0?ZRKPw50B!_T<DSiQ%1zqA;giQ*1fr|2ZbtG+ zZ1|`9nMvjgNJJ8}FS9N=`Fj8wt!RuVW$^Y@-@WTkb8>PW5FV=ul5sdMFK=sT+~yW> z)lS%LbSqGdip3Q2q{6>8!l556Q2-1I6AILh$kX<9q;vy z4ui^W9tqHDgZkaF%b>(%AR-2Zc{b~LO-xu{yzR<{(9zQBpxXX$ihZ^+rZu*a2xXq^ zDUaUx@7KA)Y?dhISqOG2DrN4{H|VBbV!YU{EW9udnXMiL&Fz2IaH6u zuMZ7hERf;)stpfs`Q+#4M|gI4;CydYSJ!@VO(l${qoIKa_(p@Re%|{NRE{9#+;g*M zzuwPahVVF}O&>TpnWgyEoL7~k1v1j^m(DB2#Kn|bM^_f2Rdv-QA&(wCf*6@k2%WW| z>&hp5{0RbA+jbhL`B+Xz3MN&vx}BX)#;YA{5IDIxIrOwaGBPErYp-7^9@`igG}ZB3 ztsK(b{N|_6$qZVUMA3^oM@Q%9ZnNH%!|m+>0l~q+sEcE7H#avxa=4#drMRg6e4$ia zQfg45NvY=&$|NT%`!rPnQTVVwKW5O<$`S>ZAbMIdG6q_CB_#zVh0)Q$ zI8IM_jkc82QwVLWm|<>00(DS}_7(culXw9_`f257sdB_^I-1dd>3PH)^|F}w=CXbf z5Brb{=huDtqM_$%xN$8;BkHzz6x{_VfSQ^b7ScQvYVKOkHLbW68 zC`Gq6g0DN(1#{Yc*Cf&^+*l#Nn>Vzjfp+Mnt?%wslifq7xF3$KwyWyPK?iI|Bl%QC`goV1t9d4}*hO z5+{E}1hvdRDZ6`fxye{^GG^5xEIJp@JRgS*>>VBL9Z-V^b=pRQ^P6ZdnlmjX;{>YN zu(nyfiwVWQ`N*g5OYq5H@2Ck%%oy$WGxCo&=YGQYx}V*=!0OEG^}hJ8X-woW z`hSky)e^gT?^Eg8jN4g4)L)wP71S*5Gdw079=-%WB-WX}7-zjX2g^m|FCA)+9{YRR zf9Fj9e`wVY&z~<~LjRtRIH=#08 z{tuV=zvC21_TrKXdpo=B9mZF#W8>p@@16<@O&B^JVY%JM!U_nOoW1o++|tX;$FVje zW2w={zhu+~q=#emE@AjqL4Lm5<;X;|fLUE^uDPC`m!Y9y5x-b+x<~8tRB|Y;Luby(O$3Q+KYu%H|-GR+)_S=eAX8>@C;kL$KJH($5I^K9$u`*@g5 z$e^4^itGDkIY4*4$fJI=)?k0}-$Ka`+S-tomKJSoZAm|Y$;nAf^|gwW)Y1aa#?qP` z7Uox$KNC<_yGF<6`b%H#LE2+RoLRp++bmDQMrTV7kuzJk3^F*Q&)6P32ys8gxGt^+Ce$9! zpb}C+J~5j=ZL`!;Qi=>Hb+C^X$GgASPtTj|H=ex832=@@6+%3Dx*h>IReejN-*raT zssJnScxc+r7fhCv*g+OI7ax<5B@GQb23oa@_{T6LWRH560#AE%d8^C#$-WQa3;dn7VQQFshvvodPuL*@~Bq zt1-po#HYw;2G@gET~`#Ogyg0J%S@Xpu!<;($oF#ix@0>ww9jb8G>ERlagi4}8ZP3A zWLGW{ijafbT3wQYQFq@nB?k!47xe~Wdwx$pveu}ottEW>`n7?Y+J@3#6(#@C(NRD^ z+X80@+?h$3k`82Ykmj3*%(!LK;V?;me-~F*9v&WP$cI>AxO&{@(Yfqx+h{EA2 z#670`*OxUWMoXhmnxB`K;5#aESPL3L!{0hMC`!MyeTGK}S=`zZbVg^FmR@*Yx~fb( z0tl7b%W^5n9Y*6U=6j;Ar zeR4m$O_9_Kd$HO@>W5F@dRm-XQ4!VAo~0C*UsR;=?pa=0snLp2X){ zfY4M^8(wG)eY+blq8^1bQRe33d&$a5PwVYHOZeQ65Qq?fwKG|N|NgzYGcUd2{MV9@ z2O&g(W1XG$0Aud!sO$#2Z8o*E>&R6qDJd=Y#!YWjYKuqr=8$}sRcs91tTZY2vck;1 z>#_944`Y@?|9os(s+Z8CD-^5*q2*+r4~@?G=>Ywq%JwWZM^bC2dqI0u^<5$)l0i!( z_+S>>^QdvNrI3S7%4#~LxecFMtaY(USFiKf2f{+yL1QvAlX&Zvm&lW% ziVA1IgihmXI!9}1M)xLgcTJ(o>MkV=4b!r+F7mawpQLeT7x`;lpyc25KBc9kWX}8& z62eOes?N^s;W_`pE{C0MJvO$Ug|@K%kr6f~rX~Ao$@=;i%8yUN{xF1ESXz<!h8`mnpkeXQhb z5P_fE)nhq`msdexM3%qs z!AN)-1EAQ{c9SI}ZUF+~_&fw8@vF0yMu6;L3=FhHK`jh#67<*OMVy3KMJ2t2M-2*T zggjV8E@=t1baXmwBpSKhsKUeFdPaQqq+!!L$}{bHMo8!@P!j!G1CNxj{y58}o3H-| zjrQ?}N9D3~kRjSkGI&t55c{^ZU>x1E)J~yuKE=aL8`j>-m*=}x(E-x6$8$Ky%9__| zk#8XOCVq~tOp^pZ07H1GzdW}s4YA{&C!i60;>lW}bE^v<`Tfr;zBpOLW-d2Mf^Z{BNKLH(F)_)UF8F)P@E!0T zp~rW@v|jJ6G=BX}SE4x;gaE5CtKZu5>bD}_$Dx1kfE&6C1vWE$z{b)@7E)d93W>6m8)Ym0YQ@Hunl?w)i&2}>Z%SJtBMN4 z1>KjH$R38*ClnNgRmQ}SbFaua&khW5(f(jV{YKa2<`&Y@vLPm?V|AY>Hx>_ab4^cw zfb~SHgOzb^5aDM)n2}?>GJ6UVDF_|R%*?(`QTzKiOz`arE&L)Rr81FRmMdM*u*66^ zN$EKC6yJ8SS0zVd`@eGP1U=cct-<7iLz8&`*T7d4iNiHtLxx@qR1yRhrprs;*RPI6 zM){U%1RGITKXW^=ZOa1sO;4$ca*wB+OR2y!jmwE()YbcAb&UuF!oqY+Q#%?!SPuI2 z_4Vg6_y}1#GB(IJ$hEAqa9zYS1zlKi`fX|2wPf+7;PvC?d_XYNU4A|^*45R8)2_Xm zeSpNjcquB{JUBSrIw7y5R(=)YapvZ{O})))K6DRCv-9m+XD}L_I!`q2QNw=t$ClcU z`iU1OKSS?GPwQBF`)J!_FFgD38DJ!qKCyT|6>?oK`_lDmn%(=OzO{*=p{};J2@EC) z`A0(3p{Oi37vR`mBO{q*W$2L+ZD;lrmG*@_P{Dv%jA_7Bn)Nl#6joJ1WOUrm_US=p zY_Oi}sbdb8)nrlk-~QeD@jqSwrid>!mJ&VWM~@HU4WNs9)C2D#S@4zu=zkD|e)FZp zbxKLn*n8n#G9x;r{dw)qcA8l9TAK;#@l+=Qy}LG9ds;vC2)>g!F)?v^dS6MQ>!bBE z9PG1Nd^@I>FHPQEqN*Z5eGTqGz7cg};}fg=N7Tbxpo#;v50JV-f@(WNUMFYdxHept zsPlO?H7g34wG9lsQ_#t~O83a&qY=XH)!nO~n)ZA6_Vg@>o<5_nkj>L$K$i+^rZbO6 zG)XCF{&yvsmKGM=u;crn1Ot#YS@HW4fi)1^bGz;@Lc-n{&D1!Y%w&hB zNPNbSE}HztioL0IjcA5l7(^zI%UaPso@kB+X`SEEHt zq?MEkLPL*-n0^*Yw;fvkd(Ecv-9cKESV-h+M|~)j=j&<>tLGN!%w5etxW{!oD!+SJ z1_l&%(S5{zWMuU!iEZAC@;$jA)TXVj*Sy|j}%09y_#Jrtxwiyv(m z!es%w5f>K+-!Fu8~wR-+t8knm-t@Kg_AJr6PO*2A30$jBPE8c)xW zeS)lyV_<6>J6F7T(aOfA3>K)n8y&#dkX-!J@E@%E@-FAjwp|?^qMqj;q@*%H4D#JACq{L}X-l^8vOjxc z=ey@iwQ7q3X2z~h?nj-32D}SusgPc@?x0Oos+9_?HgFO%%PXm%+H79AcB^OZiGL7O zM*@mvD{Je_!osN7Sd@D&%|O!c^&qIG8XiSIvy{mY5!uHq5sD91QV1%!nk;QdQ+a#-it$tF|BiC) ze|707{%3I|Q~sLYZoUeGzhdX)EF|w7dsEZi#x3OrS&p}<5 zbV1O?_m^M2!q&nh|29E-PaZb|hAV>}*g;y>xgF_eV`{YZR!fF5tw z^+LRq3B^K9odESdn;9OK+Pizh8YHv-(ZeM3*#F)QM(1B$5CG|3(80vbt%`dI)MslM zL70Q(T67mINtb>)14N`9)NOL|7#VTwIJdfB>o12D75J))gN=1t6%XhvwYeT!l;jKg+dWzv0>}_&KrXd#?pL{@qlL z_rdgmR4s0}3x=zmVy_obg6H|FJ_OaYh$(++TKtL*CaLT z6TkhKEUxOZd78tgg#iU*b2GaEM~H9IS`ZoQ z#|i{Hl*@i`H#>V3Si1l_O&+5K*k3yXTRXdok_sMPZYMkESV6?%KUcuQ^JIVo`t%{)ix(Zrvo|WrCog~ZGx@@toV8J_N$=?jT^*gSuEFN6 zuIEpG*#PE)3g5q)|N0C@qgUf0_4J|R_z?4TWk*++&v;=`(KT=ZH8-&X5{9_{ci_Sc zWvbB=*xyCRm53@Ta}i05jeUs((c8k@yhyt3Lr7>!Qibo=JJhERWCuX<%&e?z1JYrw zrR{oz+`v|t_?7+1ws<;wNJ#McAHWiUo$UX8iMc?(`OC@XM5|>GB-M^M69!x1U{{cr zH@4v8zY^^NwhgIsX6;xCiqhf3qoa(;b@TNB;65pUC2EcEGyG-IL_f1Y&01Pp)zsD3 z*4DThqMR1{P+)^ZBcLBm%u9{-R0que`TUfZRq4Dme-m{$YRhk}nU$M+{-@Dr_ka+s zqpnVh)?v4q`DmJ*6dq%2ZE~~QRaJj7czNAiW*?K$nS36Y#KB(F`R3p?7yE8xAoMjmyr0)C9h(2b+%^w-^W(|uTFpeM^d!^(?M5VQDZs&LZcx-{%M{o z*38F*V&5eXgwPTNzI+Kh1fA!?H`MqlKZv(f3=BAdU!RD$0O4VBXlQD7?$^`il{`}m zi?#K2Gcz+I6O$9T064o(8~`k~E9%>q-5nh%85#5p3`GsMKTGt^%tUpYJnsil=@i~n zcX{jg(9qX_@AHyH?L9rfT$`EMdPRK`j}LDfo!t%qX%r-LZ<$-2X@J6i^QNdF4ZQcs z3lw2kbG8Ct%U)4qGls>+YUBG4&b|fjy%K*FCH|>clSRZDuRc2`=ie@#&-N~^2d(b# zd2ttS1#cX#)f9$X7}4FsEv)&qwZwRjEbyfn`$l)wysTd$=eCGHXyvTtBfHtHKJs~; zpH%{pR4k})#f|f|8JQfo8eEs2B;d^=PkQyL9}J-w9t}0njCnOMV)+oN z58U~Ld8S0+ygecO3wenOP|?sBo$Uqx;DCx|Ru^L?3UsTy`aD}dy?=2$ZJ}Ny;Bi{T z!>LwEY?Pgwi@{8WJ%8;lr||y0(4tC6u&{WwJQu)5>rzRC@JFr1mfoCgFBX8uQtO+#VS+ULb!ddp#wj$KDnM@^K`aj8o`R`=vymd`sU}hkB1RSA8Oq=pKm$8 zGuYftm;^4MNz5xiGJA?`8cAypgj8i$R@Uj8o70Lq#>sy85P!0bVdWM*%TU^gsRV*w zlkWjO%>=^!LfUP;pgjl%);lO9#A!!*Om8tGdv`Y|3nO&V-v+gGUGdDc#as%OI$d6Q zc%OQ097QXTn^i6tuwNf8jNZbatR~0_g)CP>p+ATW!4st)*e<^isOG?i<}2PG#j8JI;Kk#_sQqGd_RDIP?~V)|1AB zI}6V@#Q+;;w@IbRJ>1ajL|rYvc^XE1f23V=P1RTz7%F@GwZ&F!u>LUle zM&XAIiCq9C9IZ3Q1(-rsZSnn^6;VKt85|mVnhJ0(5M;lV zNkVFbgwQ(Hg=}VKYiMUn%c+NzBQxK7Hr?zNYBVr5Kg*av^#SHr)N>+Y+<`Q5x`Cb2 z8N{Mo5p9zXha@-D2%vQkV1SVuAsp^sn;ZD1P{KK^qp z;60C}VsLs_B-*8_mQ}aZ7JzD?PjGuq7%eLYd&EH}9#T=ALQ-#=S`4ic+B6)@j_S?+ zKp=V}>ZGx~d|nHg z$vyl+iGsbG1@I7+b1m1C)fPLe{m+Ghegn%2z#DoE`UikNh@Ory%G<k$Oejn2_u6UR^8Hdch;m!-hlnn|-x6Mj5!U4KdY^YD6i zp(swz?a18mJ|U0|u2;m1$^sj@|LmZ_{=7QAD15+<`CF!FSrIdY8nPAAQqL?fPfimI z1(T~*?u@ZgW^F#bgQW%3Hq$$&7x*+!emDvXvTbMjWlDc)*h%$0IN7{H7Ap5;wM}0R z_(hKita-af1luR+Hn?vToG2#>NkUHE4Js!HKp;R;JaDPY&yUZ~r!p%q-o+ab?z7M+ zTC}f*9D=&+6!rSLzvm)i!`}Nw9P`Q5 zRWSD`6O*gf7301FO6$EjnI!HNdZIv$BJCa%q(*@@@Homsr2XzHUI7QgGj8q+^tc1q zpOu94dMk_TZy4G;ajcotDjjt9v53-!@RtT<&n%$TtSN%u&`*l3vO7mVd`^0 z!AOUhUp&gYSy+IkF?$Tq3cXd*{)zHl4hP_~5zmnIKRNAmKDm9gQL#nidFku;s!$jC zjw0(HGU7k8*eClq4*-S9!~}o-JPjmm>*<=S(KUze?(PBi&&eK{N(nr$WAyP764o1y zarqgX^muIu5fL#mSpq!0S}jG~17&}HhRq^+R*f<4Zy-Qcie79TL^`D&gg<9Uzv#5C zBqS%Kzu*!UUKxVI2&ly}b905fXEtw)Vn<61XdS>KoH1m4{FTrPfHUe zRD1v4>#CceAOr_A9-*iFWLBKw$G4;({(Z5yDmw-1Bu)i?Ao$1Dyk}>4=t=9(@Q7h~S%_-z0gwSOg?&HQh(>D-&(EyQ(wG zn3~NlfCj5vxf{Xfr=~0?ZG<;AHYWWGKKhr53xi%6V2`()Ey=2>iH-5C0}0bXe`RM{ zVG`W^+1aMIB|XVtE9Y*FA(a1?K6p8HHVwLvjt&Qd%F4@~w`LevKa_Z^eZh7(-kzRi z_FuICvxfHDs3$f2R02Ig}jYM?*^wmh^MEg z$%42|{lyg=dUkOZ`wapmUR9ISM~mC4Ar7*@;UG z?=UEV(DuWimo^h+9aQ)X0s^mMTjVXAH3(YuU?k+MfTRX4^Sd}WHB|y}F)^Krqi1Mwq$v z+Yfj!|y}&IDJz!WUKnupf!GWvWT54I@ zVf>WHxc8c+Wj;(XDK;vK&|S0#^i^$+y`^Gf;N;9v!n4mEpO{cg;-eQ8<$iHoQyw{d zx(A52^@Dxf&?mxz@E$bSbkSo~$3e_E*w|n1;LKDJLbcVGmxYW5e(wSG9H<fPP0zF zd_g);rtq74Iy>K{ORjHFPQ>fFxh(_LBNYD_{r-*&&P5dITXppfPXVCFZ*ImTSDL7( zHbJk_^w1Pqgfi>n%E>RxZGXT_ld?ohvP_g)&=3}AmNMH38EkUFld8<@n_8*=;{DAUU+FxS6zz96_+NL{TAQ4NN z1^R}Tnwf#6A_RCw2dqc?``^BulcOUVzZPQb85_&K@-58Wo@t&Etty?qdgVj~Q)`>G z#lkGzY^}E%sd*OW9-e-Fe)xC~sE_|NHU|+Rz6B{nTV4QMMfRMQo~W~nxexIC`-i4U zrky#YVC>*5kbwdixw&hrtF?e@FC)X()s%~$9eRG4p087By|TQ_d9w9HEZ^3)xU!7H z=I0XVyaOA9`{eWh4_7LcG*jg1uO09M`ub#aL~`otq2VR^pBjp2wY=2Tl_L({)KmNZ zSLFHp3b>&*|BS^h2@8y^EH276fSPZqfc}DJHNuwZTI1Hg zzWQUuh7dO1zauUVrInYhqrYMf`LcC`kdgC?SNryBtLCPrSO318OY4t}{?6mNe+T$J zt#A*Dn3Ia^m+Yep3$1~nOJ(-^6UUocW_zl-&9XN^IB2{IUg`6QdkO9WFS-dl4zS*c zRzaBZMtrM#j@5PWeJsF;#H6P$rl%X-zU?U^ex?+|nYKF$f+E*yU?onsv8Ps#Cea_S-7un)Fxik|Un&<5OSbO!Vg z0ByOsk)Z7=Y)$SAZ>_xqjNk(s|FgNMhK3!`NfpxsJUsHujAL`t^*1r2KnwY!d5Mnh zQuJxy>h9cvsIbKi#p2!fy%2wISHGp%|B;y)d2hbQM1Ld3#N!KumWhpRjf)on4Uw8o zEERG_Gs5AO?kDdY91a$&f3s^{zP}LSp>+pU(ocNb68kLRT1W73m`Y5 zAMv7;GjJK#eTOM8eUTD${IBUG{L{9yO@#LslRxE=+Zqx?*n27G4iIj z-Q%R5AZDxn;n%3&azMyU5fO$`3nmkj+n&Ylh4Io_bW6M@&ce0vP(5SUQr}_CG@Y#!iaTEph!4_P+9z+ZOX07Wc#qXN>70S|S?;mo5d*Avve~pxs6c|L@kGI8b z{}g}G!n7rMX{qW61N$o2t^)%DKquUq^{(=qIR-mmY-bYAK%bGXT|PD2D+7f#l$P$B zcr<~4VNl>l5%*(Z&Q9M0E%-T%XOdIdkQ_6+0L#(WHL4|){ zp~P7-3Q%vft0QNL-9lT)vsB0kBW*+5U1G#JBE{a`fY2r5D8%#BA^1j^Z`*HukV2{>T;|n_Q#m69uPD{>xFC}=h*H%|Gb+o{| z%F(nO98tSnu6ix+=!$vmFON&IH~BsuO1EGxhdTd@byqkvv{2u>4XZ#=F*pNnxEwe{ z7|jW*@$L3@ZMnI*0eTd3->!T0^rIJ~cwXN(Ev-H)%RfA2t{{C%JX|+UENeie}8i`F!)->)egD3V)OB->m??F z#*O|_g9Iw-pdbaKBtAg0VPpG_j6?z2ZDd3pB z#>I_{uKyMk1d{aB2VI~Srll4N2@A``MT$}j>URka@=YY^0_irX$i~6J;j3ci6C$eU z=;+@oH_e|sL&HUSA=MYFu2?N$!|aO$xs4Xh=PSosXPzK>t7a+A+X^n5WTr`njqNX6 zpnuN-;0YcraR?8-#;tnjGrcU+kal^%-T)%RF;Hdt;%wQyvEI&47W&-tZ+3Ow;s%Kc z7=to=eNGtcBb`)o^73e=8Ya8C0DHMc9utJfkI-GBKF4SK{SoMkSn~G|_HSX9|9k{c zvwh{jeFIUD95ysM+N)D+)G_Znn5pD!=R5?O%nAw=-t-E%Z(pLsk1Nm4_*R9hfYf=L zwAAC1It!`AWmSnmpaAW>eXp1L-9&(Vm#KwMHpi;78g8FeHiH$C(AO@7pWS}^ z3b^}*hIzj#@lqA$mV|%Cg+{hDV}IEu#MOz7qri6JrG5J|Hdb0n%Gg`xrdRU{OKuVC zovLbHN=l=_!SB?}iP%gGKF(c!J{c(%{n4Qz@cbHZS|0%ia2YZIYx4e(%gb0+pvwKe zqQ<{3MjKuw1rd3q#ODv>n335zaPF(?U-g%_veMJv>*y#zXKz4g+rklCfTR7MZxfKQ zfb?r&VMhj@@AGFCPYd%3V7H*azilslhW{}r{eLu=fK~rfA`sJ8g3zHMCaaMB_LAN` zt>wayu6_(Nhp3vl4nM)OQ@sDA=wyQ6>ZN_(69+zeYNx2fr4Y-&TKb&4vZ(aP01FDu zgq;UK>wgGbfPHw<-i&m#Y;ht5nl|0@vUKyeOFU~yEQ?^rZ~QV)i>v>Qy|)aCv)j5w zAufdA8YDijxX3JBf(*m|C|<{V?pF%5C2vBD;O$yiq25>($BoFr(gTk4<9ID!(f^GQ)q3)8sR zlJOx8Qb1itluq3?^;q|cH}hMMblgqJDRR0VQ9@h9jQ-om@VOL18H0;{VyeCrA4g-S zk?N=M4s|D7BfWE~{$lKNM(J5lF3$7x+}w}YnP+9@2?>a>VO(5P;_gdVvJ@H)Tg05J z!~N}Pej_8_?B`nbkU!46sz_qXaq>KA1-l4Tz(n3@m{O;f30kJNlm{fM`TBn$sAN@e zViHad$wH z^!=&#GsSSu>v#5LEU$1=0*Imw4DEDC7~{R3=v;a*^HHawz{9&TZ-`6XiAzrnk2z&O zyT+cOxp1|HzcEks`%(GSmPRw)U7k3h9ph7@m9c|rU^4GA8ME|4Uq>TQE3Uy@l3W)4 z|37d3prw9!kh+IoL`K{R#K>+H4>Nbi+>cn zU8E{30UEDWlfk1j*20JU%dS1~B$|V@-zRB`&tAYtsgm8p`H5+r#xO?8KNW$eH5J5b zEYJJO)(qDkJ#$9Aytg7s0ir}KU(qynR%scj)r%pGS4eJEVxk#onI*d}T=$^9PiS^PYWj(;1)@gnV=*ry)v zMqc5Gn}Paod6m+-e2s-Ty07{J18xO+{M#`xVSIfz)7p^sbrLUG(x@PrBXnz3(x+n5 z`dA2k$@dx`-BN8BDbY+?Wfz8^o)j3vBiNeySZ3+u3DKXr;}uawMfsTCQpq0AY`G6s zy0LYnmZpNU#2B7RE`A8gpY~hAS3T8$hHTX)^L+m)0qqK2p)-J>P%l01c^qYm>FfW- z7#6a!T>g*}@QR60L(yU2i=XR-mXCopb%QAr7p!~Ys{!OQJ1&Iv5jzFN{rs&TFh-;JLH^VHtK zXBRgaSw?#Y>-R4-(hz9pAvmc44Tcb!ou&Ov4e&rabssj9`}sY)JJ6n0oA>X1%j6-B zb+ECZK*WSjJh`a?p{Hrh$xJfG!VpA-8-?1SOFs`b=} z0~l%Tf*1QF3S4Mc@C`26JxUDBD~A}t;dqjn8H1^8-1t@Ztgh>eRT}O3bPAOnCA;)- zpG;e%Ys?ZhX4o+)3W^Y>8^Z*?n9djZvDaQrbQRk9MuEqS5!Wfth?)2G<_IZ)m4b9o zc=YS31P7YEQA4zG*tjC9%!;h?P&ei7|IIrp68>??BZ)qYE=WHF* zP@YtWP&g=ej${eoKp?gG9*D5kj8WJ(QX!#r3(_7A`ai)6B^eey@S%-;9RtI}L5yV?zS;GN@9iNha8 z3Mmv@Bl*Vl`NsQi4CvVu7oF48K6Li)CtrAwqBacgLZc4vm7lN+!#HN!L+ErQ7bXq; zId!TvSK708wOT6%NBmafBPTd(ee|6e-f$%L&Xl`~OD5K^4aSaT(;qRuKAU=*f+^gZ zh#d)R=FXMmOOGD5kk~IqF&$**8={);iwT>KoRBup|2n5V z%$BZynm}3^gBkAc)TmUBo|e!Q47!xHn|mY#%w5INbO|r&nk%Rolin3o@v` zMz*%*5T)taYFU3h_!8E{;Kj4Twux+TVj7a&WW+>d@|xi1^bPVrSKeyH&&uc;h<=M` z{e6<8@cu00y8%s&8k9P=(~d^-+k5EEBxuD)@6Bm=L&suXIE45{*gfS!Ct| zLsy%|47LCk?1g`s?ET@%ouYeGwDZEX_*TXx?$W&UpO@LZz~}D1+ zazf_ovZVagRtJXyj(a<$9l>jLb+K;6qmDP_Fy+3rRDt}n!-SMOHy1Ba;N~Zk_3i$p zY%=@iUgK}TR-41G9mnZosx7sQ%*+(`F|&u_x9v|{L|iEF@1%lG_+zVWIb%6;VU!YK zEYQ=qnk&|gVQ=U1t#O$9b^GSMPz*f0Ti*M3ArN@VTKPYWV9{%b9Lc#x;<+)(VwT4vL5>6p-wo2WO1G4)-pemXe>ay)wa@HLU`1`(5 zUew;rB&zC1$TaXpJq4m$j#9=uFfffE>579dBHQq=+1Ow(H1Q4VA(+< zeCsin3#!ZelekzI1#|}sO_U2%gdA@vhK>e)deEGj%v6*@vJM+;cA+o{i0g*jfVYP5-X{$8}rXh3Vx{^W8+yX$Ok9Ln=?vMBkXNIb9E zEo|2DjU3VX9{lo1-~gN}O6o&;hoFK|j;Ma=>5C{PZ*Q*IQ^UEZO2|L6nU46&FNr~B zk32d(X!JzB#`N{`PbShqi^i&tnaK<0C8r%FhG z{ko5Jr%HreUr6qc3da^bc~T=G=JWW}735Q!80Hynn5F5wb;^VFhwHW!JUYWd`ZB>#RN+aoZa}; z1~?3*uMD6Zt`-$DSe&#t-sIP=i+`FQqsP!G);X6WTuwKt zY&u3zef)%6@ix~~ZrgiQ$1lt#EygVT{e@jszkE9*+o-y~_sC)YD@%79@cSu%7Cgcn zFH+W9&W7RPtyP+imsC|nLb8OKc-n==3*4o|;#iuVNfwNItTfyWp!O5}iw>=i->V#r zmIwL@u_J5FWDcBD@Oi*EPv%8+0Scwj{TfI)Pns=Q6!wGT1Za?aO_EWaVB>(`oh-Uq znb%H}&sCxq!4MS{eJ?6Hlv3}szW|j<FM^^ zaE572FPH*7cr0scV~U~m*_D;b($a-{qu^nC{9sO_TIYx+2_GEa;`48H*Sf_<63d?G zh8~mDYZFj=xZwP3)l8Lr<9VqP@Xnxs$jag+0$$4&)IE1d#gYlRF)}eh9U^$}4`yLnl2rz&$8juHV+E1EWiy42c(rsWkVdup-lO`np}K zX4oMo6_pV~-`Z_e%Ov7Wmvx)xEgL7JfRIqjfJvl(@lDlhXz2~9&dX(=gV#YxjAq91?nw>$X=6E0C7_ShsV)j9X#E6 zw9KFnOnSmdB=tYH7+T>fK8H8CSch@o$G!;ZUW{Sig6X!)ggIWs%9lP;UReL~+^=6< z7Y& zK>vjh+~;vv_evRn$i{NDEP4=q;J*E3_EXR(tu$hI>4Pl{RtOh5sH=X78OX*E)9d=} z<=fD{3yg*$tyDe>2T9eqhet*y8^iWpgMxjr#bcGXu8YE<%j-jlYUPF}27Rh2ysknE z@^`>P)2koB1sb2aP*?z#weE7=3um1_O_mO$~{{qiBRyxKVDy1U#@lTLvmYP)aTx(gX`+*2J_u5rnKgt`&bOKL%37f zXBcTebL8e6VZ2*di~}CVi`(BBkWPU)up-}iGKP0{K-QFvRfy`TkxAd#1r#cDS>2?=>qKp$P_G(0!UQ!I#HXS>y& z2Ka-E925d5Ku4b8a((&k+LP=EG$PINu;bu*3a8<>Fh5 zW{*Z79dSg8$mfLa=Ex;7l4@T}j(E7cLeEa;ORNi|nP+P}lux!6gxrbBzWgQA^?&#r zS!34|957R1Qfs-Z4Ri>^JQha>r^EueNbigCpkp?0N;n)N>F6kjG)CY1#-EKTwmoM; zu&e6|xk{rT3=K>+;YGIM;%j~(8V$uz)A{@kE6%8ZyXkFxaQ;&U4aRU)vm^SeKQ#RO z{Os(eqiYr%*>b1H$1@eqiEl+AHoY_UiQMLMKY#v&h^_XCYz1~9;4cb4Wy}CI z;b3wz0nV}0_|^%6s0Go<1ZI)`fqv78Lal5&I(~i)==7Z?ALjvxZ2YNYm}~3B2G_22 zsHG#hQ*neT7>%!MKJkVDyc$v%gr{M9GhF#dxXH-G7cV|}7t$`ya)NcPP zvO=$QJ)^&O#KMe=$j|w}jMrxDdlb#k52A~s1VxE!D`+a8L8K;gpZ#|*WnMdeJ!`D@ zxH{b-;I<18&!8*3Gln^SFmV{{PX$|q{Kzyhn)d3c^TFfhuG=lNP~^gYNp14*GNAGr z1PFn|Ai5W_JD>9O4{aJ2VUDxEX&Rld;J1^&dG?_TeOK72^Bxhei<|z+(GZV^*yle% z%@c*^W&`Vq_X23SnJtf}B-s-RAu*6f7YAZCH)96}ha$PF&KCs$zrH*s*#Y%eN7s8$ zPoNsW|IiICPzP?=_0nsRK8%R)pJHO7q7~r;@6j@3*eC55bw!;*v4ku;fRU?IH3=SG zimhr6i0ygHuhB{O05w6zWrq6TvA^3M-J&h1t0UrHi~D``@(dxofgl5!0=ycOpjO-H z7LY%A<|{f`n;G2K<}U(54U7n1-;QeK0vzb#-2q_TjS!kFIR!+Df>OamAZ<<}d|U1M?Hl;upGFHa3L+kzL*L*y zetYwUa*1jSPehIVY;$fK$RueEs7wL_zOOh@=t6r-nO6forWN$zf8WtFbAEmH zamSp~$4LIUX6@A4BRsH1YYEn8WoM@d+3tZ6R?c4mt{ClgNV7?ICHk16 zp2@Rpr?cbPTU4P*7B17N#oHTyt0YoFLavKy!X?Ppj%Sv_Xry0Px(^x>JAaTK?ElTk z8(n+i{dKjMOG2XS_U6)jzUqCJLZGi?oM593Oy1j@RxMw&XqH!aM??(JxEY<&{r2DM z&+auNW+bYKv9bAA{QuU?CnI<0x;4R={_w+@3JLt}@g zV#1ZI7){1fO3REaper&ikz#K$sh>5xYp25PJv>fnL{7jIwXY7RKl4pD z2sWgn%PW{P-w`y&&#$v*i;3)6aZFIVz3UHW zRWJq>yFRt8o1$#{ZEmaCI*;9-xS-&GR=a2pJo!7bp6?uGDBrxPaz1*4ih4GvU2~iw zcNebwj(ei!aqtU|0Jn?yBf&{_ZDeodbnnSj?}-z$;?ZLM>8-s?c=2z=Iu-fnzNO?a zg}l&Lyzp|PNlO2)^_eu8#8``&im_c6Xd@|hRPxa=>V5ygq=VVAtl$duy`ag;T3h@^ zRTO^Yw4RkwwcF+rU|mf{*Ix;`P%LC0;WLMv8_a>cb+Yi1gNezat&_Y-s@g1SSGF11Mxi@nXUFFL3MKw^xPT{6q~Z4pzEnOEN^of4QbbzefI9A6{?N zzKtUfL*#X+PTgJm0Qq1|^H(zZty)M^@{q_r*>S^8v$DvGUsShF3K1Ru1Z>(kN;^2j zv&-?j*7{7iTk+2-rE{z3Ot3c`9?gF=vdmU|=FejewuQ2PkKW<#C(7{)Jg@(AA>KcG z45`Qk0i9qPU_^+BAX$JDx$A?W{XBHJQe8$RRv}9P*Pd~o=q?m{8lRAW#WqbJ!_A?H z@jV?Kyzkl5Hdci^r8HL7@V?QJ(O|w;P7kFlQT9s#y75q?TfxwTlPD7`3);9M7@R~h zhAOeY!}AhMKKb7-22h|^nC=&HBLeXR5Kn&t@Zcu}`WVJG0s;aYd-DBzz`gaHR$N@% zG$cDW0}N7n&V=!gA85gR&zw*}Nxd6Ro>KO>Dflm#d|lLGD)b#jLd`fJFkQ^}NX2M+ zfQs_2a2QypfB?P0>wiz6jGzJ63gvvJ(qgns4v_*Ziky!nArN@2*-%GtiZ21a+gos< zz?XJCnIGDZfB*s8Q#Vp~(}`T6ovxPd!{Fy2OUMA}?+=orzJEnAS1J4eY&%#Mk6~2) z+c?N)yVbqLwGI62Z}J{Jpe0X<^Y@>tszi>rA1l3aXg;tktLapV}{ama_$^;$+on-_GNwkdzQeDhhqVGu$()- z@Wi{tRTicbuNh`W=ofGv7Pi%1AsWkAg>Ugx9f7W@0aM3DvWYxwEzOz!wk=Oeso zi_v`ddTsz^VTDP2f5-$qRjsvIsIV9X-eT_KKTr4__b?ML&$b11&sq8T6BToYI@{Z~ z{DPi5pDD4HIx$_C0Cg9ZH`!0029oes5Ob`>DHKt+wNk3U)E#%u>7YYN4@D6~7)@Bc zg>?s|o}Xu#Au^=ttL86OM5@rE)VPBK(kYQf#w#$DxPe~tL5PC6xe+m;_Of$EfIN$B zaP#PBU807$VnH8Wc~g0bx|w0hWQ;*5N63>CylPvOofWov@)F6XQ5+m|&TuhiPjiE# z`c_u20EMW>G}N*b>3!V$)>7-+zylgr_>Z_e)5WOgD6>cfQHSG1?<<1|4 znt4mfUiBa@`beR}V>wf0*=AVUGt+B&TA25OXl$AHcB^vRcAZ61N(wvCH!`Yb5-^QnVFfj&+)XK zoNr*ZG+~%+{xM%|f&!eXOb1+`)0PSBS*pm&Lg@qr9;*wa>tZu+dG=)CC@rGP22{c4 zE7J$h@-jGlj!kB>D3fq?1Xb+-ra8jD-Sebb92E*d*{`}cv2=!*Bv$jV{vMR9`+hjD zVfFG9>v2>Poe-v^c}OPu8$4n`v>E&jEH{AgH#E90EiE@Ty3aOhRdASZEY{QjckFDS zm1c_PDX>`$5(Aoee-L~+U7d##aj@}gaD9EZkd%W)Iwrih*N92km6elIZ9Z%cmQRo^ zyb^R!_|qm~Hd$yq+^{)|x*|yK_JTmX%^I(_@KNZXd$N>+l3A0a)b2?cSP5skrdE=q z^6;_^A1~|PE;+xafRPiFL~;^ene<35|M*e-Ssj@W`*X-DR4j5&Jv-Yh;U`v)8G`C4 zUQiHb=HT#xCeE_R0GNFtLc%nto}ghSsO^;467-ePEqM(Vk=6|_>BbV%-h;$i?#S!P zi;MgBAET#UZ;qH&f`A{G=2^n?=f6uTc7+nE6>E`{nt*e#sckUWM&Bcaz9J!+DAasI z$^z}RzpUs1EK0Fbr`)Z*TTdjjm>tW0Q+xmb%QHk*f8x?lj%A&Tjg`AjKF4RC zwD#^^g^wqG9e)WK^^nhh1=yM6@|h1&I(L+V^+0XJZzcXZ_CVRa#@Me1O- z-0;?XwgE5K_U+|j@YGljSr)8wgee#JN#s~6=a0{WN-X3J6%CF!JLLJYX{~}m5|l)br!7Q+9UjCn0m)_ z?f0Vb$+I%Rbi-xH5Z_1%H#a(p~y zb(gh%=NO2fZhHy1<*?t#^15Hn)jVw$^uW6A3(&FZ3P1DO9}idmY^h7|%^=3luZalw zY9|rU?hz&?#e5uLWaPn)U@vHL($v|Yi4wwoP%COJ^~SZ+#Nsg7$6%bXfcbpql~Efz zB#$a{5x6ZMkbg_X`wpvOGR4C0;L$C+dSt)F$%TQ z_1>|uis$$&SC{j~^JTo4F-#iSmdWbR@opl3b460p;bd=R2r*AZY1JD5ixQ`-FD+v| z5P9;jUN#3;bX8cA=xh#ahnv1#O7 zouQ+qm4L-KJE@sO# z7MNvpfb1YJH`&z;YW63iYpL^SeOOH2++0k|(sI>u{&4c-;LLNE{c<#1e%@gfg6rmX zw)U) z=NIUy26V@2nT?Gkm@#(NJ%fXxKYn0^3A4*(_If!#>i-xf#|mZ5S_t9jP1@3a-M zqwWn-SON(lMnptf+S|ot8aaD+QelrJ^%36y^Ih}6k7vM#aDGx~;d-=$Eakz&0O4f5 zsv*ZMBsxi@W64>ghjYi_!fdr!U)g!}QD0|F;Mzm@i?PV!&TRhd)iQMg^XlLhF5PWphO3co?dMc-Ro;Oa`e-Q=ZRf_+xIkj z-S_rj`1rx^9a_Y`DS~5&IZDuxdAemnr%Ws|DVmjw&(swj*d)G7MBF$twW8mnzyu~0 zQ)4B9vv7~Amokn?0nw1G8vWb0KbZ5br_H;bci_tU5Gl(iiqz-sV(pE~xQiibWzmp% z?NVl}yyHq9D3bJiC_|6uV0|Qu;R2l)_oP8N5nYc)T2@vz1rQMM`Pqn#`zUTy4L|Vi zAG)vvnNq!Z6oi)r-}_~(_LD23d1LO+1$238c6z+<(>$UR)^y_+APm@>@qD#5_#kuG zG?_4Zky=5WWwlF))x!7@NP#X-wt|q{QdE&HC);zL7{_e)TPGz8+zQs2YBeK63!udSd%eRgt zJIq!phC_r`Bv0G!?MgwfUBozaG(@32mjXO|&ToDEK@zyXF~!7A59(9bSjd*IWB~rO zw|1JJlCN1?_V+KQSaf*!J2745mzc`A`!jlSva-(CRG+UUfhDvfUV=1z45V1AQOK$# zQpJMbL!;7W7`}~-^6n*hAIqcf(jk|!(x{#fxXy~K=jJsy&^TNNy$dEAI#K~g&WbiV z(Wp#XZgu4<5z`xUtJ#!kF{{#d`*~wyala@9w23JK&+hcd2aDM%U@u>)abZKuZGI7t z`gc3CKR*#xNd07FEE-j;p_Mg`zS0}x0o_oavzDwF)kkM7<|kzha)Dttf^<61hKQfs z%TrPgd>hCqZXWqD(g`k|pd2@a`deUnC;%&!_wcKU6WS5D^G!O95?p_c4ru`+sbD{ z!&oQc0w{lVAlD@|G--Edr?s_JTc8nQpb}g5Avl|RVj@c_uGcZdb28;-cYc;LS6h`n z#-+ls7+SCfcYho}E3l*{)?S|K_aXw4wV(n^cf~)@QDH>7PyC<*c70+>Fm>h7<#at= zA;Whd+fC*S{#KEYx^|U0Q*Cy1?R*Rzs_Z2IvwnW~3M8!?F+Sg(gQPyBgJ2Tpao!6>wkvwInbA+aOypgh$ViuE8*n$&Rp ztt^GJwH~BaAp+}wo&c?MsOmgv(L6WC>%F^ISLi0HF>A|Rl zIlj0c|F3#<4B|#{N8~{Jce>3y_x9!9LWF{%A4WvE8F9kSMg4Mm{n_61^vvAx3DyIh ziy&nlZI3d8k>b&{!IZzw2R~E_8owSKwsv?104|umGJYG2#^^y>`xFh zo7p9vw1n3+nj9@ey$S6>Aba=+lAE3WUQY{6GD~KS{3$5`7Crz@bKf^c+3z{ooc9T6 zf~iyU@@D1gee>4U)SM6EdxS#U32F_ov9N{5jfX#J;P_QD!6w}EQBQv7YI|6Y<$9!g zybt0FZ#V{Y{uiVWpe7kU8ksQ^5I3p*tTxBLJ#4E-k*5N(jB3Y)Z-TBzmwORHjjkI_ z^bB-#&g(^j_$+HDgjB?4W^UMn`1i~}R=EG#a3EeGPoX1K;zz8cf&0~QzjH0QD(+mb zk-j11v%^k&1hBFFcz_xdF}QF>|BmIn?AM)cMyUO#Juz^uZ)8s8w?F*T<{vguI2-SX z1QpszZyol>0^iGqq6>$d?;ip|7wr>3d;ONUsJJ7+cZxi?wtZ=(d>9=&;91=q(~`Gl+-;kGScz-Xi&rMcN`ix>ith8cUJ6t zpZkzD{~XQ#OU3iwS)jYL_dgI)HQGWbI3dx!2Z#FaGuGcsJ0w85(E3oW8m@BUKsN`h zVy=nqkyVx3Q}IvPVwr58J~%wZ<7YKhNl7oM)5{6qV2+jm8{S`SRR`O75u;osk}f(I zPD8jh&)Y{Qm?jb}8DBe^FydF*St>)Rqym8!wACswBV!!-6xCzjgqe`G&{d=g16h$5 z3lTsRXo-^2R6y&ah#3f-oXW~PFHAIDr=oNf%I`z=+Lp*;DzD7mTDN!~@X?}ZBtCzDR4w7VTEljn_U_sX|t04CK~WIe3#23k`vG)2&n@{e?IdXe464{nFHGL;TS`Gz=H8aTpwO-UpZQ;6*whRP;A5 zet<*yb@nxk1Q5OrKSpuKjel@mWS@)aZd6PW3`Hj0TSjIHmbO`{W@#!2-m zzJTu;?yl#usb(olU!#2jKn)Jfzu0S(j(8s*cTtKmQvfMbl$BP61_m;1(R%%JYyX!Y z+a0d+pQ+;ia=EhlS0jS|$R_`%x77YIg}wK=&qb6|ok-CZmX%}A9P|r*Ohx-ktC7!_ zLv=w&&}VOfIjI&rfy=M^SUe!6#_~bOi1kPHtuNL(yG>~qT)zXPNbLJV;K9CC-VV$j zQ(fJ>ii4Es8~5zfjP>^Gt!+<}d_NH1ooW(*@w~k0)6!HDMhw*=M~I$cNzW|Mlxf z@b7OwptZ?fnq72sZV_~ZE7is?VMknSz-2S80%jT6R+S>@tZQjdt!NdqD?mH|AYnUO z2JJe#ydgsNcYENBv){a&*tJPgGcNJ0Dtm-!o%F%{IQ8#q)wcHydKs#=>Sm>3fi5k#D=y~!`}?EEhK3cPp_f-`=RLUr_f5xnE*^zP>|qjmaPDlv zjC68rCg5L_Ow5maOLCfqTIKYOxW-8EA3z`kWTY_H%~*% zP^%j~35BF5m9lKI8tbbc&z&~e{T%}cvD#_JHfvv5xuNtyqsK){V4x z7+uJD=NE9|>yG*zPV-GGZfGqj_j}anZ6iO~T)p$gB0R}+IGNu$NyzyePST7m@v_Qd z6yiA7XtBMmg@5n9Wq&e<`$&7~_C#U#)i(k{!k{BRfv0X6x?O{V4x@hKj+W4u`)AWN z9x)-6_9Ax*M%q^ZfeNAODX{4LsB@~Q>YrL)F8*v@B$V#YTL8sIAKaI0G|cU)QlqU?WS5OjEdfZ4+COzrsSXo2iacALbH&B>g}{ZtPe zxy|85GnhJ;0H1w<0&EXdz5*VjofQq!;>NXWU%T@SO^#BoW;p;Nm}Z?;l8n0-Z;$X9 z^A>VH7#gmPEocdxK04WER^zn#yOhOc%A;9ncr!EZIgzjC6Hr*ls9N;7&Tzg{-JV$3 zZi~_R2_mP@MDJJEr z{cN_dor*BJs!(7F*_@;!Ya-nr-z$gR87J4P_Kq%B*Q=_&2;e$dlIF9#v_vBd+#iXm zzQ7B6V;HbLtq+ob1_aK#bwi+y5*SE!r{7oNLWaiyKn9co>RZR+1Lacv3eS%m+5VEJ zxAo@?aMU8w=c=NSoJ5R2j{r8-Qn>aauIUR<33-PDGHfC#+tjY-t@glfn+_!lAI|(9YFs`WrFrzyfekr{-VJs4w3NiDtBZs;xSp#52e~p~ zRUpQI);LX1BE+|22Lf{yyH4}+OtyI}KNXCJkqS>&8fgRFSI4b`19vZ@0R%!nbOhpN zi|Lv7g`Iz$wF<_uA}$}w462<1VF1g%hr0R<&<&^*eijj!`u_kQxXfm#fT;8=<%T}S zbaKyqn2qhBGx<`XE*kIj^z@sYOxl>0|e(NCyY0fz(&PeNB^s&+&Gt^_zjbIsyBaaZ&Zv@e<$7S5YnDA%4wmQt8n1G)gJI z_g<;@7xI|)^|xUh?1%dCJhn1y*7!UG;&l5#)%-wz>}FUe;iAqHTCPu!vM%$W#Vg=} zNUQZkU7CK`lX*IIm`_?7B6v|POYEn7xIZBgQRfj0JW1FU50qF-h=G<7Eppn*)!??* zwD}%fbF+|^0c}R?xZWHBMc(?LHn<2$d&dn%m^{F?CIn5}jkBwxUDWB8SyGrXy(2h>RMyG7n@h?SV+Ft@mWM6D;o?fnU#wUKv^&Z4Ap^6z+dOFYKwW zoEM+%%X;a=GiF5wP!&=c5h!e$Jr^uD96H;WlDP)0zWN=fKzm%y+oJJQ1{F~0Y=v|k zEspA3bp_lP4&dfG#E<(b-Hxo?xx!i*JxG*vN8YVwlwd7i26tuXU(oRBzP{az^1pxW zKA6Op-got(mibi~W5KExEXC&4SyKc{JdYU|5%63BeSr86F;WyUu}4AvHqIXn{anS> z@u9WoU20~PgNAFaYTQu)W2V(ZY?bu&KSlo*vo=s`@hv(_9lUKbR+B6{U43!LwWXT6 z6a!hVU@<%69rRvie9j(GZX2jNOPvJLs>NEV z)n6nFsz?CxT6^7>f^elwE-Cp6)HGi|iCO%%;TI0 zTpmPyImjXR+{}LSW|NQ*H0pgNd{C_|9)g&yUw3`@6zIKy=tq}QjRGU0P?WB1%|3lL z%mZ#d)oA$s{_KtJCcL{u*MuS{e6>8&$jV5yT-+Xrt1eH8DQ?f_Ym^HNU%2wu3k*Jc z`m{hXC-$7~9Yy}Bg)&qT_)GivG}b_icKEH#4{y$rPxr1Iw<@OV&vw9#=B~$t7Q7wd*OosvB*|dNM&6ixx9*@VoW|(SK?FA79mxwFAAHsArlGfxUYI09#*HXknO2?>h1jZ_vdq(gKLEl{-$-@!ZSYFF^-^NE8!(%^Vb%X7{RXC5 zEIVIkKbTzqPOM8ViJOb<)@14>dqRam*0Yyw&eixn)$4uTDW0osvCJWR)4x7DF9vY<8y7 z1pCSa>pT%FE9YrL6s5oxyuZ{E%FlsD8P}JuTtEbhCR)He`kTfdXrSLWbcN~^xR@lO zo4!vCeyp4}q=ytThiAqf>KMlhq>c+Yo=u>&^{15IDO;8zR-&UpugFS!t4h7DJ;&s` zqHy2mhAbL&8~xKqK%C7Col%}#*>P1H8|duqi_p%sUtoP=dT6sye`W`R#d6DlW3YN@|svd+rPXDTsP{(g|U-mTSH zX5fr2#y-_IH3qT-Gso{+(UA;XR+Fp?+_Yxc#yuzv263%a7Mn^{aCyv&kKq^*r9G0$ z4p~#{+XQ~qCF%tV%H*$+_(T5#7tx&tcEgu)l%3KS_N@S2kd=naG^`@-KYkf}118Ug zueau@W^tJcCdQwqK*JXW#ZfJE+;c?B`$X=-*gk`yln>}PCi*Vo;-rdK7xS7mPMZz9 z9IsxzYHg$RyA@Dq(8V|ra5;!HQ1nP-bv!)=rUWT(tuKA7tU8XayN9t2r4t2Q*Emzw zuMu-3K)>Yw0z~$y_m`J0)rtb!*5y@uZj%_1;zvu*`fXhzn2*G|`nj$c4{KYStcDy^ zCnHaYxrdzptY2o8lmq}|3`jR&=Vl>$u4OiRp+F7z>)Q>ey9;~8OG=C{>@v0=nMIEg z0dR(1T+gxGPl7-iIk9swTV?sV+9S#dGB^r_O5Ij2ozcfINQjFMXqV_O`;F^X^B8{D z?QLlhdd-F;+N(CHJdOC<1=XB|WJ;#KE~4Pxic2Nt%3sJ?2v0|+V)4AWkWf$A|Zw+Iv|2*sefSUj)(e;P@FiCK<$$5+!m%egjDq05ydju2yh! z=bkKutf&C-*I^<%d>sRkKqH%gndM+nL#SwIQr|kSg=I0=o!#C)Ukn1$V&GW}4)7lt zhWDL3!VVPJ@qVR|xyywA6O!})1ME59(*OtyUCi=okDvIEOxZ4bOekS2>Z$XY97|NB z0=1S|VMJCR?0PpOT{`fiUV6|D7Nf(Lu|k0lI`&<%m`0kkVPM~jeZHU$jFyPLz}!d7 zx8}7Rdw;!ctfGsk4{a2yZ4O7)3%wA%MDg50EqB!N|BLqgU$p1{0NNw2K8E`H%4Dhp zzUO&sIIU_mRH1HBO?q>Eb3cfa`R<81_x{4v98Y+;y!elTAZz6I#swcLcK6bLhe)h; z(r0ybPK%NA-DQxyNAwwdz{I?J%`Gr|6`uym=NR2%)3XMQz7lz?)NwFTHvk;X$N5%1 z!`h{uj{W+xi~4%{lPwuJ?|WP01&VKNPj*K+Hg0!Y6MzI#h!jk9?HTT~j$F0X7SNhf zkiP)dVzQAL#{vydU4tp*CB{H@$2-GJ>w8;V#41JV zIkQ|G92N^jGXKbim{gANON8NAzjLzs^NCN#co@oi%1cId#{k`UR zga_J6?Wid{gZy4U?83VDGr(2_pYz9*pZYCJ16;{Z@WdU@gMz;xZLfx0UZM4T{}038 zw3NIapXY}JT_J?E&TT&oETl*I5_?I1F0D z0kmYLv;(?{TF#VQ4#Ktp2}?X#3{XnuZVmwL`Q8WU!Elz8#Jq#P{urQ@tl)=o5Xc0{ z@xHNYxHXV??W#1*fo3A}bG_^RPf?z|XfuA$!b;f~m2pH)v!0T_lb=WTUc1UluaGRhcVQz%3}f~ja^hy!1^I2rb*ajHXBgRIKw}9mFrccbL9F4gh0#4TOt!3|fI5_j(^9QiqkS>TRIF_Xlf-%BXRZ)Z3$8fv5;w}9{PV@J8gvUX6rRjPAX!F6LG$+o=BnZZX@ zux%gGxhDL@dc$!WV9G>c7HIWaL{>;zO{>>M1pai=*l$rYZ6P|!_~nAnVBYbtHN zw!AAv;MrTp)6ZS#4_(SpwFM{UY=V`D7mJF zX^PScExL$ILPBj70(f_?F*7Nb{DZPW2z>}A>l1wfE&7n93T|g<#u)MXXj2_?n{PT5 zop0hkb4$T&uoFRMk?<1{^HG5+QlBH3q)rk1frwC>ozcy8%XzK=>rsis6qb2I)J)qmq*?Y#>1jdHsWfDO^S^Vci3OA+-j5=M3=|0C4*tc5v|Y{-YO^6#q}bKw$FYms@0C&)@+O%K+}ss4}i{ z7zhFg53p3F+xVLSeBmp8zwrEpqF;t#{hmH}%%-YtS;3^DriB$kf#uZEcdLWe);t%w z@|NE^(O?u5gT0L%z~T8W(2NMvIq&~xR{Q%}3o|W6z>4C@BQdHcNFzj3Mn-PaTdxI^ z*-_Vwk1X8zL0;rg5zO;X51)SsdXk&#Mf)WE7tX^6pKvh2H;iy*@6(S#sEK;vkTX7A7z$kPmvu%Ac4F@})E@aot&+kwUKp150zu?f11LN zp974FwQIhzF)~I6=<24+rSfi1udnos8rU!|dTLh*FbbGYo_c1xT{tIBFda1zQl@HE zJS-SDWhbg!jgQ{|cFHSTtI^!j7(_&Ff0w9-E&*}5X1R66%OTf6I^t1bd~`N{Cfqca zu?=t-VN$_#+1;+^*i0xWa~w`*7Ega$Yx>7&9lP~+cTd&x)bpJ#Sj;BN=Cp(-KdSUB zoi7tsSs7Kbvm0yUGW&7;6%7-n(QJKP6PBKl!K~FFc2{wAVSCZL5XVH5ZZYdvr^!rV zQ>zKqR_b(5ZmV%TPP0i%0^}x@MXe`NsI-*EzwxFiopyV|qEMxA%j?#i+j2%zK>Ja& zY`;C(v!l0k@9h%hlGQo1rKL!4NH6?aYQh2rQ%|nL23Gc<%CMN6qtZ25Q zUHXK6)^A_U90G+wVx`k<56w1@d-kvdna4h)m=s!fa;Ql&7o_DNF#{j0rncB(rtP+?nndTVcG@Z#jXdr94Imme!)fBJ3_z4B&tJN3A z<_E@OxgzrNzt)$3a%~GD_k+`2+d4f35{bCo=+9DkMjj!~cKI900B z5lyL+ux+G=_GRC`qyMAF52>j%2XcU0I{X^a%j=3~Pmx?xbEKTF)H^QKakRc%IVZ^8s)+glSP=}mj{zG?U@Z^3 z=`Pd!!XgB`(izM;vbigyGP^!ISC_TpY=5hD(v^0ff3om)H0lg{I4-K$bbPHt zCb3H3@Z-Qj-0k7t+_UF|@DQJ9G~4Y))UrH6lVXM-NgIC+7)!zc@pFN9pQIBA1(jnQ z-){Xc-rhPa%CBD^#XuAgr6eSj?ha|iL8No&ke2RdKt<`0ZctK&?(SxQp}VBJJI~_# zzWbcLul?I6uj}yVF!RK$XV&_x`*R0BiDU1|RH8`oDr-%~XEFB9VmY$|0g{+Moi~#- z5w1$cA9y9u?Q7CFIr-hO*yDI7EM=1Ve2peVn2r2Yh?QSObRA9R2%&y0&~2~++rzQE zskacXysN1W{hg^*?sxM!ss)p2nlY#iOv5KB2g|Ez;&lbRvFB@P&k)61*$DuHIzBvv zrFz!Q|N3P%0zXq@I(M#{A8WJJD04aRcN0X4jAcTTCd&ZMoH}zI7!>sR(&J^c5fC_$ z6A{_E&;911?62l#wJ`7|H`RGkBGggY%`}aqIp# zuC83l@$r%RVh3y(>{sR5VJmz*DL8)(Zrg+v8psgE0jV}5s<-~t9XEk>C7eEJ-v&yz z^{?#2u-M{w&ro}qZM^FK`Z1w)qyWI+(LV%J zL3VZj&-uEVa*&+099eL(Bk&7~1WKo~YiHl5#Qm()+>U*~d0PF#xBNC%jwa}KDJ^LV zh=#maSayQHzUScJu#e}zm>M*i>$}j%!e!B_90!KE<|-<}+PkxL&R5?h3`EHA$;do! zJUn(iACw6^ieb@>+nXTRZQ!-&5vPo~F7jCJZYV=rv-VD$W!#{(rdek<@n^t*fLWv3eRT!UZu;VnliKuMFSnakk-BT+*)`=;J4p$+ z5#eC;iac9rEJKp$m9pfzs+2#USVUCKd6gKhlbes`TLXox)b>=}iJOw<2}Ap5QBsEp)m-(n_k&88d?a!ZNS($JN}WOf7tg1}f&*ojFw(u@E?mHI=~$^w zMv8+4MLd}BM!Cf#P=p1At_hv#;)nYqd;w}{qAZTU4U5pNiju9)?Wgs#(7(Pn5=k3} zKjLRnWj0@c;JW?vGl;|1_&$hRDK#A#T(+y5E~#kQIny7^O8Zb>VS>E*`oP!C$=!U- zCUD}ax5xDLYu>nDHrGBf573^%mcrtP8sfEp4*sjR4@DbVrS&!&Uu@dh-3 z$F!DjjIq>uW50v!>9c1!>S=Dbyl&QWMTa^+0LJW$es_`8I_Lz`l59w-$*Myl1_Wb} zZD3`?b6>^P{5mVG^H!yah!ApNyHcgq7;Crr5Yn1tQ#Z>OR~*aml?gpChpAqbRnx8B zLz!hiXbBa$`8?bN6HruCH1RmJ{HlKAOF5ULk{5tjzA!m#NC~>V`cEfLfOF?Og2+x3 zIcfI(wy5?u`j$V+R(kFJrDE|L+L+~?ApWiCkAS30wDtq3SZI;B>VN`;-J?G=31>=c zed}JVCr218;X?sdIc73W*lt`+_pa;|!6qF?}m8KKdyLUZtZeqo`(?ESe0}xyI zhUACI%LLC8r#r1XijByfT^;z7pZvGi51r+|sS}Yr|3;7`|3i_V@oypfm%%$}{xr6_ z3Zc*b-Ern&m@S>fTibN6UIO|@C1v>1itFqYSoXf0?hCR?gjb|}0m{~U^C9EgPD!s^ z1V9^PPqaDW=Ho>$mlRz9)J79lOREz!;P5w+sOSV6ZK0?W4!6e<}pn~7_a6VtUHnCGjw$o zsxHft2{DBuCng(GK##F;uGC_g{sSP@O1V#+fae4FB&GjO`uu@H$Jn3)Q_hZLtu;?SEl`FmX%>`&Wl~V3yN}mDSxD5QC2J&bgU%^vwYOVXIsH zsb-6V&%AhZsW!T3WR#<0Zzu7iQ3$+QFO-P_g1wb{Xs? zT!)g2>^J#^LZLIoMw$=^By>l+A>~qOK<*#E2XvpJt8j4z<#V43{p{9GbZl%SzI=Rx z%l;r1DM(!%-`;i>_6x$)Js#Wj^z=k^a+{xjjXaozUFIlfE62)^9dC^0>(p)R8(iw& zPLW^E-8flJMbhJHf69_qZ0%_4OX1CGoVn4cH*7`Qot_;{IDvM)2X{yImJq?}I;QI=AZcbBk{Lgklq9 zJrKj-Jtv7Y)0I8nILKg34&Apc0_8TWN;M_HsxJ60!nF|~84{@($cpYob)Ny_@t!z~ zl27WROcWgPK@h`=sg{7IkyFjFQWoo>t#o9x9&TkAfvCJ$&1D~`aUykbx7 z^>|!+68W+KXA8JHm`)T=BzRwViI}Ve^16Q{kouIXKq zW#NquR}pbBF;AiGKoBD`KpuQ~h-^SF=`sMz;58bit9}1VunZ=~#qpV+I4foKRx;{h zP5Y9$Z-x1iF;vXQhy@c1&E#9YOz4eXO~N$kOC;s>T=)~#;{SR2%pdH8dxk^`NMwG>e+w7aVQ;U0mdJ7IvIh#pp@?|kq+_a(|!VzUBdK&)(JcR1%_0m{&r`ql?J~5OxM*Wk#qnD^L<+AD z7r}gGXP%LOFe|VR(W%m3Kfup9Xtth-R_%@FRzKUUor`9Yl9RJOkWSMmBfGRaPz9Sv z&BRquB+Scz(xg$q2McE16B}00FdE@^V0ixC=V{8`dMucXsi-r0;;*&6AIX)P&T!n0 zCR<)$Vvppg-c2&eQ5w-+f15L$Sg)+lYToOZ&GlLEqzE`$4X+i6TpvjlB>|S;ms35O zf4X#_ZgK>~a`5+GD=F~8f2jceUlwHlKOM%!8V$ucT{>Y0-|eZYzu!lw1U3JgYLk_& z_p>1wWROSRv!A&R1d+Ch6$Ze8*c}pWBoV&l4ur(oLv zfmiP)VSU_hV)XD}Vo`ALXQ2=cc!sj~7Wlk_RH^}H4W<{?z7NI#@&bV$Y`72P)nr33 z-@_&0@ExMbQP1UXcXf7{PJt?(ShUg7DOi@6eDtU!7Sv=5#?l;Cg})YE;Q%ewMx8jM zVrK_f2~ZjB&aYy`Ep&9Wt(==qSN<;dT>JU1jZ`pFk|tt+I$$;gO#ih(dV~Ya@zNix z(e6)xDJGnaNzJ-yJ#<%>0cF_yD)H$N&mBi^k&INB`Hw7ax5U1f`9;W0Z(#fa!H47x zQe?;4+MlyZH40*WLwOIa+=2pRuzBhG|5m(B%LJdzC$(XC@w;Dqwz28g4*jRZ;_5t* zLXmxL793BioD;@FSq~3K#8+SDmFpW5w-kR16|vr5g9c>W)?sMq2Kn@sg`>4v-&8 zmx11q+j^kQ z!o1Y2i4yCDbo#cjJAX5jrDy7%UB5mKHtk=lg~W&vP(BXBRpEnqFP5Yea$3(Tiw}-G z*sZ4$z>wX?XtApB_4PGHfLgB77A?B>@{RZo_vJGZL&A3Z*8`Qd?`xPF&?)YYTDkdi zIff9y50mp@lW1vCwVIhVN;bFicRvl^m*EZFeA`_pT-O|icX6AQXf56W)(xNtrfJt3w} z&F8Xfp#ssvbb06Eq6XR&6=`4w7Z@yVE77jGVtv&pk^%#apB2_K$Hn&E^DSHwyvUz6 zWrX*?Q-Ch3;<+;sw%0qmFgQmLPp@oe{X`;X%am=?12nK>Z|jsxoe;+zo!w8jQ%**D7Ir>HUn_=x5ZF4#YfCZWL_}J5vN@M+vFg^Q29?tk zaHu(L$eiXXQ7};Y*IBNoU5oC@I6G>c@bu*t{n*K`YS9pPkginydvCh)6Wf-E&ED9L zhUErLVAZq>h1g`t$LM||D%d*ZD^Zc!FXQ$Pt)tOst|KLQt9Op-VZDEjVAR&F;!<^R z-JXMkpb?e)rLtMhLAM&Mk!H%vj!1VJhRnq}>3#o?`s)6j64LvQP4JB=B8j#!Prby| zA5o7|ns;{%)o8uF!tTvmHLH1c8CTo&J5VmKb?gRKL)M){SsuLkpY^XN6R^ z+9VyIJen$-PsMlN>GCdrB1F>+Qup*@a=o4_r;`1+@cr(9glI}Zb59y&mb2S-2dfMK zLHTeC8nYw@4Ga-qQ zfMAKwv@#B*BFZJJFXDz2RH4BGMj9B^7%V2i2m%7^feZ|<&&-e*%h!)%4*i`v=f8qp zwSddo-e$q^!W*ZP3VV~j?j0dIw!O3ga=~*$n3&4VOgXHFHU)TJnI-T$Z}b<;ZDRk` zQ^m>mSluWCSi%UaG?SV};665#q zZ*J-t4ULB>+YScS`FFoJ!v1~^7Y0V%ynZ4T%pBDbzXaYxFez8a^Qa^M*0`2EWD?J1 zuASwS7dMo(BVc1QmM;VW7N(IvMqrX4g0$TVDxj51IT1suUg9X6+Zl<65YAR$oHIcZ6sod0@uvV-X;vvCR7R9>s;*20@2`fq>(>LY>Bl1g;44 zp32)#dj$91DdDhqS#w-(Zr(n?cI|ewI(FpSItE+>pAVQk#Lg3zNGclX5Wfx34fyo2 zc!K!uYqUAPEFI=e)#uj<(p@hUF)Ghx+^g`C?$6Rq8R*7Tl5@!A(755a7$zW1A{~|Z zCTlo;U^Rw;waH4;U|*XbFf}rf%pRk+h)RlGW@Bi?zC|G11Q{NT8ySu&n_d!!OdV$` zN1Lw}dj7?QK&m=A@b%4Vv_;hJJHRihnd?HPs@_{uq|)@|5?hVQ8Q(hiSgsV;nMtK= zyj;>Bho>G&4DcbhQabl7N!0ZMJaT_os~L{7gEJic+}bf~u;TxIJHa{nvd7o)Lqw{B zqoE)Z|FiYr_;-8 zVqG7m;w>-gFbTp%}!v~5a@I8T3nfo?FjXz zSc*cx-cq^1YTGtNwg*^2Nl5|c+4dnh5quIn2n6i?0w`#yX>#DiFWpnEu0MdOqcpR$ zbavY*Ff~@7jW!i{1LSMewOct~U2N)mc{TX?*-&f%kfj?6OcJVP!qd6U$95;{PJcKd zu@#gJA!TMzV-L;_E9b2l=U;4;mY9?!xgQ~|ANf{UmJ{cD8(7SZO-h!nBTQemd^AS5 zdD~h?AMr%Whjo^UbC1EEyotIw>q7c zP}FFF$F-yiR0eKl#P>t5_>ENvHJfvQ9OOx2;o_`t2qsDf*&QezT9_MEY~Rmh*<_DU zc)nowR8Ti^S)L+%njLcy@4M8*rel_0=XMAUg^z+iUc~uMjmo$uwEjx*uI}390&(L>~rZJaT823ea%V^5) z&fnPJB*1ce3RQgeq4*T&KQnT+%6M@3gyp;XQYtoOjVT*p*7EcHP*u7E?h_-to~RtZ8`%AwevAeu`P$ zZJs+6_0YzQ*xY0muDIBC+o?^&JBomPW0cT0s>sP=hGor`&dTp)L~2yhYL)2_LVN3+ zlNE}rnQww5HL4W!CZ`Pxw+JwyGx-eRy?B;^00=TxZM?$ zV&TUj+{|V*h^3}20D{h{Rl8Xy{-1j3eQim+gqTL%hNn7Jieh34ELuG~Gy3f0m%C?U zLncCFSHaE>q{%~tAj)NC%K}1O3E1Bc zQ(f|$6>{kw@3##oe2EwOh=jvK;Tr0)FWsIg78^M3$>L5Y<5P zFH?0#zpvZiIpcP`k*`_tjC$3Se=K!@@uL`KF@wj?1Rig1`>sUDoSzK<%Z+3phLLU;+UDIY4-kIGU z!BPWcBUmm!^sHdj@75VN=a zs*e`$S;9W9`9-EH5G;(c1sQVO;t~oLHKGvu-1nx<$ikAAa*bGw@cu@-A`(G^O)6|h z#YN?^o1X`Vd-5&k)Lj<4d#%o38weAZxh@h*g!6y};_Ca>ECGv#V!lNj;NWR6tt>4? zl6xgKxFQ;oM}@B~27fj^@O|pa$xeSh^aS^?U}>VxefR81M7yUTgP`Em)%n@%^`rJA zB$*63`^I7@$bxGynF8I9hNQz50qbWhd((m4pQm3E3er=XMpFI25cN=7dize5$>7}g z;kA;iJF0q*{`e1L5z7$7VXakg(?M;^Mh-lisiJW!>uF*RW=ZGLSa;k=dsqgCL)aKI z`?*_ub?g46qfdUhL-KDfAMH;k&MN}xWl(Dl_=b5oR}x%j;rls_$oBaRCI5R=b&r|o z9sSr~H>FZ0{Nnl54-$!m?Vrw5m|Ik#5TD>>$J@2uiZQ$|st((O{(fYxmBx2g{{~;1 z_5anrN0I;bW%eJ<@)~D1)^wI6fs?I)GMTCSEYUl1 zb;W}Vu6jzZ(KqYXW`fcif`pTwTpp^vcPO`0YdFH7zo|sAnoB{vVAd+7x{c$iaav!B zli=j$w!HbK%WE~Ah`ecf_wLCP)m^7_8-Y8lR9-Qd?AY^oW8~u4OKJXxmG*7SrPIA> zK5{WK3mI+WBY*s((CQ@qRG0cMV-p{0+N48D=p^6AY$yJzQ4PC~S3@xAeB$(2-teyB zD+yocG?60|G2Rr})Jio6o7^Fjz7r=%MnKf^4TqY>n-cyv97<|dMO|Ym^6W5k6O~E| z2}qX9^~UAp=tGo9w?E_ez6jV^-&thN=O^$wpDZ&z@eN%%Ee{4iG9qm3n{M;#g9%z* z<*jLvyNd_C;8z#tF=F8NoUK!5CVUAZ_pXl)Sx?#MD$VcS;QY`4pr-Qxjk`o!xpTV& z*!}kSTM$335hH-SX)};0a9W%nGu20OZ07HXN>M(NCWQ%2vB2+%;@nF=y{S9%=Ol z!OET}>#i?adlKProC=56dwzYb$DT}H*W@x43{c9D|BTu_M-3h|YwAwSkbrXt*nt*?hG$3-FWmy2q_DJhi)-f& z5LA<5wU=Hlm-aypdG6GnJ(Pv^%+>kYCwNhq==#E3$a->M<|h2^n!W&E=i+R5e4-0G z71M_T)@HgJfciapx|PKYBsFl?!1Bq1$+DO2Ui=c8H@36i0KHJiWseOT;8mGM2;<|; zv5AUX6l}}c;^UlxhS#axQ4B}hhZ+bKR`6U}UOQ_}t!j?tsxQu23iy5gAG^at!K9#5 z0%$&Oqjm4D#^G4>vszp;vakv?hQ$J7%n(i;W!*Rb@c4jtISgigH&k{;h|yg2BtOBl zo7KLgu@@FR0@%P92U|fUI@m9$eTxvJ9LYdBLbngO)|_grC$aBt7!M6Vk;!nlzbfl@ zpN=($ACgC`+V#aIyEj*-M7&N8K#3m1qXd)cWO&%z^A7YQ#je0;I$o$r1&Qd z0mT^uJc!SNDl{wCDxQgZi9(DJ(exXC|BVYW|APzm zI;r0O=Sgk`_o+`P^P;2;86EXk9hX>V>8j=@i*D6my2K)Z?wdcnYdSl#Pz7*8;r|Kx zn|}(ZAK-!4Wb2TXz#+u5+TU+LBR$^XWCLRG!Pb52qirGA?lG$h<@A;@>+xZ)#-HfV zqEc=~mQ>vwQ@Af{LWRk6Et>AAE^l?Dr6(9>L+%C8Fdv&mb0_)j)p%e2XGHH()J9%j zv>9qGeh&gkOz|qLF!++nPRtC4`?1h^I@^d8sxej3npb=Eq?~F4H(=~Hy#XHus<<;+iW@2_657l@A+s0fmrZe9EU6E5 z=n4blQ%g#i>!K)giV!r|+VhS-p0QS(a)fJCTgYgYV=%>NRI0j0(j=w^bxBL=SG6wi zonn;-1%$gO_7mvOiJI;dI+dGTnX}F1J^K637>GpUP8&DLDn;ruyuIH3sdx`I7`1$B z!9hnsDV{8%;V|borcK9-MKS(X)_M03DMZQO`k$n*SxP4Twcty}Tw(5wsxRLi6D^SL zcr9A!73XQMuG#2v?9pWc&CB6ru0iQ^LAUaMlsP;GVQO!qO$4kKs~Fi>5fkO7cu zsvfo)ya|QY@!liE6z{Z2|L7ab{L)Hm-40qaax>bfk-No~K}t!pOGDf8Chq0v3+Q7bq5qmYZKV@XumVyDpPQA-NDY*4FaNgViXImo}HQxriA9&$HrF2y^0LlJ>5V& z{Pv%|B>tn#Q#Xjqc+~ftxt{pLsc@soi!|SpSn2i`y(!mcX?ZWqlz zq(C6;#AL#wQ!wpNKQm{qOS{kw{OHNG@h)j8{M=7Lf`L4_(+-aH%*Pg>- z7EcD6AW%Z)EC5a2uHGE%{ai8L9fi*zfrHo?B;wtaX=QU0BQlktq0o;F<%}p5A|Qf= ztOupTdy~q=A-?{@IZO@RpQ~b(+7E3nM#!1(+17^m!2|jTNJf!|q_&}v)7ImIexH9b zU(&Q2N_}#xe=z$ru{@gPC3bM{N2*i@pQNn>?d;DgOXXPR>Rr9r8&BRf46ZE>XX4b0 zHCn4F$zoi@ryinrbnI7WX`Q^$spwfsklU>gbcT{9#FcigO*I-lQ%#3NYkoc$l3kkQ zl_(uwOOPXq5@9{I zRjz%WFGc%f_oyYGT}^fk6QVrJ?BrmW&!Iv5W?LBU@dH0P7S^WaefkgD_jdh`%C*BS zVV5A?9y3|7Ih_|1+IDcA7GV$-*@dZpF0{@#Id1@XKpXA|<%s5<;mS4THf5 zdTu>Ow|3p@2eUk?iVr={RHB#SN>-i^6u!2OrpFzsG-XU)6i(O!X5Of?Pak96P`vsq z8GYQ=a}-lB)%Y=PU8sffa_xu~kd&!uLjX&eJqQ8`V^4xc0bzSgR(7FZg<^!Sgrecc zaT_rB=A7fzs9x%;CY=E_rkJZPO}5vau1_m+Le>(^PvrEfGFcK*;%6e&!*t8Dtot=j z;)Cx6Ot&QeHH_7EiwHF8ID05URZ}y`*?wu5HNXKBKL)8KIDyRRtE zO?gnPshJLD{RbC-qeE`*$wg!QK``H|uw_B*C4-vT$ZorBl2KNVZ+>*AJKEbs^h_eX zw0^IT#e9#*U1yoB!|TEBM=N~biQa)uA7Tjfu9#c~@3H(8ieX&!qb>`e&8pf9T} z5W)3vOjCWy6SHCG-qb(+O0C2Fe5P|X)-yf1FDq=+uA$4kX$4N?Z#8vix80ibuG^NJ zL&l)CHT+YYD;yTJHZu`8$661q#Zz1b_&AAHz8Vd^S|Ycyh8ABI$tZm6*1dJ^#4RKuI?vBK0; zsJbtS(S5@F6#SH<@zqs^S)Oo(zy6L_@hWqc%ZHMGaeY(VHK!`6=-Ukg>qn*<32S3J z7N}W3pLFz;B^y0vMDxDDLj&f4Y|C(Ul@q4I+@4|$S(tLx?IbPRk45TeAu7WAP%+(B zg3nr~M(mi_U3_)&@6_wN*)-07mN!Il&XO=xAvy;&yeGPfv7)Db@v1u30O-N1(Y99B zQ0--l*3x&(5LJJs^JJ-;RnLzmwLKW>Os562TC#TTJVq%Rzv(g4*n%X3oPK3#!SknF zrTbH`kI-94#)uYNW+<&pb{;TRYRe>+pBsy4_Wh6~9dMO55kzh(`|#y)wjNw`v~AHY zy84u_ftk@NI(YGnZMmBG_e0rng-9Gq6gup?y$E2X9I0ErzG-gjFMLkH5f}9C>(?wh zNryyPldB&XMu^tu1AygyLjI=I@o+M!=EUN{1OWnf^3>H)oosisPUf96xdZ*AKTu+~ zwL(&a?MF+HT@hJ`qtJoq_kcx2@XYrad0h+c(mCVg{gyX?T!GFqTZtdXSr}gOT)_Ac zI%3b~pP67(Vi)}YpHDihtoyml*WhA^Oj3D3INeXUHuGM3b$};2>PB*uiUdyCGAqnG zuYyc}O!m9qEJ8@9kL?DY_|`)Bp1B-Y{y5%|F5|89?TTWI= zt%f|fJcVT|Re zHBM7Rts43^zr>gei88vj&$p2duuv?<2v8(sQI6(2o}~Hx3*-0aE*OOEb7=Gm{hRqSLPI4Sam)5{dP}qj%=WE& zWS{OBQW(n6?XgwIk_kK_?Ah!gDImTY9=$ELv7MVO0IO2k*ybGUGB15;Deu;bHWf6= zm|{hE-_ZH_b+40*+q|B-Q>d=vbI08;uP`u8d@7wDGxxQ zcnAqazoB!#Rl3xo9}~7hA(Idjzkg?9#6(uHmaF<8&7>EkR^_rK8$F9IG4(li2U}w59^aFq z1U;=*R92_x1v3-Obyi1;E~RO;DwkOjeQt@N6M0;<(5hy#invb8D)+yb6w+? zK!)2)GF;M|;&i2`EXXCF&Z_=+?P@-}3MoXcj`{L+jkjT!cvzY}y6=C-8DmZ*cjY4F zN|{FNjOKzSb2ydlYRFzB<-*%5+dRvMy9Y_3s?<^I4!$B6+ zW?h{vUiE6;9CLAlS{7I2(r{D6oRc%Jf%*LUP(tZoeGJ&${4eD-rjx3ipatFBkTBNP zp?hXAxYQn;ta2bTkQj3DB&OleL(t1f1RM2{*UqZQt%`4Y1{UZrJ2S`jgh23!hTav3 zyaUCq*SIB8tA0-)EPd>j0Q)+iJmFQQZN5WRM&eJmLo}PiH%x>SRL;*deY)9R9%r(t zFZd0Z9j(S)O})w6HKYk_CBZ-1#BiHg*YM8p7CM~iS;}EL_3ctEG^sa}y6waH*}R_< z9PM<{vk}gir02XDl$SIiCs`X7^&*M2FB%z& z|AsN*NI|56h4YfsuS*p9qWTV-0qf-I0ZY%R%9;IGa{ab35>qApVYFuC&?RGeP_f-f zg1^99X)Tya`d{ zw_;<9U3VoPpy28J!)Vc?eL6gxeSHR6736T`lJRfV7$EbbMsKFO!%QS9E>7KVCQ$oB zC$7`2Z;M>tJKN*ySEn`iB^eb69Lgjc3M1?t@~Nyl?o&(r?;Ggvz@FrbIpFNqyLYSr z#&N;e=H-d&F<@+-N`OX~Fg+Sx-{;eUo$a^t?_S5JIjXOQEj)74rzoW|u@c1%P5O~`W#bZEM(zyM;4GU#D zZ0hb1Uj~7S=k(c~S_b_6U#V8^z=8jTVq-o}4Mjel9y3L8Ma(zjev92}6EB|e1z-XX zP_DYWI2uXL1TUEi;WrFU{EPx0p?>>LZ^5xnAKv+$_EN!q_Idh8SVF$z0eTS`$sb_; zIvA{{JTk=&-ZX7~2dsj>f0Q)fG__w9!~pOB6d(n6HnD>e)a|A$i+gz%-Ga;8YT%7K z+=4L8;;I>a;|~F^);zAi)skW~Ubhizu~IImOAWHTALRo>@UPFaHYH+dDlUjopreNX zl?%!#Y0AO_V}C>&7MFI3n6Hyn;wE;P>M zC*grYB{IJJDr}s895WOa7q;LqIU*{JUJsbrfIZ)R7`9jm>@6*4k5033eR-@e+yS!4 z-b1+-6BuNWy#>f75o91P(Lp_WdQ#j+ zFNlU*Jz7h)#)LeXK(txkMW-_>>8mwXoy&gl>f)BVF0aQ$7vJ2q%hFnrulXq9!DwR# z87zJGrL~#nWy8QF;1I9eUTuQFI8bF>fEPmN2zbl~PBunb^#v5Z)C5IYut@QNGOPF_ zy!q848qi8TSY0LG+9v#k0*6!4v?7Wl-7}`P52&t*#T4+wc;Y+`Oc}VjWx|W6Oo1E) z+~%>n!5$LhMKYhg(`AS@t!yF*kHuabfYK8M#ULdO=NrgnFJKwIGQ7@-27(i8=KD*K z!uHFO&0e={FOdGC{)R3L7C_c;)`G|Ittmi#ii<4( z$MmtmIkh)8C$n6Dm(sUi&oI#uUMWD?a3}MN<4^MAcW~KXE4m%E9$%WMcA9B7=m>G% z>h}bW-$0x05y!!f+48yU?d1u%%f`CNZu^sa(*lVL=)sz6+jRdtdc(^xC{77wY&ED4 zf3Qnqd;T8DfzDLyzD`Quulp-r%`=`(YOjWh9_BynDd+Xzs}7 zRQ{+tEyamC)=Y{eo}Tp}yxCR7*wFam^3oKsD3WyacTKLxcnEE`q2y$D*<9sTy+SsR z!ttM9h|X80hG9CFZ%Kk+M+3IPhq*_G$1-wA7A?TYoRtF(szb#9!qxTQW9H&o%5t^u zj%pcRygT)&05~-Y0{`mldn%pP05skBR)9>i=48=TWi`p&vls3=_%te#lxNZPw z*L3c8&V+>(2#^bNyF2$6cR-nZ^6GJQ^Hy|nv|23vp-?o-bs9i)0Ka}geF&rt6LZ6v z)vKj1EA1~cK}%L??x zT$h{kQ9y{laq0tPn(I@WUSil~?ZxTbX6X|rzqJ@$g3xmpLkEYYfwT@#8C@L1gxKj# zm*L#b9-?Q*kB$VJV}Tn8#_V9`)M1yuE07h8v2L`1PxcjVo9&yLo}yan)te_A*7AMGi< z?>w~rRPV0~|BIdMy}iPvNIYwCg@db`Db`!kP*QF;i?8lj#Qg>DylJbQypEGwp@y)$ zY?bKik*!_zp>b39k9OCeo*bEJP3V-GFhCG8t|r7T!^@wyiebyR5Et?Tp(e)e&*ldV z-bPuoOWSI{Tu}c}vmZO*-AS3)Jv_X(c+9`(&eV{%rGgMxQ$K&eD!YS(h1p zU$WXR^g)CNFP=R1*?wgIbzg*upSXJKUO;$r@g`<8=eK$`6K1+@6wOHqSv6QoS+9)H zl2e(TF)G520g=b4A-i;Bm-8h!V0ttTDvJZvm)&b-@D7c%UjSuhpB^(~O;YRDa6 zAEB2hMuZhw+4fn?<@M~IwlcEP0uA;3#nYikp%tfYh`8OLx_2t5Ns;`Pu8RG3;b-4k zs(Y4jkx%fc_o>~D(Gl7Uj{YPfeZ1o(nxrvlaH^G*1yG#&3N8Nnbvv{4GQBftD~^cC zT{>n?N;Z|s+1>Z}SsKz+_78n?<_&~NxLaSlpYybv~el~`S>S!lRvO+G-&u{8Bo-zCU`O`T~N)3E9oiEhF>hICE z@LP2r;Oi5=v25Xtm_>dxTj&{7`5?JdMCAWL5p80y-Iyw*_u~<=Ypcd2qs-QLWS!}!refup?Mb_qpL{v+;G}Yy zM|x?{05IYc83!3?L_&yWI*;OMT?opw^Sa72~{HI zb1$ipX%_#_NloE>`z8;s$&!ADto7XfoJ_s`^GhU`)7a+9s&1WwR&a%7{-@PRkW*jo zHUFae4NcljeSjbj<-p-)zu;^B5Og1yn*o2vE>EoRDF*i4Fkc&11#Ic)9Z4*Fh( z{p6|TZ~zyDKxbGeG%SxK7SA}pd8S%_+`&un(`u~@u$w|d*?A6h%{V0!V;1#0Sh-D~ z4)*I<19b0^Ne?w#9PE~Dx*vH6F)-NeH>ZS<3e;~Q@gYmm=`rpOq=#Kufg*uKlYwb~84b+6~yaxbC|*-oTrB2EFd8EoO!yMUeVCXx@31 zl^ZE|eC0=SVOpoX{@S5SV~@eL;m*KG_5{M}^6ep+SID$wDurX&Ftz^*wrEhn!4|3F z>ZsWdPQ+ID8ywMb)hVKY1Ky1Y*Q*S>F_g65H5{BitbQw+WtBFZGETAb;bN;~SNR!A z=JXq1)yV`AT{E$|C$23PkN8rImYC9dN;H*{7!+T5D2z8&g}zH^Tuj(u)IV>&;4fQ# z?-AUtX>9Mi;Oe29Hhb`TDqVKkUzts?&_o@UGDAD?9?f`_sn_)`0AC z3XLHPe8D=j?x3JB00<9om2Cs1fux$#5E7xVxVSR6UVhP!Ess)cr;gpcWwQ(j+b>iw zAGLfFlfs{v03lYPp>p$?)5^JO^*S??pv8*p?v|88p260;ks{V>J1ZX^@9)`|5E|Gi zq9Z_1Pw3{TH4bhB=Uk}N=CNCyY!)J6p{CO9;zE^f5WkW(QV@G3nX&V^og~vx|B=C0 zI`5U`p26RAEP1>*`st>WGPorc$-n8M<)@w6w_5JS|5Vb?j$aXa;g@>;jlml0tF@!e zByE?;NmbT6a>IV@&ck1T%N_q2Y9gk1NOTUu6{%=?`oqe zN!mKM?atiE(Vd5V$@jlF|D#mcA300E2(k3?(W$Yyo;z%kc^L>PC~2gXOSWY_a%(}v zu-4TEh-B@!O6RWUzy00m^z-B6*Y|F2h=XZZSdyo1-cW=;U)bFhfBd8dwyH9o6u2sP zRi!5ba-)}vMOPwX_s+jn9Jt6agjy4ajwzNF(p7L(rS}UeL5aAK`@PbHS zES?{}>!SnnO)j$lPs165Tt2n(JO;+jUo-3ThAy1J`DtUV2M<{f1tqkeQ%dRdd!UMG z7O~l3;fpo=I_DR~7A>N7cZmA^hpPVV`AUyxKq2psh0pc!QbQ(f91p})d1~uVOP6Lwr;_XE2rBA_Rf^vqHsf~I-M?dKl2U&8M^7v!Z!;6P}%cw24(NQvKn zhQgJ3Sf4)LTh!S*_h6MnR@8rSP(HFRQX_djkF3kn%BE;xE3&nn){K+BnE#u$%sA?B zmMW#?;emM3Te%&*%Z>S{PWBS3LzlT!NB;h1Ge>5N7NNmPLd&7m2XFi2HrM!^sNbSR z9LTqxuq6J7Omd9eo5F8K4Jt-e9PP)7F+GCx^(6!Iy@Zqp?jPUwuq8jLYh>z>nSXK> z^k`$m{~__Qtu+~)Nl>y6Z{`f`-otywxcd)+FUEOIZdcuRUi33^;0G zc(iL8?Pwf}Nrn_{d?HxyXC$P9`r?11?k%I@`nK)C$d5om(BK3J7Tnzv2o~HOf;$Aa z0+L|C-7R>~3ho}ae_uhW5NB94A_m>`{Yve;hs;GVT*=O&y=9+6xvoT8~ z$>k#?(m?*N=?b>Izf)OE)U`3dP3HJ}ld(wB-(bDyi$ht1UmA*sGvkFaGBW0l4DC!7 zs#RCLYdKhiaITuvG!E<$Jdqpx`_2PW*@_*v=G*%*)eIRE6k(JM{-KxW@^2u(d#G9Ar17P1H^dX}&f|45_HhpPA(sL= zW*=S}rqx^%oIZ=o-mHy(l6K zLsa-_ohEN3xuI2-Dl-;#>nlwp_4n{LgiNNfX_%M@zE4xArkxV?avEX{9r}^Rh-~z} z5&OiS0=n(W>VM+mUaXsS=$4LC8M|^YILbYursYR`3f69Qn~m*smBYE7RykG>3L)1} zih%ceS;uIu?49)vy>PeCH5y1)?%_j(+1a@$ge+oN!|1}mU_;RU0$mAZzIpp2()OSH zzAW+ZV2qZU^tUqC*1eZ(T`14mx7jvL1`>y?7cVDaWnUi$pur-0vVrS&GN(0<_j1(s z&uItT5F&w8`d$KMZ|F}t3CLuzC~DZ5u*m?()!4I?31)mWXem_HBCZ+uXfythP~%MLT0KcYD>q z{DZ!dr|#iD9@$|s9KFsjqkpejNAs9&x`^wS6lyArA6|W(yy6Z08nG=KM~oD>ihR!3 zoopUMgx`To>|O2?otDdh*dVturI5<;hHw6zM2$RTXS|HrRxpEBXjyxr+Fhr ziu1)Z7Jl5a4aHA>o0mAckD{y)-xJhAd}13~pFFFT{sXDQrxZw!5U#>6>Ef9NtIfIw zb%5SBo;VE%C>n(jW9`rV?5|;jvm(6lXnhU3>}QvHtU2rL+q5pB6#= zPSi&+NG1Rc{PNsn55oNm{2RQ!H2z!U<G)mj|*y4@Ef4Bf9S42hXA-q!GCcwtbpQ^G+){TW=b1$)3AZbN- z3KQugDPFZ>(V}T|$CT@H2>I+0|GsthME@26pf))Yu|IlUU<-VnSK13?{`yr17kraq zKCLa-jnGH%j9hAtR5{x8p4Is!o`%s}&k+A_L16xqS!}TT6ybdvtCwvT)kONwL3baX zizGpiqLQefG}9#QQ?^^wwdmfwNr^ZChmFmiyWmhtdgG43VfQqeNhT~&>Yxnj4Wb1V zoS+F@hQ7&K3yQ!I(D~V5`~dU@9e|Y)ndSYO{l}s>34-VcL3}}03J@2ew{60`3An06 zuB%EI2hU0PlejOd^W@U)0`{iPHjiHAv9Ypx-RMi>lN{V4qTVyZOofqTMwQ-%9{g!4 z)@DRT3r}FN)ScSrnf22v$ME4=c(7m^v-cJz(7I^8YNsAaDao$Wy0 z^ipju`9NkqkvR`fnEIw^J6?7P!X9bduO15Z3!B^9`1Z9ogT>yp3|U=wjzA++m?_Jz zZ@f_}o>b)7g{uc;lWVQ}K%Gwgc_InkHGkC5=JiEf`JH$!Wz5+?}f5Iy60&lU{84G2n#hply9Pa8U>k?+EZmg3X6^>>wo)&*XYN+#8xATW> zp{gs}Gs=N_26P>CNsS;fdOiUq^>t`sSyxFN(kBOrOX_#Tc{UXDB4R zwL?C|G1<^A`K_veS{laBz_dR~k>#UHu)gNj0sZsBoJdApczcmMe$O5se>@6>RY0!8 zrD>DKd&4T@nF_wBebz;bj!HjQuIH8F!Ozn=^dC+tc@u6K4#R(*X%g&jxsN83#k9UB zxmNj*Xt*wF9+mPDf-RZeg|PQL6Q!b4Bv$p>Z%{)7-wZsMy9`W0p0}fUP8FvbUXJJD zMPC#y=@fSx-}u(((U5y@9ACXI%*D%g|0=u%8EV(@YrR85*Z})5R{F5nYhI%krse^& z*K=3vec1?b6Z=_UJv|Kce2E3FCw`tz`yt0y*-leqZ5Rp5rHfUX&l?=J+>r`}K+iQs zfpxRpY`xQMo%4PY5wBCeYSu!WH6Jcxf{X$dX?CmWDR8G0v>g1Fz68U^KZ*;y#J&4V`OA4#5qj*+IIoy6$q z)#IGtHk(E3`6{K=++s}3R}2+iJ15h$Dwf5%^>@InR;6HK zR602(4WJH68QCbt*%|10|8rDKt0XlnwQeKzdfwOfc1I;?P+r;CN6-gE$}aQtPBz&p zR|F@%5r1?0Q1mj*9ab5bpbRYSh&Gw&=V>MDCceFkaJN`Kn@cxKX$T!JW29VkJ&Eh- zMD{n`S=nOltvBi0TXrAlcS{D3S+|~(+IL=5(!xX3dAo)MQkV*InIJ1Q3HnzwqvQyg zZuaM?m|gCgPKL0=e}W9ut1@IO+gsi8`#BOfDo2d8N@$fS@^h4u7gQ%LN6lwqR$d85 zx!rU`G4c>wMEZrfLwuGxuNicY_ z@7OJ<hxpU?26FzHBRxinZ)p}h=2KSK&FE!JPAudJaINLY6GM7FM?@k0s(#@Rb?#1K z=`7qxfv1|z0=gG7gsE-oh6pQIfeex7OBTgqw|P9&`hI-4oA%xU9=|<3G?o)KKh>(k zv>B;FcXaHY`ePSPjPTb zwxd{9q`t;HU9PHqBZKn$_`de`RQ-@1NgDb-{{W#9t!7E-enKAKYPm1GQE%GsuxuI@iH9{knAS926eEpg`6qJpXTs}Yg1C5zL_InONlIm!~D498Sqw0+X zK~zwt&2viM2#TgRsa@y5l1oM&i}bg|cko--WuzUHUzp8H49}7Js|7GaQT3^NB}T2% zM0U2=tNo%jA*50Ya=t5{n||iX${;--vBYLSD3NcI9}~&A@WU>@6dJZ1!}3&E`;@&M z4{3FZTzgfHXkm*)L6Gzo3!4<(9s8z%bu;YU-fvc~tCTx=k-S=(n1qAFZ&Vj*$`!SW z_~{gV>EPJjO<|`M@*DL$e-h>)qMGBFhX`w<#~AoC=)$i-TzK45Yq)HFK_C~~CF*Tg z7L&IQANN~iLl-vlcWzeggdpqD94=~U5bR2@RIm?5PQV=p<7`SVrl0h_+a_`n%U~&4 zjV=n>_C;@umQA1`^NrzAU0AQ88u-&jAIaVGemBYCU=44(fIhkB5Ks8K!YAcRnzcwq zU-USGP%?5k@*nC!dCT!Us=CCdom9^=*#k$(ExYDv$iZIE;%j1-lp&M;oSHUIDxHs) zqMO=3s*^WJ&*0+_;y-Mlq2}XSPoX3$OKB;VsGGYxy0Es6jw+*`K~u6h`ivQ~pa;(F zo(4=D21HK}oi>@EIy^4RE9(HFe9h+-mD~(FIB>b>wi~s zNjgYliayrhVipw4Fy0MAAsDkIo?ENddwaG!TPQx%LL;W$wE48yUJK}YpK?}v? zu;e9zNyce)Tig1`F3KX>Yt_@$@FXtVnJkY61NHj0O>XMsf%^x4wBU2g> zWS_%Njq%>n&`9Quc6CuH-(HZ93N|$vzbJVV@UCSOei_fGlPKt5)5oa?QEaqW|A_sZ zba;5k=bJ8?mTH0W(Iq?~3SrOm1@}=0avxvw=>)tCQftJz?Gq3l2UQ7fH@uPVwt4ctpA~GLkuN?4s+^9i+ZPtYvK`#puE>2#>vx70sG1 zSp{Xq$UDFuZw7Mq$NRUUYzVt_WP)mu0x()|J1gmm&s$J$Vn|9g2iiEOn-IS z%}dUFtRmcn#C5=CoZ6;?jXeUlEdTJ&i;O{fywvEkVy?#>{(n!tI_JyY$?6d09p=yP z7QLamLxZZA!c{i+mLO&uFYxN$gx5RmLvFggT+W3znt}P|!6c1P@CPzsiBN*^P%-lO zZ?>~XF4tAXgb>y6p-mUF#VXl-O}_gXojo&+I3iZFFUmXeon7@>)lj)KenYo=g9=9U zLqFjRd1?w@q>DMr$E3bpt9G;INgGFIqk=e$YS06BtJ$*Q`GHV$%%y{e6olw@uAvw= zkcCE)Qb#VTi<#el86ysz?2`s@`yYBKB)5KCuk6VS0!P%4(%83J=N8O-K3xD2pDn~< z?W8tJbl%z1?F|vu`Y)Ib>?$dGIjabjx^LpvQ8SP%c~kl}Y>_%*PiA&_Q3lHH+~?7a zHI04Z_%Osf0YZ<%B285M(WZkU)8k2Lf-!-)3V+-Y=g#gndq$>knFDd(=T>xKSF8?0 zyryY*@1);K96?T6Zq@~5Z}zAq1&>(GA$u+2Or?!QW%bBqh6>v;&#^>&f4Jg_JyE;i zh>&N`=pkibt^_UCq(t=zlw@C9nQLbsi(! zKZ!AS;+gg5r^7_tA*X-dGFXn!5F2$1*aSYk33pUMFv@Q%(*U7t|Cnn-p>3FtK}$%g zB516y{FpIn&Tc_T`hh<3g&$_1Pe`s^`?F7k9_K_ChNs6buzUT4!tewQ=&S8O(~Uu? z83@`-N=h&yBf+MX6s6d$h9Hy7VmcABSfVS~w+YY6%nAs@10J!WNVQ(KokcvzxpJv1 z`}?;yZv8E!d)0+nQ&;m^$nGlql#t;-J7l8T`m$VhKZU7Pr{eQqrk?}W z3(-(b6tBc%hjiUV`&pl4PGa_7LZsPtpLZ`Ve7`YH4mLZ-qrBvXd=8g>D=#t3SM(?FYXLAON z$ERgDK2nCeXiz_Yg>^jE^=Hpiac>yGqxnokFn{_u-v>2zc7ZOUy`?2a5PCj1o4{rU)JLM1Hu7&Fi zMWuwn1;S&V9hK^d{^3o#$uGA|;3EBSthnPo%2%nI+1mO>9;tBpB(>Ks37EB@Ql&=scxumeZRvcn%$qT zzduQYG(|SK8f3P|-!vKY9MB!(gyLai;-06ewm*6__+YF@%PN!o_!D(+Tf>j)p9Q+3 zqQ$QLxT*c+7ibOG`A)jjea77W^@&ik=U@I_ZRd$=qBbK`r`}mzUERcF5KmfOUf#ff z?7WhjM)IiXF7`!gmXPI!t(uk}ZLHrMXH1H@hRq`nmHdw=S^@I^aM}3l*P%9;qWMN4 zQfjFo(mSA?+M%76I$<4>wvi|2e9=6;()#r6+qc0qf$Q@{ZzU-4rzAm7cOb?IpXbp7 z{=g0{F6qpI6pJGh#YrRr4NPP=XVatN9-fn{Dp|2vX@Yo%o+PmSd(Pte&#)SK>O(j@ zG!S(&_ZD!;`FJ;U{kY!p@*C|*z?{A`FLt67wv#N>xopk^83(V~zub91a~mFd4<8qA zggWI%MMs0={-lqo`LivFAS5C3$Q^?#wIqV6C@=(4W^qd5>3&|MvOB6RDw70hf`!LM z%B6)6UylNHC6mF6*uFgyp|Ghs>rG%kzHYD4?tkjzLwL_=9VeS7Co8)>?}AQBLBA(^ z(Bu>IQEJz;Sf{+MJfiH8%*rLe~uPXo=<>x+w%E7&Xw z;k`JLM$PAKutLJ|1hef{{Q>1r(Bte0>4(DcG$HRubbHv1D9jJRxbGPdb#pyvdg>d| zr&eN7d9m{H0qk}`(D0&pH(GHtaL`xpaSrQ_BzHMj(8&@DMMNV`*x1sNgiZqGYvY5o z{q_J9)YjkR!h79!Wc`I@egi7|uv#r2+sk`wRzAN{OgJDgoED`GZxS0Eb))kP8T zyqc3KI(@k2!$Hu$j_?~ZQ8&G_F_$_hIkH*5-G6Cm>Gt}Z%j{1}Ot1r=meS^cmcCZi z9v+AN6v&FD3Gw}(qcrj~e?j0iO9CHafK^v8X*TQu6Gw(5#7U^0%kRTh@QrCK4mL*x ze+hVf%uLN#=z(y()K5z-U!Qz!VSm4PJm@x%+Dy&BP&|seFQaASH=j#Qd(z1O3-?jB zptW~)zB8Xou%5jS3YJQ^nqAXYNrdi*te-df8h9dvwn zys1lv6$HL5DQIP7<*i(rHdI%jR$CU39*+B5s2kr<$)&Q~8_WQeFH}OoD&b3ex;O^d z~RZ^bNrvG`2e>QFh2JE^GAzZY^^zls%17x-c8-=RPuRjfH{R%)nAga zXV%SAA1k7#>Xcy1%~4#_!otEbV#dS7jGhzdZ8)!a@p}`VE>PS2d3eOQPi>YL$2Fj# zu~AV`$(l%1P+b@!Xz;|MC^GKUtFC8a`O%{rs+#&*Km;C{P}FUp1`#tulA%?O~@G{u(j)(_g(eQeS8 zM_B8D$9;JB;J)A?hSAA!_M3N-wJ5D+;u5AKi02wC^p&U%Z9z6B1MD$P#^Z9k>zT0tEp9{t@Aiz+p<*=Ug?V z#+IImQZUXbQjj-)A~bMnkigG6H2bvs4*YNr{b7{&ZaXqLQcnIWv%C+p{C5OaV%Z`3 z&x@n4{`=4TO-`TaB+0JX{OiLHL;gjX_I}`)qUu4X_g_QSGO&J-@&BUp;Db^1`;an5 z!FuazwrGrxBN~dA{FBKfZwEK$TVBX|5aouJaA#OZAgZ^=aO3jD@GW?} zJ;h^1@;en99Gk;rnTC*0693-a7F6(zdyXKoJ1@8~)L)9b>*4x$jb7K_Y#%c5R#^`7 zUodpOdPPLc>TJ{`N-pM?!s`iRs6ue|F$fim^ybd>pZPmu*S_@4F$$a|AE-Zi?WMs7 zE%V!x%?Tmd=J$yuQMQq^i5zgQeC4Y_1IT_)v?)R8h5-9tVTKLBL4F&eoNy^4Fex;M zDV&W<_L?~FkS3#DDBkf@$ixpqN5|uMkx*ZM4K_8mVEfSC3ekW7mUmTHxz)9^EBc7Du|Ll`&;xq?~H;U6$NITBU`j#X4y?iMZ8#mBY!; zW$;_{+pk(%L%owZrSe8WC({Xx?>jmsj&q*N;`@&|y~321lk`wbWw(*Fe1{E2i?N@r zA=}NG(|=`GuwpBpwtRA!`KUV+l*UNN_}SJ^7AEGSnkNzKdc~$M7qj>e;e4ta4gQ33 zC8Q$>m1t%#nJ-J{dQi2h>GSdkxE~}e5DDNZAeX}JdA5fj{9UzB!26DjbZzc3cn%r4 zHx323Bpd>{)59Y6ox(4vQsQ{J(N^m#CbSl(w_qK2pJJ$Ak<@>n_2u5V9i zx;zpGJtA|Vx(mH8Y!_b4mKk>e(*RoKUuWn^ximor8da`&zs!!xs`i_C!4W}~t~^_B zdd;Nd#i%O)o}fqa)JB&%Us{!Nt+c1@&QV|tL+=M)Avq=H&uNL}4bzNJ+6cB4qB)KC zvZ0dE6{hleD`;wJ<}uAASN&9`wY6n}IpqXl_q#a%pU>&xlijcn3YU-{Z*YRO*wF^N zyS1APWS|RAt88Yc;j=cXozEWzAPPKiup|yWoB6XAjstA< z@>KdZHt1l$;iF8W{4D^BRu_N+#1E0{xkcZOvb_~ihkNz<2E%|VAeCc1U)SLiaIjNY z^Dvx88eZEG{FlK~`yvL_Xp-u);n>G1bmNYA9`cr@2J8aO8?V`+`S*QrzRf$)FhH_IAlQce;qrGWlr94@jKws_c z{}%^zc?{LVs2Z^UP2RZvUmv`nIS7LOtEDsGso~{e$;*o-CQ=Go+L?*3E%nCi1i`n` zoM6v>^-!0~D$e@yy8C!p2mgF^t9aI#nBQ^i@7tL1jy>0a&EuUVbr36_{m=}8*27^% zjiG%%Sot3=K%_+XCY(c)!QS)HmwVPY;|{XY)=w?CdR}iHy00lS$9K$s*{EVo$Vc|HA7 z{VqfP`vCR2K8-Lor-uT;$o#5rO9L1c`ZE)%~JO)Q}1CeGi4#^leCLnJfPE7Fn ze|*G&_x|6Vg8yH=5fk32adV(uSM35p6Q`Lj=b8%`|4%X7OT zh|a*{c5ng%_>$2))V~(K+34^c+<92;&v1bJx6FQg2J}4Zc_-F5bZxlAY;}DIu$^vz z>5Scc)v7R>205PfgN{(l6Nna=svO9 zWT4#X%h@VevQ?;HlmCbq0*)0jw1XcCO0;OnThrMb)g9&L$-N>}%ETNRYs<#FTT9J_ zw&`hPkz1RR%}I(7;qI%`WSEfa)DL}6n6&;Z4Otx}}!)qbUN4%2ORIlsDcDx_7WHm%J_;;`Ji zvXuI8vA?S}-ggR-F+dlG2H{+NTh z&*$uRMjwPeQs)$W>Rkl6Vz&U&q1bdW2V?o|z%xk1D`9DKbGAt*nI^jHm9WWRlK1Y! zJ|UN_MoF*s`|&ttO+*Kx{ zk7S8+2}{g6>veQdt<3^pVI8b6^NN{NK9^GZ*(?vW#)YNjWn%fN7uENda9n^J{%#Bl z4DIXf<@LHzj(!U)FO@6-`RkR}ogcbltzt)ez?oTP9r#)UyxhJ?J!4bTcsjMXLU4%P zAu}81u}5B9ls$V&N&%+zM`W}{*77Ax#uvTwNBqTwmXeP-bGUxO#l>&185QZ4-w}zU zoDFq#?cUu6_`$$7&~$e-o4sZPvjzZ9SlBV+d=oNqy$BMI>sI%&kB3<3>)!P_{B3+X zwcApYeSe^iD=YyT`n4*pWRU`cgYOOJJHdpd3wa-fI}sM=|7)&hB1*}1v{O7z_B_^m zIfT1Q4XLVaugk&M88sWM_7X5;!@~5OVS_}jHy7LBXbuR$XR*0igAfw1xz|Wg?A%!| zYE|335(e5Zwcd+*2s(;txbao{P5pzaB^vd2i+!fx`vt$=2qWS1*ngLxxGFjSvO8&u zE-ahEUG6gEOy>o(&^`%01Z+w1fxhTLU2yYR4UE%-%q`aay0>XlU92Hj#@}LN_pUdW zKn(H^#48x5^_4fVDKp+g@#4vZ2tZr(j<16#o1w0|93tCJ=L=7j7^RTRapovEI2d?% zIzR}A9+g`B();!B&t+5X?bAQWlOndfJiHSHr{+KlM?gTJKQC*|pqAEQLQN~%EE$2z z?RX789uNv(3-x;Y(RFjXxiW&`p`n`(Pjo2oAbX|9Zhq|c9%US=Mg{0nQb*58_4Qpq zXGF1bsc_SKK?qh_YB7Z`SPESjktl>~{oxje8n?c_9~e6}2|TaZdm*_XBbX8ZQHOsK zB%&rn?^F*5p3NF0Uod6riyqJt1fD4Z4hv1{7!{;mudA9r?wMKX;MM`K1TaBftoNPX zR9)AD!%K*g<%lx=TC)=`bi=l>u@Q+>jWLyT(To|d1{a$yE?vmhBz2~;LUX>{RKdM* zL3kjpkk!<)QZ#5{VBpj|ZTkIdH8otN-oe1o(Cd>?0tAk=y*;Bk$|VX)O5B+BLY0Ea z)~!=4(L{m)m7d^urbxh~xyb`K2~n>XU-wT1Q&5jKqWb{TW%1yI|3>vi7b`rv-{I2{ zqh*MznfSS>dk)`9B`gBwmW|h-xsS8adcMG|drASDHYPY+Ztj;Ie8QTqcAs6wd$HN& zKzA{YX7v>zVY9({5|DTQENVSl^#Y%*403577#Iln4O304wn9RBjIUnc^RXK3bz7v5 z4fHBD?C(A%i3^TrJO?F7vCthC*c{tp)Ad0ymW<2x4BKK>RJ0O5{~RJJais0`3`bwz zg{${$`C_vgl%WtXnYrn)~e+98af8 ze?M({T2q}4QQW_q|3l)9H-L?BaqW4vO{J}{ugTFDa|D>kitkZ$8gX`ZwQ_AzHRopQ zoGic*wb1)U2H;$0=kVLL=#=t8P$ce+rNgeo1frSaz>S6gNi=c!9EtR*=;c@G5*bO% zTKCVCWG-^n7OZkBpSlOhe2oNZ_I06w>%G~Eh~OodKACNob+$jdH&q%u`#-^v(-m&B zfX-#R*aS*&$7|-voD92@PzSi`)OUR!5&?I9`;&0r2UjVYvhvi_)JjbTF7mCv+0ZW! zzzdT}V|4QJxjy{x7RaKp@s}!;wdvnrR?1qek>o~ST*{4}$RRuy2z%B%}bPCmfUdAL{+Zg!ekFv|8&CJKi2`gl3mMZnDv3Y&4r>eV~RZo<#@=H-wsJ-356i?!}-M@fMBTrTyob+}EU zhDI}!j)uHQUtF=pe8FWp;UsM8l8baL*+z%HzmEwt{aGdy4nHWn5( zC<#Xb!DG_{JQu~3Mt?oObm3F~TURijtE9VEEo`Rl3Y=CUvdQ+hikD5~qc%FRYCkh2 z-L}s=swFqWG)t@xe;gp9_2M7gpD$X%aT%9&CkwTb(T}%UWk%C-Y5G8X6&41}RbH!c zGXK)741Z2a7Wo}rv3RDd{`|&p#v9fkda$&Y;dtROxsWFZ`XGre0OKeuENsZoAXg^+ zwwZyCUK#@S;e(TPu2pY>Yo|?F#e8;JT8m!j=>2(fO3tUwJ7%xJJ@eEiv-FgdI+Oh? zu~0$F#gfqNsfdW@qq#C0f;M#yn`!F>{Td|`Px@p4L&|%)w(IwEA?Mu*4QlkcCQp~a z22oInuYJnrJ-@n{?tN2Y>SFWLYj6(1&h7|- z`KjThK9#!Q`Ain?zWx06nt}@SAh8y!4Z$8@raPryx?bB$+F2!9`~GER*yBtq&t*)- zMUCbfC6Vm%71Rji)8s3D_fhd(N$!M7&7FM%m_ ztlK?(v#o(k1r!#lO0|L7J>2mL5rqN?- zB+I==Q!juAXMwWU3H7EOL@?bOw#O1Fp z&~}zl@!lRwl*j92J9snzKUH&S>%?(Y(X!wLN+Z7es_Is#mecMSfq=zSiOw}^d09DXE|l`%k)YcqE{+ny=JQ$z|Q$d7z!g zD7yCc*{DpAbKlsmnv5Era@C$ytu` zCJoz*>GsSCaq*oP)T7E=bY`FrFqU*%t)m&!=qtiNWCPW01Y*NZ!rkrS;XqiG2`jKB zup>X;ygdM|M7{JI_>RSr0ZKnSH)u2e2+ANLNkg)=votxURI!P=o5q z$w(4$|I(|q|4L5^{5U~-4JZ~JEKj_;sS@XslM4q~hpEEw!TQdl7E6Had=M3YYLtrs zzu}#+{Mg8}TE}VHqD16Jhw0yjCq{fS)swm!m8m*k%+L9Sl_bR<`J%U#vFpi?U8MV_Z5u2f}K4M^jF(n9DZY_Ncj;Ej8 zb(laB^4ysFqiA<*<=-ZMg99#)zwQ0*w*? zHh%vOWX0h1$(EVvudmVnFOyVEd=|*zQP#DC_04f#m`htp9XB7S2||B7B_dkK`DhJ$ zigs{|T%b*}v;B0}B`grNdV|&8L-nUTjKS}+1Z(@GwM^JU^gW;Ybn1dwh;3;8<`NXk z^&a$zybFBI@4A*1{_V-rr~O=2wv$)g!>il)_|-O`p2hCKlnZV}7iBQXE%=|(0(aD8&yj8^9_dz#ir=^vgXr`K@(R!iC+_~y_XIvgG ziHbrv(fk?a3ev{?*}IeD6ZZQz^`7;dRC2E=e8DEgq{-dYupz5g(Tw39nMn;RhT0}> zDujchysz=L$vZt5S5{20$zknq0pyXjp|xU^GR6O>lwjQ*PH@dPHQ~E&pHspeQiT=T zcZVBy6P3it+HBJWood9-OAvGtzmZj-gWLrUo>5z0UC0gf9aawC8SY)a{ z^;!3(<9#X|*O#)rLx~3V1kFXy6i>dR0l8`D?cYLz?<#}9kNjr0hIbx!8 zo%!m_!2Rq*-G2P@=Yi!WG8{rTK#xVBc~=f8U*{a2Kf2I;D4W7h9{mxtcc&^jTyvho z1il9aZQM~3b6PFgHV;@Wl-=eI%&Hb^kNnd2?6V8%SaIIhJm2SXy$a!iQ3es{f_Pgt ziQ8u3TgQNAMY@1TtK4em**;unVT1mIx;%w%M2-}WGJt1WT9%7vz4Da{HU<+1tzABU zPT*Oc1SMxK%VC@L&H<_Tep@iz!ofxP8q`=`i_PZ%*#kKv>`i2U%3UGN9Y#B%T(Tfl zjoWOfw@sp;^~WYPr>%&ux7Vjhhj1naEhos~;qZb09|fl5(OC+crKY=kr*B}hItiqN zP9sEDA!>AJmaFLHClFo)pyG2|UllEFSl?fH47DMY%ZTE*tG&M@!hi|mrUZHU=w)XT$(&LbDyHfD*7$3*v`^sIEFQaK$AB~I z620d4pf#^#0CezS3Y#Snb2={lmTXSt@km3*B&_cms_yT`5P@pfnvlvSx7CoGeT-F-e9!4{T)K-w;zE4`JuG6$jhx<#L`FM=q@mpKjSMI-mDC`s3b zgsQD(>%Pu1Vm{wwQnz1jqZIC5tUm+E$x9O6?;e&J-APH8kh^{jcpAT(7?K7+);S8} z6IbrdZ`MHZ6jK>%YKACmgfgC(Gml<>!Dd! zm^Dzyo~w`qS;pRO2G@Yp>gp?i4S25oSpZK4k%03zsp;Yh@B8Iihg?wfjjOI!1N1#a zG<;Dc8jz)pkFUFL?Ya-9HcvHs9|&9aag{PEx*GRhxVpPq&Hd^$>rXV08m%ywjl8sp zBk$(|jbgHS5AmAKzUJMXmr9`*J!YV^s2bEiN%tY%iXeSjL{pY)!Z^ERPm@3P6@6uO zb$@5ae*3sN*YmD1Nv@d&&Fn+qPd>xbJbC#@O=Ah**}nR7p5f&~SYbPqsvS z>7N%;Cn7YZQPpV&&ovj*C0lW8rv&o;fOVjp5U-c?oxj0HOeUY-D$_JN%eoJ6KhnWTCCX}b(HBfCN1_0mtPVeiZ?eph2!DS^-R<<<4~YTk@Vrp3*(SZoXQKET-aidTMYRpF z6GxJw;cosg;2<(Vq)Ca15`qV+x@IKTX|0z`S-<&{58dSMi9iWQ}a zsJ~s>75u7mUFt6KJIPIMf*xsaW@zH5)qDP{h`1LLezCk!fZu$N3YK#1Nb9XPm+b_5 z%OX_dniFI`4*L;NNxjU{pjrMk(Yl-E0;v8?rt+y2UL6e^Qq?fLY%kJmwCOz2OX9NJ z+1$Jy;L-s*!!Lt%0vlFKu$P^fH^(sPl{gh{tagUdupg88bussYj1y-teY{DBP;Zen zoy+3ac4L`+JiGA&^1?(J%Aln?FP-oV2*a$Zq|A*0&t0jRgpBfiz= z3T&hkNo1B5gTeX0KfC zgEFyx~n5;>t z|7JZGhA^Iw?#imI3`%b08lHb3K)>p&yLLEs7wyI_e}6vwGmJs5ClrbWO5yXsksk;E*h-q+)(eLS%3=yQ~H(tb^Ob~1>^JisNwGhNV=(|#;`!@-*YOGC+_2|Pd1EChM7 zseAkDPSsrpeIQZ{S^y2BBAUH+A%4BI4*0GU`IXVJ3ec&e2yeNo_PNcfs_o>q|Az)B8UH#ydbv$W$9^lHl2)OVtP; zt&Hd|wSq>a5QcREkKmv{4vUaLj<>_Vf0lOWVsa43?4i6beWRifg#8Z&2EsN`)gqdR z>XWi3QA=S%_nQIJz~rRCr*`4tFW+grk|aL3%e*E$IgyWvJN!WQG$76|d_|W}R&gY{ zrR5FTiyFs{jKte51@gPln0rk+HOMO%zJl^eknLHaWaGQXpOYIsN53ApJ^$xhU;NYE zdYmtHrB>T*&emE`%|=EJj)8@yo-#`0#p%UQ8T>Z^kDZX=$CV#AvzK4fmsMZQ^!r=b6XEbDX3m1b zoL9X$aKk#y_pTkU#VD=b{e;m&Uz3`e|lQa(38c5@?o*wbryk#6r zx$Vdj58R!+U0d1v&A47_IGYQ2<-oid0l}~2>WGgCdWVmnxcc@2T|rs7zvj81sAxy* z5FttWFQ?hTqg63JK9_=DyRn-i{2KrliT#*Ut>%4}RUMCbO-ng|i!hTZRow&t`WiR7 zvL@twIXkq~!ldXdecXo1V>oitEi8aoK;X4j#lcAN!8x6GRE*v@#)8V<%Qx9Gdm72j zbcTx2bL`;v%s;B%u{4pgUfgQ2^9t#r(cPJZ z`_DDdX|)1W&QW6i?^-oxwI6fpoEd)i_FC*ED0q0y%Y6X#xds9}EF#b3@0ggxZXOY4-Z-zudQCTY{`v7(sQBux@heH3 zEp$hlpi_FN8woA^@a*_gI>p)94$0?j3p=~gjo=3c=Mr-^gn>Jfa_&D|fCvo7((Q!& zp~2U~=4P=@Y-2w(g1Zo_1bFJyXkv{PkZd^hO`MHtGDHeT`f;m7#B%fmpl%iUg3-BG zG4ls#$n{O``|i%O^8Do$(F2lww^le2>hv2&nX_B zs(h|@IyyAoOr0oQ^{F*#wd*cHa3Bxjp|Ux$H@00~=yfwVGSc>Ysz!tDn&iIZL%Zk$ zMd>phSbEeDEIMXpD}Jkn_exz+6{f#eIgVdn^`GNmXrNt0FyX+R9Ft`d6cS=0oY-m( z?HV?QzlpR>K<_(x@<*dOkQtw8t1_wODbtdZ*%a%RHyxAGHED4g{Qd{oak70&KJ=Jl6VI0+xqf?3wYyAnl_n=F1!-sO}*LJM!$V)qf>jL z=b`Wb4ZZe{ffCspl7T-n47y4Q7ZK1bOSUENE9bM9?Rb^280YO2MNKkxR~2i9nCUe~%Dq;+^ReSt3rh@joO8Euyx z1pbta?%c_M&4)WVIjMSUSA6zr%j)vJbqcvvPmTA5YTlOTnKoyLJS)%wgWX_(A0Iz~ zB6xVXB_t+ZUFyYr?6aA&ta)JFJwk0Ct)B7GcZIY%G_T6Z5jR}7KXH5iwdmIptd~hi zmIwlK`G$e?UEhLzpLea~9o`TjX;eeZY9I`faN8Q^!%9sAz<+Sj!=85v-h zCtX!LZm>8zBbgJB?(Xj0Ke(;>ii@Z`_sR%k{7Ii#~y*?+KAj+mcf5{Z%%s;n$u8T(0qrjp=kK?RTm9_VrHPAmBS% z?XM6HaLVaB%_ry3euN%vz_TR_0)K_Q(@kTEb)|?JzxMXR!xnaG>gccZ_eUJ+0CSt_ z`e4;}&wy-VtgLGV1nh0Vx-ZLYJeMUc_iWp?i77F3m)(nxh=?dPKI-htmer`bCW$ZH z^rMJnfm~URuM}xkPS%;}fQ}d>%(_4aW8{Qfu_qy2-LRRc?H?ErvVTm1$r9`3Wu>y> zwiQRhqW!(YaBPgbp&@Nu437k`GBAGYxttWeEv359n2Wq+ChO#roSb(}PfCeUKs7vm zMk2b5cVzj4_NufTj`J6Nth%WPSJiW=+zFTOSY*9j*&FUv+z_{M{RM_22eu-lcteA(_dS z{I1ZVd0}q@_5?j~xh5{>F}zWdu4cByig|@QLg+VBljn5d#It+4SIA67#%M{=GYy^> z(TXfgL_tT_O@Ac~vqe5pCAS@pWD3T!lo@EVZcAoKPo;m8%3Y62NqnT`l&W~Psj&|F zPgGjX=%_iKrwAT(EnAuNoed9rqaPv9`{8Unv~6W$^)V5VVgAl4Q?y-AKq8mx@@deZ z(C1VylmHGQnKib{d23pWzNI^kgOhH_H3=8Ji7;$#GD0?9iBLubir#$%^uF6|ckn zP3P;$pn%eTkW;7PHO{Q%=Vm-U7#non87HG6Spbd%2tab=4ua|)+wt;T7TiAQbWY$k zc}@rd!TG%mci=XdOq}dYId0`6KG1qBSfIz}ZT`L!dDE`uSH7U4gsqu`^%>SDKcT7h z@X4R=eJ1O)onU~N4|B2(lKT+HztZI`6|3ffkfs<6G992_04d9Imo?{+kx=|6qYK;H zwJsf1?;G?$!Co}a-cN5~o|2Nw#pSqg&ENmdRITIoV9pBXOmUQ?(O(`V>R$I~|IP2; z>&%ZI-F5U$M`nVq1%Us+|Ji${z~tmJW<3D~Ph(|YGRIbfPc`U0TA-W{Vu-@R!q%|I z6)VWA&FSA3?-QV7Vj|2xc%_fx7x`zeHa8PfXTLr3nXy0?TYdVV?pI!@1G5GF;@Pvk z#>-8rfEGlj#;#}?`Ij|X;TzRQge&*-PhKzC4<*m%GDq>v)&YJxka{P6*w*&4kO;x{ zl;TNLhwike*X8Lw81PV}MSz_UQC3$M5vi@^iSGLzn}Prg7b;bjSjnsunS`s>*uTe{ z!#k>v5SK8ek5$ky=S9Oay$vL4esRdGWBxWUJu53DKer^a*r?}6K-jgBPfHoz_9|q3 z$)EwfYj&v`>O7c#FWl2T3z)k%^jI@XQBo2o^ZPt9jQH+n#< z@kqLB=4Grzu=0zn)&^b8igOcT;ij?joN}rv>!~HMphgF7Ha6iJ>^WOw6-Pb<{zJ9P zCB)rEq{hQ?8*r_?j2v;q_0{>1+uu7V7ihV*T1oESzG-_#oF$~tV*s+(9;ba74_m{{ zEKRytQUtBep9B~mCvX-eaOrg)Q@{`!@G>Wr3X2Kjq4sbu-4iKY-Ra?i_iDx3T5yk2 z^_TfmrvD5(L?<%lNC&fyFfUX7IkSS-qcu`&zY>=x#ORNwDO}D~(e~uB{B!>>=hEKk zdN^t{C`SkFX-vDum1cx0OD=VpaYv5~|6^fYkl+TY$3EG%W%`@{d1WAuvr4XMKFai9 zLuJJXT}vKgcl&q!|CeT&aL5@wK8&L^FIhhwip5%?=zKU+zZkAUP{=)r`$>T#1v{Fv zRNv6jf!V2w`6~}zc6d^JTC)1n2OqjPe-33yG<;VA#umS>ne%OF?hYV} zVqmN{5Kt{vRS;JEWE&#fJLAiSclAqpP-ZaAbG{+QxxJ77mM+$yhFwrJNJJ; zQggb)4QPDMS$t`v4@E$ip1$_&oUiLJ;-`F`KvjXU!{F>5UvbZx4@t+QlvIpgc3yn5 z^C=+VVEl%CcqzXYwCAm_GeCmVe3P%~vhwdO=j|Nv^=|mY2y=vYKnUvix7Q>_su3VL z9?wn}QA}{|on7v40nyQ5#!UC)6xpNrH@o~c{&_t<4k~!PRy)fom>8eP4Um~eo=6M~ zP0QWX8(LMCAFBfJsN6w^Rcs2l<|~`l!#ok%=*~p#TH;5K;B$|uCSh46C2}IVnEtJ; z0*2&0-O>aUXr9NIpsAS|>m=;3xS(M}$4>DjY!9KAL1QfjFI$qSOH#wzwVB|1k)vf_ z_+GJ1Xo1~?lC5axh4&|rBAgz|>iV3Om9<$JYl7&c;6qvC;@|T;2$U1yb-LEn*52Hq zx=)4rFjei+f77vQKJGnxKgNBK7}Qgy+E{U&E*WUO)H z2%I`zovCV^Zgr{z7OZRn4!?G^YsDk4`enYbd9Wr8UCjuI?{X)GbVeV?o)q~;5n$M?Po9;XP8Y^|mKz^0IlH{p9+D4j~y5e^JJoSIbhuwudq_Oes|RT0C z@BMT(6C-Qvji1xEtDCQKI_g{w!{<1Ya=GFnGtV`Dp-_X!jtksCI_*pj zWCgpc2(sV_KEc43XHbC^Kf+Z{n%2|HU&%kLSlP#sT;GS4JhK?|%n082^qWV|{5Q%v zE+P%zW~{W1KK|~x<{d_`5tJ1a6lN>#J53BOEM-y{(9m#lk~m#x*R1g*Q(k%WQBv`n zyBP3lm8u(>nZ0&s|2>#w@S(=2i&(#Ow4njoBgZ5jdKovhv_9|AfI6%$&G_-g>?LvV(c$5E zl?4nS81;xP;QXNaHc1YQcdo3&XW;eHGBVBjr2y}kYeKE;ICoA=WQY-s409EFU2_DH zgM8f5Fse`Z!nh|6K=}n^ch@bG?%7&Q)i+U!15IUp9hS8JAMq zfp~Xid!;@oP~^CtJ6daK{8W9f6g@Q^gp>V9HgKm%yvv_EclCPX;)Z-H(7QdCg7-aO zV`cB2#gI__-qDc(r?z&Yw6yf-7Kkd!Im?N#{ZM`wmHn-)ZVUb#wY9Y(4j0E$Q|`xp z0W%+w4cg^ySz!FwGz4T^Pv0KTfy<5(!~;xno>yYctO-?lg8l(Br$z^r8=Tb10-nSm z#WXZRinG=rS(BX5p#9F7xbiggflbo_c=PX&uFRj;gmThu!} z!Q)U?y)Ib;9S2}1n}G7#+naC>u3FFY!@_Fr=3{v?lS+wyWLUz{8LbGMxpgfNRa_RdRHXy&1R_4Izj5&`%Jv$|ciQnGb*2 zDxck;yS~05;;?>LV>aj!muId=Is_}sbQUl>0)6t0ap4p7RVV*5R@*4*=b zWaMVaaqT)WiTfT2CSHg`m)%)S?tIY=(GHFM*5xm2l;=K)hoi^D2TCjWuRgduBdFFg z&+SSWnfWN~d=+KsilAZ(G(Bi(>>iH+Dr)np{vUwztd&ZyQiyz zu+1==vth^c%X-qV_`Ee>A4jboJ~VL35I?ad5}QV#J{FNcx$TcH2k0Q|xP$fXYLwvs z=oqHUTRBjM%vOAKS}>pO@&FEYvz6kq#5ia1c{3!pi z=7x-njCPky80VjoZIm1mSOK_a*Yw+;s1spJa8Xh4p8RB-8E)wqZD(K=L@kXKT+a=y z)?wJ>T=W@Y@+c?D9+)A@Ts)VcYm+{%!by(C?&PO4j7jdVh;Ts=+nitZhAol68Ip>5aH)bMC~d!AC;YTN_} zR`f_N_xQcivNMc~j7!PaB^X7TSM~x;xBAGdtj0jioT(`tf=jq~mLfki(ShUDYPjIF z8)?e!ctpY*v&)X=Qfq6LF#MiT2{v;Mx6d{@p~4~~s-dHy0R#)fq3bq8r2eI4*2)4) z7N>IMKh7Y`$S3%y(g zHz^$*-Lteg3$N+Z)&7NXmFUDrFpy>i+BoEXzPA>Ob~SBehp$lD=g&}NaT5ReiQa_G zWOaOWv`)|a(XlPZ)uDL%?d{^tObUS%6GOufBJUg0YHBJ_OKEI^h+wK~o1rL)hi)fp zW|oG{uW(_xtKfn&?meHcOUa&LI6qvgabHo5`0znQLt_kCG7}P3!@qLyn4>7Ixb=p2 zXULJuZ8{YJ(~H^oO&T={f$(S4H&SeEp7RlD!9>Age(lq8 zn2Cx+#fp*}4=go_hAH;fm|bQmGTg40 zKLe28NLU9ro~X#&z1pd+ySxN`)O5Xj8PnF!lcS*3%^8B_GDRiG&prh7e9W?EuSzzN zcjaVipUy)7>|9C@=vYzpV2%Z!&PqjkhD~4M)$NM`j2u~t>~m@JsoE@ghRgE;*B`9* zdyTAPrf?h7`{Vdq0x6JS2VJ#=pUFAdrBa_NP5b${XhW=&1);yM`A4h`F|3AK#Yp3o z_wokok=V?5uE1snDigt3m7;M*>wZ9^RqHd9^Syjs{FPab(_Jx9MVCoB3=lio68Ut^ zv(i%j=Svp%Jd*NnKPO!#-HSH-D73*EEqZA|Z|adyhW3Qv>3dddx?F@rFF3A}WaIhv z{>;%x#d_|zPkVtf3V<=n%)qcYTz=tY|LnKx`a40p=C;bpx0{M@p-_^p6NSDBN?s@0 zls=QH3$XI%IYb3snhGl?$>rttLPAYJxdv^=!U4F{)IlQq{yQuAzo+4A$5!N3HWSrn zv5q`EJV8O>;S_=u##?usN`R|go1>`V#42AksYZN!Y_vmYutA%C5`dqt@_3kRC7MGy z8(Qr&IjXSUAqe9BQt~S5j84QAhWCMh!?5SB_O{o>(pR1;N+~Fp&NrP*>hzJ3#z650 zeu|~+^F3m)Q%Gs8*yCEbYx{jUr@(p3#qwB6x8SD{yLWO zP>uOJiwH1_pm{4KVHV(3t7%HoB8%KHFRec0WpW5CUN8|x7|^eu-N;jRuqMdj%cLO) zTD1$xmT(bDOSLuN_17D9#{fgDJzAAR=YLSfW9b4{(^AqN(jvXRNwSoJd>03-;MNru z0jVdzj9QxghytKiGUSAUOMOpA2uyTZL+oh90r+gJ*hdQreeZ~WD{Sus(abW=Kpfjc zRqx8qMnhBXk>Ytl5cZf~TTQLXB;0zX_X!UEJ*%PIeheGAV}ZlkBgBxa3czxY*T<6D z7C6iX;sRN8;F`+Hu{N!q*O#s)&YZ_fFsI75pb{QokO)Y+>z~9x^7qdUl#gRm=z@v0 zx2BhNQ`#Opq{_+3DGwC{S+9ztflr|>;4Z~c$TtwKDow1CBow0>Mfds|t zt`m^mWQvxwDY@Ph2gv!rzyJ;jE1|;wJe{_{gqsi%!EOD8fDoj{LK0?`l$Eu6Fh3jE z+1ocY+CV zJ-Yr!nh$~;u498omAJSaFSjS?q=;Ef2S&pJ6_o~KSRr}aXBVG^H^mB6nFTH!uwk=( zKs-gp{IVM`%~5k$!cJS)MZ`wR_K9jE@*4YtQQQac7tG8?Gu|8QM(I5BHlx)``oEVn zmG7nwzYXKO^6+kGfn^<_+W9FJ`0^8`w;7G~pM?jWR}5J4K%wz_U1H&0n$&)fUTtb>lBzsI=>Ib0R9cVqndg*rESh6DMa=*%Ot%{J7W{{n& zv5BUxo)5spG9uHuSC}k1M##=Mev5G*EL$8BX0<$JWU-&RhDIm_yLn&9MHc~6#D`J3 z%ir)H!JtJu=@=NlBtoeL>QsO~^3G<8nmWB7 zqADFgGyH6A6Ur{MXg+;eoeSL=nC zSCa-{Um^e#8=O^aV6M;Osr^kCV;9T6`|5wK6A@YD2!rxS^^89xB3Pt^h!tRB zaz8)J3k$=?_S2trpB60CE|zCtf#4ge4c#L^5MG}Q#$<>=CsRKgxw(nWFVOa2-Mr+y z)qBzaNAaY zj2@DtP3wpB=M;R%qn&|tOn$A!r>6cM^(Q&Y!GVTxQId$c+uS9$U8G4Kx9L>+%y2PK zFO+b|;CqupUI?V8Ef)@&_sbmxP>HU#MVPGwlHt+n~{2Oq^GlOj5!BP7NKQNQah z(Wyh?IEzGXByI3v=vvjp(9gXtiqCDUvD{G+LL$zz^RDr#wstauj$mQlSxu}?607=W zpF94{<@;&(HIqOIC;KXG&7bDdhh$u1UUJ2K38r5&(O*{#)%ly50WR)Mc0Sjn&5L8;`8hK$3+jn%ydBPt9ZbX{H+Vpt z)Laj~6tKSm^w|C0L)lG-2mX&2o$p6W1_ni}CNi+`Xc+oxoq}&u@$GvPCr9~xg^{LT zH>HG2;p*Pp=M_(*nSyEeNzNX8mM@XlyMB}N6VCJnjWY?$cF$2qHjz;kgY1>JIkqP) z+n+AWg%K{qs}&7hRa>)&y2;Lm@-jCCAadfC#*=^k{9ZH`v0J6-W_8i}7pi7B&l~M8 zJ8f+$WGQ+n9n!rHds0NQ|CHug1?}_O!I5z0pStMA7IhihIoP2st`d2!HCZ=HznP>e zE#a7?zF^%q?3WPLJ5khE!VVXIHjfb9J!D4z{9xiHtLe)d3|H$p~N&QXr{pJ7}QS?jO2jI8h^Z)Z3oBf~&nUlE$|BP29btI~3Bhv?WQca7sFhPSG4Czdzr z?u@*#z^umm5RDF+CUeSxe4}7MvqH{m3#I+(8P<4u-*kIaXtN+Ed$xD> zwsf7-u`!bmjs)E{4VkeE#5wB4Ffjg@dl*D|?M-~bz=%2XHu0bkT^?)A{Fv{hJR`ur zGg%WG9nDM}%*S`0os;9dHD03x%7$k@2LPeT#p>#+!`kNZ;$&WFl9j4zr3kgHv;E%j z{{0}4=g(UoKh}53vQkcS9EX$B1jKzk%-z669HSm40WQVx ziq-UF1SRFE>JJ4Fkzy49~{%GdWH<+nSr3fB&8}>tv@cD=h`d z=9zNwlf=!$U%yCncwiN#{fU7#C5Q^L8+&r03d+50@*q%WDCj-T=6 z%U?fVrM!ZM1O-WGYkTPF&0*~jj3ALFZ7*NG?CxWgw^1H0Z}ff(UL&gLe9?;6;oP6& zt#JWaNk9sj>qkHm-WI)4)}nN`oOoMAMNgNNo$Y$KvoZUz#Ja@1dwZ%jv)(05nc)t6 zWoc;`@*v0%F1?Prb>goYQIFj7QGPY0x| zE^dd;4wkBCWCiPY0O#Q50qc#~nJgsV%ufTSn35tsIpqw@ElaDia{I5r!DD&6fN*wA zauc*EAgnOm&Mhbq7Gdd?4X5PCCqTRxVeCsLCnLSDU}yJLG4BxZiIJ5xJP?$)yS!xK zlYmN!ghwVnLC+G%;y^_ZsVl?Nr{Ag-py6_Ab?qC2}o3YU8*Y^FmDcS@=(#}Y~PaUz)>fzP61 zVje_jKLg6+vO}9)Dx%0kCM8#nLPmQ~5>`W@dmjIW+X^`}YS< zP*+>q*9ocsC#mK_yc?=@lrk_dAh%%3Q||0-Dh0p)HH;CVpwfqpS$6d|>tF-3K~Y&g zp-)dw*QcSO!5hwBTU)EJK^~uA1`IKCQd>t?sPP*sJK#=Oo0);OgISb=lie@*`7<`_ z6kY?!kvdN~Tb_YwXfn?rAc2!6DUqja3!FAaxfGRZF}%OK8J!_Zm=7W%-k~>1Dpz`R zwUF`%4xjXRC%H${)M#3+iECkD;kl)Gmp5l}V1SzYjB&zRPmkphwvy6dAOi!#8+v+V zT6}#$u#&3kaf%m(62l`WubHan)ZhXK5cBHBhM@Z~ILcMOl=n9^@+Gq#1d9S_nvt<@ zh+O5!kfzM-U1eNUl!?rbQLxFDmzVQ#Dl5w*Wuyk>i!>vjJApIJ&0TXS_oGc2)oWm3 za`1)@D0fCvZ-lqG?@=dh*&pw)Vg)zR@7Cz0QLEeR5o&h)z$-wy}sZX?$Ykf~IFI z?hbL5FKZv67Ic?(LE1nR{>{qJSMuP!Ty)Eq$pY01((=a4OHf0!?$X04wx~!(Q|WgrFk+asK&tDoXxgTT}dgjyZfb z68T~MIdXk!$A*2ml;4=23nEfgq%e;ORbu@7YLb$AvbxmXC>I!;nyO!`)6fVDq@+Yf zT9~GqbzffIteol{S>BI+cXSF&Er^VOiNI}&ii-KUMIG@|CSe2)hc2;>0Q;mczrdu{ zc^&kT)c=YjyOG0u_3u%Zn=$_!(nKhkml!Bw{X8VXJ5WTFN66mbb9`E=ytD}4!?gBc z-@qtE*VZ(0mC%E;&9x4RQjkQAvAJArN(29|cRwkNRJ`g-A>%WB2go=;rI=pvMyYN8 z%J6e(l-274kKREQ!=x&e4vU|;VVZstXL4Q4H}c>cd>|bOJl6+=;cXVf`9@AovZ|_Y z2{kk|%fd?^L;w}b=F3L{DKju$ZKeV-W8-YgC#YSYXCUsz z#>OtludGYld}3k2go9&GZ9e+5A&{_X)Ha_zyR@_vOo622SUP{D)7y0>MTSS-f-+Zy+uno)|6)(iXPG1j+EX2D~TcPpl9e2D`82vTf@4 z_IfUS6n*}5ZOIW|q_wJ^QFp37h#1Xy*0eyVFw$Wv3N=$%NaT0E4t6cCuji*~rOzeD za&cc?TJrPt9hS%g#f4M?2waec7ZY&=(xonf+y{k8$p)XpbQD_mo)azaDyM`N9d+G% z@ph#Dbrod0tTgB=Tt?(%dx~myYb;&VULYkl@$zuBG;))9r88|mOA@qbToi0pP6+| zL0?E{e)KgB9Z*C)$GKa*e`>49(e|snq66&PweNbQJv5obJkJlw(4glE)DG}JHl zq$1mha!>ARlCQaO&{9iC_6`!kGxvgzKwdhFZ7j6`WgrM7ixd5GCcUSe^MJ`SM0G7$u95_|=$C%rpAyByu&|$dc>7UPOGzf4IkS@>1}lpRjq7 z58VTar9cSm_3*=!Xh|boDBK?m=t0n7^nZSVcb!PG@692X-)>RsJDkm18+GVTHht+| zdZ?f)U$@w?F(d8TiwqA0Aj@btW*xu1y?p_@PR{>?f@Zm&x%Y!$tn?~Ym09bhX5D3* ziXf=NdvviAqp~CP9+tN#y}Z`y+JLtK`{o=RpJ(QAnE}`;fDS|*7h5937Ct>-U-ob{ z$Zspu@MJ%*EpYtt!-%@nHybX7j$$r{tG1S)C+##P;<_@WZ^iv^XJLipX>1q7efIyA z@Le*8E{c@`YDWTApva>KWV+C$`xv=eoHi;O5a49HI6qyocxY7ma>LZHX;0^|fB&B8 zhq|&Xsj@K97r{)u>bad`_A7wkZ)R>jP;5nRV6adQhYoXh{zJruWm!jb=-Rh}9J!}} zyIU}E*xVc;XxmUv^jM__8%-pd#RHtC_%GkY#il46D9Co1TP&qIG7i7|B&#c0-sDD{ zK|HqC#t;S*PMB0xP{5}K zv`dceE~LO3mQC(8)S_Oo_`?i|Zbs9?hg5B?0#8npV`J64yiih0IUA2iNI1=v-zL@8 zWC)*S{L6fP+;QDMh*aCrk5eo3FV4sqL_ks|C+i?@ZK!yy_W|irJp8=cp9CBIq>6v} zOR2_Dx3l#*6iF#53W^`h z+FUb@jhE*~fxElpB2m%Npp>$*xHy)d(Cc0P9l*^~V|WzHiuIts1;?bU+-`p1VW8=D zV*K13XJeBM&{qS%?09>MMoy0jxZE4^CYBVM~ zwqkyePX+*`$w?4kdU+6lYL5H4xp9C6lW-j07cN*F4G4qF1l0~kb%J)4|1nw++c zaiEr%SGflrtRS;mq&WBV5;Tl^%n6m0uJ^02G&9328<%qIEg*i@(}3=N*Mq@{O6KEL0;&?a%D z1K`*mx$9OnNXz>45xo^|R_@Kz#bozL|w z4=+F@H2DxcSJx_E&RH;YOI%i&L7v7+Z&X^hzkJ}jjnrRUq%lFtW$jrOr3q=ojfu~( z#I*41Gp4qCcz9?AZ=_P&&z~D2Lp9~(O|K|;o$d$uD&~a*0Fouj51gGZc$b`=_#Mx+RaKopu7`SHaL{6~ zR>jnm3x@0}pEN)J#RF*Xf&Dmh1NB=W68OLqK%zT09N#U31`8{l=21bo5``U zAU#q{%&UywiPF7fm3hXcg8k5utYS&n!smP z=l0FkKs;YLA1nX?4x)4(W<&*jwb&7v^FOGSK(MaDWrKoxqWiY)O#7f0%kzGf(ZM;? z)BRyTko8c8BeR0Zfhv1EKCsqlt($V7NNWYysRu#7!k}N#bH8&Rh}Ff4!?Qtpq=)C**S5@~}h4lO7+=+RQxG^pOTW)V4@o$d-SHDZf*<9)#+R_}SB zy4cnv;IZX8QEBG5xOy*3Q9=aUkD70@Rh+86ZyOsIcYC~o-JKN$ZZhc}X`tP;G&5s- zgpFBpTWtgDAF{bG&;Yy;_jtY{z{(^v$Mt@Sx*8Uy&;j99e*b>1-ko4lN5|5#2uy0= zYDeTE06;)d%CWJ$g_t7VuHIZ_F_B5ldgCi5tT`0FcwnFlU$SJDn^Be5qwZHkwO93~ z_rXMvy`J|1*;q@OzAlw6t(1L-b1L0xm|^tJ@M^s;BC@Hy(r! zvXT!r-Ci56-=cUxcD?tLAT%VT(rO~hIv&6-AVO%L37-}d6J^KE&{Zr)ONc~8*9jAK zc=D>Iv~@rw1&I5A`-uU}!D(gBMKTNY4Rzk0ciMrzgfTI2iKNMQqvj7zeZ^UIGqG;_ z;i67WKuNk!G-wl_Is&j_oLApp>S_i)bqZKrXGrRzx|e*`snz#V@IA!AS?5R`=N?|w z&sU)2tKJ-Er>0P2VNnq_PO$Y1ysOf3sunP29J`i}KxU@gSazb^Vgri`S0VgQu3l3` zfts7UJE(Y&4WKZ@7O#9up6+<1l^Vdnki};W6B7$76@rzP{T_hyw^@97`6YKX4wTyj zNArQg>Cs&Z3fqawqSt?KqSO&|oU?lFu4YOo>Lt}bGh+RVoYNY_3ZT3csDNL_oR)?R zT0IZF>nGGuc}u&N&FVZ+gI#a}h<~8aYrrw*w46+*)B_9z08$|=wG#mKZ!>`iXn#Go zBtQx;{C^5@lHUq~?LU1YB?L(TanTk4kCZq^;nwRotv{n4i3#A#JTzTTVGp=o;*9Y zpCU^v5lQR^+VB5(N9%Zs*II4u?cV|!qdzQ)ioO68`>q?zpsvlkr$FN#ESe6Gl5-Zc zUSl20nh2p25`wGpLd901RQkDabAYCNo-$i}VQ#g0%eS-$JNl6!68sgv$*nRMMF4l)L8$!Tb$dgu`QNeKjV8q7HKlL~Gz*xTl#v}6d ze&^CYc%xdFB^KwF%Q4tVvpT*}DB`&T*SKH;N1zk}#Q6XCjlW&CF_3?=7eG0Q2f#k` z>;I@XnqUPMBqu=+Ti4guN1UIb$M1;Cm{R^=Vdr`4Owwh?X=kWFB>lBiP66M3LgL;` zK}?0~V6Bl99BSjO=1GM9gFdJL*!vTE%gh3@`NK>Eb6TuahEP+hGw?Elhy3PTp3mQ$_t#CK4dS`7yVx`9H8 zP|NX5+p~m|BCRUv5JVSc+3v>K`WBKHodMc)dH^&byE~oj?Z1BgQm@m>>e10<%@nC0jh8FGHQE=^BH#EvpeT&#BlkRvot-`5qD5_q*Vory z?%c4hs3_FW&(+vCrl5d*VtaWR6nU+YP2zdbe=zhblfGjq97O-XBLEd)+o94@?g~ls z=)XbAoM{nbd{K6_TG)pxyl z99}SzU&TT4cZx@ZI#;+rn}*@WEZ`%1SLIa2il6BKLFixb~FI^#80B$VOe zA|OqIa4HE7en@x*x$AQNMl?%tYs&qd{o@snE5J$vktbkeNTONI=n?xIhZrQp4D7F(D2WJc~PgzoAJ^tiJ zpJM#E2yjBn$Xi>9-2Hw1YihZ;xgGUQ7$|sc%`-p6WeBr_91_6TMIMnk>DX5czobN; zl_I|=l&m_;I#L`32f6NO8$*-yo$>OMHWdpds&rQy=zDlge0*pq(MA8rNUf8fnShkh z+mX=Dx0ao~aUkkXlQT6vT`A87tqNmgR-Qf61G^2dyR*+d8fAMWUcWB%fPw)6GpE_ncokH@b06(E_*Xq}(z45ofw0w*3QszXC?AN$vM z2_B0z_aL{YDh-?w@cN@ehbvFHn5Yc@MudlyA3EaT*^1Mhuj-`0D>+?ew zEu{KAfqAk&^GvWEZnwBzs)m!H3WCC?18b>%rUDmThu{$?jM49;(~ z9&&MFuw>_|uRky(XHsfEVj+2;@nWKCXBOl)BD)rWBoW<5(5-(!%?an;J*J7fcr@va zjj`YBxBojAAbrAl`$2?a9xj4XLFF}|in-9t$4Eaf2PwWcZwgzM(2G?^_pfimFqo^* z)LmF;?%+XEYLkC%J3OxAemvsLJl@ToUssaisQ*R!91j+aXf*Jn+?Vx%R$GOWj ziIfl%(rk|#8RB@5%Eb-xxzC&>Sj;+?(I04O(dx5o>7>_lk$FHotnwn7fU5N&Aq>6o zFs^5&JzGQ_i#(q|gh`t3-2Ia4@-CF@p?feHXoc|B3#7*pnaLn3%ycCkrjf^+@P(`N`y^NvUyn z!#gBis)(VXVRH-ruhLRgL`blE+|}yrd(2IX382w__%O1;M*w=pHtd;a5{8}JHFW_U z6~7zteZMRw^eAvn_{sV(#hFGg5!)GFSIG@29Gn!0S7l`}qwfbvNjrx^K~w>^Y}nC? zXZ;5ydr)qpV#^Yeo&7_tn9pr!7hFpouMfJwW}k-JtMR7-z(H7m;-xQ_=W=0X3J{We zY^LA_kT$rnOo0%7SIK8H>&T)a3xU8;d#9_}B;u`$WAdovWC52ypguP0&rqSh z_4L%zm9y3_6mmMn?>^O$C&I~!w@1NbrP$rc)5h4C?BRjhHUT|Ym8VN;@`y7kS!s{& zKYoxs^3cAk2Xd$G-AOQKFc?QmLH*PFo|v9UT~FA_>H(nQ&*KfQ4tI&()zj))&Y7B! z3%KQKqfwHRL+@*ftPC~op8K5vk~4jso#Sx(DmS@;m>v#s6WJ7VQ`1j7(^sEUaQpT+ z(U5Cy#6DB{;-cY^n44SeeWCJ~0Iagab`NOoIXc3UVT%KjF`hb zmlH&{!zf%_T;Kb{`D())H2(ZW-poYT}@9HLEYz?83=n$DsZc=w{=6sU90% zr&HrrB;H3r&S8GK&1-Ywu+^V+;0}>aushq2UZ5BH`dV7JUfpZrScfuM_e^ITWDa-m zc(smN%T4;;hzEq8O5e3Tnf7F!0y1N7U$A=d=bWz#R0}i%OHrWl-Z~WP9(EYP3oOuCTrI z_2(n804Y8ZW;K1f1-!Z8ysNcA6LFs~A~W^vJMb&(jB$Xe?z&lDYlPCO z-HzN&YwpTu7-jFT>OqcdHt#;ee{u+OKS^HBornsGexb4sd`|?bT#lRo)N_9))VG-#st&`@UiE8@+x~|vRpuDZ@av?`Sos-9O}#!!6qCZcWQ_v5bV8LPuNsD+&c&l z4aVW8IKD#w0+M%j*cY{Uj#HS|#s&ryDc{(|)EL%Ld|ge07GRxfw?!X-yYcb?AqED~ zeS0*I$=mWToypts^q9Hx+qtZa;}o!&=);DNt_%TL=)dZpSS3vQwz$uu*x zkb4faIr@SoU^EXzJKIpeh^%wYK0I>j5LIt{4Zdm+^%4y|NZD6jku^igvxIW7H$u0yAmAKmvi|u-b z!W0Sw4_9G|$qT@vIOX#-yPAI4s#eL^d zo?Y_r5a%!|g-VBu#Ep+3)pkM5T8Un#mXz3GvC4VIDrV)O%hoI(Im2R&4X2eI*X-;O z6UpV(^+Z9A)Nuic{PDt#tH!=W^{pj^<|k$_4biZ_Ab6s$nKv-+ z2f=w3c87wUg9G$F@N<*i(Jcl^B)I)b@p576>_U@x7?IE~vzZpppn&`OtKS+Rz44{y zM?A5~RBpxE{PzA6fqE&+@JTXOIq^2HkQA=0KCCMxMMb_Cmd@9yAEFNmj13J(D`g6R zi3#WO(px#v>Xw!PyYUs<{=k=#mF2Tr*p%AuF#T%&lx5+7QY~wn=M7;=uzFRNoso(I zi>@DWq$lfZY;N7npobyxNhnBhw39GGpm*-v>Ef@artv~JZG{h8AS{rT75Aw*IF8!; zXMq!#-*&h*b&$GaGu9_5*XMG{rF)l0MqV=KUY|#4Q;aBSLO{r z(_Awz8Lin{!%{rfPIAFzv3)+5L(KeRg;YMX^Gt>P)hpl`H}xdEhCxp|Iy>#QYD3p= z$jXMf3VgnKhh*}d9?LIK&;8rCKNlxdn-g9i2aR_?r7A>aVRG{H7eA?D?fRIw(?z^# zEwJh89B>x=0P=?6DO?ra*p(HQg@rE> zC)2sg#`!0!Ym9Gjpk-2Way!#S7F{ttTNV=>W|uLgr3wx8MA|jppa>MfFeV#2yONTU z-+ePPGvMR9>Vno`CG{0ZU53p~?jEPr_*agdURGmRrM9;PAA`~8(=4fJKg*FNCnf!5 zK31nuUe(mtxbX0SuDj$6)CT~`Z&=Ii@Z=dDp)V=bvCY}{2%uHS&dR#_IS6~zv#3!s zI{bC6qDs|!b4&*!2hlPDj^5YMD2OeHRL`-VY!AXrK#Aa!>xGF5NM;3%oFqhYBM#i^ea?L4l>13P} zJdVbXK-(6#B5mExPQSwAWo&zkGY~JuT?~I2F5p||<+^m-7zxohkWJ(}T1L2UZ!UAfn;}>WH>$D zjWF=LZ#C|03z>iBOUmhV*t};z%)0k!ZP@uF*{cY$0_uV$@byt}>#u^cmgm55>RXn% z^m`ojf=XOo+$OF0!yDRe(A65dqwdGnH2$7H7DT`iJZU+YiY@x&boH^VnBSs~kJoWM z&Y-(L)c^#jMOqc|h|Q_4BfFt!g!L4QVt^|dr|}S|Z#5a~#sh<+4pG$up1hj8ZU+lY@gu z2<)8Fva-u*_YB4OJb}!doIi!N9ov>JzQ(+V|E<02jD~yN`pI>3;v^@yCvilO1R*5E z5m6H)LyQ(gIl751x``g;LzT8D*Hbdz^FcxnJH- z@4EN>@>3+-%M-%1N6O(0USjhKmd5+ymXnPHt?opVwYw81srHKSszOAWR)c0?AKMJ5BT4wj+3&M4Y|ntO^uBLf(rMk`}vb$ zY$*Fx83wsdevcxVH4y(LG?-S%!10wV&)ZbB&8t(Llu@x zIbXjrN3-WcIuQBIZ|69w7$UL2KdW(>SNv|auB^|BqpK^F)hhRQLsfsJKqI>m5{YGR zJ8iltsQiA353dH4T#rnuHuM!)7;9_jEdQm6Wyw2$;J49iS&0mieW()OxdOy2%bB5I z2>mAEoZCvU(P_biXa(oq?ShZt(T-PMp~AOT6f5@6d-v2AadVTY?#oivG~(!ySoPUX zbHyvB_;(L-qP)w?XdBD2HqD>wucgt2ZN-M_T2=??4;fKCH&m6j7zcIh@pD6PU$7e= ztdJ&8pK8|{SA4SGnR=<0W8ayGbJ;EYAsam@z5c$y>6@Q~9k~<}wr7<;TzD=h0JDZp z9GUZ?3^g^%-G&IX)&Iccr+bq{eSu3@2t6p32fzV&dzo3|%#cNDtInS`t%^ zc+NxP@}{+h!$JFz)t-J~gNdSCgR_N|uJpGX8yle5VW}yrSfEi;A6zI;2Bp%bh41H? zN8zU?EBzN<9|6xPnZPDXe=gf_1t5(M?bN0h7a4zaucNV1P9eSe8$tsxD=1a+bxF~g zZR=Zy!4rCf3@IIY{OHjm-CTV)9Mni!Z*)t-k+BW5*;mczV!16Fv^aGO4HvP_Rt>Osf&C=m zAm-Klf?jx~Q*Mb-7H$~C z(;d>)$2hutQ04U`>SLa&&G)Noi^SZ_!X$>lk~%Jf;D5z7Gt2uifdVbYL=h3YTklO!JKxS5ISOl3H^fbO9|3nY8Y zd=VWX?hg9;Y5DA$Aw_{byXmC5(~C}$YHMi`uUjElH@z^KEEC*KhxN$Op2l@*UK+iv z^ZR<#Tk-LHkE$v!h@!#j`E@{Oks?L(V%<)PjPwdXAf8%eJbE(?o(DB0F>c;K$J@xn z2&fmL7Zl>dmWszSi0?lq3H4z#;@g{9XgYAHm!DC*=@1z8|I$Ic+lxuaSklSFpg{LF z3WZA7na6X?T!tSBiFHzmee~HT3Lf72Jd^}z|B;Iwi1vN3R&Z{AjJMH-8H(H1{jU%VzZF~h`I4M&<*W;5Sc_(`Y? zGIkTGhExW`#DF8&bukiE<=+rH(Ul_0e#3eGA|e7pPEE>4Ss9{U^nJiiAU{AZDelhH zq@+Mw&lonVVPXsX5fazQzX3t9!!znbMStq~SPMj0R$mf4O{hNE+} zNq{2Q;2TQ2jyA904uLu*PrX0;ncOS?yN9)C4=pKQ(40fq_^z&P-A%irs;2fg1hh!< zpnO@$*stDcXs^8WThkav2b4dmh;jw05&NEhHuJAxY0tlY-B@Flx$$7&Mi`>!Lts@? z^mNw~WCh;Skk#GGgGIrcPhi$|vjiLuu(HQ^wL+8SIDbsUV1z>xpz|q}BK<|oh#P&$ zbBuNeOm_Iy6j;qKSqI?e^i^c3|MV^AWVU)@yFT;eG=&hbfY8u*?%1CvCqp#-;OJth zUgp}5VD^x`YF2WQU&+`i57!15v;?#0j7{Cb7>O^pq$OCywS_! z26S}Wz>#?o_L_e`N_@EnT6t{dFlsrw?zOdnG6l87J zo@hvFcb=w6#>M@FhyedxZ`6+H32jB)==Q#R`&B|J!N`XP%*@T>|6+cSm8VYfNOrgs z7goVVLYaR!C%_CEE|1sb9MCSC0J;H{h`S+R|DpA!bB8&I$zW% zE>(MoLJ8vf@!HMu04vbLbc!em$-tFJ1-&ywa@tMcBW8*M}1vZ!A#4c zFZk|8jRlWJjF&i>x?CTbJ)2)&-*w{bwYv16nz}k{Z?Hq<{naI)ZSH6VrN`>Rgo06K zDP6QtoqrN(8p;+GwSQXLPCt!x_oASJEW1CAu22J|!npnAG?~S1*FvGoX*=rgGN5Q@ z^c|pag_0sqDR6@IhHMDvGG{+N_&k&i@WvTQXBn%ZmrO_L7N&d6J@)`G_K$!!3K)Bz ziY;QBYR8n^Us#ayw}Xi^QE3g28^Z^h*1UTCnlDsUGk`BtNBg2-o=t`V5pQsu_tR{% zdxtS6XDgop8$#KFW?sVMF*(&l-(`R63wrt52=x0)m9x!w)2G<^1o_vaX%+6`y7}6m zP;c6+?sOlHRfn?5zd3c_rG+zc_Q|FKG=G0%W8>SRwccY-lpZ1RK1;p8HL0C!TplX3 zC#}W0^@8FB$`}cC^HBXff zEcYncis+f%FWZ{a{w~mLl#Ah3m(akT-{6`#G>NnU5V9cat(JQqArb&VS|SA~RApaw~tZ&}ro-kOaVG`VzFSKDQj5y@B<{&ye{;vJ;8TA*^mO?e-K!Q{p|3f%z% z1^#l8`M%QSei2cTsj0J$*#M`6kVf%hqEK+k9QW(g&*I|3pBT(~$jh~CTMLrepeR-* zPk)l3D&3yNh%uN^9cB%UZ`RZ3#@1e48(ZPnR>TXihzw><3mVvoy-ow{1l&Xt2D3n+ zQ1JYxlu@XO_V)J1Mw9d$-&cDgl9C34pcQ^yi<}sG)d#&jFJlt2YXb7zj9M~OykN^2 z6Vo`Q7<>#MnreJkZ%FX>eoK*7 zIwR&9XhUo+4b#>t4LE=@nTb?Ud8;D$1#{{4+e;dQOW5<6y!V>1_06BmCc0;!aN8eH z0J!x~y(9rq82~LamiO*q^)DS@mhQv4aLw!2 zRyGdrC|Az2TJvYd#Kix3k(!2vp{*_SVN@H8y!jo3A6fxpYiIy40y%;_CR>f(^$WbA z@SyZ`UZ;(_KLB~q-Q5i***wk4vN=Fso{tSa+iJmiFpGM9>fhPLQmH$qpJcSOgC*sJ z%tP?n4?rDOB5SW$NK`a3jKQ-DNxgjrLUD-nd*=E7AO6!L@#Cp+5{&mbMqPmaaoqRL YQD`kFfx@-(aLOUI+gi$nhpF literal 96826 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

*gST#KP&P~?iACY1Xp1{K>>ZC)jYITBt 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

iFfzj| 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

6BOae)+t;AaoMhqa-T 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

wvS&_; zSaa=~gD7oee#0~H=P%~|QA6G!m)u@F*iqmHyMZE&I*#FkkC%}@`v`|Zhy=d1Ei2ht zG&oxgCS7gVsSO7ih!F!TvHC}tv3xfBg-aeTe}wO=7O7=qXDhd6(!U{`0VK6j*X2f! zuQmINXWErZV(D^nh0}jh*FTC1HhTeI79NXEJYz8nCP_+jXf@|axpPs1DC+{Z=@K43 zJZ{?Pu92q~W*>|U377mwK)d0o0bof`cSB!C*siYc0bO}UV!xF1P|{7;pNvP?Mn*CsRo;@OC*mphn2cviL-IzL4yX)*`~ z2LSQ4B1byz%(|FGWc*JZ5jOl9m0;(*BRG$1PaqBk8h10sDib1QKZn!8Uj&Hl3%3F1Lw@7az-%E_`uc_O z_V4O)VM=<>iAZ7^CWc#n5?%c%3_;iiN`3-*=6>P#@9$wVh%FQdN_^^l(Bwrj^y)b= zfz8$i#nSf5?(SR?QM%*G+SdDT-eFFp8gIF|+1RMTK^uM-6n#Dd2SrI`&bnd!1NvhK z2=D^+h^iwEJC4^-^8+9lX08j~E{a!=&!MH|;!^3C)YRPhjh}NxPcyBiNx(9NNB#y> zgVjg?qjgJ>j?-#1@Y9C3_dVxoE+E|lt_a4DHbA9Exkv+f80oLre7gUXsqq68zC&f< z{ERB2#Qg%SjV~xc*dIy}bl&=t58%7#hO<^*Im+$%ihw3BE6f1J-DyqyTyRV`52qsa zv9Pvf0R4Sc$Gv$`sh0S2IDm(zjxr)ovFjYvVX%j&4lYrjMX0J`O|&`1F>qppN+5`l z)AF6~60lRHd~vt{=#YSOk!nBCIWWu5&pVN)=M7(p2dZ*V6!IW@a%O1p+x&zD)) zfF$0@vC@krsTVgGxL$*buqdUxQGtS2)UPbIE#=gTeo{UW$L-TPZX5mJng|KseN>n2 zsg$A? z2oEJL&cYeoyyXZt7q~rukpU0duFzrEl3r#!kGYZ!28P#L>pyF`vTfN4W=cw@-w$%w z3?`W*&*UX|T@Sk#5lKHKvOqsZ;3=DOF_xi_2!}t!V*%p0*fbz|eJt1IQV$h76l&_7+pF_HBaUxZ^~2znS8@J%mi^i!0o%+F>7t}*i( z2&DCm%@gDnnnu98TLf!?X)yAC{u^G=VDp~+?YLFp{@;EO9FL0swe$J!)Xuee6lvCl z1InhRrsm(MiqazXz86t0A}Sd6!;{~8H%|fN`HkL3f86F9+-?_le*Xk0f3>v^;zjqt z^y(72iR@DfUbT6Ati>+Y7L z1^mK;O2?jW43W(RVQk3HO+8|uSnwc+ulyRq2ORQ!VF_@53+n3Ph0`~$2hwr|nSuG~ z2N5cNEO{4g1yJ_gNr?vH7;a1{3+1E*FwZf3_$y#h99zz1a!Y zafgnMCLmTV7ZYRKQoqmDc{%m0q@IFqVdQy*#*ApMxw$o~?9I{^Ll5a*#*3^WLvt{}4Lu%OAd)6;hf5nyDzLnq*=1jM13wX`)aUy91ibNd zB1B33{=Zzb9d}ypEdtVtc(wvFbJ5oaS1?#mEVHh5VZa1aETCHZ2HHEE6ux5q_>@9l zw_&pTO@~-_)I?$7{r{6dM1M`n?HpAU>Xf2ZSdz=_K5h%-Gw~HZo@6KMpmd(|wV`1L zoP1EX(2}(i1gZT+vHW5I-#uLsRZ2W3??3)MVG-T;)K6>Sx77xL^`7tt3LJUBXO=hz zU_pG~-PN^g^TQTYPD0X`h$A zcsr5p&|h;5Lk~u)Oil=j5d2qI*j^L4xkW{x_5}fAxk8w`6B83bKirj%+kkB=03cyL z>4Un5pQNR6gFB$bi`0}L6#lZ(Uub-p;cTTD{#@{T*M^(Z&R9oQ^_wL+^zv8p$rFVg^?*r^)UI)-2rAfjB`JlFVgPtSV z9>=Hgxh@A+XUPfN7At$O>9P+E@ngCC?x$;DP zK9pSZQ@x}yvHIJ91cB`=G(50*dwy(WMz6p3-O=Y9!&QzOaTdwX+R2fV2VFs|f zjs9aSedsF(Qz48c06fQtPeNT=g2>4$hzqg`<7Mn2VCQ;x`@IZ^JQ~h6HIK*uEpDN+ z%fsDqq0Gv_@zjF0DmT|etI0W20UWi|?t}{~T!zy;PPf^W79eVXfZ4Xp??vp*y4hT= znJ?u&vGIz%3lj{K*Zx4F8f?-`u^Bo!d49Tk16}MYSd~VK{Qh2O#eZEgvj?3^{s03Y zP(?W7T?bU-Dzzk^<&2@42mZkKR_V8T&wZT#!=;=CC%=5i7d8CmcIZjINJ2t_^U~6? zn-DXjdpr9EOFJDk2p-<;B*=WA#r{8pw`l4b8q~RX;Ul_u>&xmOFwa*Ue5tq4d%~`$ z*e?Q7=);G90OW`K`EOg#IWP27?11{v32o$6ppg8(NYczVQLytIA6|>bw+-MKKCc^G zrFI!*@6^Aynjy>c@|}u`%3^RT6(I@=k?kju_ewUXZ~9VM{!o(s&65;j2sA97L3);L!#pFN=r&W7tD-BkS_nx^}7cXve>S!jE8`KO7Vptg_(-Z_^Clcl8 zO}F-Ez&do@igkW4pI?wUwo!1Go~{>6*w1uECO5ApdJmsx_y0LE>}USp=R9 za<0m#C?TVnLJ-^h1Uzqe*9X4(iUIdmmVd8-Bz0)9)NH3ORvzR&z~+3m)Qn^-4dAH? zi}&zDl?mk{9uzH>c0i%5Ec<&Py#jPW0lk||`v#y&4)(dz^>864RBl4p-S9n4e5G;! z+lwbU!wMzb4m~ug-^OERt;!Nr%=dFlt&QxIZQtWCJ9KgM?VnxLPDp=!_ulp%9yUI1 zEcK_I-+5oqA3yCszBageDfFIHZ>c2~da_Khkpxc}f+w*f8aMh}Iz@qpch3++KKKF@ zCDP1eB)Gp^+1`0p+pS)mX#uz0RcFKT@V*%TS5MVvW(JBJHo|aer3-Std02205^k_k zPMTNou41F3E5pB~{*aKAM8zVW0-Kg0F7jkvK|KQlZ7-V%)#4ltnL*`Mlw=uI1qI6Q z!=@b7)m+Lt*$J&!ja8^R^k;_=$9qv9@;jptE#Bq81%#Xeaf@ zB9_HRMq0XWpwDB8fwhTWD|003fS3_OE?;T3+FS47GsMB_4!km4_nbm1#WP- zwRJJ-FNF}X8NqckBO|9FhLjX5_w(I_3Mk5|$s-}iS7n`<_Fh_*0vcSKB4RIhq2!;n zL$v~F2=?5eBu+_nWSPZ4+dGng=xlXS$2)%&H~b)MRuMkYc;nfmbHMGImYJEUQ=;3z zLix&ZWccMB`F_#$`BoJy_{`vA6F45UWMiRD@pQX@)uXn?`)Z4vqCZ6)<|JKcsb8hR zb~L#!Rxt5MCXwIv9l%8{mP;UP-gBFw*qY|L$Xm!2*Jm?28cxniPY;ycj(W?%)rmh2g%sM;6rhlJ?V+%253cXV`Qc1o$$8!m^m zFo5gPZtym^q?5GJnr=6*GU+Xvmo+n+4xkv&E#t3DuDK{7Wa&>5ut9uXn~6n^E=IJ; zET+W87a^dSODKO!{yMoLGV*A)4V>2}y$+<+!3&bVs?qd;*9eQCuJ z$JwHHTz*8UI9Q+t#zFeGJo%0*%aaF#Yz4w(9Po^ikIBJp3TL%-By(XV_L&FmiRt*D z4VbC65Qo&QS-zKdUF<;Gd^SLEF=-9!T6DdgxYUlwmCfnu_}F}ORdA6su>jpL)v$-s zA#fl}$GiCkZ{!zIFRztZ?*5#7z@nJTRmcx%0QYeym2YcrqB;TdAfCzwoTbybNOW>I z*~#G7riP&u-sam>-Sf>mr4Bu1E?t-+Bk+S6Y8Q9|j%0Ja9jsEMWv&PaPiZL;$FQiM zwFi6hpdFWh2i9YCJjU?_Wy(xw)?cn2xi( zhen_R-el6B^1bQ&{9K@3$Y_p?mwL%?Jztkq%QFwNfWv!tGYGfS|CP=<;o%Jga{JP9 zdgVBFALSNLsc2dWnw*?mW>TS{$p&9_?JdSc82bsglh~y% zIx4FD;1ek?^^3i3`Iqg(>GvY!-(bz^88Jqi-(0>qA$+wES*rT@s4ZI@+;R3Ch^p7g z1%LJr4GtS?3kwo_vdF|lLJpz!%dUWgXppVs`DESDraM{G#4u9`*sqzwBW_WDiG>rZ z!#*3d6AEiVQY=hN=)T+9?5(e?+=#Yo6seea_WTi6Zr;wxXfxY_%`yZi(1lPax=ATH z_Wu$^|3>Hs49A_}4jZ2obA&7dl;_eC3o0TN6^`d+@xXgS85U31nEVKJYl--RCxKNf=VSE2U!NuoMlI z1WC_0`y@=VPwpj^Zr!iQRG-XiM3FzC@aYbe?qu8yS5mvDE+IDcV13>FsAe$~@%Es3HOEw-Sqpo%Tbq~Q&eYVDqv=6nObj`3wf^K>_}yKn1t$wwTjUVp@X_AB zA?VJTw=XIXCvKlzg<>cA5_)kxicu86PH5>0b4AMLW)@$Hf$^dD<j)$VF|2p1&Dl;!$<^_)!)9@}=o}@y!)Ka`OF+Aq4T| zT~d^9zOss>q$HRH`2pd0cmy#Ng*k04TNNK-A9a01&;eKF(!*$y$zs5M0#b(T>}<){ zfB5)#j0}^&vQlrhnt;mXGo;8^;>>oUv{{Z1!)HGuymSIAUttC{$A@WzmVW4ot;<3#*9MD=sdsb8~xB)}UH= zGZ%6OrYXu@r&hO8tZ@0FZ=(9J9gYVyH8d-M=IBf zW$$RbRoA8!yYw@fu?{a3D;2?^;=t3{Q&v-h{sa?E9S5wLe`1PeRs30jjep6gG&skW zq*u|_C}#sRGrXQ1zq7LNUbed|9+<*b*v$T@t+IfxSZmSpR&;#J+~mmzlQYi^3ul@^ z2G4$w5mDzU{l4D&%{>0d7e@emS=!*wW0+%Zp7`TsK%KXPf<`+l1t2TYZvLB+$fV|9 zJOXc%3lN9fgMNYk+X;QSjp|^Gxrqn~2)I534)VYT2)MY1bgBBYCSqTv2s48%P74^l zQM4q%Styi_>q-d7^fA$O)sM2%9=<&B6_g4LCO);*8@cw`GFJvlQ5BgU~2ColHm{&<;E7TLt#kPJP-f{%>y?SQ>)h!(` zubzs-*(^5pj9xzneVEYE4nVwPoX6bn16aVwNV@3BItZ!|o!UG{FbmU03_8LpXWTr@ zs%AiN?eBxUZ?{~~B8b7?>o%0s&7hDG5s&roCNKc-uuKklVJJzBe4@R4G;2Ka?P+khuA)ZBZA1FzH=?`?(i| zK*Vq#+0Pb0U}4(~Rt)3nx~{p(i8&8C=RR>`)yrw?HcM@kOI>uq3|1vYp1p3!q<_Kl zXYl9G@J4C;S!2!hYk{p#buF^37pFLrtBY(<-P<ZP>NyJsU*^& zh;Ay0@C)KRtwT^T2m2&wiC2-i@`rIf0?wufF&y28;~<}5P(595;!CT(yEGc*T)!XF z-P0?mcqr>y3hGKfkGJqyNwxC*`rb+L`JSHDX8a>u23_GDuj`j+8zh~+7j#&HwNt$Yop@RCKr$( zq0J5nN@X*tFVx{ako~=8#_wk zY3^yk<(4-7W?a4ZZ`UjQ0I_V;4G%lXX}zLy`|s9qgk{jnyf*ye%O3)v%)ARn4F6$2 z-<5hLH`8@RS?)vYxKM0rk7iQ?e{l%j}DzI(0g=S^T@>7Qk5Ru9h#eRLV3S6 zr1xkb69_DC%Y~L1EY*x#a@w;t?E}sd+@#0-Z~Pd4G;X{$#FbykiTS9Xe%fzMpQ#gg zz=eMd=iPCV|oh3u&eqR&?vRZCl|^Lrnkxgxh77^Rb^w}txn_#8!|PMRVl-ACDM zof1;;QP{saea|+g%Ol1VuEQRl&X$aZMWA1nbiv^?2Ac=QjS{7|oW2w}bDQ_$_Gah6 zH&)ix$0s+c!)t2d;;3dt>bgEAAWjEyqx(XPXL+zq=9Epu5c;p_#|okRs(_U|+ml z<8%_~wcFHA#fZdKYF(n7F7Kn=+`RW;nk<3XorI-m=g69gW6UVWXL&t-XXoz;?>uLH z(`1t6rNoup9AV*e?Dk=tDu4D?CQ9y692`6#Kl5dP!Z74@OK(&U&W4Dd`(P`@=q0la#&LfGj=F1 zD9V8fj?OSh=eG>IQe#B0knWcZQg6fOm0Gmy$30Ny}&PVjn2z_*8f3zO%^C z@@iz^O;d>0X(>S0!QEANgm%cbYAM>hT*&$qzXe?Lv>eVWv`Fy|oMbIJ*|N@wGfGS4 zbUdo*X$)3jVvu`NL?|Bm=tMJZJ7ho_J?tMhMnerxb|nD0ulY4u&#(8ct(x8OhW_On z${S;|(a6DxZ%7q?D>(HOTUYc!Kp>4z;br+BSMBA?hMB1-d|db7SbzT(uOIHypUy~t zn2`(`qQPU#-=!;k!!gv*vh}5@aM-2#&Lsmb4+!t^@1o!Jx*z)hja)0#U2nMBG@TO% z0Gh?6{G6>kMOC>}&~XDi4PY_4C8Pm-u*_&E!SBirsaAk+e!uyq`L!4eoxTAlmYO!D zMdhm{wbSz!$eo6J=t_{B^=Ufqlvtxot zf(aw+sYhQr8nk7n1i~2$Mpw3IOUwGFy7)M_9#xlm<470e_XwYU0IKq#XfvfI%~MDS zjkXI33E?Y5quc~XdKrTe=;wFQA$MA=4~alny;TCtSPq!+=3D4-pm8b0eAc}5q6RG` z@mqJdz2n>!v=dB})yA&yyJTm34L2Gz|6MhkUzRRjrrrVzXLCRR-NqC5zU)Q6t?}LV zjcNl=QyE2-J$r=6ULY`-=&=PP?vha{d8!oG zMfL*BqZ!;Z(#V@A#U+S{K-nu-9Ii2z5@nYEHHAcCm*37$asVZBRphXKy||df>vdps zX5N3z%kr-y@jv|_Zimi$7m?)l%V*?~Wa!w6;P7o90R(efn`fhnsw$WPbFbdK=>$X- z2#X_jrosD6Y;0@+y#P+#xmU$yC?wLBUpFmNz#4w6jWi(~<<|TZ!P)KlrNBXhf~B>2 zkocTD8b;#25@SPOzV6=MOAZdjh6*P#t@8>XN^)u{@+@3h{fVS3cji~iq=)zJ0HZh{ zpjl-~uG3R5YG7c@KbT&|YoR=EZ@1140ZL*ON6-cbAiPQ>4e@w?}QS1 z3ne6H-neSfNX_RbL=#(~LVN-zS%Rb4pGG@5x9^6Ttq;UZm|nYT zf@7x0Mnp#u)v^xrm07t3%X+k@JxS(U{&0hQNt}a=lmCY>%~i7>SuZ%x4=fE_vd1|d z;x9o7);Kwe4e-A?LXJDHc%hzbSNmAXU zEA?B(p;T&YtlfOwf^Jt0KyRQC`Okux(W?dLCc|+eQce%V#Tz0f^#1+UOfW-HfNsBb z3x;pty%&;kmqCoY@w<0=x=BvNYtesA25BLg?(uniZ-YoEBj_jwLPfn@vIGsv@+$iBg%4>O) zYsgovP2`d6R6tN)GBB48Enxx4s8!+Ai=<_u(F)7im$-a9Q`tV+W zcnP+u_LqvTuJvTO!p-Y`_i>wI5JhD|$b2!3`i)V(QP1Pe?xy?q>W$4lnwgtVcCnff zmGf2~930?aEeSI-LPA5Fot-^vom^dAE#oT$WL524!MUMSXhPEs)Y@8fxuC8YDKHUwwXS(}`gnLXG z=E^yOFJBgFHb^l)a=6jxZ?xUll^ajGfz_7o+UtP^#lKAs}a!to(VL|;Zodz2-v%!J{R+Pig zUw1hn!_cU#vQ#nelRsaAzy!_KyLdmM@!g0iDK9S%l|`wGd-AB>D#-h}h?r~0$XHU; zLHB9bkYD3*+xx+|GV&xKPqO-I(QtVEjNWq?(|%9B8A7{3kF_PGDpoeVPD{%q&4k7A zH8y6TL`rp*3@D{(C#H1Al$VySe^PNu=qEp~ zN9cGQLA{Tdd3a>Ycd?6Kf*_+=6^Bh-7lb?FE1Bpj%NCpY=B8koAWsyn-23+(ku;e< ze{vW%B!b`Y^YXf3FI`jA3{_QCeSFk2GcsT>7&|+=bi|XNd1p&oR8vSZ%g&Cr;!B6B zxcYnd>PaXbs%fd27#MJSoqo7+<5J)EG91dyQ!!qAd44z`J~sG)jD2OQN?%(;qte>a z4Yi|7Wu0oj-08GFsMjH6MGE%Q#DoSdh48qvzJ7`NZkl?r&T4f98>@R0Brfh~6b|R4 zqf^$EE5g3wEUre*Fl&(<^W~i9zl}?-*P3tMfs9s|4jdzWW!z$zv)sxnvxKz&?i(`g zO3tMVyH?lLnL8X*_+n=l*VnnshfmcDui}TBu|e$W+m3U-yEkcr+uquI+C&fjD9AA# z?D*YZtt@G5EGn7j+1=CgoRgL31z&Vbpth4!rK*a`8;RE7#Djy723NW%S2IrThrxI6 z5;QndR7iqTeixw)rX8;)99 z$;%z#CXcTX(G`-Kn6BA{mTGk|6?6KEw-iLuFeN4@XPFuy5G(KE8}svp7#Ywo9=&8YGqaH2dbf36Ru&$UxRAp>To?1LLHC1_DN;BEgTa~_k z1+fAK|0~BdFer%lg^<>iQV3HOyNu=C>Jt~pdjkVnqS#aVXlPkQjb%KFo0LtX^y44@ zto_iq4~=t=_0FMsWnr5;FyBX%%j+vfRz^>#h_{C`gGTRL%E-t(qm3n?qIjQISZHNw zNKE0v#K*pURxIb4$yZlbSy)(R6qyuKpL0Amt9CE$91=^hYzAMl?iO zNhR^6{S%@h>;_r)jpd~!SP#qh?@z|Y#t{WRm~Bq6W@P-7)9~Z*_-`j^~7H`N+^vcTayrm{(MMa?h@kqGFn$W&OnA z4FhKqr$bVrv(vB#cW#27sh8+^9?%bsjje7?;spj;pPy_iuX(E|Dkh1zUvK5Qd-v{! zIUk`LuSU=lIl1s^YkZgODIQ;p4((KxWn@-XKz6p2_eOiy!~|m)jqA?L8PnZhGS2gd z(E(X!ZFiS>`S_5HdY+yQJt6O$@tqswU2Jxm9333TMn|E!{oxs#mh#7{(Yg5+&*mZD z;vU^5*wmljF0HAtEM*^qKeQ?=ihD$oCL*&1A2^gzih1?4G*)Q%{mFmAZrZwR%gkxW5n6f29GtnH9LD>U_b0(bZCLBnTDI0omtPJ z3ZE(o6H`zulft3r;o(7573k+!u!f(3MHhPs=y4zu|5v3$W z+pmWBT4)IoUF>~|%QR%#aiU13c=s-3rtH?O0IwIDlX`Ttv`SXqTN6X!MP;L-qp}H? z+&tX)_owazjJ;9oO4n7EReqX#Y#e2zOF~Nea0t<-eX0zOcZf*G(=)R>L}i;4oA)Ik zh55-ApA?B|n*Io_xO);778Z)wEpQQOYH8i464E#!Wi>Rk9Fej`^qNabGAN|ce+`=T z2CEK-+k$UC*4+hD#-Uexv|CN}E+oXorCKagdaOpVlI1_^Gm)D5(j48roWoL(?{T~} zSzYvuh;`Lv6y9+vj@P@QlPmj3?Lf^2XJujNjWDjgI&BZuQSLu*urkG{wcmK~S6P zn=1$e3CTAzi~O9dEaK?m2!5iCjZFk%^;=wAenCON*RNSw+4$r_iFnMxxz^gPVPU;U zxUHMJyMwlhs_J(=r%K#Y{bhfq=Vt|Z`J`kd>S}5a73~$vG?HL2Rs$MQ+Ki*Hu%r9U z$a6(^_gm_LOBqWC2ls3wB`#M#Z=6><)_y|bN5B&F40GgDpL23zk47RNk&v`tF*&!9 z`h~?RDk?oNSZ6p*=8qq*AcY?$s;wJt^W?=I2|eQRIvs>1Ts{umKcQw8&0?OUoF4bB zW@TmROBS7-oa`PhUp_x>`DJP}?%D+IO6#NP-gNPrj0{>{UJ-iwQLx>DWCgmzn>-pq z(z2Qn^mq~yH<+Yx4e2ubQfj^i&F^om{mjT!&!&5_I%#kAW}s@YsrWy zVWQERy1L%$3q*eYZ;Vw{O@*~Fzt5`$;^Qa^3JX~{Ia}=MnECjc{&b5nAbUnCN=kOW z4G!9|%EBgUYe(1e98CsR-kdbfG+M&1UmPDsl|>CBKPVAr$3-`lfgK{|wr2qFqHaA;cAuLp`3C*jchPpE{K({w1Va8n#cFSXifBZ;c>0u#e46CZH zrloa7&0U_mudE^h0s^(QwB(a{{lvc#ae-51*m3#*miE#3W~WVGW)cy)w}gOXBb1Qjm9)&Nt1Z3A>Ql2D+ z*T6bWA%+TN&d~xy@?^>{YVUQ+cLxHxzs_nVa;v#5qoe@4uyKo>?JPJ1y;EP&xz%>3Vcvg zbJ@z2p3<7Sar-zyOa~Xtz})+A>N1J8|7W_Hly9C-u3bsRJ2_HTql*_$1sdYK!tfcl z$t!1g4L$jnN&aBqW9aeC5_GxxCFsUi=6^Z*tGTB=R}aRC5`Z53Yq)}+;dS)}j{6tp zbSU$w%leM)#k+T#X^$UWy}PhIysqEA)ZX5{J5k1T>SAZ27Vqcxng%sjVKPuzy~Dh` zn7Y;QV8|3EmLy=S77N>Bf#B^8Nv8wUV{UF4PK6v{3HbL#W>Rut2b}sR7fXk##>U2w zUqwZ!=OV`-+71RRu*5IL;LKT=_# zZzzu07uzh6m6cUrU*Cd0Fr2Oqgp5`fEpoPCeiamG>*#oW#6IKDWV+x0!$DVAcb2qZ z5If@oSwR>1-z?iZn(+e0#7pKEhFpJW@A}O997=%uqJ@=#!Fke@^}N>8898P7_w>2x zz;`myy+5tF?V;l98&fsfaJ@`##;sY$C}Yi`L(JLQ_<)%9P*w#p-51km-D1CtIJJ*$ za7Btb_k@9z9^$x6aE6-KEq`>;5uRe$`F?Y#3Dui)xU@taN_`d2arPL^-t9Us98*F@ z2Vlywva$2Id3kdKu*1>rk!#od(%CN(=Y5X4_Tx;SzkBx%%yVaCx(fV*e$^(P&+ejx zw6gLDz!)JRAtyVcQK_ki$Uv~@qN0w&ZFz!%b=Un~>FQoCwyqn))P7~>a3+ceK@Diy z`x5zc3Jc$BYHG^JYz$@A+O}MZ2{T!445QAz6K;uvOFyfqi2VWcgP}`YLNZQ|mil_F zrw`gXnbM%j(sH@4u14~ibS$nJU0KOX%gw_>GHqjF@^^Rj zIWzOjodd#p@`bIfw-7Q;9n#sWwb>t@T!{MJt<3mfC;%@ZCN}-y5KRiUx4TFVxg$he3m1mIajRMcj+*#~*Tmyjk3HJhLNQpNH9=}Y%>GtfSU z0WWxcx1}090lB%USL??3lHP9c$F<>-vStI@>3Rv?biF2>ln;JaeZ^tVZ#Nx&BGjg> zt}YGegWo@{LBOaP>RqEyuZUw$uKRsN^pelSLmN;~W-cx$R4VMrTv=wotEX z7^D$~h{|jdVG%R|5xz(C0AMdtO7j2pCs`VtiO1yR4D=$4LbH;hay}i~B(u3cHF@%- zWfb%J3v0ifY=_r(!Lb8Sg-Y zR@~gh-8s4qF8{{AhCn=w-VgN(3!~`z7cLf#iML^b4p|(vI#y9y@Y=`n&vDs5lYYC zCB4Y>i*UE8SD=08jX}3>B)=qzijOBHGBz50#Kz9vWPbK!Xu0Y zd3mb{g!jQld05zcT1Gm$!x07X0T^s#a4=EGnw#kG;K}{5Mlbi_1W!)=16iMQ6=oys zxg}*ymSqhGBrGTgmnc=#@!5+PGT{BG146jVCu=0kzuR+Oo2CbUf@&Z+Mz? z2s?Zz(dLAl`v&b#ZAjdsS7bJF-JMex*7Qa$wYxaD(9_Pt)Roe5?geZ$H(ek_sQ#N? z-ohhg>#OYAF&5$UZX?hZo=QLdozL7RXmalK@AeNFJKy1D=-XCxHBQ{U756oPHx zQSahCwyJkb{f{>`_)077K;~$0irC!?nIT zqQ`NuvBGVhUz6)8;8ptbWB)=kFLAe>z7|doYE_n6%~Xod9iLiceZB04VP^zCKR*Y@ zbDQ}&x0%`((h<~;dCh)@8d;^{hBSRY>5tpsnF9fMczisK+j+QV-n)I9kK4lavVGxe|4HkU z;)NteZX37(9$b?x%Cs%=6H@3ve9D!|hlzG+N7R{b3sXU7lU(Lan=6WkRe(yN8NmbkY8KsbtFVMXaFdK$`x^q=SuH3}8vH-7tebw#&=^>x{qprWEu*3q%Du(-PQ zB}2(_bD6QG$eUN6)rv9NVkgfEMRkToPUKO|hWZHqeo)3nMAZ89`>m@6Zn_!

nzc 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 literal 98697 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 Y@)mQ8jj4*%3=CVz+0k`(CG}wP?~tmeYybcN diff --git a/frontend/src/scenes/experiments/ExperimentCodeSnippets.tsx b/frontend/src/scenes/experiments/ExperimentCodeSnippets.tsx index d5a2abca2306fb..8d9aefd7269a90 100644 --- a/frontend/src/scenes/experiments/ExperimentCodeSnippets.tsx +++ b/frontend/src/scenes/experiments/ExperimentCodeSnippets.tsx @@ -188,10 +188,10 @@ export function FlutterSnippet({ flagKey, variant }: SnippetProps): JSX.Element <> {`if (${clientSuffix}${flagFunction}('${flagKey}')${variantSuffix}) { - // Do something differently for this user + // Do something differently for this user } else { - // It's a good idea to let control variant always be the default behaviour, - // so if something goes wrong with flag evaluation, you don't break your app. + // It's a good idea to let control variant always be the default behaviour, + // so if something goes wrong with flag evaluation, you don't break your app. } `} diff --git a/frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx b/frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx index dd8ebd131cefb7..384283704aa07a 100644 --- a/frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx +++ b/frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx @@ -365,7 +365,7 @@ export function FlutterSnippet({ flagKey, multivariant, payload }: FeatureFlagSn return ( {`if (${clientSuffix}${flagFunction}('${flagKey}')${variantSuffix}) { - // do something + // do something } `} diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx index 90629bcd6f691d..7eaef809182437 100644 --- a/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx +++ b/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx @@ -24,6 +24,7 @@ import { VueInstructions, WebflowInstructions, } from '.' +import { FlutterInstructions } from './flutter' import { RNInstructions } from './react-native' export const SessionReplaySDKInstructions: SDKInstructionsMap = { @@ -43,6 +44,7 @@ export const SessionReplaySDKInstructions: SDKInstructionsMap = { [SDKKey.IOS]: iOSInstructions, [SDKKey.ANDROID]: AndroidInstructions, [SDKKey.REACT_NATIVE]: RNInstructions, + [SDKKey.FLUTTER]: FlutterInstructions, } export function AdvertiseMobileReplay({ diff --git a/frontend/src/scenes/onboarding/sdks/web-analytics/WebAnalyticsSDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/web-analytics/WebAnalyticsSDKInstructions.tsx index e4778bd86bb438..4c6e9a7953123e 100644 --- a/frontend/src/scenes/onboarding/sdks/web-analytics/WebAnalyticsSDKInstructions.tsx +++ b/frontend/src/scenes/onboarding/sdks/web-analytics/WebAnalyticsSDKInstructions.tsx @@ -1,5 +1,6 @@ import { SDKInstructionsMap, SDKKey } from '~/types' +import { FlutterInstructions } from '../session-replay/flutter' import { AndroidInstructions, AngularInstructions, @@ -36,4 +37,5 @@ export const WebAnalyticsSDKInstructions: SDKInstructionsMap = { [SDKKey.WEBFLOW]: WebflowInstructions, [SDKKey.ANDROID]: AndroidInstructions, [SDKKey.REACT_NATIVE]: WebAnalyticsRNInstructions, + [SDKKey.FLUTTER]: FlutterInstructions, } From fea53827d7cd3d1a85dcae468adc87bdd40c9702 Mon Sep 17 00:00:00 2001 From: Juraj Majerik Date: Thu, 5 Dec 2024 16:58:22 +0100 Subject: [PATCH 10/12] fix(experiments): keep flag <> experiment in sync (#26681) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ee/clickhouse/views/experiments.py | 6 +- .../views/test/test_clickhouse_experiments.py | 108 +++++++++++ posthog/api/feature_flag.py | 17 ++ .../test_process_scheduled_changes.ambr | 168 ++++++++++++------ 4 files changed, 238 insertions(+), 61 deletions(-) diff --git a/ee/clickhouse/views/experiments.py b/ee/clickhouse/views/experiments.py index 391fc1a6aa5ab9..b8444d819bafae 100644 --- a/ee/clickhouse/views/experiments.py +++ b/ee/clickhouse/views/experiments.py @@ -429,8 +429,8 @@ def update(self, instance: Experiment, validated_data: dict, *args: Any, **kwarg {"key": "test", "name": "Test Variant", "rollout_percentage": 50}, ] - filters = { - "groups": [{"properties": properties, "rollout_percentage": 100}], + feature_flag_filters = { + "groups": feature_flag.filters.get("groups", []), "multivariate": {"variants": variants or default_variants}, "aggregation_group_type_index": aggregation_group_type_index, "holdout_groups": holdout_groups, @@ -438,7 +438,7 @@ def update(self, instance: Experiment, validated_data: dict, *args: Any, **kwarg existing_flag_serializer = FeatureFlagSerializer( feature_flag, - data={"filters": filters}, + data={"filters": feature_flag_filters}, partial=True, context=self.context, ) diff --git a/ee/clickhouse/views/test/test_clickhouse_experiments.py b/ee/clickhouse/views/test/test_clickhouse_experiments.py index aa6d791c6d3d0d..a4c8bf9f3eb13e 100644 --- a/ee/clickhouse/views/test/test_clickhouse_experiments.py +++ b/ee/clickhouse/views/test/test_clickhouse_experiments.py @@ -1753,6 +1753,114 @@ def test_create_draft_experiment_without_filters(self) -> None: self.assertEqual(response.json()["name"], "Test Experiment") self.assertEqual(response.json()["feature_flag_key"], ff_key) + def test_feature_flag_and_experiment_sync(self): + # Create an experiment with control and test variants + response = self.client.post( + f"/api/projects/{self.team.id}/experiments/", + { + "name": "Test Experiment", + "description": "My test experiment", + "feature_flag_key": "experiment-test-flag", + "parameters": { + "feature_flag_variants": [ + {"key": "control", "name": "Control Group", "rollout_percentage": 50}, + {"key": "test", "name": "Test Variant", "rollout_percentage": 50}, + ] + }, + "filters": {"insight": "TRENDS", "events": [{"order": 0, "id": "$pageview"}]}, + }, + ) + + self.assertEqual(response.status_code, 201) + experiment_id = response.json()["id"] + feature_flag_id = response.json()["feature_flag"]["id"] + + # Fetch the FeatureFlag object + feature_flag = FeatureFlag.objects.get(id=feature_flag_id) + + variants = feature_flag.filters["multivariate"]["variants"] + + # Verify that the variants are correctly populated + self.assertEqual(len(variants), 2) + + self.assertEqual(variants[0]["key"], "control") + self.assertEqual(variants[0]["name"], "Control Group") + self.assertEqual(variants[0]["rollout_percentage"], 50) + + self.assertEqual(variants[1]["key"], "test") + self.assertEqual(variants[1]["name"], "Test Variant") + self.assertEqual(variants[1]["rollout_percentage"], 50) + + # Change the rollout percentages and groups of the feature flag + response = self.client.patch( + f"/api/projects/{self.team.id}/feature_flags/{feature_flag_id}", + { + "filters": { + "groups": [ + {"properties": [], "rollout_percentage": 99}, + {"properties": [], "rollout_percentage": 1}, + ], + "payloads": {}, + "multivariate": { + "variants": [ + {"key": "control", "rollout_percentage": 10}, + {"key": "test", "rollout_percentage": 90}, + ] + }, + "aggregation_group_type_index": 1, + } + }, + ) + + # Verify that Experiment.parameters.feature_flag_variants reflects the updated FeatureFlag.filters.multivariate.variants + experiment = Experiment.objects.get(id=experiment_id) + self.assertEqual( + experiment.parameters["feature_flag_variants"], + [{"key": "control", "rollout_percentage": 10}, {"key": "test", "rollout_percentage": 90}], + ) + self.assertEqual(experiment.parameters["aggregation_group_type_index"], 1) + + # Update the experiment with an unrelated change + response = self.client.patch( + f"/api/projects/{self.team.id}/experiments/{experiment_id}", + {"name": "Updated Test Experiment"}, + ) + + # Verify that the feature flag variants and groups remain unchanged + feature_flag = FeatureFlag.objects.get(id=feature_flag_id) + self.assertEqual( + feature_flag.filters["multivariate"]["variants"], + [{"key": "control", "rollout_percentage": 10}, {"key": "test", "rollout_percentage": 90}], + ) + self.assertEqual( + feature_flag.filters["groups"], + [{"properties": [], "rollout_percentage": 99}, {"properties": [], "rollout_percentage": 1}], + ) + + # Test removing aggregation_group_type_index + response = self.client.patch( + f"/api/projects/{self.team.id}/feature_flags/{feature_flag_id}", + { + "filters": { + "groups": [ + {"properties": [], "rollout_percentage": 99}, + {"properties": [], "rollout_percentage": 1}, + ], + "payloads": {}, + "multivariate": { + "variants": [ + {"key": "control", "rollout_percentage": 10}, + {"key": "test", "rollout_percentage": 90}, + ] + }, + } + }, + ) + + # Verify that aggregation_group_type_index is removed from experiment parameters + experiment = Experiment.objects.get(id=experiment_id) + self.assertNotIn("aggregation_group_type_index", experiment.parameters) + class TestExperimentAuxiliaryEndpoints(ClickhouseTestMixin, APILicensedTest): def _generate_experiment(self, start_date="2024-01-01T10:23", extra_parameters=None): diff --git a/posthog/api/feature_flag.py b/posthog/api/feature_flag.py index 06727c74bcf53f..435ccbe1cf27f3 100644 --- a/posthog/api/feature_flag.py +++ b/posthog/api/feature_flag.py @@ -393,6 +393,23 @@ def update(self, instance: FeatureFlag, validated_data: dict, *args: Any, **kwar instance = super().update(instance, validated_data) + # Propagate the new variants and aggregation group type index to the linked experiments + if "filters" in validated_data: + filters = validated_data["filters"] or {} + multivariate = filters.get("multivariate") or {} + variants = multivariate.get("variants", []) + aggregation_group_type_index = filters.get("aggregation_group_type_index") + + for experiment in instance.experiment_set.all(): + if experiment.parameters is None: + experiment.parameters = {} + experiment.parameters["feature_flag_variants"] = variants + if aggregation_group_type_index is not None: + experiment.parameters["aggregation_group_type_index"] = aggregation_group_type_index + else: + experiment.parameters.pop("aggregation_group_type_index", None) + experiment.save() + report_user_action(request.user, "feature flag updated", instance.get_analytics_metadata()) return instance diff --git a/posthog/tasks/test/__snapshots__/test_process_scheduled_changes.ambr b/posthog/tasks/test/__snapshots__/test_process_scheduled_changes.ambr index f81f9a6ef08af1..95e70a1ec23283 100644 --- a/posthog/tasks/test/__snapshots__/test_process_scheduled_changes.ambr +++ b/posthog/tasks/test/__snapshots__/test_process_scheduled_changes.ambr @@ -266,6 +266,32 @@ ''' # --- # name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.15 + ''' + SELECT "posthog_experiment"."id", + "posthog_experiment"."name", + "posthog_experiment"."description", + "posthog_experiment"."team_id", + "posthog_experiment"."filters", + "posthog_experiment"."parameters", + "posthog_experiment"."secondary_metrics", + "posthog_experiment"."created_by_id", + "posthog_experiment"."feature_flag_id", + "posthog_experiment"."exposure_cohort_id", + "posthog_experiment"."holdout_id", + "posthog_experiment"."start_date", + "posthog_experiment"."end_date", + "posthog_experiment"."created_at", + "posthog_experiment"."updated_at", + "posthog_experiment"."archived", + "posthog_experiment"."type", + "posthog_experiment"."variants", + "posthog_experiment"."metrics", + "posthog_experiment"."metrics_secondary" + FROM "posthog_experiment" + WHERE "posthog_experiment"."feature_flag_id" = 99999 + ''' +# --- +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.16 ''' SELECT "posthog_team"."id", "posthog_team"."uuid", @@ -335,7 +361,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.16 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.17 ''' SELECT "posthog_featureflag"."id", "posthog_featureflag"."key", @@ -357,7 +383,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.17 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.18 ''' SELECT "posthog_user"."id", "posthog_user"."password", @@ -390,7 +416,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.18 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.19 ''' SELECT "posthog_featureflag"."id", "posthog_featureflag"."key", @@ -413,7 +439,19 @@ AND "posthog_featureflag"."team_id" = 99999) ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.19 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.2 + ''' + SELECT "posthog_remoteconfig"."id", + "posthog_remoteconfig"."team_id", + "posthog_remoteconfig"."config", + "posthog_remoteconfig"."updated_at", + "posthog_remoteconfig"."synced_at" + FROM "posthog_remoteconfig" + WHERE "posthog_remoteconfig"."team_id" = 99999 + LIMIT 21 + ''' +# --- +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.20 ''' SELECT "posthog_team"."id", "posthog_team"."uuid", @@ -483,19 +521,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.2 - ''' - SELECT "posthog_remoteconfig"."id", - "posthog_remoteconfig"."team_id", - "posthog_remoteconfig"."config", - "posthog_remoteconfig"."updated_at", - "posthog_remoteconfig"."synced_at" - FROM "posthog_remoteconfig" - WHERE "posthog_remoteconfig"."team_id" = 99999 - LIMIT 21 - ''' -# --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.20 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.21 ''' SELECT "posthog_team"."id", "posthog_team"."uuid", @@ -558,7 +584,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.21 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.22 ''' SELECT "posthog_remoteconfig"."id", "posthog_remoteconfig"."team_id", @@ -570,7 +596,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.22 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.23 ''' SELECT "posthog_team"."id", "posthog_team"."uuid", @@ -640,7 +666,7 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.23 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.24 ''' SELECT COUNT(*) AS "__count" FROM "posthog_featureflag" @@ -649,7 +675,7 @@ AND "posthog_featureflag"."team_id" = 99999) ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.24 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.25 ''' SELECT "posthog_organization"."id", "posthog_organization"."name", @@ -675,7 +701,33 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.25 +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.26 + ''' + SELECT "posthog_experiment"."id", + "posthog_experiment"."name", + "posthog_experiment"."description", + "posthog_experiment"."team_id", + "posthog_experiment"."filters", + "posthog_experiment"."parameters", + "posthog_experiment"."secondary_metrics", + "posthog_experiment"."created_by_id", + "posthog_experiment"."feature_flag_id", + "posthog_experiment"."exposure_cohort_id", + "posthog_experiment"."holdout_id", + "posthog_experiment"."start_date", + "posthog_experiment"."end_date", + "posthog_experiment"."created_at", + "posthog_experiment"."updated_at", + "posthog_experiment"."archived", + "posthog_experiment"."type", + "posthog_experiment"."variants", + "posthog_experiment"."metrics", + "posthog_experiment"."metrics_secondary" + FROM "posthog_experiment" + WHERE "posthog_experiment"."feature_flag_id" = 99999 + ''' +# --- +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.27 ''' SELECT "posthog_team"."id", "posthog_team"."uuid", @@ -745,42 +797,6 @@ LIMIT 21 ''' # --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.26 - ''' - SELECT "posthog_scheduledchange"."id", - "posthog_scheduledchange"."record_id", - "posthog_scheduledchange"."model_name", - "posthog_scheduledchange"."payload", - "posthog_scheduledchange"."scheduled_at", - "posthog_scheduledchange"."executed_at", - "posthog_scheduledchange"."failure_reason", - "posthog_scheduledchange"."team_id", - "posthog_scheduledchange"."created_at", - "posthog_scheduledchange"."created_by_id", - "posthog_scheduledchange"."updated_at" - FROM "posthog_scheduledchange" - WHERE "posthog_scheduledchange"."id" = 99999 - LIMIT 21 - ''' -# --- -# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.27 - ''' - SELECT "posthog_scheduledchange"."id", - "posthog_scheduledchange"."record_id", - "posthog_scheduledchange"."model_name", - "posthog_scheduledchange"."payload", - "posthog_scheduledchange"."scheduled_at", - "posthog_scheduledchange"."executed_at", - "posthog_scheduledchange"."failure_reason", - "posthog_scheduledchange"."team_id", - "posthog_scheduledchange"."created_at", - "posthog_scheduledchange"."created_by_id", - "posthog_scheduledchange"."updated_at" - FROM "posthog_scheduledchange" - WHERE "posthog_scheduledchange"."id" = 99999 - LIMIT 21 - ''' -# --- # name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.28 ''' SELECT "posthog_scheduledchange"."id", @@ -888,6 +904,42 @@ ''' # --- # name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.30 + ''' + SELECT "posthog_scheduledchange"."id", + "posthog_scheduledchange"."record_id", + "posthog_scheduledchange"."model_name", + "posthog_scheduledchange"."payload", + "posthog_scheduledchange"."scheduled_at", + "posthog_scheduledchange"."executed_at", + "posthog_scheduledchange"."failure_reason", + "posthog_scheduledchange"."team_id", + "posthog_scheduledchange"."created_at", + "posthog_scheduledchange"."created_by_id", + "posthog_scheduledchange"."updated_at" + FROM "posthog_scheduledchange" + WHERE "posthog_scheduledchange"."id" = 99999 + LIMIT 21 + ''' +# --- +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.31 + ''' + SELECT "posthog_scheduledchange"."id", + "posthog_scheduledchange"."record_id", + "posthog_scheduledchange"."model_name", + "posthog_scheduledchange"."payload", + "posthog_scheduledchange"."scheduled_at", + "posthog_scheduledchange"."executed_at", + "posthog_scheduledchange"."failure_reason", + "posthog_scheduledchange"."team_id", + "posthog_scheduledchange"."created_at", + "posthog_scheduledchange"."created_by_id", + "posthog_scheduledchange"."updated_at" + FROM "posthog_scheduledchange" + WHERE "posthog_scheduledchange"."id" = 99999 + LIMIT 21 + ''' +# --- +# name: TestProcessScheduledChanges.test_schedule_feature_flag_multiple_changes.32 ''' SELECT "posthog_featureflag"."id", "posthog_featureflag"."key", From 259c3a33744485aa8612412066ee237d88390d6b Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 5 Dec 2024 16:04:09 +0000 Subject: [PATCH 11/12] chore: prep replay components for new ui (#26676) --- frontend/src/lib/components/Playlist/Playlist.tsx | 4 ++-- .../playlist/SessionRecordingsPlaylist.tsx | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/Playlist/Playlist.tsx b/frontend/src/lib/components/Playlist/Playlist.tsx index 7e95122e77b68c..41853e0600a2bb 100644 --- a/frontend/src/lib/components/Playlist/Playlist.tsx +++ b/frontend/src/lib/components/Playlist/Playlist.tsx @@ -26,7 +26,7 @@ export type PlaylistSection = { export type PlaylistProps = { sections: PlaylistSection[] listEmptyState: JSX.Element - content: ({ activeItem }: { activeItem: T | null }) => JSX.Element + content: (({ activeItem }: { activeItem: T | null }) => JSX.Element) | null title?: string notebooksHref?: string embedded?: boolean @@ -149,7 +149,7 @@ export function Playlist< onDoubleClick={() => setListCollapsed(!listCollapsed)} />

-
{content({ activeItem })}
+ {content &&
{content({ activeItem })}
}
) } diff --git a/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx b/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx index b3cf899123303b..023b395b067ccc 100644 --- a/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx +++ b/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx @@ -26,7 +26,10 @@ import { } from './SessionRecordingsPlaylistSettings' import { SessionRecordingsPlaylistTroubleshooting } from './SessionRecordingsPlaylistTroubleshooting' -export function SessionRecordingsPlaylist(props: SessionRecordingPlaylistLogicProps): JSX.Element { +export function SessionRecordingsPlaylist({ + showContent = true, + ...props +}: SessionRecordingPlaylistLogicProps & { showContent?: boolean }): JSX.Element { const logicProps: SessionRecordingPlaylistLogicProps = { ...props, autoPlay: props.autoPlay ?? true, @@ -122,7 +125,7 @@ export function SessionRecordingsPlaylist(props: SessionRecordingPlaylistLogicPr onSelect={(item) => setSelectedRecordingId(item.id)} activeItemId={activeSessionRecordingId} content={({ activeItem }) => - activeItem ? ( + showContent && activeItem ? ( Date: Thu, 5 Dec 2024 16:04:30 +0000 Subject: [PATCH 12/12] feat: merging & splitting issues (#26612) --- posthog/api/error_tracking.py | 39 +++-- posthog/models/__init__.py | 8 +- .../models/error_tracking/error_tracking.py | 120 +++++++++++----- posthog/models/error_tracking/sql.py | 4 + .../test/test_error_tracking.py | 136 ++++++++++-------- posthog/models/team/util.py | 2 + 6 files changed, 194 insertions(+), 115 deletions(-) diff --git a/posthog/api/error_tracking.py b/posthog/api/error_tracking.py index 9cdfd10f09122f..7f554880ff2cf1 100644 --- a/posthog/api/error_tracking.py +++ b/posthog/api/error_tracking.py @@ -10,8 +10,8 @@ from posthog.api.forbid_destroy_model import ForbidDestroyModel from posthog.api.routing import TeamAndOrgViewSetMixin -from posthog.models import ErrorTrackingSymbolSet -from posthog.models.error_tracking import ErrorTrackingStackFrame +from posthog.api.utils import action +from posthog.models.error_tracking import ErrorTrackingIssue, ErrorTrackingSymbolSet, ErrorTrackingStackFrame from posthog.models.utils import uuid7 from posthog.storage import object_storage @@ -28,29 +28,26 @@ class ObjectStorageUnavailable(Exception): pass -# class ErrorTrackingGroupSerializer(serializers.ModelSerializer): -# class Meta: -# model = ErrorTrackingGroup -# fields = ["assignee", "status"] +class ErrorTrackingIssueSerializer(serializers.ModelSerializer): + class Meta: + model = ErrorTrackingIssue + fields = ["assignee", "status"] -# class ErrorTrackingGroupViewSet(TeamAndOrgViewSetMixin, ForbidDestroyModel, viewsets.ModelViewSet): -# scope_object = "INTERNAL" -# queryset = ErrorTrackingGroup.objects.all() -# serializer_class = ErrorTrackingGroupSerializer +class ErrorTrackingGroupViewSet(TeamAndOrgViewSetMixin, ForbidDestroyModel, viewsets.ModelViewSet): + scope_object = "INTERNAL" + queryset = ErrorTrackingIssue.objects.all() + serializer_class = ErrorTrackingIssueSerializer -# def safely_get_object(self, queryset) -> QuerySet: -# stringified_fingerprint = self.kwargs["pk"] -# fingerprint = json.loads(urlsafe_base64_decode(stringified_fingerprint)) -# group, _ = queryset.get_or_create(fingerprint=fingerprint, team=self.team) -# return group + def safely_get_queryset(self, queryset): + return queryset.filter(team_id=self.team.id) -# @action(methods=["POST"], detail=True) -# def merge(self, request, **kwargs): -# group: ErrorTrackingGroup = self.get_object() -# merging_fingerprints: list[list[str]] = request.data.get("merging_fingerprints", []) -# group.merge(merging_fingerprints) -# return Response({"success": True}) + @action(methods=["POST"], detail=True) + def merge(self, request, **kwargs): + issue: ErrorTrackingIssue = self.get_object() + ids: list[str] = request.data.get("ids", []) + issue.merge(issue_ids=ids) + return Response({"success": True}) class ErrorTrackingStackFrameSerializer(serializers.ModelSerializer): diff --git a/posthog/models/__init__.py b/posthog/models/__init__.py index 54d21e27585443..593d60f95934f9 100644 --- a/posthog/models/__init__.py +++ b/posthog/models/__init__.py @@ -30,7 +30,12 @@ from .element import Element from .element_group import ElementGroup from .entity import Entity -from .error_tracking import ErrorTrackingIssue, ErrorTrackingStackFrame, ErrorTrackingSymbolSet +from .error_tracking import ( + ErrorTrackingIssue, + ErrorTrackingIssueFingerprintV2, + ErrorTrackingStackFrame, + ErrorTrackingSymbolSet, +) from .event.event import Event from .event_buffer import EventBuffer from .event_definition import EventDefinition @@ -103,6 +108,7 @@ "ElementGroup", "Entity", "ErrorTrackingIssue", + "ErrorTrackingIssueFingerprintV2", "ErrorTrackingStackFrame", "ErrorTrackingSymbolSet", "Event", diff --git a/posthog/models/error_tracking/error_tracking.py b/posthog/models/error_tracking/error_tracking.py index b003e29b3b8a53..47ae96334b5f70 100644 --- a/posthog/models/error_tracking/error_tracking.py +++ b/posthog/models/error_tracking/error_tracking.py @@ -1,10 +1,14 @@ -from django.db import models +from django.db import models, transaction from django.contrib.postgres.fields import ArrayField + from posthog.models.utils import UUIDModel from posthog.models.team import Team from posthog.models.user import User -from django.db import transaction -from django.db.models import Q, QuerySet +from posthog.models.error_tracking.sql import INSERT_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES + +from posthog.kafka_client.client import ClickhouseProducer +from posthog.kafka_client.topics import KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT +from uuid import UUID class ErrorTrackingIssue(UUIDModel): @@ -20,6 +24,30 @@ class Status(models.TextChoices): name = models.TextField(null=True, blank=True) description = models.TextField(null=True, blank=True) + def merge(self, issue_ids: list[str]) -> None: + fingerprints = resolve_fingerprints_for_issues(team_id=self.team.pk, issue_ids=issue_ids) + + with transaction.atomic(): + overrides = update_error_tracking_issue_fingerprints( + team_id=self.team.pk, issue_id=self.id, fingerprints=fingerprints + ) + ErrorTrackingIssue.objects.filter(team=self.team, id__in=issue_ids).delete() + update_error_tracking_issue_fingerprint_overrides(team_id=self.team.pk, overrides=overrides) + + def split(self, fingerprints: list[str]) -> None: + overrides: list[ErrorTrackingIssueFingerprintV2] = [] + + for fingerprint in fingerprints: + with transaction.atomic(): + new_issue = ErrorTrackingIssue.objects.create(team=self.team) + overrides.extend( + update_error_tracking_issue_fingerprints( + team_id=self.team.pk, issue_id=new_issue.id, fingerprints=[fingerprint] + ) + ) + + update_error_tracking_issue_fingerprint_overrides(team_id=self.team.pk, overrides=overrides) + class ErrorTrackingIssueAssignment(UUIDModel): issue = models.ForeignKey(ErrorTrackingIssue, on_delete=models.CASCADE) @@ -114,36 +142,6 @@ class Status(models.TextChoices): blank=True, ) - @classmethod - def filter_fingerprints(cls, queryset, fingerprints: list[list]) -> QuerySet: - query = Q(fingerprint__in=fingerprints) - - for fp in fingerprints: - query |= Q(merged_fingerprints__contains=fp) - - return queryset.filter(query) - - @transaction.atomic - def merge(self, fingerprints: list[list[str]]) -> None: - if not fingerprints: - return - - # sets don't like lists so we're converting fingerprints to tuples - def convert_fingerprints_to_tuples(fps: list[list[str]]): - return [tuple(f) for f in fps] - - merged_fingerprints = set(convert_fingerprints_to_tuples(self.merged_fingerprints)) - merged_fingerprints.update(convert_fingerprints_to_tuples(fingerprints)) - - merging_groups = ErrorTrackingGroup.objects.filter(team=self.team, fingerprint__in=fingerprints) - for group in merging_groups: - merged_fingerprints |= set(convert_fingerprints_to_tuples(group.merged_fingerprints)) - - merging_groups.delete() - # converting back to list of lists before saving - self.merged_fingerprints = [list(f) for f in merged_fingerprints] - self.save() - # DEPRECATED: Use ErrorTrackingIssueFingerprintV2 instead class ErrorTrackingIssueFingerprint(models.Model): @@ -155,3 +153,59 @@ class ErrorTrackingIssueFingerprint(models.Model): class Meta: constraints = [models.UniqueConstraint(fields=["team", "fingerprint"], name="unique fingerprint for team")] + + +def resolve_fingerprints_for_issues(team_id: int, issue_ids: list[str]) -> list[str]: + return list( + ErrorTrackingIssueFingerprintV2.objects.filter(team_id=team_id, issue_id__in=issue_ids).values_list( + "fingerprint", flat=True + ) + ) + + +def update_error_tracking_issue_fingerprints( + team_id: int, issue_id: str, fingerprints: list[str] +) -> list[ErrorTrackingIssueFingerprintV2]: + return list( + ErrorTrackingIssueFingerprintV2.objects.raw( + """ + UPDATE posthog_errortrackingissuefingerprintv2 + SET version = version + 1, issue_id = %s + WHERE team_id = %s AND fingerprint = ANY(%s) + RETURNING fingerprint, version, issue_id, id + """, + [issue_id, team_id, fingerprints], + ) + ) + + +def update_error_tracking_issue_fingerprint_overrides( + team_id: int, overrides: list[ErrorTrackingIssueFingerprintV2] +) -> None: + for override in overrides: + override_error_tracking_issue_fingerprint( + team_id=team_id, fingerprint=override.fingerprint, issue_id=override.issue_id, version=override.version + ) + + +def override_error_tracking_issue_fingerprint( + team_id: int, + fingerprint: str, + issue_id: UUID, + version=0, + is_deleted: bool = False, + sync: bool = False, +) -> None: + p = ClickhouseProducer() + p.produce( + topic=KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT, + sql=INSERT_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES, + data={ + "team_id": team_id, + "fingerprint": fingerprint, + "issue_id": str(issue_id), + "version": version, + "is_deleted": int(is_deleted), + }, + sync=sync, + ) diff --git a/posthog/models/error_tracking/sql.py b/posthog/models/error_tracking/sql.py index 1700a6c7c4cd9f..2bd96fb8956aff 100644 --- a/posthog/models/error_tracking/sql.py +++ b/posthog/models/error_tracking/sql.py @@ -77,3 +77,7 @@ TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = ( f"TRUNCATE TABLE IF EXISTS {ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE} ON CLUSTER '{CLICKHOUSE_CLUSTER}'" ) + +INSERT_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES = """ +INSERT INTO error_tracking_issue_fingerprint_overrides (fingerprint, issue_id, team_id, is_deleted, version, _timestamp, _offset, _partition) SELECT %(fingerprint)s, %(issue_id)s, %(team_id)s, %(is_deleted)s, %(version)s, now(), 0, 0 VALUES +""" diff --git a/posthog/models/error_tracking/test/test_error_tracking.py b/posthog/models/error_tracking/test/test_error_tracking.py index 8ccb762c8eda82..91db5c014c0908 100644 --- a/posthog/models/error_tracking/test/test_error_tracking.py +++ b/posthog/models/error_tracking/test/test_error_tracking.py @@ -1,60 +1,76 @@ -# class TestErrorTracking(BaseTest): -# def test_defaults(self): -# group = ErrorTrackingGroup.objects.create(status="active", team=self.team, fingerprint=["a_fingerprint"]) - -# assert group.fingerprint == ["a_fingerprint"] -# assert group.merged_fingerprints == [] -# assert group.assignee is None - -# def test_filtering(self): -# ErrorTrackingGroup.objects.bulk_create( -# [ -# ErrorTrackingGroup(team=self.team, fingerprint=["first_error"]), -# ErrorTrackingGroup( -# team=self.team, fingerprint=["second_error"], merged_fingerprints=[["previously_merged"]] -# ), -# ErrorTrackingGroup(team=self.team, fingerprint=["third_error"]), -# ] -# ) - -# matching_groups = ErrorTrackingGroup.objects.filter(fingerprint__in=[["first_error"], ["second_error"]]) -# assert matching_groups.count() == 2 - -# matching_groups = ErrorTrackingGroup.objects.filter(merged_fingerprints__contains=["previously_merged"]) -# assert matching_groups.count() == 1 - -# matching_groups = ErrorTrackingGroup.filter_fingerprints( -# queryset=ErrorTrackingGroup.objects, fingerprints=[["first_error"], ["previously_merged"]] -# ) -# assert matching_groups.count() == 2 - -# def test_merge(self): -# primary_group = ErrorTrackingGroup.objects.create( -# status="active", -# team=self.team, -# fingerprint=["a_fingerprint"], -# merged_fingerprints=[["already_merged_fingerprint"]], -# ) -# merge_group_1 = ErrorTrackingGroup.objects.create( -# status="active", team=self.team, fingerprint=["new_fingerprint"] -# ) -# merge_group_2 = ErrorTrackingGroup.objects.create( -# status="active", -# team=self.team, -# fingerprint=["another_fingerprint"], -# merged_fingerprints=[["merged_fingerprint"]], -# ) - -# merging_fingerprints = [merge_group_1.fingerprint, merge_group_2.fingerprint, ["no_group_fingerprint"]] -# primary_group.merge(merging_fingerprints) - -# assert sorted(primary_group.merged_fingerprints) == [ -# ["already_merged_fingerprint"], -# ["another_fingerprint"], -# ["merged_fingerprint"], -# ["new_fingerprint"], -# ["no_group_fingerprint"], -# ] - -# # deletes the old groups -# assert ErrorTrackingGroup.objects.count() == 1 +from posthog.test.base import BaseTest +from posthog.models.error_tracking import ErrorTrackingIssue, ErrorTrackingIssueFingerprintV2 + + +class TestErrorTracking(BaseTest): + def create_issue(self, fingerprints) -> ErrorTrackingIssue: + issue = ErrorTrackingIssue.objects.create(team=self.team) + for fingerprint in fingerprints: + ErrorTrackingIssueFingerprintV2.objects.create(team=self.team, issue=issue, fingerprint=fingerprint) + return issue + + def test_defaults(self): + issue = ErrorTrackingIssue.objects.create(team=self.team) + + assert issue.status == "active" + assert issue.name is None + + def test_basic_merge(self): + issue_one = self.create_issue(["fingerprint_one"]) + issue_two = self.create_issue(["fingerprint_two"]) + + issue_two.merge(issue_ids=[issue_one.id]) + + # remaps the first fingerprint to the second issue + assert ErrorTrackingIssueFingerprintV2.objects.filter(issue_id=issue_two.id).count() == 2 + # bumps the version + override = ErrorTrackingIssueFingerprintV2.objects.filter(fingerprint="fingerprint_one").first() + assert override + assert override.version == 1 + + # deletes issue one + assert ErrorTrackingIssue.objects.count() == 1 + + def test_merge_multiple_times(self): + issue_one = self.create_issue(["fingerprint_one"]) + issue_two = self.create_issue(["fingerprint_two"]) + issue_three = self.create_issue(["fingerprint_three"]) + + issue_two.merge(issue_ids=[issue_one.id]) + issue_three.merge(issue_ids=[issue_two.id]) + + # only the third issue remains + assert ErrorTrackingIssue.objects.count() == 1 + # all fingerprints point to the third issue + assert ErrorTrackingIssueFingerprintV2.objects.filter(issue_id=issue_three.id).count() == 3 + + # bumps versions of the merged issues correct number of times + override = ErrorTrackingIssueFingerprintV2.objects.filter(fingerprint="fingerprint_one").first() + assert override + assert override.version == 2 + override = ErrorTrackingIssueFingerprintV2.objects.filter(fingerprint="fingerprint_two").first() + assert override + assert override.version == 1 + + def test_merging_multiple_issues_at_once(self): + issue_one = self.create_issue(["fingerprint_one"]) + issue_two = self.create_issue(["fingerprint_two"]) + issue_three = self.create_issue(["fingerprint_three"]) + + issue_three.merge(issue_ids=[issue_one.id, issue_two.id]) + + assert ErrorTrackingIssueFingerprintV2.objects.filter(issue_id=issue_three.id).count() == 3 + + def test_splitting_fingerprints(self): + issue = self.create_issue(["fingerprint_one", "fingerprint_two", "fingerprint_three"]) + + issue.split(fingerprints=["fingerprint_one", "fingerprint_two"]) + + # creates two new issues + assert ErrorTrackingIssue.objects.count() == 3 + + # bumps the version but no longer points to the old issue + override = ErrorTrackingIssueFingerprintV2.objects.filter(fingerprint="fingerprint_one").first() + assert override + assert override.issue_id != issue.id + assert override.version == 1 diff --git a/posthog/models/team/util.py b/posthog/models/team/util.py index 5756c8da211aac..5cb103b154b84c 100644 --- a/posthog/models/team/util.py +++ b/posthog/models/team/util.py @@ -14,10 +14,12 @@ def delete_bulky_postgres_data(team_ids: list[int]): from posthog.models.feature_flag.feature_flag import FeatureFlagHashKeyOverride from posthog.models.insight_caching_state import InsightCachingState from posthog.models.person import Person, PersonDistinctId + from posthog.models.error_tracking import ErrorTrackingIssueFingerprintV2 from posthog.models.early_access_feature import EarlyAccessFeature _raw_delete(EarlyAccessFeature.objects.filter(team_id__in=team_ids)) _raw_delete(PersonDistinctId.objects.filter(team_id__in=team_ids)) + _raw_delete(ErrorTrackingIssueFingerprintV2.objects.filter(team_id__in=team_ids)) _raw_delete(CohortPeople.objects.filter(cohort__team_id__in=team_ids)) _raw_delete(FeatureFlagHashKeyOverride.objects.filter(team_id__in=team_ids)) _raw_delete(Person.objects.filter(team_id__in=team_ids))