Skip to content

Commit

Permalink
LSU: Remove legacy supervised user UIs and strings
Browse files Browse the repository at this point in the history
Legacy supervised users are now deprecated. This CL removes some dead
UI code and strings.

Bug: 1164090
Change-Id: I895ad42c4c336889aebb57112ca80ef622594e4e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2625803
Auto-Submit: Toby Huang <tobyhuang@chromium.org>
Reviewed-by: Denis Kuznetsov [CET] <antrim@chromium.org>
Reviewed-by: Scott Violet <sky@chromium.org>
Commit-Queue: Toby Huang <tobyhuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844836}
  • Loading branch information
Toby Huang authored and Chromium LUCI CQ committed Jan 19, 2021
1 parent 406f590 commit 66a6bb3
Show file tree
Hide file tree
Showing 23 changed files with 8 additions and 192 deletions.
6 changes: 0 additions & 6 deletions ash/ash_strings.grd
Original file line number Diff line number Diff line change
Expand Up @@ -2390,12 +2390,6 @@ This file contains the strings for ash.
<message name="IDS_ASH_LOGIN_POD_OWNER_USER" desc="Login/lock screen user pod menu title for a user who owns the device.">
<ph name="USER_NAME">$1<ex>Ivan Arbuzov</ex></ph> (owner)
</message>
<message name="IDS_ASH_LOGIN_POD_LEGACY_SUPERVISED_EXPIRATION_WARNING" desc="Text shown as a warning that supervised users will be deprecated.">
Your supervised user profile will be removed soon. Sign in to learn more.
</message>
<message name="IDS_ASH_LOGIN_POD_LEGACY_SUPERVISED_USER_REMOVE_WARNING" desc="Text shown as a warning when attempting to remove legacy supervised user.">
All files and local data associated with the supervised user will be permanently deleted once this supervised user is removed. Visited websites and settings for this supervised user may still be visible by the manager at <ph name="MANAGEMENT_URL">$1<ex>www.example.com</ex></ph>.
</message>
<message name="IDS_ASH_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING_PART_1" desc="Text shown as a warning when attempting to remove non-owner user. Also see IDS_ASH_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING_PART_2.">
All files and local data associated with this user will be permanently deleted once this user is removed.
</message>
Expand Down

This file was deleted.

25 changes: 0 additions & 25 deletions ash/login/ui/lock_contents_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -472,11 +472,6 @@ LoginErrorBubble* LockContentsView::TestApi::warning_banner_bubble() const {
return view_->warning_banner_bubble_;
}

LoginErrorBubble*
LockContentsView::TestApi::supervised_user_deprecation_bubble() const {
return view_->supervised_user_deprecation_bubble_;
}

views::View* LockContentsView::TestApi::user_adding_screen_indicator() const {
return view_->user_adding_screen_indicator_;
}
Expand Down Expand Up @@ -640,10 +635,6 @@ LockContentsView::LockContentsView(
base::Unretained(this), DisplayStyle::kAll)));
expanded_view_->SetVisible(false);

supervised_user_deprecation_bubble_ =
AddChildView(std::make_unique<LoginErrorBubble>());
supervised_user_deprecation_bubble_->set_persistent(true);

detachable_base_error_bubble_ =
AddChildView(std::make_unique<LoginErrorBubble>());
detachable_base_error_bubble_->set_persistent(true);
Expand Down Expand Up @@ -1993,22 +1984,6 @@ void LockContentsView::OnBigUserChanged() {
Shell::Get()->login_screen_controller()->OnFocusPod(big_user_account_id);
UpdateEasyUnlockIconForUser(big_user_account_id);

// TODO(crbug/1164090): After Supervised Users are deprecated, remove this.
if (big_user.basic_user_info.type ==
user_manager::USER_TYPE_SUPERVISED_DEPRECATED) {
// TODO(crbug/1164090): Remove this string and the associated screenshot.
base::string16 message = l10n_util::GetStringUTF16(
IDS_ASH_LOGIN_POD_LEGACY_SUPERVISED_EXPIRATION_WARNING);
// Shows supervised user deprecation message as a persistent error bubble.

supervised_user_deprecation_bubble_->SetTextContent(message);
supervised_user_deprecation_bubble_->SetAnchorView(
CurrentBigUserView()->auth_user()->GetActiveInputView());
supervised_user_deprecation_bubble_->Show();
} else if (supervised_user_deprecation_bubble_->GetVisible()) {
supervised_user_deprecation_bubble_->Hide();
}

// The new auth user might have different last used detachable base - make
// sure the detachable base pairing error is updated if needed.
OnDetachableBasePairingStatusChanged(
Expand Down
4 changes: 0 additions & 4 deletions ash/login/ui/lock_contents_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ class ASH_EXPORT LockContentsView
LoginErrorBubble* auth_error_bubble() const;
LoginErrorBubble* detachable_base_error_bubble() const;
LoginErrorBubble* warning_banner_bubble() const;
LoginErrorBubble* supervised_user_deprecation_bubble() const;
views::View* user_adding_screen_indicator() const;
views::View* system_info() const;
views::View* bottom_status_indicator() const;
Expand Down Expand Up @@ -469,9 +468,6 @@ class ASH_EXPORT LockContentsView
views::View* user_adding_screen_indicator_ = nullptr;
// Bubble for displaying warning banner message.
LoginErrorBubble* warning_banner_bubble_;
// Bubble for displaying supervised user deprecation message.
// TODO(crbug/1164090): Remove this.
LoginErrorBubble* supervised_user_deprecation_bubble_;

// Bottom status indicator displaying entreprise domain or ADB enabled alert
BottomStatusIndicator* bottom_status_indicator_;
Expand Down
9 changes: 0 additions & 9 deletions ash/login/ui/login_user_menu_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@

namespace ash {
namespace {
constexpr char kLegacySupervisedUserManagementDisplayURL[] =
"www.chrome.com/manage";

// Vertical margin between username and mail.
constexpr int kUserMenuVerticalMarginUsernameMailDp = 8;

Expand Down Expand Up @@ -203,12 +200,6 @@ LoginUserMenuView::LoginUserMenuView(
user_manager::UserType type = user.basic_user_info.type;
base::string16 part1 = l10n_util::GetStringUTF16(
IDS_ASH_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING_PART_1);
// TODO(crbug/1164090): Remove this section and the strings.
if (type == user_manager::UserType::USER_TYPE_SUPERVISED_DEPRECATED) {
part1 = l10n_util::GetStringFUTF16(
IDS_ASH_LOGIN_POD_LEGACY_SUPERVISED_USER_REMOVE_WARNING,
base::UTF8ToUTF16(kLegacySupervisedUserManagementDisplayURL));
}
base::string16 part2 = l10n_util::GetStringFUTF16(
type == user_manager::UserType::USER_TYPE_CHILD
? IDS_ASH_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING_PART_2_SUPERVISED_USER
Expand Down
10 changes: 1 addition & 9 deletions ash/system/supervised/supervised_icon_string.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const gfx::VectorIcon& GetSupervisedUserIcon() {
base::string16 GetSupervisedUserMessage() {
SessionControllerImpl* session_controller =
Shell::Get()->session_controller();
DCHECK(session_controller->IsUserChildOrDeprecatedSupervised());
DCHECK(session_controller->IsUserChild());
DCHECK(session_controller->IsActiveUserSessionStarted());

// Get the active user session.
Expand All @@ -39,14 +39,6 @@ base::string16 GetSupervisedUserMessage() {
base::string16 second_custodian =
UTF8ToUTF16(user_session->second_custodian_email);

// Regular supervised user. The "manager" is the first custodian.
// TODO(crbug/1164090): Remove this section.
if (!Shell::Get()->session_controller()->IsUserChild()) {
return l10n_util::GetStringFUTF16(IDS_ASH_USER_IS_SUPERVISED_BY_NOTICE,
first_custodian);
}

// Child supervised user.
if (second_custodian.empty()) {
return l10n_util::GetStringFUTF16(
IDS_ASH_CHILD_USER_IS_MANAGED_BY_ONE_PARENT_NOTICE, first_custodian);
Expand Down
38 changes: 0 additions & 38 deletions chrome/app/profiles_strings.grdp
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,12 @@
<!-- Profiles specific strings (included from generated_resources.grd). -->
<grit-part>
<!-- Supervised User (Legacy and Accounts for Kids) Avatar Menu -->
<message name="IDS_LEGACY_SUPERVISED_USER_INFO" desc="Text which explains that a supervised user is managed by a custodian.">
Usage and history can be reviewed by the manager (<ph name="CUSTODIAN_EMAIL">$1<ex>Jane.Doe@gmail.com</ex></ph>) on chrome.com.
</message>
<message name="IDS_CHILD_INFO_ONE_CUSTODIAN" desc="Text which explains that a child user is managed by a single parent.">
This is an account for kids managed by <ph name="CUSTODIAN_EMAIL">$1<ex>Jane.Doe@gmail.com</ex></ph>.
</message>
<message name="IDS_CHILD_INFO_TWO_CUSTODIANS" desc="Text which explains that a child user is managed by two parents.">
This is an account for kids managed by <ph name="CUSTODIAN_EMAIL">$1<ex>John.Doe@gmail.com</ex></ph> and <ph name="SECOND_CUSTODIAN_EMAIL">$2<ex>Jane.Doe@gmail.com</ex></ph>.
</message>
<message name="IDS_LEGACY_SUPERVISED_USER_AVATAR_LABEL" desc="A label for the supervised user which is used in the avatar menu and as a label in the titlebar.">
Supervised user
</message>
<message name="IDS_GENERIC_USER_AVATAR_LABEL" desc="Label shown for the user that is currently active, when there are multiple user accounts.">
Current user
</message>
Expand Down Expand Up @@ -59,9 +53,6 @@
<message name="IDS_AVATAR_BUTTON_SYNC_PAUSED_TOOLTIP" desc="Tooltip for the avatar button when sync is paused for the current profile.">
<ph name="PROFILE_NAME">$1<ex>User</ex></ph>: Sync paused
</message>
<message name="IDS_LEGACY_SUPERVISED_USER_NEW_AVATAR_LABEL" desc="Label shown in the new avatar menu for a supervised user.">
<ph name="PROFILE_DISPLAY_NAME">$1<ex>Markus</ex></ph> (Supervised)
</message>
<message name="IDS_CHILD_AVATAR_LABEL" desc="Label shown in the new avatar menu for a child user.">
<ph name="PROFILE_DISPLAY_NAME">$1<ex>Markus</ex></ph> (Account for kids)
</message>
Expand Down Expand Up @@ -504,20 +495,6 @@
<message name="IDS_PROFILES_CREATE_SUPERVISED_JUST_SIGNED_IN" desc="Warning message shown in the create-profile dialog when the custodian signed in recently, sync has not yet finished initializing, and so the creation process is likely to take extra time.">
Creating your supervised user. This may take a few moments.
</message>

<!-- Import existing supervised user dialog -->
<message name="IDS_IMPORT_EXISTING_LEGACY_SUPERVISED_USER_TITLE" desc="Title for the dialog used to import existing supervised users. The dialog appears when the custodian clicks on 'Import existing supervised user' during the user creation flow. The dialog displays a list of existing supervised users for the custodian to choose from">
Import an existing supervised user
</message>
<message name="IDS_IMPORT_EXISTING_LEGACY_SUPERVISED_USER_TEXT" desc="Text that instructs the user to choose one of the displayed supervised users to import to this device.">
Choose a supervised user to add to this device.
</message>
<message name="IDS_CREATE_NEW_LEGACY_SUPERVISED_USER_LINK" desc="The text for the link button that takes the user back from the dialog for importing an existing supervised user to the user creation dialog.">
Create a new supervised user
</message>
<message name="IDS_IMPORT_EXISTING_LEGACY_SUPERVISED_USER_OK" desc="Text on the button to confirm importing an existing supervised user.">
Import supervised user
</message>
</if>

<if expr="not is_android">
Expand All @@ -530,17 +507,11 @@
<message name="IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON" desc="Text shown on a button that confirms removal of a user.">
Remove This Person
</message>
<message name="IDS_CREATE_LEGACY_SUPERVISED_USER_MENU_LABEL" desc="Text shown on a menu option that creates a legacy supervised user.">
Add Supervised Person
</message>
</if>
<if expr="chromeos">
<message name="IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON" desc="Text shown on a button that confirms removal of a user.">
Remove This User
</message>
<message name="IDS_CREATE_LEGACY_SUPERVISED_USER_MENU_LABEL" desc="Text shown on a menu option that creates a legacy supervised user.">
Add Supervised User
</message>
</if>
<message name="IDS_SCREEN_LOCK_SIGN_OUT">
Sign out
Expand All @@ -554,17 +525,11 @@
<message name="IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON" desc="Text shown on a button that confirms removal of a user.">
Remove this person
</message>
<message name="IDS_CREATE_LEGACY_SUPERVISED_USER_MENU_LABEL" desc="Text shown on a menu option that creates a legacy supervised user.">
Add supervised person
</message>
</if>
<if expr="chromeos">
<message name="IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON" desc="Text shown on a button that confirms removal of a user.">
Remove this user
</message>
<message name="IDS_CREATE_LEGACY_SUPERVISED_USER_MENU_LABEL" desc="Text shown on a menu option that creates a legacy supervised user.">
Add supervised user
</message>
</if>
<message name="IDS_SCREEN_LOCK_SIGN_OUT">
Sign out
Expand Down Expand Up @@ -634,9 +599,6 @@
<message name="IDS_LOGIN_POD_MENU_REMOVE_ITEM_ACCESSIBLE_NAME" desc="Text to be spoken when 'Remove user' item is selected on the pod menu.">
Remove this user
</message>
<message name="IDS_LOGIN_POD_LEGACY_SUPERVISED_USER_REMOVE_WARNING" desc="Text shown as a warning when attempting to remove legacy supervised user.">
All files and local data associated with the supervised user will be permanently deleted once this supervised user is removed. Visited websites and settings for this supervised user may still be visible by the manager at <ph name="MANAGEMENT_URL">$1<ex>www.example.com</ex></ph>.
</message>
<message name="IDS_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING" desc="Text shown as a warning when attempting to remove non-owner user.">
All files and local data associated with this user will be permanently deleted once this user is removed. <ph name="USER_EMAIL">$1<ex>john.doe@example.com</ex></ph> can still sign in later.
</message>
Expand Down
2 changes: 2 additions & 0 deletions chrome/browser/profiles/avatar_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ class AvatarMenu :

// Whether or not the current profile is a legacy supervised user profile
// (see SupervisedUserService).
// TODO(crbug/1155729): Remove this as legacy supervised users are
// deprecated.
bool legacy_supervised;

// Whether or not the profile is associated with a child account
Expand Down
1 change: 1 addition & 0 deletions chrome/browser/profiles/profile_attributes_entry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ bool ProfileAttributesEntry::IsChild() const {
#endif
}

// TODO(crbug/1164090): Remove this function because it should always be false.
bool ProfileAttributesEntry::IsLegacySupervised() const {
return IsSupervised() && !IsChild();
}
Expand Down
6 changes: 2 additions & 4 deletions chrome/browser/profiles/profile_list_desktop.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,11 @@ void ProfileListDesktop::RebuildMenu() {
new AvatarMenu::Item(items_.size(), entry->GetPath(), icon));
item->name = entry->GetName();
item->username = entry->GetUserName();
item->legacy_supervised = entry->IsLegacySupervised();
item->child_account = entry->IsChild();
item->signed_in = entry->IsAuthenticated();
if (entry->GetSigninState() == SigninState::kNotSignedIn) {
item->username = l10n_util::GetStringUTF16(
item->legacy_supervised ? IDS_LEGACY_SUPERVISED_USER_AVATAR_LABEL :
IDS_PROFILES_LOCAL_PROFILE_STATE);
item->username =
l10n_util::GetStringUTF16(IDS_PROFILES_LOCAL_PROFILE_STATE);
}
item->active = item->profile_path == active_profile_path_;
item->signin_required = entry->IsSigninRequired();
Expand Down
4 changes: 0 additions & 4 deletions chrome/browser/profiles/profiles_state.cc
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,6 @@ base::string16 GetAvatarNameForProfile(const base::FilePath& profile_path) {

#if !BUILDFLAG(IS_CHROMEOS_ASH)
base::string16 GetProfileSwitcherTextForItem(const AvatarMenu::Item& item) {
if (item.legacy_supervised) {
return l10n_util::GetStringFUTF16(
IDS_LEGACY_SUPERVISED_USER_NEW_AVATAR_LABEL, item.name);
}
if (item.child_account)
return l10n_util::GetStringFUTF16(IDS_CHILD_AVATAR_LABEL, item.name);
return item.name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@
background-image: url(../../../../../ui/webui/resources/images/account_child_invert.svg);
}

.controlled-setting-indicator[controlled-by='supervised-user-custodian'] > div {
background-image: url(../../../../../ui/webui/resources/images/supervisor_account.svg);
}

.controlled-setting-bubble-action {
padding: 0 !important;
}
Expand Down Expand Up @@ -82,7 +78,7 @@ html[dir='rtl'] .controlled-setting-bubble-extension-name {
}

.controlled-setting-bubble-extension-manage-link {
margin-left: -0.35em;
margin-inline-start: -0.35em;
margin-top: -0.30em;
position: absolute;
top: 50%;
Expand Down
6 changes: 0 additions & 6 deletions chrome/browser/resources/user_manager/user_manager.html
Original file line number Diff line number Diff line change
Expand Up @@ -200,12 +200,6 @@
margin-inline-start: 8px;
}

.pod.legacy-supervised .legacy-supervised-indicator {
-webkit-mask-image:
url(../../../../ui/webui/resources/images/supervisor_account.svg);
display: block;
}

.pod.child .child-indicator {
-webkit-mask-image:
url(../../../../ui/webui/resources/images/account_child_invert.svg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,11 +359,6 @@ void SigninScreenHandler::DeclareLocalizedValues(
builder->Add("removeUserWarningTextCalculating", base::string16());
builder->Add("removeUserWarningTextSyncNoStats", base::string16());
builder->Add("removeUserWarningTextSyncCalculating", base::string16());
// TODO(crbug/1164090): Remove this.
builder->AddF("removeLegacySupervisedUserWarningText",
IDS_LOGIN_POD_LEGACY_SUPERVISED_USER_REMOVE_WARNING,
base::UTF8ToUTF16(
chrome::kLegacySupervisedUserManagementDisplayURL));
builder->Add("removeNonOwnerUserWarningText",
IDS_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING);
builder->Add("removeUserWarningButtonTitle",
Expand Down
14 changes: 0 additions & 14 deletions chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@ const char kKeyDisplayName[]= "displayName";
const char kKeyEmailAddress[] = "emailAddress";
const char kKeyProfilePath[] = "profilePath";
const char kKeyPublicAccount[] = "publicAccount";
// TODO(crbug/1164090): Remove this.
const char kKeyLegacySupervisedUser[] = "legacySupervisedUser";
const char kKeyChildUser[] = "childUser";
const char kKeyCanRemove[] = "canRemove";
const char kKeyIsOwner[] = "isOwner";
Expand Down Expand Up @@ -661,9 +659,6 @@ void UserManagerScreenHandler::GetLocalizedValues(
localized_strings->SetString("cancel", l10n_util::GetStringUTF16(IDS_CANCEL));
localized_strings->SetString(
"browseAsGuest", l10n_util::GetStringUTF16(IDS_BROWSE_AS_GUEST_BUTTON));
// TODO(crbug/1164090): Remove this.
localized_strings->SetString("addSupervisedUser",
l10n_util::GetStringUTF16(IDS_CREATE_LEGACY_SUPERVISED_USER_MENU_LABEL));

// For AccountPickerScreen.
localized_strings->SetString("screenType", "login-add-user");
Expand Down Expand Up @@ -704,12 +699,6 @@ void UserManagerScreenHandler::GetLocalizedValues(
localized_strings->SetString(
"removeUserWarningTextSync",
l10n_util::GetStringUTF16(IDS_LOGIN_POD_USER_REMOVE_WARNING_SYNC));
// TODO(crbug/1164090): Remove this.
localized_strings->SetString("removeLegacySupervisedUserWarningText",
l10n_util::GetStringFUTF16(
IDS_LOGIN_POD_LEGACY_SUPERVISED_USER_REMOVE_WARNING,
base::UTF8ToUTF16(
chrome::kLegacySupervisedUserManagementDisplayURL)));
localized_strings->SetString(
"removeNonOwnerUserWarningText",
l10n_util::GetStringUTF16(IDS_LOGIN_POD_NON_OWNER_USER_REMOVE_WARNING));
Expand Down Expand Up @@ -806,9 +795,6 @@ void UserManagerScreenHandler::SendUserList() {
profiles::GetAvatarNameForProfile(profile_path));
profile_value->SetKey(kKeyProfilePath, util::FilePathToValue(profile_path));
profile_value->SetBoolean(kKeyPublicAccount, false);
// TODO(crbug/1164090): Remove this.
profile_value->SetBoolean(kKeyLegacySupervisedUser,
entry->IsLegacySupervised());
profile_value->SetBoolean(kKeyChildUser, entry->IsChild());
profile_value->SetBoolean(kKeyNeedsSignin, entry->IsSigninRequired());
profile_value->SetBoolean(kKeyHasLocalCreds,
Expand Down
3 changes: 0 additions & 3 deletions chrome/common/url_constants.cc
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,6 @@ const char kGooglePhotosURL[] = "https://photos.google.com";
const char kLearnMoreReportingURL[] =
"https://support.google.com/chrome/?p=ui_usagestat";

const char kLegacySupervisedUserManagementDisplayURL[] =
"www.chrome.com/manage";

const char kManagedUiLearnMoreUrl[] =
#if BUILDFLAG(IS_CHROMEOS_ASH)
"https://support.google.com/chromebook/?p=is_chrome_managed";
Expand Down
5 changes: 0 additions & 5 deletions chrome/common/url_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,6 @@ extern const char kGooglePhotosURL[];
// first run dialog.
extern const char kLearnMoreReportingURL[];

// Management URL for Chrome Supervised Users - version without scheme, used
// for display.
// TODO(crbug/1164090): Remove this.
extern const char kLegacySupervisedUserManagementDisplayURL[];

// The URL for the Learn More page about policies and enterprise enrollment.
extern const char kManagedUiLearnMoreUrl[];

Expand Down
1 change: 1 addition & 0 deletions components/user_manager/user_manager_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ void UserManagerBase::UserLoggedIn(const AccountId& account_id,
user ? user : User::CreatePublicAccountUser(account_id));
break;

// TODO(crbug/1155729): Remove this case.
case USER_TYPE_SUPERVISED_DEPRECATED:
NOTREACHED() << "Supervised users are not supported anymore";
break;
Expand Down
Loading

0 comments on commit 66a6bb3

Please sign in to comment.