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 X-Spam-Level: X-Spam-Status: No, score=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5AA04C07E9C for ; Wed, 14 Jul 2021 11:01:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 43BF6613A9 for ; Wed, 14 Jul 2021 11:01:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238836AbhGNLEX (ORCPT ); Wed, 14 Jul 2021 07:04:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41816 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231161AbhGNLET (ORCPT ); Wed, 14 Jul 2021 07:04:19 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75AF9C061764 for ; Wed, 14 Jul 2021 04:01:28 -0700 (PDT) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1m3cdh-00038r-J8; Wed, 14 Jul 2021 13:01:17 +0200 Subject: Re: [PATCH 1/3] crypto: mxs-dcp: Add support for hardware provided keys To: Richard Weinberger Cc: "open list, ASYMMETRIC KEYS" , david , David Howells , davem , festevam , Herbert Xu , James Bottomley , James Morris , Jarkko Sakkinen , Jonathan Corbet , linux-arm-kernel , Linux Crypto Mailing List , Linux Doc Mailing List , linux-integrity , linux-kernel , LSM , Mimi Zohar , linux-imx , kernel , Sascha Hauer , "Serge E. Hallyn" , shawnguo References: <20210614201620.30451-1-richard@nod.at> <20210614201620.30451-2-richard@nod.at> <76db3736-5a5f-bf7b-3b52-62d01a84ee2d@pengutronix.de> <1409091619.25467.1626259183269.JavaMail.zimbra@nod.at> From: Ahmad Fatoum Message-ID: Date: Wed, 14 Jul 2021 13:01:11 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <1409091619.25467.1626259183269.JavaMail.zimbra@nod.at> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: a.fatoum@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-crypto@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Hi, On 14.07.21 12:39, Richard Weinberger wrote: > Ahmad, > > ----- Ursprüngliche Mail ----- >> Von: "Ahmad Fatoum" >> Let's trade reviews to get the ball rolling? > > Sounds like a fair deal. :-) :) > [...] > >>> --- a/drivers/crypto/mxs-dcp.c >>> +++ b/drivers/crypto/mxs-dcp.c >>> @@ -15,6 +15,7 @@ >>> #include >>> #include >>> #include >>> +#include >> >> The CAAM specific headers are in . >> Should this be done likewise here as well? > > I have no preferences. If soc/fsl/ is the way to go, fine by me. I think it's the more appropriate place, but if the maintainers are fine with , I don't mind. > > [...] > >>> @@ -219,15 +224,18 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx, >>> struct dcp *sdcp = global_sdcp; >>> struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan]; >>> struct dcp_aes_req_ctx *rctx = skcipher_request_ctx(req); >>> + dma_addr_t src_phys, dst_phys, key_phys = {0}; >> >> Why = {0}; ? dma_addr_t is a scalar type and the value is always >> written here before access. > > Initializing a scalar with {} is allowed in C, the braces are optional. > I like the braces because it works even when the underlaying type changes. > But that's just a matter of taste. > > key_phys is initialized because it triggered a false positive gcc warning > on one of my targets. Let me re-run again to be sure, the code saw a lot of > refactoring since that. > > [...] > >>> +static int mxs_dcp_aes_setrefkey(struct crypto_skcipher *tfm, const u8 *key, >>> + unsigned int len) >>> +{ >>> + struct dcp_async_ctx *actx = crypto_skcipher_ctx(tfm); >>> + int ret = -EINVAL; >>> + >>> + if (len != DCP_PAES_KEYSIZE) >>> + goto out; >> >> Nitpick: there is no cleanup, so why not return -EINVAL here >> and unconditionally return 0 below? > > What is the benefit? Similar to why you wouldn't write: if (len == DCP_PAES_KEYSIZE) { /* longer code block */ } return ret; Code is easier to scan through with early-exits. > Usually I try to use goto to have a single exit point of a function > but I don't have a strong preference... It's just a nitpick. I am fine with it either way. >>> + >>> + actx->key_len = len; >>> + actx->refkey = true; >>> + >>> + switch (key[0]) { >>> + case DCP_PAES_KEY_SLOT0: >>> + case DCP_PAES_KEY_SLOT1: >>> + case DCP_PAES_KEY_SLOT2: >>> + case DCP_PAES_KEY_SLOT3: >>> + case DCP_PAES_KEY_UNIQUE: >>> + case DCP_PAES_KEY_OTP: >>> + memcpy(actx->key, key, len); >>> + ret = 0; >>> + } >> >> In the error case you return -EINVAL below, but you still write >> into actx. Is that intentional? > > You mean acts->key_len and actk->refkey? > Is this a problem? It's easier to reason about code when it doesn't leave objects it operates on in invalid states on failure. Changing key_len, but leaving actx->key uninitialized is surprising IMO. I can't judge whether this is a problem in practice, but less surprises are a worthwhile goal. Cheers, Ahmad > > Thanks, > //richard > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | 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 X-Spam-Level: X-Spam-Status: No, score=-10.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D78BC07E9A for ; Wed, 14 Jul 2021 11:03:20 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 5B5BB61279 for ; Wed, 14 Jul 2021 11:03:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5B5BB61279 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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:MIME-Version:Date: Message-ID:From:References:Cc:To:Subject:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Bnspc5MTpMxSwIMGipyB8wXOzn9MIxQTnlfemk+t2XE=; b=JL+rDZ9SJMDFwpoQdrmPrTlOIK knhw5M+4VHaEzrUhIcItGIcEMaxv9fojMMHa6lHmKn/ZfALBJWacmgAVuA+oxPsvaXaSDMiUbMC6w CdwrFyY2w2PMlFQjlSbPNbjUpodZd3m3xDuP/E7CUKjDmMbyJwt2qpr6NtvpGjQdKYoy+a6w6y7hU di0N+Tgy78KzUEA+M97iXb7SBm/26qTCB4SqhnY2Q0ygP56S9eiTwzCS9wzk+7qcYhoEMiqov7R+l mxUfxVFaTxQDlrTY8eH4Z18TSkcNhtToTKdD2w6qifklbir+H/u2eFRbR/1qFDvuUPYzJA580aYmV +qaM0n3Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m3cdy-00DGrG-S0; Wed, 14 Jul 2021 11:01:35 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m3cdu-00DGqT-Me for linux-arm-kernel@lists.infradead.org; Wed, 14 Jul 2021 11:01:32 +0000 Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1m3cdh-00038r-J8; Wed, 14 Jul 2021 13:01:17 +0200 Subject: Re: [PATCH 1/3] crypto: mxs-dcp: Add support for hardware provided keys To: Richard Weinberger Cc: "open list, ASYMMETRIC KEYS" , david , David Howells , davem , festevam , Herbert Xu , James Bottomley , James Morris , Jarkko Sakkinen , Jonathan Corbet , linux-arm-kernel , Linux Crypto Mailing List , Linux Doc Mailing List , linux-integrity , linux-kernel , LSM , Mimi Zohar , linux-imx , kernel , Sascha Hauer , "Serge E. Hallyn" , shawnguo References: <20210614201620.30451-1-richard@nod.at> <20210614201620.30451-2-richard@nod.at> <76db3736-5a5f-bf7b-3b52-62d01a84ee2d@pengutronix.de> <1409091619.25467.1626259183269.JavaMail.zimbra@nod.at> From: Ahmad Fatoum Message-ID: Date: Wed, 14 Jul 2021 13:01:11 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <1409091619.25467.1626259183269.JavaMail.zimbra@nod.at> Content-Language: en-US X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: a.fatoum@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210714_040130_783825_C7514FF1 X-CRM114-Status: GOOD ( 35.66 ) 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 SGksCgpPbiAxNC4wNy4yMSAxMjozOSwgUmljaGFyZCBXZWluYmVyZ2VyIHdyb3RlOgo+IEFobWFk LAo+IAo+IC0tLS0tIFVyc3Byw7xuZ2xpY2hlIE1haWwgLS0tLS0KPj4gVm9uOiAiQWhtYWQgRmF0 b3VtIiA8YS5mYXRvdW1AcGVuZ3V0cm9uaXguZGU+Cj4+IExldCdzIHRyYWRlIHJldmlld3MgdG8g Z2V0IHRoZSBiYWxsIHJvbGxpbmc/Cj4gCj4gU291bmRzIGxpa2UgYSBmYWlyIGRlYWwuIDotKQoK OikKCj4gWy4uLl0KPiAKPj4+IC0tLSBhL2RyaXZlcnMvY3J5cHRvL214cy1kY3AuYwo+Pj4gKysr IGIvZHJpdmVycy9jcnlwdG8vbXhzLWRjcC5jCj4+PiBAQCAtMTUsNiArMTUsNyBAQAo+Pj4gICNp bmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPj4+ICAjaW5jbHVkZSA8bGludXgvc3Rt cF9kZXZpY2UuaD4KPj4+ICAjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4+PiArI2luY2x1ZGUgPGxp bnV4L214cy1kY3AuaD4KPj4KPj4gVGhlIENBQU0gc3BlY2lmaWMgaGVhZGVycyBhcmUgaW4gPHNv Yy9mc2wvKi5oPi4KPj4gU2hvdWxkIHRoaXMgYmUgZG9uZSBsaWtld2lzZSBoZXJlIGFzIHdlbGw/ Cj4gCj4gSSBoYXZlIG5vIHByZWZlcmVuY2VzLiBJZiBzb2MvZnNsLyBpcyB0aGUgd2F5IHRvIGdv LCBmaW5lIGJ5IG1lLgoKSSB0aGluayBpdCdzIHRoZSBtb3JlIGFwcHJvcHJpYXRlIHBsYWNlLCBi dXQgaWYgdGhlIG1haW50YWluZXJzCmFyZSBmaW5lIHdpdGggPGxpbnV4L214cy1kY3AuaD4sIEkg ZG9uJ3QgbWluZC4KCj4gCj4gWy4uLl0KPiAKPj4+IEBAIC0yMTksMTUgKzIyNCwxOCBAQCBzdGF0 aWMgaW50IG14c19kY3BfcnVuX2FlcyhzdHJ1Y3QgZGNwX2FzeW5jX2N0eCAqYWN0eCwKPj4+ICAJ c3RydWN0IGRjcCAqc2RjcCA9IGdsb2JhbF9zZGNwOwo+Pj4gIAlzdHJ1Y3QgZGNwX2RtYV9kZXNj ICpkZXNjID0gJnNkY3AtPmNvaC0+ZGVzY1thY3R4LT5jaGFuXTsKPj4+ICAJc3RydWN0IGRjcF9h ZXNfcmVxX2N0eCAqcmN0eCA9IHNrY2lwaGVyX3JlcXVlc3RfY3R4KHJlcSk7Cj4+PiArCWRtYV9h ZGRyX3Qgc3JjX3BoeXMsIGRzdF9waHlzLCBrZXlfcGh5cyA9IHswfTsKPj4KPj4gV2h5ID0gezB9 OyA/IGRtYV9hZGRyX3QgaXMgYSBzY2FsYXIgdHlwZSBhbmQgdGhlIHZhbHVlIGlzIGFsd2F5cwo+ PiB3cml0dGVuIGhlcmUgYmVmb3JlIGFjY2Vzcy4KPiAKPiBJbml0aWFsaXppbmcgYSBzY2FsYXIg d2l0aCB7fSBpcyBhbGxvd2VkIGluIEMsIHRoZSBicmFjZXMgYXJlIG9wdGlvbmFsLgo+IEkgbGlr ZSB0aGUgYnJhY2VzIGJlY2F1c2UgaXQgd29ya3MgZXZlbiB3aGVuIHRoZSB1bmRlcmxheWluZyB0 eXBlIGNoYW5nZXMuCj4gQnV0IHRoYXQncyBqdXN0IGEgbWF0dGVyIG9mIHRhc3RlLgo+IAo+IGtl eV9waHlzIGlzIGluaXRpYWxpemVkIGJlY2F1c2UgaXQgdHJpZ2dlcmVkIGEgZmFsc2UgcG9zaXRp dmUgZ2NjIHdhcm5pbmcKPiBvbiBvbmUgb2YgbXkgdGFyZ2V0cy4gTGV0IG1lIHJlLXJ1biBhZ2Fp biB0byBiZSBzdXJlLCB0aGUgY29kZSBzYXcgYSBsb3Qgb2YKPiByZWZhY3RvcmluZyBzaW5jZSB0 aGF0Lgo+ICAKPiBbLi4uXQo+ICAgCj4+PiArc3RhdGljIGludCBteHNfZGNwX2Flc19zZXRyZWZr ZXkoc3RydWN0IGNyeXB0b19za2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAo+Pj4gKwkJCQkg dW5zaWduZWQgaW50IGxlbikKPj4+ICt7Cj4+PiArCXN0cnVjdCBkY3BfYXN5bmNfY3R4ICphY3R4 ID0gY3J5cHRvX3NrY2lwaGVyX2N0eCh0Zm0pOwo+Pj4gKwlpbnQgcmV0ID0gLUVJTlZBTDsKPj4+ ICsKPj4+ICsJaWYgKGxlbiAhPSBEQ1BfUEFFU19LRVlTSVpFKQo+Pj4gKwkJZ290byBvdXQ7Cj4+ Cj4+IE5pdHBpY2s6IHRoZXJlIGlzIG5vIGNsZWFudXAsIHNvIHdoeSBub3QgcmV0dXJuIC1FSU5W QUwgaGVyZQo+PiBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybiAwIGJlbG93Pwo+IAo+IFdoYXQg aXMgdGhlIGJlbmVmaXQ/CgpTaW1pbGFyIHRvIHdoeSB5b3Ugd291bGRuJ3Qgd3JpdGU6IAoKICBp ZiAobGVuID09IERDUF9QQUVTX0tFWVNJWkUpIHsgCiAgCS8qIGxvbmdlciBjb2RlIGJsb2NrICov CiAgfQoKICByZXR1cm4gcmV0OwoKQ29kZSBpcyBlYXNpZXIgdG8gc2NhbiB0aHJvdWdoIHdpdGgg ZWFybHktZXhpdHMuCgo+IFVzdWFsbHkgSSB0cnkgdG8gdXNlIGdvdG8gdG8gaGF2ZSBhIHNpbmds ZSBleGl0IHBvaW50IG9mIGEgZnVuY3Rpb24KPiBidXQgSSBkb24ndCBoYXZlIGEgc3Ryb25nIHBy ZWZlcmVuY2UuLi4KCkl0J3MganVzdCBhIG5pdHBpY2suIEkgYW0gZmluZSB3aXRoIGl0IGVpdGhl ciB3YXkuCgo+Pj4gKwo+Pj4gKwlhY3R4LT5rZXlfbGVuID0gbGVuOwo+Pj4gKwlhY3R4LT5yZWZr ZXkgPSB0cnVlOwo+Pj4gKwo+Pj4gKwlzd2l0Y2ggKGtleVswXSkgewo+Pj4gKwljYXNlIERDUF9Q QUVTX0tFWV9TTE9UMDoKPj4+ICsJY2FzZSBEQ1BfUEFFU19LRVlfU0xPVDE6Cj4+PiArCWNhc2Ug RENQX1BBRVNfS0VZX1NMT1QyOgo+Pj4gKwljYXNlIERDUF9QQUVTX0tFWV9TTE9UMzoKPj4+ICsJ Y2FzZSBEQ1BfUEFFU19LRVlfVU5JUVVFOgo+Pj4gKwljYXNlIERDUF9QQUVTX0tFWV9PVFA6Cj4+ PiArCQltZW1jcHkoYWN0eC0+a2V5LCBrZXksIGxlbik7Cj4+PiArCQlyZXQgPSAwOwo+Pj4gKwl9 Cj4+Cj4+IEluIHRoZSBlcnJvciBjYXNlIHlvdSByZXR1cm4gLUVJTlZBTCBiZWxvdywgYnV0IHlv dSBzdGlsbCB3cml0ZQo+PiBpbnRvIGFjdHguIElzIHRoYXQgaW50ZW50aW9uYWw/Cj4gCj4gWW91 IG1lYW4gYWN0cy0+a2V5X2xlbiBhbmQgYWN0ay0+cmVma2V5Pwo+IElzIHRoaXMgYSBwcm9ibGVt PwoKSXQncyBlYXNpZXIgdG8gcmVhc29uIGFib3V0IGNvZGUgd2hlbiBpdCBkb2Vzbid0IGxlYXZl IG9iamVjdHMKaXQgb3BlcmF0ZXMgb24gaW4gaW52YWxpZCBzdGF0ZXMgb24gZmFpbHVyZS4gQ2hh bmdpbmcga2V5X2xlbiwKYnV0IGxlYXZpbmcgYWN0eC0+a2V5IHVuaW5pdGlhbGl6ZWQgaXMgc3Vy cHJpc2luZyBJTU8uCgpJIGNhbid0IGp1ZGdlIHdoZXRoZXIgdGhpcyBpcyBhIHByb2JsZW0gaW4g cHJhY3RpY2UsIGJ1dCBsZXNzCnN1cnByaXNlcyBhcmUgYSB3b3J0aHdoaWxlIGdvYWwuCgpDaGVl cnMsCkFobWFkCgo+IAo+IFRoYW5rcywKPiAvL3JpY2hhcmQKPiAKCgotLSAKUGVuZ3V0cm9uaXgg ZS5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwKU3RldWVyd2FsZGVyIFN0ci4gMjEgICAgICAgICAgICAgICAgICAgICAgIHwgaHR0cDov L3d3dy5wZW5ndXRyb25peC5kZS8gIHwKMzExMzcgSGlsZGVzaGVpbSwgR2VybWFueSAgICAgICAg ICAgICAgICAgIHwgUGhvbmU6ICs0OS01MTIxLTIwNjkxNy0wICAgIHwKQW10c2dlcmljaHQgSGls ZGVzaGVpbSwgSFJBIDI2ODYgICAgICAgICAgIHwgRmF4OiAgICs0OS01MTIxLTIwNjkxNy01NTU1 IHwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK