Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move goog.i18n deps to a module #8360

Merged
merged 1 commit into from
Jun 10, 2019
Merged

Move goog.i18n deps to a module #8360

merged 1 commit into from
Jun 10, 2019

Conversation

rasom
Copy link
Contributor

@rasom rasom commented Jun 5, 2019

This PR adds the first cljs module to the project and introduces defmodule macro which makes definition of module's api and loading of module a bit simpler.

Moving all goog/i18n mentions to a separate module makes index.android.js 8.91% smaller (2729KB vs 2996KB) and startup ~4% faster. The loading of the module even on a slow device is quite fast (90ms), assuming its size is ~216KB. Probably it is smaller and faster than it was before this PR because I rewrote it a bit so that compilation warning doesn't appear anymore, and thus good/i18n calls are now optimized better during compilation.

This warning is fixed:

[2019-06-01T06:57:46.639Z] Jun 01, 2019 6:57:43 AM com.google.javascript.jscomp.LoggerErrorManager println
[2019-06-01T06:57:46.639Z] WARNING: /home/jenkins/workspace/status-react_prs_android_PR-8332/target/android-prod/status_im/utils/datetime.js:40: WARNING - incomplete alias created for namespace goog.i18n, possibly due to await/yield transpilation.
[2019-06-01T06:57:46.639Z] See https://github.com/google/closure-compiler/wiki/FAQ#i-got-an-incomplete-alias-created-for-namespace-error--what-do-i-do for more details.
[2019-06-01T06:57:46.639Z] var loc = (function (){var G__23425 = goog.i18n;
[2019-06-01T06:57:46.639Z]                                       ^^^^^^^^^
[2019-06-01T06:57:46.639Z] 

Loading of module on Samsung a500d:

06-05 08:25:32.863 30156 30193 D ReactNativeJS: DEBUG [status-im.goog.i18n-module:10] - :load-goog.i18n-module
06-05 08:25:32.953 30156 30193 D ReactNativeJS: DEBUG [status-im.goog.i18n-module:17] - :goog.i18n-module-loaded

status: ready

@rasom rasom requested review from antdanchenko, churik, jakubgs and a team as code owners June 5, 2019 06:18
@status-github-bot
Copy link

Pull Request Checklist

  • Have you updated the documentation, if impacted (e.g. docs.status.im)?

@status-im-auto
Copy link
Member

status-im-auto commented Jun 5, 2019

Jenkins Builds

Click to see older builds (64)
Commit #️⃣ Finished (UTC) Duration Platform Result
3debc1b #1 2019-06-05 06:19:59 ~59 sec android 📄 log
3debc1b #1 2019-06-05 06:19:59 ~1 min android-e2e 📄 log
3debc1b #1 2019-06-05 06:19:59 ~59 sec ios 📄 log
3debc1b #1 2019-06-05 06:20:09 ~1 min linux 📄 log
3debc1b #1 2019-06-05 06:20:10 ~1 min windows 📄 log
3debc1b #1 2019-06-05 06:20:10 ~1 min macos 📄 log
077b573 #2 2019-06-05 16:14:10 ~7 min windows 📄 log
077b573 #2 2019-06-05 16:14:15 ~7 min linux 📄 log
077b573 #2 2019-06-05 16:15:08 ~8 min macos 📄 log
077b573 #2 2019-06-05 16:18:52 ~11 min ios 📄 log
077b573 #2 2019-06-05 16:23:53 ~16 min android-e2e 📄 log
077b573 #2 2019-06-05 16:24:00 ~17 min android 📄 log
0876d17 #3 2019-06-05 18:13:00 ~3 min ios 📄 log
0876d17 #3 2019-06-05 18:13:26 ~4 min linux 📄 log
0876d17 #3 2019-06-05 18:13:29 ~4 min windows 📄 log
0876d17 #3 2019-06-05 18:13:53 ~4 min macos 📄 log
1ddb1e3 #4 2019-06-05 18:17:13 ~3 min ios 📄 log
1ddb1e3 #4 2019-06-05 18:17:51 ~4 min macos 📄 log
1ddb1e3 #4 2019-06-05 18:18:25 ~4 min windows 📄 log
1ddb1e3 #4 2019-06-05 18:18:36 ~5 min linux 📄 log
1ddb1e3 #4 2019-06-05 18:19:54 ~6 min android 📄 log
1ddb1e3 #4 2019-06-05 18:20:52 ~7 min android-e2e 📄 log
ac10daa #5 2019-06-05 18:41:27 ~3 min ios 📄 log
ac10daa #5 2019-06-05 18:41:45 ~3 min windows 📄 log
ac10daa #5 2019-06-05 18:41:47 ~3 min linux 📄 log
ac10daa #5 2019-06-05 18:42:03 ~4 min macos 📄 log
ac10daa #5 2019-06-05 18:48:32 ~10 min android 📄 log
ac10daa #5 2019-06-05 18:48:39 ~10 min android-e2e 📄 log
6c80d0c #6 2019-06-06 09:18:26 ~3 min ios 📄 log
6c80d0c #6 2019-06-06 09:18:35 ~3 min windows 📄 log
6c80d0c #6 2019-06-06 09:18:38 ~3 min linux 📄 log
6c80d0c #6 2019-06-06 09:18:58 ~4 min macos 📄 log
6c80d0c #6 2019-06-06 09:25:11 ~10 min android 📄 log
6c80d0c #6 2019-06-06 09:25:17 ~10 min android-e2e 📄 log
✔️ 49cca50 #7 2019-06-06 09:36:43 ~11 min linux 📦 App
✔️ 49cca50 #7 2019-06-06 09:38:04 ~12 min windows 📦 exe
✔️ 49cca50 #7 2019-06-06 09:38:05 ~12 min macos 📦 dmg
✔️ 49cca50 #7 2019-06-06 09:40:09 ~14 min ios 📦 ipa
✔️ 49cca50 #7 2019-06-06 09:48:00 ~22 min android 📦 apk
✔️ 49cca50 #7 2019-06-06 09:48:17 ~22 min android-e2e 📦 apk
✔️ bb333c2 #8 2019-06-06 10:15:29 ~14 min ios 📦 ipa
✔️ bb333c2 #8 2019-06-06 10:15:44 ~14 min linux 📦 App
✔️ bb333c2 #8 2019-06-06 10:16:37 ~15 min windows 📦 exe
✔️ bb333c2 #8 2019-06-06 10:19:05 ~18 min macos 📦 dmg
✔️ bb333c2 #8 2019-06-06 10:24:34 ~23 min android 📦 apk
✔️ bb333c2 #8 2019-06-06 10:24:52 ~24 min android-e2e 📦 apk
✔️ a25d644 #9 2019-06-07 07:34:46 ~14 min ios 📦 ipa
✔️ a25d644 #9 2019-06-07 07:35:07 ~15 min linux 📦 App
✔️ a25d644 #9 2019-06-07 07:35:49 ~15 min windows 📦 exe
✔️ a25d644 #9 2019-06-07 07:38:10 ~18 min macos 📦 dmg
✔️ a25d644 #9 2019-06-07 07:44:06 ~24 min android 📦 apk
✔️ a25d644 #9 2019-06-07 07:44:44 ~24 min android-e2e 📦 apk
✔️ a25d644 #11 2019-06-07 13:30:07 ~13 min android-e2e 📦 apk
✔️ a25d644 #11 2019-06-07 13:31:23 ~14 min linux 📦 App
✔️ a25d644 #11 2019-06-07 13:31:51 ~15 min ios 📦 ipa
✔️ a25d644 #11 2019-06-07 13:33:49 ~17 min macos 📦 dmg
✔️ a25d644 #11 2019-06-07 13:34:13 ~17 min android 📦 apk
✔️ a25d644 #11 2019-06-07 13:39:16 ~22 min windows 📦 exe
550ee49 #12 2019-06-10 04:46:28 ~3 min ios 📄 log
550ee49 #12 2019-06-10 04:46:29 ~3 min linux 📄 log
550ee49 #12 2019-06-10 04:46:35 ~3 min windows 📄 log
550ee49 #12 2019-06-10 04:46:48 ~3 min macos 📄 log
550ee49 #12 2019-06-10 04:53:33 ~10 min android 📄 log
550ee49 #12 2019-06-10 04:53:38 ~10 min android-e2e 📄 log
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 30c50d3 #13 2019-06-10 05:15:43 ~13 min ios 📦 ipa
✔️ 30c50d3 #13 2019-06-10 05:17:07 ~15 min linux 📦 App
✔️ 30c50d3 #13 2019-06-10 05:17:56 ~15 min windows 📦 exe
✔️ 30c50d3 #13 2019-06-10 05:20:35 ~18 min macos 📦 dmg
✔️ 30c50d3 #13 2019-06-10 05:21:27 ~19 min android 📦 apk
✔️ 30c50d3 #13 2019-06-10 05:21:31 ~19 min android-e2e 📦 apk
✔️ 3bd0947 #14 2019-06-10 18:24:50 ~13 min ios 📦 ipa
✔️ 3bd0947 #14 2019-06-10 18:25:45 ~14 min linux 📦 App
✔️ 3bd0947 #14 2019-06-10 18:25:51 ~14 min windows 📦 exe
✔️ 3bd0947 #14 2019-06-10 18:29:43 ~18 min macos 📦 dmg
✔️ 3bd0947 #14 2019-06-10 18:30:46 ~19 min android 📦 apk
✔️ 3bd0947 #14 2019-06-10 18:31:00 ~19 min android-e2e 📦 apk

@status-im-auto
Copy link
Member

Jenkins Builds

Commit #️⃣ Finished (UTC) Duration Platform Result
3debc1b #1 2019-06-05 06:19:59 ~59 sec android 📄 log

@status-im-auto
Copy link
Member

Jenkins Builds

Commit #️⃣ Finished (UTC) Duration Platform Result
3debc1b #1 2019-06-05 06:19:59 ~59 sec android 📄 log
3debc1b #1 2019-06-05 06:19:59 ~1 min android-e2e 📄 log
3debc1b #1 2019-06-05 06:19:59 ~59 sec ios 📄 log

@rasom rasom changed the title move goog.i18n deps to a module [WIP] move goog.i18n deps to a module Jun 5, 2019
@rasom rasom force-pushed the goog.i18n-module branch 2 times, most recently from 1ddb1e3 to ac10daa Compare June 5, 2019 18:37
@rasom rasom changed the title [WIP] move goog.i18n deps to a module Move goog.i18n deps to a module Jun 5, 2019
@rasom rasom requested review from flexsurfer and yenda June 5, 2019 18:48
Copy link
Contributor

@yenda yenda left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome work does it means that we can expect i18n calls to be slightly more performant ? Computing timestamps is actually one of the bottlenecks so that'd be neat!

@rasom
Copy link
Contributor Author

rasom commented Jun 6, 2019

does it means that we can expect i18n calls to be slightly more performant

I doubt that it will have any effect in runtime.

@yenda
Copy link
Contributor

yenda commented Jun 6, 2019

@rasom ok thanks. btw I've read that type hinting in cljs is only useful for booleans, I wonder if we are using enough of them for it to be worth doing

@rasom rasom requested a review from mandrigin June 6, 2019 10:23
@statustestbot
Copy link

100% of end-end tests have passed

Total executed tests: 49
Failed tests: 0
Passed tests: 49

Passed tests (49)

Click to expand
1. test_block_user_from_public_chat
Device sessions

2. test_filters_from_daap
Device sessions

3. test_copy_and_paste_messages
Device sessions

4. test_send_transaction_from_daap
Device sessions

5. test_request_and_receive_tokens_in_1_1_chat
Device sessions

6. test_deploy_contract_from_daap
Device sessions

7. test_open_transaction_on_etherscan
Device sessions

8. test_public_chat_messaging
Device sessions

9. test_long_press_to_delete_1_1_chat
Device sessions

10. test_password_in_logcat_sign_in
Device sessions

11. test_text_message_1_1_chat
Device sessions

12. test_add_to_contacts
Device sessions

13. test_sign_typed_message (TestRail link is not found)
Device sessions

14. test_unread_messages_counter_1_1_chat
Device sessions

15. test_logcat_send_transaction_from_daap
Device sessions

16. test_send_message_in_group_chat
Device sessions

17. test_logcat_send_transaction_from_wallet
Device sessions

18. test_send_token_with_7_decimals
Device sessions

19. test_modify_transaction_fee_values
Device sessions

20. test_send_eth_from_wallet_to_address
Device sessions

21. test_manage_assets
Device sessions

22. test_logcat_send_transaction_in_1_1_chat
Device sessions

23. test_request_and_receive_eth_in_1_1_chat
Device sessions

24. test_long_press_to_delete_public_chat
Device sessions

25. test_send_emoji
Device sessions

26. test_search_chat_on_home
Device sessions

27. test_logcat_recovering_account
Device sessions

28. test_messaging_in_different_networks
Device sessions

29. test_send_tokens_in_1_1_chat
Device sessions

30. test_network_mismatch_for_send_request_commands
Device sessions

31. test_logcat_sign_message_from_daap
Device sessions

32. test_switch_users_and_add_new_account
Device sessions

33. test_send_stt_from_wallet
Device sessions

34. test_send_eth_in_1_1_chat
Device sessions

35. test_login_with_new_account
Device sessions

36. test_send_eth_from_wallet_to_contact
Device sessions

37. test_add_contact_from_public_chat
Device sessions

38. test_send_two_transactions_one_after_another_in_dapp
Device sessions

39. test_password_in_logcat_creating_account
Device sessions

40. test_backup_recovery_phrase
Device sessions

41. test_offline_status
Device sessions

42. test_open_google_com_via_open_dapp
Device sessions

43. test_unread_messages_counter_public_chat
Device sessions

44. test_sign_message_from_daap
Device sessions

45. test_user_can_remove_profile_picture
Device sessions

46. test_share_contact_code_and_wallet_address
Device sessions

47. test_request_eth_in_wallet
Device sessions

48. test_refresh_button_browsing_app_webview
Device sessions

49. test_backup_recovery_phrase_warning_from_wallet
Device sessions

ci/Jenkinsfile.android Outdated Show resolved Hide resolved
Makefile Outdated
@@ -100,16 +100,22 @@ prod-build:

prod-build-android: export TARGET_OS ?= android
prod-build-android:
lein prod-build-android
cp params_prod.edn params.edn && \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this cp be here? Why not make it e separate target? Like:

prod-params:
    cp  params_prod.edn params.edn 

prod-build-android: prod-params

Or something like that.
Also, can you explain what this file changes exactly? Maybe you can add that as a comment to the Makefile target?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file changes the parameter which makes macro behave differently in prod and dev env.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Obviously, but differently how?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, who use these files? Is there any reason why this can't be managed by env variables?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

currently defmodule macro uses this file (introduced in this PR), another macro will need platform version in that file. This is necessary to provide env vars during cljs compile time. It can be done via env vars though might be a bit implicit. I would merge it as it is and then spend time on this later, because I'm kind of have a bit different objective. It works and I'm happy.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, just don't want to multiply entities in the repo if it's not necessary. And it doesn't have to be implicit, you can clearly define the env variable above the Makefile target and make it very clear so as to what it does, like so:

prod-build-android: export TARGET_OS ?= android
prod-build-android: export BUILD_ENV ?= prod
prod-build-android:
	lein prod-build-android && \
	node prepare-modules.js

We also have .env* files in the repo root which contian various settings like that, might be a good place for that too.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for some reason BUILD_ENV is not seen from lein if defined this way, only if I make it BUILD_ENV=prod lein prod-build-android && \

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be because of --pure.
https://github.com/status-im/status-react/blob/cdae3423bcc986d9a390de0a5479cfa4c005c121/nix/shell.sh#L34-L38
For now the simplest thing to do would be to just add a --keep BUILD_ENV somewhere in there. What do you think @pombeirp ?
I can do a separate PR that will add an env variables to do that.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about this: #8398

Copy link
Member

@jakubgs jakubgs Jun 10, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've merged #8398 so try rebasing and adding an export NIX_KEEP ?= 'BUILD_ENV' somewhere at the top of the Makefile, probably next to this:
https://github.com/status-im/status-react/blob/0e7f73fd11e396c5e5fa898178d3872eb676f234/Makefile#L29
And add a comment saying something like:

# Defined which variables will be kept for Nix pure shell, use semicolon as divider

And we should be golden.

@jakubgs
Copy link
Member

jakubgs commented Jun 6, 2019

This PR now has conflicts due to #8360 being merged.
When you rebase you'll have to use the make targets as I mentioned in the comment earlier.

@rasom
Copy link
Contributor Author

rasom commented Jun 7, 2019

@jakubgs rebased

Makefile Show resolved Hide resolved
@statustestbot
Copy link

100% of end-end tests have passed

Total executed tests: 49
Failed tests: 0
Passed tests: 49

Passed tests (49)

Click to expand
1. test_block_user_from_public_chat
Device sessions

2. test_filters_from_daap
Device sessions

3. test_copy_and_paste_messages
Device sessions

4. test_send_transaction_from_daap
Device sessions

5. test_request_and_receive_tokens_in_1_1_chat
Device sessions

6. test_deploy_contract_from_daap
Device sessions

7. test_open_transaction_on_etherscan
Device sessions

8. test_public_chat_messaging
Device sessions

9. test_long_press_to_delete_1_1_chat
Device sessions

10. test_password_in_logcat_sign_in
Device sessions

11. test_text_message_1_1_chat
Device sessions

12. test_add_to_contacts
Device sessions

13. test_sign_typed_message (TestRail link is not found)
Device sessions

14. test_unread_messages_counter_1_1_chat
Device sessions

15. test_logcat_send_transaction_from_daap
Device sessions

16. test_send_message_in_group_chat
Device sessions

17. test_logcat_send_transaction_from_wallet
Device sessions

18. test_send_token_with_7_decimals
Device sessions

19. test_modify_transaction_fee_values
Device sessions

20. test_send_eth_from_wallet_to_address
Device sessions

21. test_manage_assets
Device sessions

22. test_logcat_send_transaction_in_1_1_chat
Device sessions

23. test_request_and_receive_eth_in_1_1_chat
Device sessions

24. test_long_press_to_delete_public_chat
Device sessions

25. test_send_emoji
Device sessions

26. test_search_chat_on_home
Device sessions

27. test_logcat_recovering_account
Device sessions

28. test_messaging_in_different_networks
Device sessions

29. test_send_tokens_in_1_1_chat
Device sessions

30. test_network_mismatch_for_send_request_commands
Device sessions

31. test_logcat_sign_message_from_daap
Device sessions

32. test_switch_users_and_add_new_account
Device sessions

33. test_send_stt_from_wallet
Device sessions

34. test_send_eth_in_1_1_chat
Device sessions

35. test_login_with_new_account
Device sessions

36. test_send_eth_from_wallet_to_contact
Device sessions

37. test_add_contact_from_public_chat
Device sessions

38. test_send_two_transactions_one_after_another_in_dapp
Device sessions

39. test_password_in_logcat_creating_account
Device sessions

40. test_backup_recovery_phrase
Device sessions

41. test_offline_status
Device sessions

42. test_open_google_com_via_open_dapp
Device sessions

43. test_unread_messages_counter_public_chat
Device sessions

44. test_sign_message_from_daap
Device sessions

45. test_user_can_remove_profile_picture
Device sessions

46. test_share_contact_code_and_wallet_address
Device sessions

47. test_request_eth_in_wallet
Device sessions

48. test_refresh_button_browsing_app_webview
Device sessions

49. test_backup_recovery_phrase_warning_from_wallet
Device sessions

@rasom
Copy link
Contributor Author

rasom commented Jun 10, 2019

@jakubgs @pombeirp does it look better now? params.edn files are removed

@statustestbot
Copy link

100% of end-end tests have passed

Total executed tests: 49
Failed tests: 0
Passed tests: 49

Passed tests (49)

Click to expand
1. test_block_user_from_public_chat
Device sessions

2. test_filters_from_daap
Device sessions

3. test_copy_and_paste_messages
Device sessions

4. test_send_transaction_from_daap
Device sessions

5. test_request_and_receive_tokens_in_1_1_chat
Device sessions

6. test_deploy_contract_from_daap
Device sessions

7. test_open_transaction_on_etherscan
Device sessions

8. test_public_chat_messaging
Device sessions

9. test_long_press_to_delete_1_1_chat
Device sessions

10. test_password_in_logcat_sign_in
Device sessions

11. test_text_message_1_1_chat
Device sessions

12. test_add_to_contacts
Device sessions

13. test_sign_typed_message (TestRail link is not found)
Device sessions

14. test_unread_messages_counter_1_1_chat
Device sessions

15. test_logcat_send_transaction_from_daap
Device sessions

16. test_send_message_in_group_chat
Device sessions

17. test_logcat_send_transaction_from_wallet
Device sessions

18. test_send_token_with_7_decimals
Device sessions

19. test_modify_transaction_fee_values
Device sessions

20. test_send_eth_from_wallet_to_address
Device sessions

21. test_manage_assets
Device sessions

22. test_logcat_send_transaction_in_1_1_chat
Device sessions

23. test_request_and_receive_eth_in_1_1_chat
Device sessions

24. test_long_press_to_delete_public_chat
Device sessions

25. test_send_emoji
Device sessions

26. test_search_chat_on_home
Device sessions

27. test_logcat_recovering_account
Device sessions

28. test_messaging_in_different_networks
Device sessions

29. test_send_tokens_in_1_1_chat
Device sessions

30. test_network_mismatch_for_send_request_commands
Device sessions

31. test_logcat_sign_message_from_daap
Device sessions

32. test_switch_users_and_add_new_account
Device sessions

33. test_send_stt_from_wallet
Device sessions

34. test_send_eth_in_1_1_chat
Device sessions

35. test_login_with_new_account
Device sessions

36. test_send_eth_from_wallet_to_contact
Device sessions

37. test_add_contact_from_public_chat
Device sessions

38. test_send_two_transactions_one_after_another_in_dapp
Device sessions

39. test_password_in_logcat_creating_account
Device sessions

40. test_backup_recovery_phrase
Device sessions

41. test_offline_status
Device sessions

42. test_open_google_com_via_open_dapp
Device sessions

43. test_unread_messages_counter_public_chat
Device sessions

44. test_sign_message_from_daap
Device sessions

45. test_user_can_remove_profile_picture
Device sessions

46. test_share_contact_code_and_wallet_address
Device sessions

47. test_request_eth_in_wallet
Device sessions

48. test_refresh_button_browsing_app_webview
Device sessions

49. test_backup_recovery_phrase_warning_from_wallet
Device sessions

Copy link
Member

@jakubgs jakubgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much nicer.

@Serhy
Copy link
Contributor

Serhy commented Jun 10, 2019

No regression found.

  • Can change device localisation and Status picks it up as app localisation too.
  • Can change currency and transact in 1-1, Wallet with the preset previously fiat and amount corresponding to fiat
  • Request message history and date on 'Fetch more messages' correspond to the date which is about to be requested.

@rasom rasom merged commit 3bd0947 into develop Jun 10, 2019
@delete-merged-branch delete-merged-branch bot deleted the goog.i18n-module branch June 10, 2019 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Archived in project
Development

Successfully merging this pull request may close these issues.

9 participants