From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6052C7D3F4; Thu, 18 Apr 2024 13:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713446243; cv=none; b=EsQFAWHkweGWbENOO8ElD1q8db0dJWcRXALxVZYr0QKJp3TD9brE08PqIC1rDrjuVsWP7Vp0IiNLxGU08Eafp3hbEB5g+7fiO5DuneRaksK9EmhK04ANnDqGJNBNR4Sz/2C7o9TA3xAuaPcmHfoMkv0FGft0rz0pqgUhsXIJp80= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713446243; c=relaxed/simple; bh=JwQ6WKAgwkgGDjlwTjWbko4n+LA0bmKAxcEWpDK1XLo=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=Rpaix53Ro6RmvASn0VLuJFRCxAUAgk07WFGQlGWB/rQ7PvnSf4sOiBYs5mCg1Mgxx0CG9PMhkXBrJU9cxdss90TrnFEBeu+r64qnN6O3ATrBtKxwUDRDwgvVrxtxiQwJbKyavt7E426yQWYA5Lz7p7y76dTFTZ2wtcKF2Y8cyiw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 97EC8339; Thu, 18 Apr 2024 06:17:48 -0700 (PDT) Received: from [10.1.35.34] (e122027.cambridge.arm.com [10.1.35.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DAEDF3F738; Thu, 18 Apr 2024 06:17:16 -0700 (PDT) Message-ID: Date: Thu, 18 Apr 2024 14:17:14 +0100 Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 04/43] arm64: RME: Handle Granule Protection Faults (GPFs) To: Suzuki K Poulose , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> <20240412084309.1733783-5-steven.price@arm.com> From: Steven Price Content-Language: en-GB In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 16/04/2024 12:17, Suzuki K Poulose wrote: > On 12/04/2024 09:42, Steven Price wrote: >> If the host attempts to access granules that have been delegated for use >> in a realm these accesses will be caught and will trigger a Granule >> Protection Fault (GPF). >> >> A fault during a page walk signals a bug in the kernel and is handled by >> oopsing the kernel. A non-page walk fault could be caused by user space >> having access to a page which has been delegated to the kernel and will >> trigger a SIGBUS to allow debugging why user space is trying to access a >> delegated page. >> >> Signed-off-by: Steven Price >> --- >>   arch/arm64/mm/fault.c | 29 ++++++++++++++++++++++++----- >>   1 file changed, 24 insertions(+), 5 deletions(-) >> >> diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c >> index 8251e2fea9c7..91da0f446dd9 100644 >> --- a/arch/arm64/mm/fault.c >> +++ b/arch/arm64/mm/fault.c >> @@ -765,6 +765,25 @@ static int do_tag_check_fault(unsigned long far, >> unsigned long esr, >>       return 0; >>   } >>   +static int do_gpf_ptw(unsigned long far, unsigned long esr, struct >> pt_regs *regs) >> +{ >> +    const struct fault_info *inf = esr_to_fault_info(esr); >> + >> +    die_kernel_fault(inf->name, far, esr, regs); >> +    return 0; >> +} >> + >> +static int do_gpf(unsigned long far, unsigned long esr, struct >> pt_regs *regs) >> +{ >> +    const struct fault_info *inf = esr_to_fault_info(esr); >> + >> +    if (!is_el1_instruction_abort(esr) && fixup_exception(regs)) >> +        return 0; >> + >> +    arm64_notify_die(inf->name, regs, inf->sig, inf->code, far, esr); >> +    return 0; >> +} >> + >>   static const struct fault_info fault_info[] = { >>       { do_bad,        SIGKILL, SI_KERNEL,    "ttbr address size >> fault"    }, >>       { do_bad,        SIGKILL, SI_KERNEL,    "level 1 address size >> fault"    }, >> @@ -802,11 +821,11 @@ static const struct fault_info fault_info[] = { >>       { do_alignment_fault,    SIGBUS,  BUS_ADRALN,    "alignment >> fault"        }, >>       { do_bad,        SIGKILL, SI_KERNEL,    "unknown 34"            }, >>       { do_bad,        SIGKILL, SI_KERNEL,    "unknown 35"            }, > > Should this also be converted to do_gpf_ptw, "GPF at level -1", given we > support LPA2 ? Ah, yes I somehow missed that. Although something has gone majorly wrong if this triggers! ;) Steve >> -    { do_bad,        SIGKILL, SI_KERNEL,    "unknown 36"            }, >> -    { do_bad,        SIGKILL, SI_KERNEL,    "unknown 37"            }, >> -    { do_bad,        SIGKILL, SI_KERNEL,    "unknown 38"            }, >> -    { do_bad,        SIGKILL, SI_KERNEL,    "unknown 39"            }, >> -    { do_bad,        SIGKILL, SI_KERNEL,    "unknown 40"            }, >> +    { do_gpf_ptw,        SIGKILL, SI_KERNEL,    "Granule Protection >> Fault at level 0" }, >> +    { do_gpf_ptw,        SIGKILL, SI_KERNEL,    "Granule Protection >> Fault at level 1" }, >> +    { do_gpf_ptw,        SIGKILL, SI_KERNEL,    "Granule Protection >> Fault at level 2" }, >> +    { do_gpf_ptw,        SIGKILL, SI_KERNEL,    "Granule Protection >> Fault at level 3" }, >> +    { do_gpf,        SIGBUS,  SI_KERNEL,    "Granule Protection Fault >> not on table walk" }, >>       { do_bad,        SIGKILL, SI_KERNEL,    "level -1 address size >> fault"    }, >>       { do_bad,        SIGKILL, SI_KERNEL,    "unknown 42"            }, >>       { do_translation_fault,    SIGSEGV, SEGV_MAPERR,    "level -1 >> translation fault"    }, > > > Rest looks fine to me. > > Suzuki From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 603CFC04FF8 for ; Thu, 18 Apr 2024 13:17:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=THJmDDH5v4BbXQ0hF+zXvCGA2K4L1/z+eK1CJw4zudQ=; b=w9UI8nrTz8KlFc iJ164QQcwYYlk6boUEFewd6uqWD+cIMxYP9QxCMB4eopNRpHTJC3+XMDi/ZSX65a6kPtnxFC4OsI3 hnOYfdn3vcLP6b+rg5sg3Xw8gOEluE30WzENgMeIwR+sfy1ExUCPEkN29bps1VHPuQgbvTexi7Udg 8Uzau0exJdrloD1HXJxpIJ+mkZlbuZJbw4s2iUJY3zFtxojxfmxRcEnKWdvl3lqdEWqKysEYcpfCJ Lu1lLihjCdifA7rk9sGVPz1VKXdyzCMrumEKhbtfouxxdkGY+J4H3dDQAAf0WY9mT9Gob9KNT7fpD QmQn+i6Y2sPM9dneWLoQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxRdt-00000002L8C-35Zq; Thu, 18 Apr 2024 13:17:33 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxRdl-00000002L6U-2fX0 for linux-arm-kernel@lists.infradead.org; Thu, 18 Apr 2024 13:17:32 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 97EC8339; Thu, 18 Apr 2024 06:17:48 -0700 (PDT) Received: from [10.1.35.34] (e122027.cambridge.arm.com [10.1.35.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DAEDF3F738; Thu, 18 Apr 2024 06:17:16 -0700 (PDT) Message-ID: Date: Thu, 18 Apr 2024 14:17:14 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 04/43] arm64: RME: Handle Granule Protection Faults (GPFs) To: Suzuki K Poulose , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> <20240412084309.1733783-5-steven.price@arm.com> From: Steven Price Content-Language: en-GB In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240418_061726_245235_6A5AEB2A X-CRM114-Status: GOOD ( 17.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMTYvMDQvMjAyNCAxMjoxNywgU3V6dWtpIEsgUG91bG9zZSB3cm90ZToKPiBPbiAxMi8wNC8y MDI0IDA5OjQyLCBTdGV2ZW4gUHJpY2Ugd3JvdGU6Cj4+IElmIHRoZSBob3N0IGF0dGVtcHRzIHRv IGFjY2VzcyBncmFudWxlcyB0aGF0IGhhdmUgYmVlbiBkZWxlZ2F0ZWQgZm9yIHVzZQo+PiBpbiBh IHJlYWxtIHRoZXNlIGFjY2Vzc2VzIHdpbGwgYmUgY2F1Z2h0IGFuZCB3aWxsIHRyaWdnZXIgYSBH cmFudWxlCj4+IFByb3RlY3Rpb24gRmF1bHQgKEdQRikuCj4+Cj4+IEEgZmF1bHQgZHVyaW5nIGEg cGFnZSB3YWxrIHNpZ25hbHMgYSBidWcgaW4gdGhlIGtlcm5lbCBhbmQgaXMgaGFuZGxlZCBieQo+ PiBvb3BzaW5nIHRoZSBrZXJuZWwuIEEgbm9uLXBhZ2Ugd2FsayBmYXVsdCBjb3VsZCBiZSBjYXVz ZWQgYnkgdXNlciBzcGFjZQo+PiBoYXZpbmcgYWNjZXNzIHRvIGEgcGFnZSB3aGljaCBoYXMgYmVl biBkZWxlZ2F0ZWQgdG8gdGhlIGtlcm5lbCBhbmQgd2lsbAo+PiB0cmlnZ2VyIGEgU0lHQlVTIHRv IGFsbG93IGRlYnVnZ2luZyB3aHkgdXNlciBzcGFjZSBpcyB0cnlpbmcgdG8gYWNjZXNzIGEKPj4g ZGVsZWdhdGVkIHBhZ2UuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFN0ZXZlbiBQcmljZSA8c3RldmVu LnByaWNlQGFybS5jb20+Cj4+IC0tLQo+PiDCoCBhcmNoL2FybTY0L21tL2ZhdWx0LmMgfCAyOSAr KysrKysrKysrKysrKysrKysrKysrKystLS0tLQo+PiDCoCAxIGZpbGUgY2hhbmdlZCwgMjQgaW5z ZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv bW0vZmF1bHQuYyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwo+PiBpbmRleCA4MjUxZTJmZWE5Yzcu LjkxZGEwZjQ0NmRkOSAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02NC9tbS9mYXVsdC5jCj4+ICsr KyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwo+PiBAQCAtNzY1LDYgKzc2NSwyNSBAQCBzdGF0aWMg aW50IGRvX3RhZ19jaGVja19mYXVsdCh1bnNpZ25lZCBsb25nIGZhciwKPj4gdW5zaWduZWQgbG9u ZyBlc3IsCj4+IMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgK3N0YXRpYyBpbnQg ZG9fZ3BmX3B0dyh1bnNpZ25lZCBsb25nIGZhciwgdW5zaWduZWQgbG9uZyBlc3IsIHN0cnVjdAo+ PiBwdF9yZWdzICpyZWdzKQo+PiArewo+PiArwqDCoMKgIGNvbnN0IHN0cnVjdCBmYXVsdF9pbmZv ICppbmYgPSBlc3JfdG9fZmF1bHRfaW5mbyhlc3IpOwo+PiArCj4+ICvCoMKgwqAgZGllX2tlcm5l bF9mYXVsdChpbmYtPm5hbWUsIGZhciwgZXNyLCByZWdzKTsKPj4gK8KgwqDCoCByZXR1cm4gMDsK Pj4gK30KPj4gKwo+PiArc3RhdGljIGludCBkb19ncGYodW5zaWduZWQgbG9uZyBmYXIsIHVuc2ln bmVkIGxvbmcgZXNyLCBzdHJ1Y3QKPj4gcHRfcmVncyAqcmVncykKPj4gK3sKPj4gK8KgwqDCoCBj b25zdCBzdHJ1Y3QgZmF1bHRfaW5mbyAqaW5mID0gZXNyX3RvX2ZhdWx0X2luZm8oZXNyKTsKPj4g Kwo+PiArwqDCoMKgIGlmICghaXNfZWwxX2luc3RydWN0aW9uX2Fib3J0KGVzcikgJiYgZml4dXBf ZXhjZXB0aW9uKHJlZ3MpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4gK8Kg wqDCoCBhcm02NF9ub3RpZnlfZGllKGluZi0+bmFtZSwgcmVncywgaW5mLT5zaWcsIGluZi0+Y29k ZSwgZmFyLCBlc3IpOwo+PiArwqDCoMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+IMKgIHN0YXRp YyBjb25zdCBzdHJ1Y3QgZmF1bHRfaW5mbyBmYXVsdF9pbmZvW10gPSB7Cj4+IMKgwqDCoMKgwqAg eyBkb19iYWQswqDCoMKgwqDCoMKgwqAgU0lHS0lMTCwgU0lfS0VSTkVMLMKgwqDCoCAidHRiciBh ZGRyZXNzIHNpemUKPj4gZmF1bHQiwqDCoMKgIH0sCj4+IMKgwqDCoMKgwqAgeyBkb19iYWQswqDC oMKgwqDCoMKgwqAgU0lHS0lMTCwgU0lfS0VSTkVMLMKgwqDCoCAibGV2ZWwgMSBhZGRyZXNzIHNp emUKPj4gZmF1bHQiwqDCoMKgIH0sCj4+IEBAIC04MDIsMTEgKzgyMSwxMSBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IGZhdWx0X2luZm8gZmF1bHRfaW5mb1tdID0gewo+PiDCoMKgwqDCoMKgIHsgZG9f YWxpZ25tZW50X2ZhdWx0LMKgwqDCoCBTSUdCVVMswqAgQlVTX0FEUkFMTizCoMKgwqAgImFsaWdu bWVudAo+PiBmYXVsdCLCoMKgwqDCoMKgwqDCoCB9LAo+PiDCoMKgwqDCoMKgIHsgZG9fYmFkLMKg wqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25vd24gMzQiwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9LAo+PiDCoMKgwqDCoMKgIHsgZG9fYmFkLMKgwqDCoMKgwqDCoMKg IFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25vd24gMzUiwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9LAo+IAo+IFNob3VsZCB0aGlzIGFsc28gYmUgY29udmVydGVkIHRvIGRvX2dwZl9wdHcs ICJHUEYgYXQgbGV2ZWwgLTEiLCBnaXZlbiB3ZQo+IHN1cHBvcnQgTFBBMiA/CgpBaCwgeWVzIEkg c29tZWhvdyBtaXNzZWQgdGhhdC4gQWx0aG91Z2ggc29tZXRoaW5nIGhhcyBnb25lIG1ham9ybHkg d3JvbmcKaWYgdGhpcyB0cmlnZ2VycyEgOykKClN0ZXZlCgo+PiAtwqDCoMKgIHsgZG9fYmFkLMKg wqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25vd24gMzYiwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9LAo+PiAtwqDCoMKgIHsgZG9fYmFkLMKgwqDCoMKgwqDCoMKgIFNJ R0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25vd24gMzciwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB9LAo+PiAtwqDCoMKgIHsgZG9fYmFkLMKgwqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5F TCzCoMKgwqAgInVua25vd24gMzgiwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9LAo+PiAtwqDCoMKg IHsgZG9fYmFkLMKgwqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25v d24gMzkiwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9LAo+PiAtwqDCoMKgIHsgZG9fYmFkLMKgwqDC oMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKgwqAgInVua25vd24gNDAiwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9LAo+PiArwqDCoMKgIHsgZG9fZ3BmX3B0dyzCoMKgwqDCoMKgwqDCoCBT SUdLSUxMLCBTSV9LRVJORUwswqDCoMKgICJHcmFudWxlIFByb3RlY3Rpb24KPj4gRmF1bHQgYXQg bGV2ZWwgMCIgfSwKPj4gK8KgwqDCoCB7IGRvX2dwZl9wdHcswqDCoMKgwqDCoMKgwqAgU0lHS0lM TCwgU0lfS0VSTkVMLMKgwqDCoCAiR3JhbnVsZSBQcm90ZWN0aW9uCj4+IEZhdWx0IGF0IGxldmVs IDEiIH0sCj4+ICvCoMKgwqAgeyBkb19ncGZfcHR3LMKgwqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJ X0tFUk5FTCzCoMKgwqAgIkdyYW51bGUgUHJvdGVjdGlvbgo+PiBGYXVsdCBhdCBsZXZlbCAyIiB9 LAo+PiArwqDCoMKgIHsgZG9fZ3BmX3B0dyzCoMKgwqDCoMKgwqDCoCBTSUdLSUxMLCBTSV9LRVJO RUwswqDCoMKgICJHcmFudWxlIFByb3RlY3Rpb24KPj4gRmF1bHQgYXQgbGV2ZWwgMyIgfSwKPj4g K8KgwqDCoCB7IGRvX2dwZizCoMKgwqDCoMKgwqDCoCBTSUdCVVMswqAgU0lfS0VSTkVMLMKgwqDC oCAiR3JhbnVsZSBQcm90ZWN0aW9uIEZhdWx0Cj4+IG5vdCBvbiB0YWJsZSB3YWxrIiB9LAo+PiDC oMKgwqDCoMKgIHsgZG9fYmFkLMKgwqDCoMKgwqDCoMKgIFNJR0tJTEwsIFNJX0tFUk5FTCzCoMKg wqAgImxldmVsIC0xIGFkZHJlc3Mgc2l6ZQo+PiBmYXVsdCLCoMKgwqAgfSwKPj4gwqDCoMKgwqDC oCB7IGRvX2JhZCzCoMKgwqDCoMKgwqDCoCBTSUdLSUxMLCBTSV9LRVJORUwswqDCoMKgICJ1bmtu b3duIDQyIsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSwKPj4gwqDCoMKgwqDCoCB7IGRvX3RyYW5z bGF0aW9uX2ZhdWx0LMKgwqDCoCBTSUdTRUdWLCBTRUdWX01BUEVSUizCoMKgwqAgImxldmVsIC0x Cj4+IHRyYW5zbGF0aW9uIGZhdWx0IsKgwqDCoCB9LAo+IAo+IAo+IFJlc3QgbG9va3MgZmluZSB0 byBtZS4KPiAKPiBTdXp1a2kKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVs QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==