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=-0.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 E6B75C433DF for ; Wed, 17 Jun 2020 19:40:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B5E7420734 for ; Wed, 17 Jun 2020 19:40:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="uTYBzgWi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726597AbgFQTkR (ORCPT ); Wed, 17 Jun 2020 15:40:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51002 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726558AbgFQTkQ (ORCPT ); Wed, 17 Jun 2020 15:40:16 -0400 Received: from mail-ej1-x642.google.com (mail-ej1-x642.google.com [IPv6:2a00:1450:4864:20::642]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5EE23C06174E for ; Wed, 17 Jun 2020 12:40:16 -0700 (PDT) Received: by mail-ej1-x642.google.com with SMTP id w16so3830783ejj.5 for ; Wed, 17 Jun 2020 12:40:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=PzrErsDtCW0fo0/5Z0gDbq30hKL4/dmBDqmjS52gLHg=; b=uTYBzgWii2wzQgZ//qnppAtt96gQW3i1Ovk7UoUSYd5xj3Y0eXpjZclXZ2s5feF+rO JFt0MvSbRwGdtwb5X4nfjWeHamSAlXfZ66ApQq5ZY9NIFnT1fKIcfp/xcjM8rDdTyeHu MLpMn2uqLm9XbzlsAWwVMhq2ZfwOInh2GDfnG7grnNJYpRlL7cuUnYaXR3fGFhJ+cUC8 Fm+NJU8LQ0JoHC7+UCJuyqw7EYox+VuMP1X3uplbQI2gSm0jsyxEwJ8l1a8cW1tzHaTO Ctds8oL3r5dqo7QTEw0x0C/cde0rR54MGy+aWBWX+MVXNGhjcyltnB4cNBapOYPEhKCt JjJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=PzrErsDtCW0fo0/5Z0gDbq30hKL4/dmBDqmjS52gLHg=; b=m2A1GGHIWxZP+/qm2w1TaZat4Rn9Qd06wMvZQcpPuMgUplyyOZOKHTnigmQlfFRHWI VbzYTYOVW2bgMs4MC7McWuJoCWcZhwYh6Q/6menBoLWNJaaNmlOPNtdDbWxhTyg6krCK exEB9zOm/lUOmq/tGv62l7MeUjPVU7RaRtoJU2ZClqoE+Rm0pdFOSUNERg1Uqqiz5OtG wLuKjUKFVu7xkjXptKptxzxLjAk0fYK/BJfl3lFunGMFJV8zxbFBzLs2JqwhQcLIu273 sQQKL99pieEz8NDmGC4YZRKzH/M0511SpxZhaMnqW0TRdtMCbN4ken6oUbrLtfuvDCVW RCtQ== X-Gm-Message-State: AOAM532uHI8sB/RSLAZnbbf77UgsXFukyqX3i6p4s64p2N/t77TZhmJR RBXa+pVRrkBHbLBtmUnTJ3xdxg== X-Google-Smtp-Source: ABdhPJzaWan5qW2Km9JaZBt5R9h9aOC1UapjvqtyojFCv3z+4KLbN7/jXO9gwOfjhZSZUH9hJQ82kg== X-Received: by 2002:a17:906:4056:: with SMTP id y22mr706652ejj.304.1592422815045; Wed, 17 Jun 2020 12:40:15 -0700 (PDT) Received: from localhost (ip-5-186-127-235.cgn.fibianet.dk. [5.186.127.235]) by smtp.gmail.com with ESMTPSA id y62sm362138edy.61.2020.06.17.12.40.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jun 2020 12:40:14 -0700 (PDT) Date: Wed, 17 Jun 2020 21:40:13 +0200 From: Javier =?utf-8?B?R29uesOhbGV6?= To: Matias =?utf-8?B?QmrDuHJsaW5n?= Cc: Matias Bjorling , Christoph Hellwig , Keith Busch , "linux-nvme@lists.infradead.org" , "linux-block@vger.kernel.org" , Damien Le Moal , Sagi Grimberg , Jens Axboe , Hans Holmberg , Dmitry Fomichev , Ajay Joshi , Aravind Ramesh , Niklas Cassel , Judy Brock Subject: Re: [PATCH 5/5] nvme: support for zoned namespaces Message-ID: <20200617194013.3wlz2ajnb6iopd4k@mpHalley.local> References: <20200615233424.13458-1-keith.busch@wdc.com> <20200615233424.13458-6-keith.busch@wdc.com> <20200616104142.zxw25txhsg2eyhsb@mpHalley.local> <20200617074328.GA13474@lst.de> <20200617144230.ojzk4f5gcwqonzrf@mpHalley.localdomain> <20200617182841.jnbxgshi7bawfzls@mpHalley.localdomain> <20200617190901.zpss2lsh6qsu5zuf@mpHalley.local> <1ab101ef-7b74-060f-c2bc-d4c36dec91f0@lightnvm.io> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1ab101ef-7b74-060f-c2bc-d4c36dec91f0@lightnvm.io> Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org On 17.06.2020 21:23, Matias Bjørling wrote: >On 17/06/2020 21.09, Javier González wrote: >>On 17.06.2020 18:55, Matias Bjorling wrote: >>>>-----Original Message----- >>>>From: Javier González >>>>Sent: Wednesday, 17 June 2020 20.29 >>>>To: Matias Bjørling >>>>Cc: Christoph Hellwig ; Keith Busch ; >>>>linux-nvme@lists.infradead.org; linux-block@vger.kernel.org; >>>>Damien Le Moal >>>>; Matias Bjorling ; >>>>Sagi Grimberg ; Jens Axboe ; Hans >>>>Holmberg ; Dmitry Fomichev >>>>; Ajay Joshi ; Aravind >>>>Ramesh ; Niklas Cassel >>>>; Judy Brock >>>>Subject: Re: [PATCH 5/5] nvme: support for zoned namespaces >>>> >>>>On 17.06.2020 19:57, Matias Bjørling wrote: >>>>>On 17/06/2020 16.42, Javier González wrote: >>>>>>On 17.06.2020 09:43, Christoph Hellwig wrote: >>>>>>>On Tue, Jun 16, 2020 at 12:41:42PM +0200, Javier González wrote: >>>>>>>>On 16.06.2020 08:34, Keith Busch wrote: >>>>>>>>>Add support for NVM Express Zoned Namespaces (ZNS) Command Set >>>>>>>>>defined in NVM Express TP4053. Zoned namespaces are discovered >>>>>>>>>based on their Command Set Identifier reported in the namespaces >>>>>>>>>Namespace Identification Descriptor list. A successfully >>>>discovered >>>>>>>>>Zoned Namespace will be registered with the block layer as a host >>>>>>>>>managed zoned block device with Zone Append command support. A >>>>>>>>>namespace that does not support append is not supported by >>>>the driver. >>>>>>>> >>>>>>>>Why are we enforcing the append command? Append is optional on the >>>>>>>>current ZNS specification, so we should not make this mandatory in >>>>>>>>the implementation. See specifics below. >>>>>>> >>>>>>>Because Append is the way to go and we've moved the Linux >>>>zoned block >>>>>>>I/O stack to required it, as should have been obvious to anyone >>>>>>>following linux-block in the last few months.  I also have to >>>>say I'm >>>>>>>really tired of the stupid politics tha your company started in the >>>>>>>NVMe working group, and will say that these do not matter for Linux >>>>>>>development at all.  If you think it is worthwhile to support >>>>devices >>>>>>>without Zone Append you can contribute support for them on top of >>>>>>>this series by porting the SCSI Zone Append Emulation code to NVMe. >>>>>>> >>>>>>>And I'm not even going to read the rest of this thread as I'm on a >>>>>>>vacation that I badly needed because of the Samsung TWG bullshit. >>>>>> >>>>>>My intention is to support some Samsung ZNS devices that will not >>>>>>enable append. I do not think this is an unreasonable thing to >>>>do. How >>>>>>/ why append ended up being an optional feature in the ZNS TP is >>>>>>orthogonal to this conversation. Bullshit or not, it ends up on >>>>>>devices that we would like to support one way or another. >>>>> >>>>>I do not believe any of us have said that it is unreasonable to >>>>>support. We've only asked that you make the patches for it. >>>>> >>>>>All of us have communicated why Zone Append is a great addition to the >>>>>Linux kernel. Also, as Christoph points out, this has not been >>>>a secret >>>>>for the past couple of months, and as Martin pointed out, have been a >>>>>wanted feature for the past decade in the Linux community. >>>> >>>>> >>>>>I do want to politely point out, that you've got a very clear signal >>>>>from the key storage maintainers. Each of them is part of the planet's >>>>>best of the best and most well-respected software developers, that >>>>>literally have built the storage stack that most of the world depends >>>>>on. The storage stack that recently sent manned rockets into space. >>>>>They each unanimously said that the Zone Append command is the right >>>>>approach for the Linux kernel to reduce the overhead of I/O tracking >>>>>for zoned block devices. It may be worth bringing this information to >>>>>your engineering organization, and also potentially consider Zone >>>>>Append support for devices that you intend to used with the Linux >>>>>kernel storage stack. >>>> >>>>I understand and I have never said the opposite. >>>> >>>>Append is a great addition that >>> >>>One may have interpreted your SDC EMEA talk the opposite. It was not >>>very neutral towards Zone Append, but that is of cause one of its least >>>problems. But I am happy to hear that you've changed your opinion. >> >>As you are well aware, there are some cases where append introduces >>challenges. This is well-documented on the bibliography around nameless >>writes. > >The nameless writes idea is vastly different from Zone append, and >have little of the drawbacks of nameless writes, which makes the >well-documented literature not apply. You can have that conversation with your customer base. > >>Part of the talk was on presenting an alternative for these >>particular use cases. >> >>This said, I am not afraid of changing my point of view when I am proven >>wrong. >> >>> >>>>we also have been working on for several months (see patches >>>>additions from >>>>today). We just have a couple of use cases where append is not >>>>required and I >>>>would like to make sure that they are supported. >>>> >>>>At the end of the day, the only thing I have disagreed on is >>>>that the NVMe >>>>driver rejects ZNS SSDs that do not support append, as opposed >>>>to doing this >>>>instead when an in-kernel user wants to utilize the drive (e.g., >>>>formatting a FS >>>>with zoned support) This would allow _today_ >>>>ioctl() passthru to work for normal writes. >>>> >>>>I still believe the above would be a more inclusive solution >>>>with the current ZNS >>>>specification, but I can see that the general consensus is different. >>> >>>The comment from the community, including me, is that there is a >>>general requirement for Zone Append command when utilizing Zoned >>>storage devices. This is similar to implement an API that one wants to >>>support. It is not a general consensus or opinion. It is hard facts and >>>how the Linux kernel source code is implemented at this point. One must >>>implement support for ZNS SSDs that do not expose the Zone Append >>>command natively. Period. >> >>Again, I am not saying the opposite. Read the 2 lines below... > >My point with the above paragraph was to clarify that we are not >trying to be difficult or opinionated, but point out that the reason >we give you the specific feedback, is that it is the way it is in the >kernel as today. Again, yes, we will apply the feedback and come back with an approach that fits so that we can enable the raw ZNS block access that we want to enable. > >> >>>> >>>>So we will go back, apply the feedback that we got and return with an >>>>approach that better fits the ecosystem. >>>> >>>>> >>>>>Another approach, is to use SPDK, and bypass the Linux kernel. This >>>>>might even be an advantage, your customers does not have to >>>>wait on the >>>>>Linux distribution being released with a long term release, >>>>before they >>>>>can even get started and deploy in volume. I.e., they will >>>>actually get >>>>>faster to market, and your company will be able to sell more drives. >>>> >>>>I think I will refrain from discussing our business strategy on >>>>an open mailing >>>>list. Appreciate the feedback though. Very insightful. >>> >>>I am not asking for you to discuss your business strategy on the >>>mailing list. My comment was to give you genuinely advise that may >>>save a lot of work, and might even get better results. >>> >>>> >>>>Thanks, >>>>Javier >> 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=-0.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no 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 17B69C433E0 for ; Wed, 17 Jun 2020 19:40:24 +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 D9A1820773 for ; Wed, 17 Jun 2020 19:40:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="AZnSVOC0"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="uTYBzgWi" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D9A1820773 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=javigon.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=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.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=mFfA+kiElVxhaL0QQkspbf/9zk0wbzO9nAD2/YPTY74=; b=AZnSVOC01Fl4f37gNaieSPsuT zMyTz4kz5h821fAVMD6QaTAAjVAy5I5iCre8a1TORAaKq0v0+geyK9OKI45oPtEeyB2XPNUSpsOjy EF2QJ+6FnoYj2wzgnHWmA4DiaH4BP9T3pDk8FIEoUQ9HRkXcmvy3MSditGRk/Bvex+rsG5OWoyd1i bCMlHNLrUByx1pZl1oJeMx108W1aEhDTwUMMOh/XsyuxUU02vJM0fiitwvXlgsxz2WSuRsMI8snSQ mWN8kqVnkeuxfMWoQYNRTAAU0o+eKMhxwI5ydcnJTl3g1MhxOfdnvlVpoQazkOxhTjogJiKCJQ8rI ZxmPNyqlQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jldv0-0005Zh-Ps; Wed, 17 Jun 2020 19:40:18 +0000 Received: from mail-ej1-x642.google.com ([2a00:1450:4864:20::642]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlduy-0005Yy-Im for linux-nvme@lists.infradead.org; Wed, 17 Jun 2020 19:40:18 +0000 Received: by mail-ej1-x642.google.com with SMTP id dr13so3837284ejc.3 for ; Wed, 17 Jun 2020 12:40:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=PzrErsDtCW0fo0/5Z0gDbq30hKL4/dmBDqmjS52gLHg=; b=uTYBzgWii2wzQgZ//qnppAtt96gQW3i1Ovk7UoUSYd5xj3Y0eXpjZclXZ2s5feF+rO JFt0MvSbRwGdtwb5X4nfjWeHamSAlXfZ66ApQq5ZY9NIFnT1fKIcfp/xcjM8rDdTyeHu MLpMn2uqLm9XbzlsAWwVMhq2ZfwOInh2GDfnG7grnNJYpRlL7cuUnYaXR3fGFhJ+cUC8 Fm+NJU8LQ0JoHC7+UCJuyqw7EYox+VuMP1X3uplbQI2gSm0jsyxEwJ8l1a8cW1tzHaTO Ctds8oL3r5dqo7QTEw0x0C/cde0rR54MGy+aWBWX+MVXNGhjcyltnB4cNBapOYPEhKCt JjJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=PzrErsDtCW0fo0/5Z0gDbq30hKL4/dmBDqmjS52gLHg=; b=MuDEV8mymqW2ZAB2J3O5hgZNRJ6arQtbdT/XHMPDmA0j7G56YmHyAnNDQNUTd4XwqQ /RzYyWitGgtaySpIIgxIzpm7PZ/wxdXAK96PwtjnrEKK9Mq4i+0zVQFldwtdls96GA4v IOLsoviSTPaQqw9g/CIUjNEiTDhVpelEQuCZA/0mqxqIROGKdGYQ13Zk0UAF6O42ordq CP49NVDP3aIUmbmsWcyuEOH7AVTOD2pIRk4AdicHVTlbD9cI2CvKTRpvmp3dRYoU9tks oIBqWw7n9E1QdULzu2C7e6E7H35K9m3C7OsqIRY1i51n1aIDgfQt4Rc2llND/3xom5aF eEdw== X-Gm-Message-State: AOAM533sq/YocP/ZqQxTRiKWHg28TfbSQO12Rf0ehMRHcFf0hZgW9ZTd MiX+QcBfgfuI00qmSA2sXGsqpQ== X-Google-Smtp-Source: ABdhPJzaWan5qW2Km9JaZBt5R9h9aOC1UapjvqtyojFCv3z+4KLbN7/jXO9gwOfjhZSZUH9hJQ82kg== X-Received: by 2002:a17:906:4056:: with SMTP id y22mr706652ejj.304.1592422815045; Wed, 17 Jun 2020 12:40:15 -0700 (PDT) Received: from localhost (ip-5-186-127-235.cgn.fibianet.dk. [5.186.127.235]) by smtp.gmail.com with ESMTPSA id y62sm362138edy.61.2020.06.17.12.40.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jun 2020 12:40:14 -0700 (PDT) Date: Wed, 17 Jun 2020 21:40:13 +0200 From: Javier =?utf-8?B?R29uesOhbGV6?= To: Matias =?utf-8?B?QmrDuHJsaW5n?= Subject: Re: [PATCH 5/5] nvme: support for zoned namespaces Message-ID: <20200617194013.3wlz2ajnb6iopd4k@mpHalley.local> References: <20200615233424.13458-1-keith.busch@wdc.com> <20200615233424.13458-6-keith.busch@wdc.com> <20200616104142.zxw25txhsg2eyhsb@mpHalley.local> <20200617074328.GA13474@lst.de> <20200617144230.ojzk4f5gcwqonzrf@mpHalley.localdomain> <20200617182841.jnbxgshi7bawfzls@mpHalley.localdomain> <20200617190901.zpss2lsh6qsu5zuf@mpHalley.local> <1ab101ef-7b74-060f-c2bc-d4c36dec91f0@lightnvm.io> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1ab101ef-7b74-060f-c2bc-d4c36dec91f0@lightnvm.io> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_124016_688103_45FB2133 X-CRM114-Status: GOOD ( 20.20 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jens Axboe , Niklas Cassel , Damien Le Moal , Ajay Joshi , Sagi Grimberg , Keith Busch , Dmitry Fomichev , Aravind Ramesh , "linux-nvme@lists.infradead.org" , "linux-block@vger.kernel.org" , Hans Holmberg , Judy Brock , Christoph Hellwig , Matias Bjorling Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gMTcuMDYuMjAyMCAyMToyMywgTWF0aWFzIEJqw7hybGluZyB3cm90ZToKPk9uIDE3LzA2LzIw MjAgMjEuMDksIEphdmllciBHb256w6FsZXogd3JvdGU6Cj4+T24gMTcuMDYuMjAyMCAxODo1NSwg TWF0aWFzIEJqb3JsaW5nIHdyb3RlOgo+Pj4+LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+ PkZyb206IEphdmllciBHb256w6FsZXogPGphdmllckBqYXZpZ29uLmNvbT4KPj4+PlNlbnQ6IFdl ZG5lc2RheSwgMTcgSnVuZSAyMDIwIDIwLjI5Cj4+Pj5UbzogTWF0aWFzIEJqw7hybGluZyA8bWJA bGlnaHRudm0uaW8+Cj4+Pj5DYzogQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBsc3QuZGU+OyBLZWl0 aCBCdXNjaCA8S2VpdGguQnVzY2hAd2RjLmNvbT47Cj4+Pj5saW51eC1udm1lQGxpc3RzLmluZnJh ZGVhZC5vcmc7IGxpbnV4LWJsb2NrQHZnZXIua2VybmVsLm9yZzsgCj4+Pj5EYW1pZW4gTGUgTW9h bAo+Pj4+PERhbWllbi5MZU1vYWxAd2RjLmNvbT47IE1hdGlhcyBCam9ybGluZyA8TWF0aWFzLkJq b3JsaW5nQHdkYy5jb20+Owo+Pj4+U2FnaSBHcmltYmVyZyA8c2FnaUBncmltYmVyZy5tZT47IEpl bnMgQXhib2UgPGF4Ym9lQGtlcm5lbC5kaz47IEhhbnMKPj4+PkhvbG1iZXJnIDxIYW5zLkhvbG1i ZXJnQHdkYy5jb20+OyBEbWl0cnkgRm9taWNoZXYKPj4+PjxEbWl0cnkuRm9taWNoZXZAd2RjLmNv bT47IEFqYXkgSm9zaGkgPEFqYXkuSm9zaGlAd2RjLmNvbT47IEFyYXZpbmQKPj4+PlJhbWVzaCA8 QXJhdmluZC5SYW1lc2hAd2RjLmNvbT47IE5pa2xhcyBDYXNzZWwKPj4+PjxOaWtsYXMuQ2Fzc2Vs QHdkYy5jb20+OyBKdWR5IEJyb2NrIDxqdWR5LmJyb2NrQHNhbXN1bmcuY29tPgo+Pj4+U3ViamVj dDogUmU6IFtQQVRDSCA1LzVdIG52bWU6IHN1cHBvcnQgZm9yIHpvbmVkIG5hbWVzcGFjZXMKPj4+ Pgo+Pj4+T24gMTcuMDYuMjAyMCAxOTo1NywgTWF0aWFzIEJqw7hybGluZyB3cm90ZToKPj4+Pj5P biAxNy8wNi8yMDIwIDE2LjQyLCBKYXZpZXIgR29uesOhbGV6IHdyb3RlOgo+Pj4+Pj5PbiAxNy4w Ni4yMDIwIDA5OjQzLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90ZToKPj4+Pj4+Pk9uIFR1ZSwgSnVu IDE2LCAyMDIwIGF0IDEyOjQxOjQyUE0gKzAyMDAsIEphdmllciBHb256w6FsZXogd3JvdGU6Cj4+ Pj4+Pj4+T24gMTYuMDYuMjAyMCAwODozNCwgS2VpdGggQnVzY2ggd3JvdGU6Cj4+Pj4+Pj4+PkFk ZCBzdXBwb3J0IGZvciBOVk0gRXhwcmVzcyBab25lZCBOYW1lc3BhY2VzIChaTlMpIENvbW1hbmQg U2V0Cj4+Pj4+Pj4+PmRlZmluZWQgaW4gTlZNIEV4cHJlc3MgVFA0MDUzLiBab25lZCBuYW1lc3Bh Y2VzIGFyZSBkaXNjb3ZlcmVkCj4+Pj4+Pj4+PmJhc2VkIG9uIHRoZWlyIENvbW1hbmQgU2V0IElk ZW50aWZpZXIgcmVwb3J0ZWQgaW4gdGhlIG5hbWVzcGFjZXMKPj4+Pj4+Pj4+TmFtZXNwYWNlIElk ZW50aWZpY2F0aW9uIERlc2NyaXB0b3IgbGlzdC4gQSBzdWNjZXNzZnVsbHkgCj4+Pj5kaXNjb3Zl cmVkCj4+Pj4+Pj4+PlpvbmVkIE5hbWVzcGFjZSB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUg YmxvY2sgbGF5ZXIgYXMgYSBob3N0Cj4+Pj4+Pj4+Pm1hbmFnZWQgem9uZWQgYmxvY2sgZGV2aWNl IHdpdGggWm9uZSBBcHBlbmQgY29tbWFuZCBzdXBwb3J0LiBBCj4+Pj4+Pj4+Pm5hbWVzcGFjZSB0 aGF0IGRvZXMgbm90IHN1cHBvcnQgYXBwZW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgCj4+Pj50aGUg ZHJpdmVyLgo+Pj4+Pj4+Pgo+Pj4+Pj4+PldoeSBhcmUgd2UgZW5mb3JjaW5nIHRoZSBhcHBlbmQg Y29tbWFuZD8gQXBwZW5kIGlzIG9wdGlvbmFsIG9uIHRoZQo+Pj4+Pj4+PmN1cnJlbnQgWk5TIHNw ZWNpZmljYXRpb24sIHNvIHdlIHNob3VsZCBub3QgbWFrZSB0aGlzIG1hbmRhdG9yeSBpbgo+Pj4+ Pj4+PnRoZSBpbXBsZW1lbnRhdGlvbi4gU2VlIHNwZWNpZmljcyBiZWxvdy4KPj4+Pj4+Pgo+Pj4+ Pj4+QmVjYXVzZSBBcHBlbmQgaXMgdGhlIHdheSB0byBnbyBhbmQgd2UndmUgbW92ZWQgdGhlIExp bnV4IAo+Pj4+em9uZWQgYmxvY2sKPj4+Pj4+PkkvTyBzdGFjayB0byByZXF1aXJlZCBpdCwgYXMg c2hvdWxkIGhhdmUgYmVlbiBvYnZpb3VzIHRvIGFueW9uZQo+Pj4+Pj4+Zm9sbG93aW5nIGxpbnV4 LWJsb2NrIGluIHRoZSBsYXN0IGZldyBtb250aHMuwqAgSSBhbHNvIGhhdmUgdG8gCj4+Pj5zYXkg SSdtCj4+Pj4+Pj5yZWFsbHkgdGlyZWQgb2YgdGhlIHN0dXBpZCBwb2xpdGljcyB0aGEgeW91ciBj b21wYW55IHN0YXJ0ZWQgaW4gdGhlCj4+Pj4+Pj5OVk1lIHdvcmtpbmcgZ3JvdXAsIGFuZCB3aWxs IHNheSB0aGF0IHRoZXNlIGRvIG5vdCBtYXR0ZXIgZm9yIExpbnV4Cj4+Pj4+Pj5kZXZlbG9wbWVu dCBhdCBhbGwuwqAgSWYgeW91IHRoaW5rIGl0IGlzIHdvcnRod2hpbGUgdG8gc3VwcG9ydCAKPj4+ PmRldmljZXMKPj4+Pj4+PndpdGhvdXQgWm9uZSBBcHBlbmQgeW91IGNhbiBjb250cmlidXRlIHN1 cHBvcnQgZm9yIHRoZW0gb24gdG9wIG9mCj4+Pj4+Pj50aGlzIHNlcmllcyBieSBwb3J0aW5nIHRo ZSBTQ1NJIFpvbmUgQXBwZW5kIEVtdWxhdGlvbiBjb2RlIHRvIE5WTWUuCj4+Pj4+Pj4KPj4+Pj4+ PkFuZCBJJ20gbm90IGV2ZW4gZ29pbmcgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGlzIHRocmVhZCBh cyBJJ20gb24gYQo+Pj4+Pj4+dmFjYXRpb24gdGhhdCBJIGJhZGx5IG5lZWRlZCBiZWNhdXNlIG9m IHRoZSBTYW1zdW5nIFRXRyBidWxsc2hpdC4KPj4+Pj4+Cj4+Pj4+Pk15IGludGVudGlvbiBpcyB0 byBzdXBwb3J0IHNvbWUgU2Ftc3VuZyBaTlMgZGV2aWNlcyB0aGF0IHdpbGwgbm90Cj4+Pj4+PmVu YWJsZSBhcHBlbmQuIEkgZG8gbm90IHRoaW5rIHRoaXMgaXMgYW4gdW5yZWFzb25hYmxlIHRoaW5n IHRvIAo+Pj4+ZG8uIEhvdwo+Pj4+Pj4vIHdoeSBhcHBlbmQgZW5kZWQgdXAgYmVpbmcgYW4gb3B0 aW9uYWwgZmVhdHVyZSBpbiB0aGUgWk5TIFRQIGlzCj4+Pj4+Pm9ydGhvZ29uYWwgdG8gdGhpcyBj b252ZXJzYXRpb24uIEJ1bGxzaGl0IG9yIG5vdCwgaXQgZW5kcyB1cCBvbgo+Pj4+Pj5kZXZpY2Vz IHRoYXQgd2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IG9uZSB3YXkgb3IgYW5vdGhlci4KPj4+Pj4K Pj4+Pj5JIGRvIG5vdCBiZWxpZXZlIGFueSBvZiB1cyBoYXZlIHNhaWQgdGhhdCBpdCBpcyB1bnJl YXNvbmFibGUgdG8KPj4+Pj5zdXBwb3J0LiBXZSd2ZSBvbmx5IGFza2VkIHRoYXQgeW91IG1ha2Ug dGhlIHBhdGNoZXMgZm9yIGl0Lgo+Pj4+Pgo+Pj4+PkFsbCBvZiB1cyBoYXZlIGNvbW11bmljYXRl ZCB3aHkgWm9uZSBBcHBlbmQgaXMgYSBncmVhdCBhZGRpdGlvbiB0byB0aGUKPj4+Pj5MaW51eCBr ZXJuZWwuIEFsc28sIGFzIENocmlzdG9waCBwb2ludHMgb3V0LCB0aGlzIGhhcyBub3QgYmVlbiAK Pj4+PmEgc2VjcmV0Cj4+Pj4+Zm9yIHRoZSBwYXN0IGNvdXBsZSBvZiBtb250aHMsIGFuZCBhcyBN YXJ0aW4gcG9pbnRlZCBvdXQsIGhhdmUgYmVlbiBhCj4+Pj4+d2FudGVkIGZlYXR1cmUgZm9yIHRo ZSBwYXN0IGRlY2FkZSBpbiB0aGUgTGludXggY29tbXVuaXR5Lgo+Pj4+Cj4+Pj4+Cj4+Pj4+SSBk byB3YW50IHRvIHBvbGl0ZWx5IHBvaW50IG91dCwgdGhhdCB5b3UndmUgZ290IGEgdmVyeSBjbGVh ciBzaWduYWwKPj4+Pj5mcm9tIHRoZSBrZXkgc3RvcmFnZSBtYWludGFpbmVycy4gRWFjaCBvZiB0 aGVtIGlzIHBhcnQgb2YgdGhlIHBsYW5ldCdzCj4+Pj4+YmVzdCBvZiB0aGUgYmVzdCBhbmQgbW9z dCB3ZWxsLXJlc3BlY3RlZCBzb2Z0d2FyZSBkZXZlbG9wZXJzLCB0aGF0Cj4+Pj4+bGl0ZXJhbGx5 IGhhdmUgYnVpbHQgdGhlIHN0b3JhZ2Ugc3RhY2sgdGhhdCBtb3N0IG9mIHRoZSB3b3JsZCBkZXBl bmRzCj4+Pj4+b24uIFRoZSBzdG9yYWdlIHN0YWNrIHRoYXQgcmVjZW50bHkgc2VudCBtYW5uZWQg cm9ja2V0cyBpbnRvIHNwYWNlLgo+Pj4+PlRoZXkgZWFjaCB1bmFuaW1vdXNseSBzYWlkIHRoYXQg dGhlIFpvbmUgQXBwZW5kIGNvbW1hbmQgaXMgdGhlIHJpZ2h0Cj4+Pj4+YXBwcm9hY2ggZm9yIHRo ZSBMaW51eCBrZXJuZWwgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBJL08gdHJhY2tpbmcKPj4+ Pj5mb3Igem9uZWQgYmxvY2sgZGV2aWNlcy4gSXQgbWF5IGJlIHdvcnRoIGJyaW5naW5nIHRoaXMg aW5mb3JtYXRpb24gdG8KPj4+Pj55b3VyIGVuZ2luZWVyaW5nIG9yZ2FuaXphdGlvbiwgYW5kIGFs c28gcG90ZW50aWFsbHkgY29uc2lkZXIgWm9uZQo+Pj4+PkFwcGVuZCBzdXBwb3J0IGZvciBkZXZp Y2VzIHRoYXQgeW91IGludGVuZCB0byB1c2VkIHdpdGggdGhlIExpbnV4Cj4+Pj4+a2VybmVsIHN0 b3JhZ2Ugc3RhY2suCj4+Pj4KPj4+PkkgdW5kZXJzdGFuZCBhbmQgSSBoYXZlIG5ldmVyIHNhaWQg dGhlIG9wcG9zaXRlLgo+Pj4+Cj4+Pj5BcHBlbmQgaXMgYSBncmVhdCBhZGRpdGlvbiB0aGF0Cj4+ Pgo+Pj5PbmUgbWF5IGhhdmUgaW50ZXJwcmV0ZWQgeW91ciBTREMgRU1FQSB0YWxrIHRoZSBvcHBv c2l0ZS4gSXQgd2FzIG5vdAo+Pj52ZXJ5IG5ldXRyYWwgdG93YXJkcyBab25lIEFwcGVuZCwgYnV0 IHRoYXQgaXMgb2YgY2F1c2Ugb25lIG9mIGl0cyBsZWFzdAo+Pj5wcm9ibGVtcy4gQnV0IEkgYW0g aGFwcHkgdG8gaGVhciB0aGF0IHlvdSd2ZSBjaGFuZ2VkIHlvdXIgb3Bpbmlvbi4KPj4KPj5BcyB5 b3UgYXJlIHdlbGwgYXdhcmUsIHRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIGFwcGVuZCBpbnRy b2R1Y2VzCj4+Y2hhbGxlbmdlcy4gVGhpcyBpcyB3ZWxsLWRvY3VtZW50ZWQgb24gdGhlIGJpYmxp b2dyYXBoeSBhcm91bmQgbmFtZWxlc3MKPj53cml0ZXMuCj4KPlRoZSBuYW1lbGVzcyB3cml0ZXMg aWRlYSBpcyB2YXN0bHkgZGlmZmVyZW50IGZyb20gWm9uZSBhcHBlbmQsIGFuZCAKPmhhdmUgbGl0 dGxlIG9mIHRoZSBkcmF3YmFja3Mgb2YgbmFtZWxlc3Mgd3JpdGVzLCB3aGljaCBtYWtlcyB0aGUg Cj53ZWxsLWRvY3VtZW50ZWQgbGl0ZXJhdHVyZSBub3QgYXBwbHkuCgpZb3UgY2FuIGhhdmUgdGhh dCBjb252ZXJzYXRpb24gd2l0aCB5b3VyIGN1c3RvbWVyIGJhc2UuCgo+Cj4+UGFydCBvZiB0aGUg dGFsayB3YXMgb24gcHJlc2VudGluZyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlc2UKPj5wYXJ0aWN1 bGFyIHVzZSBjYXNlcy4KPj4KPj5UaGlzIHNhaWQsIEkgYW0gbm90IGFmcmFpZCBvZiBjaGFuZ2lu ZyBteSBwb2ludCBvZiB2aWV3IHdoZW4gSSBhbSBwcm92ZW4KPj53cm9uZy4KPj4KPj4+Cj4+Pj53 ZSBhbHNvIGhhdmUgYmVlbiB3b3JraW5nIG9uIGZvciBzZXZlcmFsIG1vbnRocyAoc2VlIHBhdGNo ZXMgCj4+Pj5hZGRpdGlvbnMgZnJvbQo+Pj4+dG9kYXkpLiBXZSBqdXN0IGhhdmUgYSBjb3VwbGUg b2YgdXNlIGNhc2VzIHdoZXJlIGFwcGVuZCBpcyBub3QgCj4+Pj5yZXF1aXJlZCBhbmQgSQo+Pj4+ d291bGQgbGlrZSB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuCj4+Pj4KPj4+ PkF0IHRoZSBlbmQgb2YgdGhlIGRheSwgdGhlIG9ubHkgdGhpbmcgSSBoYXZlIGRpc2FncmVlZCBv biBpcyAKPj4+PnRoYXQgdGhlIE5WTWUKPj4+PmRyaXZlciByZWplY3RzIFpOUyBTU0RzIHRoYXQg ZG8gbm90IHN1cHBvcnQgYXBwZW5kLCBhcyBvcHBvc2VkIAo+Pj4+dG8gZG9pbmcgdGhpcwo+Pj4+ aW5zdGVhZCB3aGVuIGFuIGluLWtlcm5lbCB1c2VyIHdhbnRzIHRvIHV0aWxpemUgdGhlIGRyaXZl IChlLmcuLCAKPj4+PmZvcm1hdHRpbmcgYSBGUwo+Pj4+d2l0aCB6b25lZCBzdXBwb3J0KSBUaGlz IHdvdWxkIGFsbG93IF90b2RheV8KPj4+PmlvY3RsKCkgcGFzc3RocnUgdG8gd29yayBmb3Igbm9y bWFsIHdyaXRlcy4KPj4+Pgo+Pj4+SSBzdGlsbCBiZWxpZXZlIHRoZSBhYm92ZSB3b3VsZCBiZSBh IG1vcmUgaW5jbHVzaXZlIHNvbHV0aW9uIAo+Pj4+d2l0aCB0aGUgY3VycmVudCBaTlMKPj4+PnNw ZWNpZmljYXRpb24sIGJ1dCBJIGNhbiBzZWUgdGhhdCB0aGUgZ2VuZXJhbCBjb25zZW5zdXMgaXMg ZGlmZmVyZW50Lgo+Pj4KPj4+VGhlIGNvbW1lbnQgZnJvbSB0aGUgY29tbXVuaXR5LCBpbmNsdWRp bmcgbWUsIGlzIHRoYXQgdGhlcmUgaXMgYQo+Pj5nZW5lcmFsIHJlcXVpcmVtZW50IGZvciBab25l IEFwcGVuZCBjb21tYW5kIHdoZW4gdXRpbGl6aW5nIFpvbmVkCj4+PnN0b3JhZ2UgZGV2aWNlcy4g VGhpcyBpcyBzaW1pbGFyIHRvIGltcGxlbWVudCBhbiBBUEkgdGhhdCBvbmUgd2FudHMgdG8KPj4+ c3VwcG9ydC4gSXQgaXMgbm90IGEgZ2VuZXJhbCBjb25zZW5zdXMgb3Igb3Bpbmlvbi4gSXQgaXMg aGFyZCBmYWN0cyBhbmQKPj4+aG93IHRoZSBMaW51eCBrZXJuZWwgc291cmNlIGNvZGUgaXMgaW1w bGVtZW50ZWQgYXQgdGhpcyBwb2ludC4gT25lIG11c3QKPj4+aW1wbGVtZW50IHN1cHBvcnQgZm9y IFpOUyBTU0RzIHRoYXQgZG8gbm90IGV4cG9zZSB0aGUgWm9uZSBBcHBlbmQKPj4+Y29tbWFuZCBu YXRpdmVseS4gUGVyaW9kLgo+Pgo+PkFnYWluLCBJIGFtIG5vdCBzYXlpbmcgdGhlIG9wcG9zaXRl LiBSZWFkIHRoZSAyIGxpbmVzIGJlbG93Li4uCj4KPk15IHBvaW50IHdpdGggdGhlIGFib3ZlIHBh cmFncmFwaCB3YXMgdG8gY2xhcmlmeSB0aGF0IHdlIGFyZSBub3QgCj50cnlpbmcgdG8gYmUgZGlm ZmljdWx0IG9yIG9waW5pb25hdGVkLCBidXQgcG9pbnQgb3V0IHRoYXQgdGhlIHJlYXNvbiAKPndl IGdpdmUgeW91IHRoZSBzcGVjaWZpYyBmZWVkYmFjaywgaXMgdGhhdCBpdCBpcyB0aGUgd2F5IGl0 IGlzIGluIHRoZSAKPmtlcm5lbCBhcyB0b2RheS4KCkFnYWluLCB5ZXMsIHdlIHdpbGwgYXBwbHkg dGhlIGZlZWRiYWNrIGFuZCBjb21lIGJhY2sgd2l0aCBhbiBhcHByb2FjaAp0aGF0IGZpdHMgc28g dGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSByYXcgWk5TIGJsb2NrIGFjY2VzcyB0aGF0IHdlIHdhbnQg dG8KZW5hYmxlLgoKPgo+Pgo+Pj4+Cj4+Pj5TbyB3ZSB3aWxsIGdvIGJhY2ssIGFwcGx5IHRoZSBm ZWVkYmFjayB0aGF0IHdlIGdvdCBhbmQgcmV0dXJuIHdpdGggYW4KPj4+PmFwcHJvYWNoIHRoYXQg YmV0dGVyIGZpdHMgdGhlIGVjb3N5c3RlbS4KPj4+Pgo+Pj4+Pgo+Pj4+PkFub3RoZXIgYXBwcm9h Y2gsIGlzIHRvIHVzZSBTUERLLCBhbmQgYnlwYXNzIHRoZSBMaW51eCBrZXJuZWwuIFRoaXMKPj4+ Pj5taWdodCBldmVuIGJlIGFuIGFkdmFudGFnZSwgeW91ciBjdXN0b21lcnMgZG9lcyBub3QgaGF2 ZSB0byAKPj4+PndhaXQgb24gdGhlCj4+Pj4+TGludXggZGlzdHJpYnV0aW9uIGJlaW5nIHJlbGVh c2VkIHdpdGggYSBsb25nIHRlcm0gcmVsZWFzZSwgCj4+Pj5iZWZvcmUgdGhleQo+Pj4+PmNhbiBl dmVuIGdldCBzdGFydGVkIGFuZCBkZXBsb3kgaW4gdm9sdW1lLiBJLmUuLCB0aGV5IHdpbGwgCj4+ Pj5hY3R1YWxseSBnZXQKPj4+Pj5mYXN0ZXIgdG8gbWFya2V0LCBhbmQgeW91ciBjb21wYW55IHdp bGwgYmUgYWJsZSB0byBzZWxsIG1vcmUgZHJpdmVzLgo+Pj4+Cj4+Pj5JIHRoaW5rIEkgd2lsbCBy ZWZyYWluIGZyb20gZGlzY3Vzc2luZyBvdXIgYnVzaW5lc3Mgc3RyYXRlZ3kgb24gCj4+Pj5hbiBv cGVuIG1haWxpbmcKPj4+Pmxpc3QuIEFwcHJlY2lhdGUgdGhlIGZlZWRiYWNrIHRob3VnaC4gVmVy eSBpbnNpZ2h0ZnVsLgo+Pj4KPj4+SSBhbSBub3QgYXNraW5nIGZvciB5b3UgdG8gZGlzY3VzcyB5 b3VyIGJ1c2luZXNzIHN0cmF0ZWd5IG9uIHRoZSAKPj4+bWFpbGluZyBsaXN0LiBNeSBjb21tZW50 IHdhcyB0byBnaXZlIHlvdSBnZW51aW5lbHkgYWR2aXNlIHRoYXQgbWF5IAo+Pj5zYXZlIGEgbG90 IG9mIHdvcmssIGFuZCBtaWdodCBldmVuIGdldCBiZXR0ZXIgcmVzdWx0cy4KPj4+Cj4+Pj4KPj4+ PlRoYW5rcywKPj4+Pkphdmllcgo+PgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KbGludXgtbnZtZSBtYWlsaW5nIGxpc3QKbGludXgtbnZtZUBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtbnZtZQo=