From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web12.4418.1631175242859591661 for ; Thu, 09 Sep 2021 01:14:03 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=Q25x68oz; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: zhichao.gao@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10101"; a="207952588" X-IronPort-AV: E=Sophos;i="5.85,279,1624345200"; d="scan'208";a="207952588" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Sep 2021 01:14:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,279,1624345200"; d="scan'208";a="430998511" Received: from orsmsx606.amr.corp.intel.com ([10.22.229.19]) by orsmga006.jf.intel.com with ESMTP; 09 Sep 2021 01:14:01 -0700 Received: from orsmsx605.amr.corp.intel.com (10.22.229.18) by ORSMSX606.amr.corp.intel.com (10.22.229.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Thu, 9 Sep 2021 01:14:01 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx605.amr.corp.intel.com (10.22.229.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12 via Frontend Transport; Thu, 9 Sep 2021 01:14:01 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.173) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.12; Thu, 9 Sep 2021 01:14:01 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VoOdav8iQKaS6/OcQIgdF+dRe6m9mJsOANTm6wIfBSZgDcBIO3FhPIcWI3R1obxPisej8iSaVkQjFMYgfmz85Zq1v3uLqEncKa+T+7MvkPCN86q+9/FNh3/xi2KRmCjryhgkBIF3sMPcCxZTEt2YysJmXHjj5SR3zJIvk6C9V9cDFnNxffYq78/+pi6Jdi5cdTlZXLNu0tjJekiV5oiUchTxlUNBB5kpuGboeBebXweWrspJZ7UZMhWx4kfTo0MAOlwswznAFZMO2N43IWrBN2Rlm4lrkmB0yrM14uf2FArPuqLvHaTRvAu1mYXwkE18Rj4OeuA7FatZjJMW/aabSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=SF5L6zOzEuBjGG/w5B8gHflC7RTdQ0YVUlWAkeJfHm8=; b=iLMQeO2BAFvR3EvOH8tM50Du4c1+7Bj9UqR14djxYREJNpz+1zmtPpEKqqNekIaEQF7JqN1TD2xARiEMAtHCaJgnak2oyDRtOiXgJ+aDXLu2tTLOjtBK2HwYE1MwfSqw288mWT3bl/aJeC4104EElvgJxiL2yRvHoALRa4yZz92qFLf7FL2qEwYF0yJmc6crvCPI/Rh8gxtF+5CxBwpvdq95ymt0Jtkhh7nnjrfpFN6gVnM5q8mkgWN9SoYl3MRoI3yl73gZbPw/aJjn793onNFNjUw6kbkrBt/Ev3eCQOyAD0AU9NcvENyqfYMoQsPqM9saIhvitQBcBgWO63FBQQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SF5L6zOzEuBjGG/w5B8gHflC7RTdQ0YVUlWAkeJfHm8=; b=Q25x68ozIMP/nYX2msZWOSxzNBX1SaYOISYnFcVAZc2LGUNsbmJw+N05RxeHeOHt6u8f533h2w+JWwE0gd4r+pXWr2d2DnEqVnE0N+vCqrlu+K3ZrGvwky6W4mD3WBur682iFwKx2u1vSRHNqURm1un+MPG3UodIIDafCjPyHtk= Received: from DM4PR11MB5277.namprd11.prod.outlook.com (2603:10b6:5:388::23) by DM6PR11MB4427.namprd11.prod.outlook.com (2603:10b6:5:1db::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.22; Thu, 9 Sep 2021 08:14:00 +0000 Received: from DM4PR11MB5277.namprd11.prod.outlook.com ([fe80::fcab:50dd:7598:3b40]) by DM4PR11MB5277.namprd11.prod.outlook.com ([fe80::fcab:50dd:7598:3b40%5]) with mapi id 15.20.4500.016; Thu, 9 Sep 2021 08:14:00 +0000 From: "Gao, Zhichao" To: "devel@edk2.groups.io" , "Gao, Zhichao" , "Ni, Ray" CC: "Wang, Jian J" , Liming Gao Subject: Re: [edk2-devel] [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the boot description to 72 chars Thread-Topic: [edk2-devel] [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the boot description to 72 chars Thread-Index: AQHXo69pAyIat7X9/kuydzcoMKwMMauYMzaggAAI2FCAAiK1YIAA3BEggAAipKA= Date: Thu, 9 Sep 2021 08:13:59 +0000 Message-ID: References: <20210907061252.2069-1-zhichao.gao@intel.com> <16A312A11F4E487B.29348@groups.io> In-Reply-To: <16A312A11F4E487B.29348@groups.io> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: c41cdedd-38ff-4fc0-ebf3-08d97369c72d x-ms-traffictypediagnostic: DM6PR11MB4427: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8273; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: H8T7k0WWUj/4xGO2KIrxC5lVjugLfsnEOt1BRgc/MJFtWY7P1/fA2Tnd9GYxTCbQ0+XHD8VXIfYwnUD7rW5QCDeHg6YDmes7WJ/kC+k6UGCNiFvloWKG+o9HxUD6ZBkZBFtWMTgAGhHHYBVo/dCjUPSn8f89nmYeoK/ipTaxt1PPr/D5PZUh5BlNHwZepMXXap3+BogixSiK3pITRAAj+9fTWhcfyvHwoSJ8eew4lIOJAI2q1OWxiF8aip94PXimB7+0k1U9TqCi16CnOXYCSPHEG339MhXUMkDT8UETnFeNJvRYUaCp5QgOb5w1Axq1PQ/VI+ICCeaiQyweEKklPmnleNAlvehkSvwwNC0Kz4uObVt5FNZadUkk08ygIlSTyyRobBoHbJUMRnx2Kn1tmoELxv1a8J8Nl8xdHuPmNqf6nGqIKvesiIohkNlj3vompjeMSst5Kpr/Z8BAVCGqsc6BKgMYJEABIHnTHzXeGhRGhJPGMwSU5EJIKdl7rwmuVq/3sjMSv2GsiCye5kSBg1jDGVvC3iYj3zHh5fYI3UX+luXHJF9cquM1Pow9ymEW//u2mJG5WCeEAjph2N/LXQvnrd9F0ZZzvdSO1ORrvpMJk4+RpWw3xkGCum5TEESIzDkA91i86bip3Ajx71E16+FyI+jML3VuhyE5M4G9c6OtaA68YfpESczpLmC9Byt3qGPaX6jYUVyVM54VITFLQIhFujawWmQR3TK8iToOGTNH+/+C2FJUzzPbelRJ5I//MjSYdB5n0SjvjXESCkhVTTE+MPlFhoEyetU/OSjY5xt+ds4jfIHRSViX24XnV49z5MO5YFtHTNTUMU3Cai29Tg== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR11MB5277.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(39860400002)(136003)(366004)(376002)(396003)(2906002)(4326008)(110136005)(55016002)(9686003)(54906003)(71200400001)(316002)(53546011)(52536014)(8676002)(6506007)(76116006)(66946007)(186003)(966005)(8936002)(66476007)(66556008)(122000001)(83380400001)(38100700002)(33656002)(7696005)(86362001)(5660300002)(6636002)(38070700005)(66446008)(26005)(478600001)(64756008);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?8VHS0ZhjPh1KeNTKvXjZvncd3tIomv/qw4ozp1qopZg4B4Xo7IfSjNsWPXr9?= =?us-ascii?Q?UW/xlSGUI3iTnkkXKene2wC7Gwj/cHYPqbe6FZwiJxwjzFSvUw0OSiL0+b+Z?= =?us-ascii?Q?CWDlX6ZwoRj/Tigpj3o4kutoGp10oi3q0DAdcZJtPha/WNL1kLzotbYZVCVV?= =?us-ascii?Q?1lOhb3IJh3FF24iRG+uBfp6t0VnsqMUfPEllKNhFZ53w5FPC6PiwNg/3mH1X?= =?us-ascii?Q?slmJzc5jrNGirOnfO2QL7aTP2OjW4GSxsp1pN5cwvN/sS1O60zmPgngty7ph?= =?us-ascii?Q?ErUhPwgieEMJcHPvxE8E3nN3GKA8ovbVdfWShx7yB1xUgXQePbcbOsIMQYnV?= =?us-ascii?Q?W62/BVL6GyHKHUl1UoMS4/LOCQeHUHb5OBOwFcWawt1nzO667CfJUdELqo3J?= =?us-ascii?Q?twJBT3k3rfNtZ0x4yWGndyBCFJwsG0mYgCiviDcwVROy1MBTeUG++4ecHfp6?= =?us-ascii?Q?HPOKZdqkzXR6XcHHpasPxqdYnzMSNLv5UrcvjIs/r8FxgQ2q9ZnLLct6sduW?= =?us-ascii?Q?FcSycIZsBIBlls8kwHgXie6SCLsqy+RH93FI1kr3WqssO/3bdCxfYyvTpOXx?= =?us-ascii?Q?DUtEU9jjP9cju+Z4EIV8K1oGAe3AEsRvSx9GRRsnSZxQb/VsmtoXBobzIlUH?= =?us-ascii?Q?jPcYjAAxrnda00hpB98CxHMyB3gIrijc3vKUbOQJbgaHOmjxV4nywzoQan9/?= =?us-ascii?Q?RCeGXwwSdlk02RjB39VcHPy2luzgrXJrtvbpi9y3ZlY0SCrUwMbdFCr7ueCk?= =?us-ascii?Q?kMGzZgWUpCRLbiAZwJBD4CzwUkRVm3IdnN7lMACs9BHgixZGwnTT1Pz4ZNG0?= =?us-ascii?Q?24Wc/X9fkhsnNgrAJVctzJwSLnOXLEMHxlZ/+Kv53aimWOpMtUkD7461mZdi?= =?us-ascii?Q?qEvTqnb1XCx0Wwctkrd4GvTpcZwVPBKwQO8F4KkA4dheEM9uEe7rHiBIAG5z?= =?us-ascii?Q?N0BvuAgLcfLrfVp7bYdAVWFqUHrXBI7enpsgYX2ms9RMHh6Affiel9AKzqiV?= =?us-ascii?Q?AMAuuCpzYOZNA8BfDUZ2a87x9HISio3H71KEV2IcvhDJn22Myc6Vs8IzG//Y?= =?us-ascii?Q?8SmUE66V8JbH0K5nGsA6j1ePxqI1vrKW2hnBOhJ1lCgjwH6HEr46LgSoYOga?= =?us-ascii?Q?pSn/Y3KpHekkf2RQVUH7zxJRi953MQAsJnIkt2fw9k8+MXVgj7B8eTtiBjnI?= =?us-ascii?Q?wh2UXEcAjUEaqcFVux1TwRwn84hDxEftFw877tsABWoYXFSEbscOv8pheWR/?= =?us-ascii?Q?Ch69iJtUP8KKiIw7EUrIMEyiYi/vKwQoLdSr8Me/8jppwWnBEUfR/8WemIJ8?= =?us-ascii?Q?jW2U+1CrRZztkvEQGywtDqmq?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5277.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c41cdedd-38ff-4fc0-ebf3-08d97369c72d X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Sep 2021 08:13:59.8737 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Pv80XFRi9fOP05QPwJtY70vUEPSDoOokF8mA/+novb83Q4x4r4LCR1DJyq/wOUk9mYN3Y4gTdNhfwBKRpz6oag== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4427 Return-Path: zhichao.gao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I already sent the V2. But it would have the affection I mention in the Bug= zilla: If just limit it when show it, it would cause the different showing in Setu= p Boot manager page with BootManagerMenu. Thanks, Zhichao > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Gao, > Zhichao > Sent: Thursday, September 9, 2021 2:13 PM > To: Ni, Ray ; devel@edk2.groups.io > Cc: Wang, Jian J ; Liming Gao > > Subject: Re: [edk2-devel] [PATCH] MdeModulePkg/UefiBootManagerLib: Limit > the boot description to 72 chars >=20 > Well. That's another solution to limit the boot option showing in one lin= e. I can > implement this. >=20 > Thanks, > Zhichao >=20 > > -----Original Message----- > > From: Ni, Ray > > Sent: Thursday, September 9, 2021 1:02 AM > > To: Gao, Zhichao ; devel@edk2.groups.io > > Cc: Wang, Jian J ; Liming Gao > > > > Subject: RE: [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the boot > > description to 72 chars > > > > Zhichao, > > I didn't mean to update UI logic to support scrolling. I meant to > > update BM logic to show partial string of boot description. > > > > Thanks, > > Ray > > > > > -----Original Message----- > > > From: Gao, Zhichao > > > Sent: Wednesday, September 8, 2021 10:29 AM > > > To: Ni, Ray ; devel@edk2.groups.io > > > Cc: Wang, Jian J ; Liming Gao > > > > > > Subject: RE: [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the boot > > > description to 72 chars > > > > > > Hi Ray, > > > > > > Agree with you. I used to think of change the display logic of the > > > BM app. But it is not tiny. It need to update the scroll bar > > > definition and one > > more trace for the item string lines. I would prefer to defer it. > > > The limitation of the boot description length is required. I don't > > > know why some USB disk would have a very long serial number string. > > > On my opinion, 72 characters is enough for the boot option. If there > > > is no > > limitation, the boot description can be long enough that one screen > > can not even show one item. > > > 80 * 25 is the minimum mode for most terminal console device. That > > > is why > > I choose it and add the limitation. > > > > > > Thanks, > > > Zhichao > > > > > > > -----Original Message----- > > > > From: Ni, Ray > > > > Sent: Tuesday, September 7, 2021 3:54 PM > > > > To: Gao, Zhichao ; devel@edk2.groups.io > > > > Cc: Wang, Jian J ; Liming Gao > > > > > > > > Subject: RE: [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the > > boot > > > > description to 72 chars > > > > > > > > Zhichao, > > > > The mode 80x25 is platform specific. I don't prefer to update > > > > common logic to have such limitation. > > > > Can you update the UI logic of displaying the boot option list? > > > > > > > > > -----Original Message----- > > > > > From: Gao, Zhichao > > > > > Sent: Tuesday, September 7, 2021 2:13 PM > > > > > To: devel@edk2.groups.io > > > > > Cc: Wang, Jian J ; Liming Gao > > > > > ; Ni, Ray > > > > > Subject: [PATCH] MdeModulePkg/UefiBootManagerLib: Limit the boot > > > > > description to 72 chars > > > > > > > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3590 > > > > > > > > > > The minimum mode is 80*25 which means echo line can have 80 > > > > > charactors and max 25 line on the screen. And the BootManagerMeu > > > > > see each boot option as one line. The BootManagerMenuApp would > > > > > have 2 charactors for draw box and 6 charactors for space. So it > > > > > is better to limit the boot description within 72 charactors. > > > > > > > > > > Cc: Jian J Wang > > > > > Cc: Liming Gao > > > > > Cc: Ray Ni > > > > > Signed-off-by: Zhichao Gao > > > > > --- > > > > > .../Library/UefiBootManagerLib/BmBootDescription.c | 24 > > > > > ++++++++++++++++++---- > > > > > 1 file changed, 20 insertions(+), 4 deletions(-) > > > > > > > > > > diff --git > > > > > a/MdeModulePkg/Library/UefiBootManagerLib/BmBootDescription.c > > > > > b/MdeModulePkg/Library/UefiBootManagerLib/BmBootDescription.c > > > > > index aa891feb17..7260b2a203 100644 > > > > > --- > > a/MdeModulePkg/Library/UefiBootManagerLib/BmBootDescription.c > > > > > +++ > > b/MdeModulePkg/Library/UefiBootManagerLib/BmBootDescription.c > > > > > @@ -1,7 +1,7 @@ > > > > > /** @file > > > > > > > > > > Library functions which relate with boot option description. > > > > > > > > > > > > > > > > > > > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights > > > > > reserved.
> > > > > > > > > > +Copyright (c) 2011 - 2021, Intel Corporation. All rights > > > > > +reserved.
> > > > > > > > > > (C) Copyright 2015 Hewlett Packard Enterprise Development > > > > > LP
> > > > > > > > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > > > > > > > > > > > @@ -14,6 +14,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > #define PRODUCT_IDENTIFICATION_OFFSET 11 > > > > > > > > > > #define PRODUCT_IDENTIFICATION_LENGTH 16 > > > > > > > > > > > > > > > > > > > > +#define MAX_BOOT_DESCRIPTION_LEGNTH 72 > > > > > > > > > > + > > > > > > > > > > CONST UINT16 mBmUsbLangId =3D 0x0409; // English > > > > > > > > > > CHAR16 mBmUefiPrefix[] =3D L"UEFI "; > > > > > > > > > > > > > > > > > > > > @@ -773,6 +775,7 @@ BmGetBootDescription ( > > > > > CHAR16 *DefaultDescription; > > > > > > > > > > CHAR16 *Temp; > > > > > > > > > > UINTN Index; > > > > > > > > > > + UINTN DescriptionLen; > > > > > > > > > > > > > > > > > > > > // > > > > > > > > > > // Firstly get the default boot description > > > > > > > > > > @@ -785,10 +788,23 @@ BmGetBootDescription ( > > > > > // Avoid description confusion between UEFI & Legacy boot > > > > > option by adding "UEFI " prefix > > > > > > > > > > // ONLY for core provided boot description handler. > > > > > > > > > > // > > > > > > > > > > - Temp =3D AllocatePool (StrSize (DefaultDescription) + size= of > > > > (mBmUefiPrefix)); > > > > > > > > > > + if (StrLen (DefaultDescription) + StrLen (mBmUefiPrefix) > > > > > + > > > > > > + MAX_BOOT_DESCRIPTION_LEGNTH) { > > > > > > > > > > + // > > > > > > > > > > + // Limit the MAX length of boot description to 72 charac= tors. > > > > > > > > > > + // Replace the last 3 charactors to L"...". > > > > > > > > > > + // > > > > > > > > > > + DescriptionLen =3D MAX_BOOT_DESCRIPTION_LEGNTH + 1; > > > > > > > > > > + DefaultDescription[MAX_BOOT_DESCRIPTION_LEGNTH - 5 - 3] > > > > > + =3D L'.'; > > > > > > > > > > + DefaultDescription[MAX_BOOT_DESCRIPTION_LEGNTH - 5 - 2] > > > > > + =3D L'.'; > > > > > > > > > > + DefaultDescription[MAX_BOOT_DESCRIPTION_LEGNTH - 5 - 1] > > > > > + =3D L'.'; > > > > > > > > > > + DefaultDescription[MAX_BOOT_DESCRIPTION_LEGNTH - 5] =3D > > > > > + L'\0'; > > > > > > > > > > + } else { > > > > > > > > > > + DescriptionLen =3D (StrSize (DefaultDescription) + sizeo= f > > > > > + (mBmUefiPrefix)) / sizeof (CHAR16); > > > > > > > > > > + } > > > > > > > > > > + Temp =3D AllocatePool (DescriptionLen * sizeof (CHAR16)); > > > > > > > > > > ASSERT (Temp !=3D NULL); > > > > > > > > > > - StrCpyS (Temp, (StrSize (DefaultDescription) + sizeof > > (mBmUefiPrefix)) > > > > / sizeof (CHAR16), mBmUefiPrefix); > > > > > > > > > > - StrCatS (Temp, (StrSize (DefaultDescription) + sizeof > > (mBmUefiPrefix)) > > > > / sizeof (CHAR16), DefaultDescription); > > > > > > > > > > + StrCpyS (Temp, DescriptionLen, mBmUefiPrefix); > > > > > > > > > > + StrCatS (Temp, DescriptionLen, DefaultDescription); > > > > > > > > > > FreePool (DefaultDescription); > > > > > > > > > > DefaultDescription =3D Temp; > > > > > > > > > > break; > > > > > > > > > > -- > > > > > 2.16.2.windows.1 >=20 >=20 >=20 >=20 >=20 >=20