Skip to content

feat(logs): add ingest-time PII scrubbing for logs#54762

Merged
DanielVisca merged 14 commits intomasterfrom
daniel/ingestion-pii-scrubbing
Apr 16, 2026
Merged

feat(logs): add ingest-time PII scrubbing for logs#54762
DanielVisca merged 14 commits intomasterfrom
daniel/ingestion-pii-scrubbing

Conversation

@DanielVisca
Copy link
Copy Markdown
Contributor

@DanielVisca DanielVisca commented Apr 15, 2026

feat(logs): ingest-time PII scrubbing for Avro log pipeline

Problem

Teams need a product-controlled way to strip common secrets and identifiers from log payloads before storage, without relying on ad-hoc client-side filtering.

Changes

  • Node / Avro pipeline: processLogMessageBuffer decodes when either json_parse_logs or logs_settings.pii_scrub_logs is enabled. Flow: decode → optional JSON attribute enrich → optional PII scrub → re-encode. Passthrough (no decode) only when both are off. logs_ingestion_processing_duration_seconds gains label pii_scrub_enabled.
  • Scrubbing (log-pii-scrub.ts): lossy replacement with {{REDACTED}}.
    • Plain text (body when not structured JSON, and selected fields): RE2 patterns for Bearer … tails, Stripe-shaped sk_live_ / sk_test_ keys, emails, and Luhn-valid 13–19 digit card-like runs (optional spaces/hyphens between digits).
    • JSON body: recursive walk; strings get plain patterns; object keys matching sensitive substrings (e.g. password, token, authorization, cookie, email — see SENSITIVE_KEY_SUBSTRINGS) redact the whole value.
    • Attribute maps: sensitive keys → full value redacted; otherwise unwrap JSON-string cells (OTLP / ClickHouse alignment), scrub semantic string, re-encode as JSON string cell. Also plain-scrub: service_name, instrumentation_scope, severity_text, event_name.
  • Types: pii_scrub_logs?: boolean on LogsSettings (frontend + nodejs).
  • UI: Project settings → Logs → PII scrubbing toggle + short copy that redaction is lossy.

Limitations: Secrets without those shapes, digit runs that are not Luhn-valid cards, and values under keys outside the sensitive list only get generic pattern coverage (not full KV intelligence).

How to enable:

image

PII scrubbing turned OFF

image

PII scrubbing turned ON

image

Attribute Scrubbing:

image

How did you test this code?

  • nodejs/src/logs-ingestion/log-pii-scrub.test.ts
  • nodejs/src/logs-ingestion/log-record-avro.test.ts (including pii_scrub_logs alone / combined with json_parse_logs)

Publish to changelog?

Docs update

LLM context

Improvement Ideas/Things to watch

Compute

Double JSON parse of body when both flags are on
Enrich path parses the body (via extractJsonAttributesFromBody → parseJSON). Scrub path parses again in scrubBodyField. Same string, two parses — wasted CPU and allocator churn, scales with body size.

Catch more

  • Base PII for fixed regex captures, PII data can still slip through if outside of these structures
  • Bearer redaction only matches ASCII token characters (on purpose, for stable RE2 boundaries), so é stops the match and anything after it is handled by later rules (e.g. email); improvement: extend or add a follow-up heuristic (e.g. redact from Bearer through end-of-quoted-string, line, or a wider base64/Unicode-safe token class) if you need to catch non-ASCII tails that aren’t caught by email/Stripe/card patterns

- Team logs_settings.pii_scrub_logs and Avro pipeline (decode/enrich/scrub paths)

- log-pii-scrub module, metrics, Logs UI toggle, TeamManager markTeamForRefresh per batch

- Stripe-shaped test fixture uses string concat to satisfy GitHub push protection

Made-with: Cursor
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

Size Change: +4.34 kB (0%)

Total Size: 130 MB

Filename Size Change
frontend/dist/exporter.js 20.9 MB +1.09 kB (+0.01%)
frontend/dist/render-query.js 20.6 MB +1.09 kB (+0.01%)
frontend/dist/toolbar 10.7 MB +1.08 kB (+0.01%)
frontend/dist/toolbar.js 10.7 MB +1.08 kB (+0.01%)
ℹ️ View Unchanged
Filename Size
frontend/dist/368Hedgehogs 5.26 kB
frontend/dist/abap 14.2 kB
frontend/dist/AccountSocialConnected 1.62 kB
frontend/dist/Action 23.2 kB
frontend/dist/Actions 1.02 kB
frontend/dist/AdvancedActivityLogsScene 34 kB
frontend/dist/AgenticAuthorize 5.25 kB
frontend/dist/apex 3.95 kB
frontend/dist/ApprovalDetail 16.2 kB
frontend/dist/array.full.es5.js 332 kB
frontend/dist/array.full.js 427 kB
frontend/dist/array.js 183 kB
frontend/dist/AsyncMigrations 13.1 kB
frontend/dist/AuthorizationStatus 716 B
frontend/dist/azcli 846 B
frontend/dist/bat 1.84 kB
frontend/dist/BatchExportScene 60.5 kB
frontend/dist/bicep 2.55 kB
frontend/dist/Billing 493 B
frontend/dist/BillingSection 20.8 kB
frontend/dist/BoxPlot 5.04 kB
frontend/dist/browserAll-0QZMN1W2 37.4 kB
frontend/dist/ButtonPrimitives 562 B
frontend/dist/CalendarHeatMap 4.79 kB
frontend/dist/cameligo 2.18 kB
frontend/dist/changeRequestsLogic 544 B
frontend/dist/CLIAuthorize 11.3 kB
frontend/dist/CLILive 3.97 kB
frontend/dist/clojure 9.64 kB
frontend/dist/coffee 3.59 kB
frontend/dist/Cohort 24.8 kB
frontend/dist/CohortCalculationHistory 6.22 kB
frontend/dist/Cohorts 9.39 kB
frontend/dist/ConfirmOrganization 4.48 kB
frontend/dist/conversations.js 65.8 kB
frontend/dist/Coupons 720 B
frontend/dist/cpp 5.3 kB
frontend/dist/Create 829 B
frontend/dist/crisp-chat-integration.js 1.88 kB
frontend/dist/csharp 4.52 kB
frontend/dist/csp 1.42 kB
frontend/dist/css 4.51 kB
frontend/dist/cssMode 4.15 kB
frontend/dist/CustomCssScene 3.55 kB
frontend/dist/CustomerAnalyticsConfigurationScene 1.99 kB
frontend/dist/CustomerAnalyticsScene 26.4 kB
frontend/dist/CustomerJourneyBuilderScene 1.69 kB
frontend/dist/CustomerJourneyTemplatesScene 7.39 kB
frontend/dist/customizations.full.js 17.9 kB
frontend/dist/CyclotronJobInputAssignee 1.32 kB
frontend/dist/CyclotronJobInputTicketTags 711 B
frontend/dist/cypher 3.38 kB
frontend/dist/dart 4.25 kB
frontend/dist/Dashboard 1.11 kB
frontend/dist/Dashboards 23.1 kB
frontend/dist/DataManagementScene 646 B
frontend/dist/DataPipelinesNewScene 2.32 kB
frontend/dist/DataWarehouseScene 1.21 kB
frontend/dist/Deactivated 1.13 kB
frontend/dist/dead-clicks-autocapture.js 13.1 kB
frontend/dist/DeadLetterQueue 5.38 kB
frontend/dist/DebugScene 20 kB
frontend/dist/decompressionWorker 2.85 kB
frontend/dist/decompressionWorker.js 2.85 kB
frontend/dist/DefinitionEdit 7.11 kB
frontend/dist/DefinitionView 22.7 kB
frontend/dist/DestinationsScene 2.71 kB
frontend/dist/dist 575 B
frontend/dist/dockerfile 1.87 kB
frontend/dist/EarlyAccessFeature 753 B
frontend/dist/EarlyAccessFeatures 2.84 kB
frontend/dist/ecl 5.33 kB
frontend/dist/EditorScene 896 B
frontend/dist/elixir 10.3 kB
frontend/dist/elk.bundled 1.44 MB
frontend/dist/EmailMFAVerify 2.98 kB
frontend/dist/EndpointScene 37.5 kB
frontend/dist/EndpointsScene 22.1 kB
frontend/dist/ErrorTrackingConfigurationScene 2.2 kB
frontend/dist/ErrorTrackingIssueFingerprintsScene 6.98 kB
frontend/dist/ErrorTrackingIssueScene 95.6 kB
frontend/dist/ErrorTrackingScene 13.4 kB
frontend/dist/EvaluationTemplates 575 B
frontend/dist/EventsScene 2.46 kB
frontend/dist/exception-autocapture.js 11.8 kB
frontend/dist/Experiment 211 kB
frontend/dist/Experiments 17.7 kB
frontend/dist/exporter 20.9 MB
frontend/dist/ExportsScene 3.86 kB
frontend/dist/FeatureFlag 128 kB
frontend/dist/FeatureFlags 606 B
frontend/dist/FeatureFlagTemplatesScene 7.03 kB
frontend/dist/FlappyHog 5.78 kB
frontend/dist/flow9 1.8 kB
frontend/dist/freemarker2 16.7 kB
frontend/dist/fsharp 2.98 kB
frontend/dist/go 2.65 kB
frontend/dist/graphql 2.26 kB
frontend/dist/Group 14.4 kB
frontend/dist/Groups 3.91 kB
frontend/dist/GroupsNew 7.34 kB
frontend/dist/handlebars 7.34 kB
frontend/dist/hcl 3.59 kB
frontend/dist/HealthCategoryDetailScene 7.23 kB
frontend/dist/HealthScene 10.6 kB
frontend/dist/HeatmapNewScene 4.16 kB
frontend/dist/HeatmapRecordingScene 3.92 kB
frontend/dist/HeatmapScene 5.88 kB
frontend/dist/HeatmapsScene 3.88 kB
frontend/dist/hls 394 kB
frontend/dist/HogFunctionScene 58.8 kB
frontend/dist/HogRepl 7.37 kB
frontend/dist/html 5.58 kB
frontend/dist/htmlMode 4.62 kB
frontend/dist/image-blob-reduce.esm 49.4 kB
frontend/dist/InboxScene 59.8 kB
frontend/dist/index 306 kB
frontend/dist/index.js 306 kB
frontend/dist/ini 1.1 kB
frontend/dist/InsightQuickStart 5.42 kB
frontend/dist/InsightScene 28.9 kB
frontend/dist/IntegrationsRedirect 733 B
frontend/dist/intercom-integration.js 1.93 kB
frontend/dist/InviteSignup 14.4 kB
frontend/dist/java 3.22 kB
frontend/dist/javascript 985 B
frontend/dist/jsonMode 13.9 kB
frontend/dist/julia 7.22 kB
frontend/dist/kotlin 3.4 kB
frontend/dist/lazy 158 kB
frontend/dist/LegacyPluginScene 26.6 kB
frontend/dist/LemonTextAreaMarkdown 502 B
frontend/dist/less 3.9 kB
frontend/dist/lexon 2.44 kB
frontend/dist/lib 2.22 kB
frontend/dist/Link 468 B
frontend/dist/LinkScene 24.8 kB
frontend/dist/LinksScene 4.19 kB
frontend/dist/liquid 4.53 kB
frontend/dist/LiveDebugger 19.1 kB
frontend/dist/LiveEventsTable 2.98 kB
frontend/dist/LLMAnalyticsClusterScene 15.7 kB
frontend/dist/LLMAnalyticsClustersScene 43.1 kB
frontend/dist/LLMAnalyticsDatasetScene 19.7 kB
frontend/dist/LLMAnalyticsDatasetsScene 3.28 kB
frontend/dist/LLMAnalyticsEvaluation 42.3 kB
frontend/dist/LLMAnalyticsEvaluationsScene 29.8 kB
frontend/dist/LLMAnalyticsPlaygroundScene 36.3 kB
frontend/dist/LLMAnalyticsScene 117 kB
frontend/dist/LLMAnalyticsSessionScene 13.4 kB
frontend/dist/LLMAnalyticsTraceScene 129 kB
frontend/dist/LLMAnalyticsUsers 526 B
frontend/dist/LLMASessionFeedbackDisplay 4.83 kB
frontend/dist/LLMPromptScene 20.6 kB
frontend/dist/LLMPromptsScene 4.21 kB
frontend/dist/Login 8.57 kB
frontend/dist/Login2FA 4.2 kB
frontend/dist/logs.js 38.5 kB
frontend/dist/LogsScene 11.4 kB
frontend/dist/lua 2.11 kB
frontend/dist/m3 2.81 kB
frontend/dist/main 819 kB
frontend/dist/ManagedMigration 14.1 kB
frontend/dist/markdown 3.79 kB
frontend/dist/MarketingAnalyticsScene 39.7 kB
frontend/dist/MaterializedColumns 10.2 kB
frontend/dist/Max 835 B
frontend/dist/mdx 5.39 kB
frontend/dist/memlens.lib.bundle 27.8 kB
frontend/dist/MessageTemplate 16.3 kB
frontend/dist/MetricsScene 828 B
frontend/dist/mips 2.58 kB
frontend/dist/ModelsScene 13.6 kB
frontend/dist/MonacoDiffEditor 403 B
frontend/dist/monacoEditorWorker 288 kB
frontend/dist/monacoEditorWorker.js 288 kB
frontend/dist/monacoJsonWorker 419 kB
frontend/dist/monacoJsonWorker.js 419 kB
frontend/dist/monacoTsWorker 7.02 MB
frontend/dist/monacoTsWorker.js 7.02 MB
frontend/dist/MoveToPostHogCloud 4.46 kB
frontend/dist/msdax 4.91 kB
frontend/dist/mysql 11.3 kB
frontend/dist/NavTabChat 4.68 kB
frontend/dist/NewSourceScene 751 B
frontend/dist/NewTabScene 681 B
frontend/dist/NodeDetailScene 16.3 kB
frontend/dist/NotebookCanvasScene 3.2 kB
frontend/dist/NotebookPanel 5.21 kB
frontend/dist/NotebookScene 8.21 kB
frontend/dist/NotebooksScene 7.58 kB
frontend/dist/OAuthAuthorize 573 B
frontend/dist/objective-c 2.41 kB
frontend/dist/Onboarding 704 kB
frontend/dist/OnboardingCouponRedemption 1.2 kB
frontend/dist/pascal 2.99 kB
frontend/dist/pascaligo 2 kB
frontend/dist/passkeyLogic 484 B
frontend/dist/PasswordReset 4.32 kB
frontend/dist/PasswordResetComplete 2.94 kB
frontend/dist/PendingDeletion 2.21 kB
frontend/dist/perl 8.25 kB
frontend/dist/PersonScene 16.1 kB
frontend/dist/PersonsScene 4.68 kB
frontend/dist/pgsql 13.5 kB
frontend/dist/php 8.02 kB
frontend/dist/PipelineStatusScene 6.22 kB
frontend/dist/pla 1.67 kB
frontend/dist/posthog 144 kB
frontend/dist/postiats 7.86 kB
frontend/dist/powerquery 16.9 kB
frontend/dist/powershell 3.27 kB
frontend/dist/PreflightCheck 5.53 kB
frontend/dist/product-tours.js 115 kB
frontend/dist/ProductTour 273 kB
frontend/dist/ProductTours 4.68 kB
frontend/dist/ProjectHomepage 24.7 kB
frontend/dist/protobuf 9.05 kB
frontend/dist/pug 4.82 kB
frontend/dist/python 4.76 kB
frontend/dist/qsharp 3.19 kB
frontend/dist/QueryPerformance 5.9 kB
frontend/dist/r 3.12 kB
frontend/dist/razor 9.35 kB
frontend/dist/recorder-v2.js 111 kB
frontend/dist/recorder.js 111 kB
frontend/dist/redis 3.55 kB
frontend/dist/redshift 11.8 kB
frontend/dist/RegionMap 29.4 kB
frontend/dist/render-query 20.6 MB
frontend/dist/ResourceTransfer 9.17 kB
frontend/dist/restructuredtext 3.9 kB
frontend/dist/RevenueAnalyticsScene 25.6 kB
frontend/dist/ruby 8.5 kB
frontend/dist/rust 4.16 kB
frontend/dist/SavedInsights 664 B
frontend/dist/sb 1.82 kB
frontend/dist/scala 7.32 kB
frontend/dist/scheme 1.76 kB
frontend/dist/scss 6.41 kB
frontend/dist/SdkDoctorScene 9.4 kB
frontend/dist/SessionAttributionExplorerScene 6.62 kB
frontend/dist/SessionGroupSummariesTable 4.62 kB
frontend/dist/SessionGroupSummaryScene 17 kB
frontend/dist/SessionProfileScene 15 kB
frontend/dist/SessionRecordingDetail 1.73 kB
frontend/dist/SessionRecordingFilePlaybackScene 4.46 kB
frontend/dist/SessionRecordings 742 B
frontend/dist/SessionRecordingsKiosk 8.84 kB
frontend/dist/SessionRecordingsPlaylistScene 4.14 kB
frontend/dist/SessionRecordingsSettingsScene 1.9 kB
frontend/dist/SessionsScene 3.86 kB
frontend/dist/SettingsScene 2.98 kB
frontend/dist/SharedMetric 4.83 kB
frontend/dist/SharedMetrics 549 B
frontend/dist/shell 3.07 kB
frontend/dist/SignupContainer 24.5 kB
frontend/dist/Site 1.18 kB
frontend/dist/solidity 18.6 kB
frontend/dist/sophia 2.76 kB
frontend/dist/SourceScene 629 B
frontend/dist/SourcesScene 6.08 kB
frontend/dist/sourceWizardLogic 696 B
frontend/dist/sparql 2.55 kB
frontend/dist/sql 10.3 kB
frontend/dist/SqlVariableEditScene 7.24 kB
frontend/dist/st 7.4 kB
frontend/dist/StartupProgram 21.2 kB
frontend/dist/SubscriptionScene 12.8 kB
frontend/dist/SubscriptionsScene 4.89 kB
frontend/dist/SupportSettingsScene 1.16 kB
frontend/dist/SupportTicketScene 24.6 kB
frontend/dist/SupportTicketsScene 733 B
frontend/dist/Survey 848 B
frontend/dist/SurveyFormBuilder 1.54 kB
frontend/dist/Surveys 18.2 kB
frontend/dist/surveys.js 90 kB
frontend/dist/SurveyWizard 64.2 kB
frontend/dist/swift 5.26 kB
frontend/dist/SystemStatus 16.8 kB
frontend/dist/systemverilog 7.61 kB
frontend/dist/TaskDetailScene 21.5 kB
frontend/dist/TaskTracker 13.2 kB
frontend/dist/tcl 3.57 kB
frontend/dist/TextCardMarkdownEditor 11 kB
frontend/dist/ToolbarLaunch 2.52 kB
frontend/dist/tracing-headers.js 1.74 kB
frontend/dist/TracingScene 29.8 kB
frontend/dist/TransformationsScene 1.95 kB
frontend/dist/tsMode 24 kB
frontend/dist/twig 5.97 kB
frontend/dist/TwoFactorReset 3.98 kB
frontend/dist/typescript 240 B
frontend/dist/typespec 2.82 kB
frontend/dist/Unsubscribe 1.62 kB
frontend/dist/UserInterview 4.53 kB
frontend/dist/UserInterviews 2.01 kB
frontend/dist/vb 5.79 kB
frontend/dist/VercelConnect 4.95 kB
frontend/dist/VercelLinkError 1.91 kB
frontend/dist/VerifyEmail 4.48 kB
frontend/dist/vimMode 211 kB
frontend/dist/VisualReviewRunScene 24.1 kB
frontend/dist/VisualReviewRunsScene 5.54 kB
frontend/dist/VisualReviewSettingsScene 10.8 kB
frontend/dist/web-vitals.js 6.39 kB
frontend/dist/WebAnalyticsScene 5.77 kB
frontend/dist/WebGLRenderer-DYjOwNoG 60.3 kB
frontend/dist/WebGPURenderer-B_wkl_Ja 36.3 kB
frontend/dist/WebScriptsScene 2.57 kB
frontend/dist/webworkerAll-puPV1rBA 324 B
frontend/dist/wgsl 7.34 kB
frontend/dist/Wizard 4.45 kB
frontend/dist/WorkflowScene 101 kB
frontend/dist/WorkflowsScene 48.7 kB
frontend/dist/WorldMap 4.73 kB
frontend/dist/xml 2.98 kB
frontend/dist/yaml 4.6 kB

compressed-size-action

Comment thread nodejs/src/logs-ingestion/log-pii-scrub.ts Outdated
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 15, 2026

Prompt To Fix All With AI
This is a comment left during a code review.
Path: nodejs/src/logs-ingestion/logs-ingestion-consumer.ts
Line: 290-294

Comment:
**Cache bypassed on every batch**

`markForRefresh` deletes `cacheUntil[k]` in the LazyLoader, so every subsequent `getTeam` call hits Postgres. Because this is called for every unique team in every batch, the team cache is permanently bypassed for this consumer — the TTL-based protection never has a chance to kick in. Under steady load with many active teams, this causes O(unique_teams_per_batch × batches_per_second) DB reads rather than one per TTL window.

Consider only marking teams for refresh at most once per N seconds using a per-team timestamp, or accepting the existing cache TTL as an acceptable delay for settings to propagate.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: nodejs/src/logs-ingestion/log-pii-scrub.ts
Line: 78-84

Comment:
**Sensitive key detection not applied to JSON body objects**

`scrubJsonValue` only calls `scrubPlainString` on string leaf values — it doesn't check whether an object key is in `SENSITIVE_KEY_SUBSTRINGS`. This means `{"password": "hunter2", "api_key": "secret-value"}` in a log body leaves both values unscrubbed, because neither matches the email, Bearer, Stripe, or card-number patterns. `scrubStringMap` for `attributes` does call `isSensitiveAttributeKey(key)`, so there's an inconsistency between how body JSON and attribute maps are handled, creating a PII gap for the most common sensitive fields.

```ts
if (value !== null && typeof value === 'object') {
    const out: Record<string, unknown> = {}
    for (const [k, v] of Object.entries(value)) {
-       out[k] = scrubJsonValue(v)
+       out[k] = isSensitiveAttributeKey(k) ? PII_REDACTED : scrubJsonValue(v)
    }
    return out
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: nodejs/src/logs-ingestion/log-pii-scrub.test.ts
Line: 7-12

Comment:
**Prefer parameterised tests**

Multiple input-output assertions for the same function belong in a single `it.each`, which reports each case independently on failure.

```ts
it.each([
    ['user_password', true],
    ['Authorization', true],
    ['my_api_key', true],
    ['level', false],
])('isSensitiveAttributeKey(%s) === %s', (key, expected) => {
    expect(isSensitiveAttributeKey(key)).toBe(expected)
})
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "chore(logs): drop PII_SCRUBBING_DEV.md f..." | Re-trigger Greptile

Comment thread nodejs/src/logs-ingestion/logs-ingestion-consumer.ts Outdated
Comment thread nodejs/src/logs-ingestion/log-pii-scrub.ts
Comment thread nodejs/src/logs-ingestion/log-pii-scrub.test.ts Outdated
@DanielVisca DanielVisca changed the title gfeat(logs): add ingest-time PII scrubbing for logs feat(logs): add ingest-time PII scrubbing for logs Apr 15, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Materialize view pane (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this comment? Help fix flakies and failures and it'll disappear!

@DanielVisca DanielVisca requested review from frankh and jonmcwest April 16, 2026 15:10
@DanielVisca DanielVisca merged commit c5691da into master Apr 16, 2026
169 checks passed
@DanielVisca DanielVisca deleted the daniel/ingestion-pii-scrubbing branch April 16, 2026 15:20
@deployment-status-posthog
Copy link
Copy Markdown

deployment-status-posthog Bot commented Apr 16, 2026

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-04-16 16:02 UTC Run
prod-us ✅ Deployed 2026-04-16 16:12 UTC Run
prod-eu ✅ Deployed 2026-04-16 16:18 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants