Skip to content

Player 1.0.0#865

Draft
KetanReddy wants to merge 70 commits into
mainfrom
player-1-dot-zero
Draft

Player 1.0.0#865
KetanReddy wants to merge 70 commits into
mainfrom
player-1-dot-zero

Conversation

@KetanReddy

@KetanReddy KetanReddy commented May 11, 2026

Copy link
Copy Markdown
Member

Change Type (required)

Indicate the type of change your pull request is:

  • patch
  • minor
  • major
  • N/A

Does your PR have any documentation updates?

  • Updated docs
  • No Update needed
  • Unable to update docs

Release Notes

Full release notes are available on the doc site

📦 Published PR as canary version: 1.0.0--canary.865.36825

Try this version out locally by upgrading relevant packages to 1.0.0--canary.865.36825

KetanReddy and others added 30 commits January 22, 2026 13:12
…rom core (#786)

<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
# What

1. Remove `set` and `delete` from core `ReadOnlyDataController`. They
previously just logged an error and did nothing. Omitting `set` and
`delete` is a cleaner API. This is outside the scope of the original
issue but was discussed with @KetanReddy
2. Introduce a `ReadOnlyDataController` on iOS. This wraps the core
version of the same. A `CompletedState` on iOS will now include this
controller.
3. For parity, add a public `makeReadOnly()` to the iOS
`DataController`. It's not used on iOS, however.

# Why
#219

We should have parity across all platforms. This updates ios to match
the same public API as the core for the Read-Only Data Controller. The
read-only version of the data controller was introduced to allow users
to access data / evaluate bindings after a flow has ended.

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A` (this is part of the major release)


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
---------

Co-authored-by: Jeremy Jessup <jeremy_jessup@intuit.com>
Closes #220 

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [ ] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
Closes #360 

Fixes this in a much less intensive way that originally proposed by just
forcing circular dependencies to resolve to the workspace version of the
package. For now this is going to have to be a manual process and only
works for JavaScript dependencies but solves for the current scope of
the issues.

This also technically isn't a breaking change so this could go out
separately not as part of the 1.0 work.

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
Closes #790 

All platforms now support registering plugins with a player after it has
been instantiated.

## JVM (HeadlessPlayer)
Added registerPlugin(plugin: Plugin) that appends to the plugins list
and applies the plugin appropriately (RuntimePlugin, JSPluginWrapper, or
PlayerPlugin).

## Android (AndroidPlayer)
- Added registerPlugin(plugin: Plugin) that delegates to the underlying
HeadlessPlayer for standard plugins, or stores and applies
AndroidPlayerPlugin instances directly.

## iOS (HeadlessPlayer / HeadlessPlayerImpl)
- Added registerPlugin(_ plugin: NativePlugin) as a protocol requirement
with a default implementation. Concrete implementations (e.g.
HeadlessPlayerImpl) track registered plugins in a mutable plugins list.

## React (ReactPlayer)
- Updated registerPlugin to accept both ReactPlayerPlugin and
PlayerPlugin, calling apply on the core player and applyReact on the
React player as appropriate.

TODO:

- [ ] Update Migration Guide

### Change Type (required)
Indicate the type of change your pull request is:

- [x] `patch`
- [ ] `minor`
- [ ] `major`
- [ ] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs
JunDangIntuit and others added 12 commits May 7, 2026 14:04
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
Merge latest `main` into `player-1-dot-zero`

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
SwiftUIPlayer.swift
Removed redundant clearExceptionHandler() method — cleanup already
handled in unload()
Removed unnecessary ctx.setObject(nil, forKeyedSubscript: "player") call
Added inline comments clarifying the purpose of each nullification step
in unload()

### Change Type (required)
Indicate the type of change your pull request is:

<!-- 
We use semantic versioning: https://semver.org/. Review that
documentation for
  more detailed guidelines.
-->
- [x] `patch`
- [ ] `minor`
- [ ] `major`
- [ ] `N/A`


### Does your PR have any documentation updates?
- [ ] Updated docs
- [x] No Update needed
- [ ] Unable to update docs
<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
@KetanReddy KetanReddy added the major Increment the major version when merged label May 11, 2026
@codecov

codecov Bot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (6e9eec6) to head (073ec0d).
⚠️ Report is 9 commits behind head on main.

Additional details and impacted files
@@     Coverage Diff     @@
##   main   #865   +/-   ##
===========================
===========================

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

* GenericAsset

* collapse SuspendableAsset and AsyncHydrationTracker

* suspend render with ugly API

* Suspend render with a bunch of TODOs for tests and asyncHydrationTracker

* Scoped hydration + nested renders. Fixed all android tests, transitionAnimation remains

* fix some typing problems

* lint fixes

* revert pnpm-lock.yaml

* add hydration tracking to composable, fix assetTest

* fix assetTest set up

* lint fixes

* add guava dep to testutils

* drop robolectric explicit dependency

* exclude robolectric transitive

* separate out AssetTest to not poison demo test with robolectric

* non-suspend hydrate + some clean up

* replace GenericAsset interface with AnyAsset typealias

* remove no-op catch

* Fixed composable test

* lint

* fix compose passing down styling to xml

* input test

* info test use text

* lint

---------

Co-authored-by: Jeremiah Zucker <zucker.jeremiah@gmail.com>
@brocollie08

Copy link
Copy Markdown
Contributor

/canary

intuit-svc added a commit to player-ui/player-ui.github.io that referenced this pull request May 19, 2026
@intuit-svc

intuit-svc commented May 19, 2026

Copy link
Copy Markdown
Contributor

Build Preview

Your PR was deployed by CircleCI #36825 on Fri, 22 May 2026 17:35:59 GMT with this version:

1.0.0--canary.865.36825

📖 Docs (View site)

JunDangIntuit and others added 4 commits May 20, 2026 10:51
<!-- 

Describe what's changing, why, and any other background info.

Make sure to add:
  - Tests
  - Documentation Updates

-->
Restores `SwiftUIPlayer.clearExceptionHandler()` on iOS, which was
removed in #864 as part of the unused-methods cleanup. This method will
still be used.

### Change Type (required)
- [ ] `patch`
- [ ] `minor`
- [ ] `major`
- [x] `N/A`

### Does your PR have any documentation updates?
- [x] Updated docs
- [ ] No Update needed
- [ ] Unable to update docs

<!--
In an effort to standardize our process and code, please make sure you
include documentation and/or update any existing documentation.
Please refer to our site https://player-ui.github.io/latest/about, and
include any neccesary information that would be helpful to coders,
developers, and learners.

If you are unable to update the current documents, please create an
issue for us to get back to it.

-->

<!--
To include release notes in the automatic changelong, just add a level 1
markdown header below
and include any markdown notes to go into the changelog:
https://intuit.github.io/auto/docs/generated/changelog#additional-release-notes

  Example:

  # Release Notes
  Added new plugin, to use it:
  ```typescript
  const plugin = new Plugin(...)
  ```
-->
@KetanReddy

Copy link
Copy Markdown
Member Author

/canary

@KetanReddy KetanReddy changed the title Player 1.0 Player 1.0.0 May 22, 2026
intuit-svc added a commit to player-ui/player-ui.github.io that referenced this pull request May 22, 2026
KVSRoyal and others added 2 commits June 3, 2026 16:55
---------

Co-authored-by: Jeremiah Zucker <zucker.jeremiah@gmail.com>
@intuit-svc

intuit-svc commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Comparison against baseline from main. ⚠️ = regression (>10% slower), ✅ = improvement (>5% faster)

core/player ⚠️

Benchmark Current Baseline Change
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.bar 839.93K ops/s 814.11K ops/s +3.2%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.1.name 513.06K ops/s 520.99K ops/s -1.5%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.01.name 438.57K ops/s 484.39K ops/s -9.5%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets['01'].name 422.15K ops/s 443.70K ops/s -4.9%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[01].name 502.18K ops/s 448.52K ops/s +12.0% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[name = "frodo"].type 277.03K ops/s 229.59K ops/s +20.7% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 214.69K ops/s 236.56K ops/s -9.2%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = false].type 248.04K ops/s 293.76K ops/s -15.6% ⚠️
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = true].type 160.45K ops/s 291.77K ops/s -45.0% ⚠️
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.bar 540.71K ops/s 585.10K ops/s -7.6%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.1.name 392.98K ops/s 362.44K ops/s +8.4% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.01.name 358.80K ops/s 365.41K ops/s -1.8%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets['01'].name 327.99K ops/s 337.57K ops/s -2.8%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[01].name 327.48K ops/s 360.75K ops/s -9.2%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[name = "frodo"].type 227.78K ops/s 231.82K ops/s -1.7%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 186.42K ops/s 195.10K ops/s -4.4%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = false].type 216.57K ops/s 234.64K ops/s -7.7%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = true].type 227.11K ops/s 233.18K ops/s -2.6%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (sync) 489.18K ops/s 386.32K ops/s +26.6% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (async) 386.64K ops/s 355.63K ops/s +8.7% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (sync) 499.72K ops/s 467.51K ops/s +6.9% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (async) 429.77K ops/s 427.69K ops/s +0.5%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (sync) 194.92K ops/s 141.47K ops/s +37.8% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (async) 189.18K ops/s 146.09K ops/s +29.5% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (sync) 163.49K ops/s 140.98K ops/s +16.0% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (async) 115.08K ops/s 151.43K ops/s -24.0% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (sync) N/A N/A N/A
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (async) 287.16K ops/s 261.47K ops/s +9.8% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (sync) 317.90K ops/s 345.63K ops/s -8.0%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (async) 288.75K ops/s 269.48K ops/s +7.2% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (sync) 820.18K ops/s 834.09K ops/s -1.7%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (async) 702.21K ops/s 640.68K ops/s +9.6% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (sync) 178.54K ops/s 161.30K ops/s +10.7% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (async) 151.25K ops/s 158.47K ops/s -4.6%
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > initial resolve 683.72 ops/s 545.34 ops/s +25.4% ✅
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > Resolving from cache 19.73K ops/s 15.42K ops/s +28.0% ✅
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes 3.00K ops/s 2.13K ops/s +40.9% ✅
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes slow 647.43 ops/s 406.30 ops/s +59.3% ✅

plugins/async-node/core ⚠️

Benchmark Current Baseline Change
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 1 times 9.50K ops/s 8.39K ops/s +13.2% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 5 times 9.23K ops/s 10.87K ops/s -15.0% ⚠️
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 10 times 8.16K ops/s 8.74K ops/s -6.6%
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 50 times 2.87K ops/s 2.48K ops/s +16.0% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 100 times 1.43K ops/s 1.40K ops/s +2.2%
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 1 times 7.01K ops/s 7.81K ops/s -10.3% ⚠️
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 5 times 7.97K ops/s 7.80K ops/s +2.2%
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 10 times 6.47K ops/s 7.66K ops/s -15.5% ⚠️
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 50 times 2.23K ops/s 2.53K ops/s -12.1% ⚠️
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 100 times 1.47K ops/s 1.43K ops/s +2.8%

react/player ⚠️

Benchmark Current Baseline Change
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 1 ReactAssets 539.71 ops/s 572.33 ops/s -5.7%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 1 ReactAssets 847.84 ops/s 895.15 ops/s -5.3%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 5 ReactAssets 534.61 ops/s 564.93 ops/s -5.4%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 5 ReactAssets 894.18 ops/s 888.75 ops/s +0.6%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 10 ReactAssets 529.73 ops/s 536.68 ops/s -1.3%
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 10 ReactAssets 684.49 ops/s 805.32 ops/s -15.0% ⚠️
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 50 ReactAssets 425.92 ops/s 389.77 ops/s +9.3% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 50 ReactAssets 238.08 ops/s 208.73 ops/s +14.1% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 100 ReactAssets 329.37 ops/s 282.34 ops/s +16.7% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 100 ReactAssets 94.25 ops/s 92.51 ops/s +1.9%

KVSRoyal and others added 2 commits June 16, 2026 11:03
* Pass started flow back via Managed Player

* Update android .api files

* Update input asset to fix test

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

Labels

major Increment the major version when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants