From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Chinner Subject: Re: [PATCH 4/4] Adds ioctl interface support for ext4 project Date: Fri, 26 Sep 2014 10:10:49 +1000 Message-ID: <20140926001049.GK4945@dastard> References: <1411567470-31799-1-git-send-email-lixi@ddn.com> <1411567470-31799-5-git-send-email-lixi@ddn.com> <20140924162507.GC27000@quack.suse.cz> <20140924162634.GA16886@infradead.org> <20140924170105.GE27000@quack.suse.cz> <20140925075912.GG4758@dastard> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: Content-Disposition: inline In-Reply-To: Sender: linux-api-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: lixi Cc: Jan Kara , Christoph Hellwig , Andreas Dilger , linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, xfs-VZNHf3L845pBDgjK7y7TUQ@public.gmane.org, Dmitry Monakhov , viro-RmSDqhL/yNMiFSDQTTA3OLVCufUGDwFn@public.gmane.org, linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Theodore Ts'o , Ext4 Developers List List-Id: linux-api@vger.kernel.org On Thu, Sep 25, 2014 at 07:34:38PM +0800, lixi wrote: > Hi Dave, >=20 > I was mostly working on the semantics of inherit flag on these patche= s. And > I didn=E2=80=99t realized that the interface differences would bother= you so much. Sorry > for that. It's not the differences that bother me - it's the fact that I was repeatedly ignored until someone else raised the same issue.... > I agree that we should choose a good interface. It would be good that= it is > general so that it works well for all file systems. I agree that addi= ng an > ext4 specific ioctl() is far from the best choice. I am willing to ch= ange it to > any general interface. A general ioctl() sounds good to me. Extend se= tattr() > and getattr() for project ID sounds even better, since project ID loo= ks like > UID/GID. Ah, no, project ID is not a uid/gid. It's a completely independent construct. [ Which brings me to, once again, the issue of being ignored during reviews: project IDs should not be mapped by user namespaces, nor be accessible from anything other than the init namespace. In XFS we've turned off access to project IDs within namespace containers because they are used for container space management (i.e. by the init namespace) to manage the amount of filesystem space a container or set of containers can use. We do not want project IDs to be manipulated from within such containers, and therefore have to prevent access to them from within user namespaces. ] > And general xattr name is another choice. But it is might be a little > bit confusing if we use xattr actually, since we are not saving proje= ct ID as > extended attribute on Ext4. Any choice is fine with me, as long as th= e > implementation won't introduce nasty codes or inconsistent design. We can easily create another ioctl name if we have to. It just needs sto be defined to the same value as the XFS ioctl names currently are. We've done this before when making ioctls that originated in XFS generic (e.g. with freeze/thaw ioctls).... > However, the problem is, I do not quite understand why we should keep > the interface exactly the same with XFS. It would be good if we can. = But > as far as I can see, it seems hard. XFS uses a lot interfaces which a= re > not so standard and used by other file systems. For example, struct > fsxattr is not used by other file systems at all except XFS. Moving a existing structure definitions to a different header file is too hard? > I am not sure why we should introduce this into Ext4 if there are > a lot of other better ways. I would be happy to change to XFS > interfaces, if it is general. However, I don=E2=80=99t think it is > general enough. How is it not general enough? Examples, please, not handwaving: which bit of the quota interface can't ext4 use because it's XFS specific? We already have a perfectly functional interface and a large body of code that implements and tests it. You're saying "oh, it's too much work for me to implement an existing interface" and ignoring the fact that not implementing the existing interface forces a huge amount of downstream work. e.g. - we need completely new test infrastructure to replicate existing tests. - we need new tests to ensure the different APIs and utilities provide the same functionality, and that the work identically. - administrators are going to have to learn how ext4 is different to what they already know and understand. - administrators that has tools written to manage project quotas is going to have to rewrite them to support ext4. It's an entirely selfish argument that ignores what already existing out in userspace. i.e. you're saying that existing downstream users of project quotas simple don't matter to you... > I know xfstest is using the existing project quota interfaces of XFS.= And > maybe there are some applications which are using them too. But > keeping the interfaces exactly the same with XFS would cost so much > effort that I=E2=80=99d like to get enough reasons before start worki= ng on it. Is it > really necessary? I am not so sure. You have to have a stronger argument than that to justify creating a new incompatible user interface. The XFS interfaces have been available for more than 10 years and support all the functionality ext4 requires. If it was any other userspace interface (e.g. syscalls) or any filesystem other than ext4 there would be people from all over telling you "use the existing interfaces!" and you'd need very strong reasons for creating a new one. i.e. you need to demonstrate that the existing interfaces are inadequate for the intended purpose of the new functionality. That's clearly not the case here so why should we allow you to create an incompatible userspace API rather than use the existing, fully functional API? > It is so easy to change user space applications comparing to > changing a weird interfaces. The existing generic quota tools (i.e quotactl, repquota, etc) already implement the XFS quota API to be able to query XFS filesystems. There's no "changing to wierd interfaces" necessary for userspace; it's already all there. Hence any work you do to add project quota awareness to those generic userspace tools will need to add the support to the XFS queries anyway. IOWs, you're not making it any easier for yourself in userspace by creating a new API for ext4 - it just doubles the amount of work you have to in userspace to make existing tools project quota aware. > For > example, I think it won=E2=80=99t cost even more than a day to add xf= stest > support for new Ext4 project quota. A day of whose time?=20 Ever thought about how much time it will take reviewers to look at your tests and iterate over them to get it all right? If you're introducing new userspace infrastructure that xfstests will need to depend on and test for, then it's a lot more than just writing new tests. Indeed, I'm likely to want new project quota tests to be generic (i.e. works and passes on any filesystem that supports project quotas) with the introduction of ext4 project quota support. It's the same functionality and so it should work the same just like user and group quotas do across all filesystems. > And since project quota is far from > a widely used feature, I don't think you realise quite how widespread it's use is on XFS. > I don=E2=80=99t think there is much compatibility problems > for existing applications. And If the new project interface are gene= ral > enough, there won=E2=80=99t be any compatibility problems for new app= lications > at all. Again, you are ignoring the compatibility problems with existing applications that are project quota aware. For them you are *creating new compatibility problems* by implementing a new interface. i.e. Existing applications will not work on ext4, and new applications written to work on ext4 won't work on XFS. That's the crux of the issue - we have existing applications using the existing interface and so introducing a new interface introduces compatibility problems. You can't just wave this problem away because you don't think the existing interface matters. "It's easier for me to create a new interface" is not a valid reason for creating a new interface.... Cheers, Dave. --=20 Dave Chinner david-FqsqvQoI3Ljby3iVrkZq2A@public.gmane.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B35E7FDD for ; Thu, 25 Sep 2014 19:18:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29EAD8F8033 for ; Thu, 25 Sep 2014 17:18:36 -0700 (PDT) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2DjEf0eNsytVHvOw for ; Thu, 25 Sep 2014 17:18:33 -0700 (PDT) Date: Fri, 26 Sep 2014 10:10:49 +1000 From: Dave Chinner Subject: Re: [PATCH 4/4] Adds ioctl interface support for ext4 project Message-ID: <20140926001049.GK4945@dastard> References: <1411567470-31799-1-git-send-email-lixi@ddn.com> <1411567470-31799-5-git-send-email-lixi@ddn.com> <20140924162507.GC27000@quack.suse.cz> <20140924162634.GA16886@infradead.org> <20140924170105.GE27000@quack.suse.cz> <20140925075912.GG4758@dastard> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: List-Id: XFS Filesystem from SGI List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xfs-bounces@oss.sgi.com Sender: xfs-bounces@oss.sgi.com To: lixi Cc: Andreas Dilger , Jan Kara , linux-api@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Dmitry Monakhov , viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Theodore Ts'o , Ext4 Developers List T24gVGh1LCBTZXAgMjUsIDIwMTQgYXQgMDc6MzQ6MzhQTSArMDgwMCwgbGl4aSB3cm90ZToKPiBI aSBEYXZlLAo+IAo+IEkgd2FzIG1vc3RseSB3b3JraW5nIG9uIHRoZSBzZW1hbnRpY3Mgb2YgaW5o ZXJpdCBmbGFnIG9uIHRoZXNlIHBhdGNoZXMuIEFuZAo+IEkgZGlkbuKAmXQgcmVhbGl6ZWQgdGhh dCB0aGUgaW50ZXJmYWNlIGRpZmZlcmVuY2VzIHdvdWxkIGJvdGhlciB5b3Ugc28gbXVjaC4gU29y cnkKPiBmb3IgdGhhdC4KCkl0J3Mgbm90IHRoZSBkaWZmZXJlbmNlcyB0aGF0IGJvdGhlciBtZSAt IGl0J3MgdGhlIGZhY3QgdGhhdCBJIHdhcwpyZXBlYXRlZGx5IGlnbm9yZWQgdW50aWwgc29tZW9u ZSBlbHNlIHJhaXNlZCB0aGUgc2FtZSBpc3N1ZS4uLi4KCj4gSSBhZ3JlZSB0aGF0IHdlIHNob3Vs ZCBjaG9vc2UgYSBnb29kIGludGVyZmFjZS4gSXQgd291bGQgYmUgZ29vZCB0aGF0IGl0IGlzCj4g Z2VuZXJhbCBzbyB0aGF0IGl0IHdvcmtzIHdlbGwgZm9yIGFsbCBmaWxlIHN5c3RlbXMuIEkgYWdy ZWUgdGhhdCBhZGRpbmcgYW4KPiBleHQ0IHNwZWNpZmljIGlvY3RsKCkgaXMgZmFyIGZyb20gdGhl IGJlc3QgY2hvaWNlLiBJIGFtIHdpbGxpbmcgdG8gY2hhbmdlIGl0IHRvCj4gYW55IGdlbmVyYWwg aW50ZXJmYWNlLiBBIGdlbmVyYWwgaW9jdGwoKSBzb3VuZHMgZ29vZCB0byBtZS4gRXh0ZW5kIHNl dGF0dHIoKQo+IGFuZCBnZXRhdHRyKCkgZm9yIHByb2plY3QgSUQgc291bmRzIGV2ZW4gYmV0dGVy LCBzaW5jZSBwcm9qZWN0IElEIGxvb2tzIGxpa2UKPiBVSUQvR0lELgoKQWgsIG5vLCBwcm9qZWN0 IElEIGlzIG5vdCBhIHVpZC9naWQuIEl0J3MgYSBjb21wbGV0ZWx5IGluZGVwZW5kZW50CmNvbnN0 cnVjdC4KClsgV2hpY2ggYnJpbmdzIG1lIHRvLCBvbmNlIGFnYWluLCB0aGUgaXNzdWUgb2YgYmVp bmcgaWdub3JlZCBkdXJpbmcKcmV2aWV3czogcHJvamVjdCBJRHMgc2hvdWxkIG5vdCBiZSBtYXBw ZWQgYnkgdXNlciBuYW1lc3BhY2VzLCBub3IgYmUKYWNjZXNzaWJsZSBmcm9tIGFueXRoaW5nIG90 aGVyIHRoYW4gdGhlIGluaXQgbmFtZXNwYWNlLgoKSW4gWEZTIHdlJ3ZlIHR1cm5lZCBvZmYgYWNj ZXNzIHRvIHByb2plY3QgSURzIHdpdGhpbiBuYW1lc3BhY2UKY29udGFpbmVycyBiZWNhdXNlIHRo ZXkgYXJlIHVzZWQgZm9yIGNvbnRhaW5lciBzcGFjZSBtYW5hZ2VtZW50CihpLmUuIGJ5IHRoZSBp bml0IG5hbWVzcGFjZSkgdG8gbWFuYWdlIHRoZSBhbW91bnQgb2YgZmlsZXN5c3RlbQpzcGFjZSBh IGNvbnRhaW5lciBvciBzZXQgb2YgY29udGFpbmVycyBjYW4gdXNlLiBXZSBkbyBub3Qgd2FudApw cm9qZWN0IElEcyB0byBiZSBtYW5pcHVsYXRlZCBmcm9tIHdpdGhpbiBzdWNoIGNvbnRhaW5lcnMs IGFuZAp0aGVyZWZvcmUgaGF2ZSB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGVtIGZyb20gd2l0aGlu IHVzZXIKbmFtZXNwYWNlcy4gXQoKPiBBbmQgZ2VuZXJhbCB4YXR0ciBuYW1lIGlzIGFub3RoZXIg Y2hvaWNlLiBCdXQgaXQgaXMgbWlnaHQgYmUgYSBsaXR0bGUKPiBiaXQgY29uZnVzaW5nIGlmIHdl IHVzZSB4YXR0ciBhY3R1YWxseSwgc2luY2Ugd2UgYXJlIG5vdCBzYXZpbmcgcHJvamVjdCBJRCBh cwo+IGV4dGVuZGVkIGF0dHJpYnV0ZSBvbiBFeHQ0LiBBbnkgY2hvaWNlIGlzIGZpbmUgd2l0aCBt ZSwgYXMgbG9uZyBhcyB0aGUKPiBpbXBsZW1lbnRhdGlvbiB3b24ndCBpbnRyb2R1Y2UgbmFzdHkg Y29kZXMgb3IgaW5jb25zaXN0ZW50IGRlc2lnbi4KCldlIGNhbiBlYXNpbHkgY3JlYXRlIGFub3Ro ZXIgaW9jdGwgbmFtZSBpZiB3ZSBoYXZlIHRvLiBJdCBqdXN0IG5lZWRzCnN0byBiZSBkZWZpbmVk IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBYRlMgaW9jdGwgbmFtZXMgY3VycmVudGx5CmFyZS4g V2UndmUgZG9uZSB0aGlzIGJlZm9yZSB3aGVuIG1ha2luZyBpb2N0bHMgdGhhdCBvcmlnaW5hdGVk IGluClhGUyBnZW5lcmljIChlLmcuIHdpdGggZnJlZXplL3RoYXcgaW9jdGxzKS4uLi4KCj4gSG93 ZXZlciwgdGhlIHByb2JsZW0gaXMsIEkgZG8gbm90IHF1aXRlIHVuZGVyc3RhbmQgd2h5IHdlIHNo b3VsZCBrZWVwCj4gdGhlIGludGVyZmFjZSBleGFjdGx5IHRoZSBzYW1lIHdpdGggWEZTLiBJdCB3 b3VsZCBiZSBnb29kIGlmIHdlIGNhbi4gQnV0Cj4gYXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgc2Vl bXMgaGFyZC4gWEZTIHVzZXMgYSBsb3QgaW50ZXJmYWNlcyB3aGljaCBhcmUKPiBub3Qgc28gc3Rh bmRhcmQgYW5kIHVzZWQgYnkgb3RoZXIgZmlsZSBzeXN0ZW1zLiBGb3IgZXhhbXBsZSwgc3RydWN0 Cj4gZnN4YXR0ciBpcyBub3QgdXNlZCBieSBvdGhlciBmaWxlIHN5c3RlbXMgYXQgYWxsIGV4Y2Vw dCBYRlMuCgpNb3ZpbmcgYSBleGlzdGluZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8gYSBkaWZm ZXJlbnQgaGVhZGVyIGZpbGUKaXMgdG9vIGhhcmQ/Cgo+IEkgYW0gbm90IHN1cmUgd2h5IHdlIHNo b3VsZCBpbnRyb2R1Y2UgdGhpcyBpbnRvIEV4dDQgaWYgdGhlcmUgYXJlCj4gYSBsb3Qgb2Ygb3Ro ZXIgYmV0dGVyIHdheXMuIEkgd291bGQgYmUgaGFwcHkgdG8gY2hhbmdlIHRvIFhGUwo+IGludGVy ZmFjZXMsIGlmIGl0IGlzIGdlbmVyYWwuICBIb3dldmVyLCBJIGRvbuKAmXQgdGhpbmsgaXQgaXMK PiBnZW5lcmFsIGVub3VnaC4KCkhvdyBpcyBpdCBub3QgZ2VuZXJhbCBlbm91Z2g/IEV4YW1wbGVz LCBwbGVhc2UsIG5vdCBoYW5kd2F2aW5nOgp3aGljaCBiaXQgb2YgdGhlIHF1b3RhIGludGVyZmFj ZSBjYW4ndCBleHQ0IHVzZSBiZWNhdXNlIGl0J3MgWEZTCnNwZWNpZmljPwoKV2UgYWxyZWFkeSBo YXZlIGEgcGVyZmVjdGx5IGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFuZCBhIGxhcmdlIGJvZHkgb2YK Y29kZSB0aGF0IGltcGxlbWVudHMgYW5kIHRlc3RzIGl0LiBZb3UncmUgc2F5aW5nICJvaCwgaXQn cyB0b28gbXVjaAp3b3JrIGZvciBtZSB0byBpbXBsZW1lbnQgYW4gZXhpc3RpbmcgaW50ZXJmYWNl IiBhbmQgaWdub3JpbmcgdGhlCmZhY3QgdGhhdCBub3QgaW1wbGVtZW50aW5nIHRoZSBleGlzdGlu ZyBpbnRlcmZhY2UgZm9yY2VzIGEgaHVnZQphbW91bnQgb2YgZG93bnN0cmVhbSB3b3JrLiBlLmcu CgoJLSB3ZSBuZWVkIGNvbXBsZXRlbHkgbmV3IHRlc3QgaW5mcmFzdHJ1Y3R1cmUgdG8gcmVwbGlj YXRlCgkgIGV4aXN0aW5nIHRlc3RzLgoJLSB3ZSBuZWVkIG5ldyB0ZXN0cyB0byBlbnN1cmUgdGhl IGRpZmZlcmVudCBBUElzIGFuZAoJICB1dGlsaXRpZXMgcHJvdmlkZSB0aGUgc2FtZSBmdW5jdGlv bmFsaXR5LCBhbmQgdGhhdCB0aGUKCSAgd29yayBpZGVudGljYWxseS4KCS0gYWRtaW5pc3RyYXRv cnMgYXJlIGdvaW5nIHRvIGhhdmUgdG8gbGVhcm4gaG93IGV4dDQgaXMKCSAgZGlmZmVyZW50IHRv IHdoYXQgdGhleSBhbHJlYWR5IGtub3cgYW5kIHVuZGVyc3RhbmQuCgktIGFkbWluaXN0cmF0b3Jz IHRoYXQgaGFzIHRvb2xzIHdyaXR0ZW4gdG8gbWFuYWdlIHByb2plY3QKCSAgcXVvdGFzIGlzIGdv aW5nIHRvIGhhdmUgdG8gcmV3cml0ZSB0aGVtIHRvIHN1cHBvcnQgZXh0NC4KCkl0J3MgYW4gZW50 aXJlbHkgc2VsZmlzaCBhcmd1bWVudCB0aGF0IGlnbm9yZXMgd2hhdCBhbHJlYWR5IGV4aXN0aW5n Cm91dCBpbiB1c2Vyc3BhY2UuIGkuZS4geW91J3JlIHNheWluZyB0aGF0IGV4aXN0aW5nIGRvd25z dHJlYW0gdXNlcnMgb2YKcHJvamVjdCBxdW90YXMgc2ltcGxlIGRvbid0IG1hdHRlciB0byB5b3Uu Li4KCj4gSSBrbm93IHhmc3Rlc3QgaXMgdXNpbmcgdGhlIGV4aXN0aW5nIHByb2plY3QgcXVvdGEg aW50ZXJmYWNlcyBvZiBYRlMuIEFuZAo+IG1heWJlIHRoZXJlIGFyZSBzb21lIGFwcGxpY2F0aW9u cyB3aGljaCBhcmUgdXNpbmcgdGhlbSB0b28uIEJ1dAo+IGtlZXBpbmcgdGhlIGludGVyZmFjZXMg ZXhhY3RseSB0aGUgc2FtZSB3aXRoIFhGUyB3b3VsZCBjb3N0IHNvIG11Y2gKPiBlZmZvcnQgdGhh dCBJ4oCZZCBsaWtlIHRvIGdldCBlbm91Z2ggcmVhc29ucyBiZWZvcmUgc3RhcnQgd29ya2luZyBv biBpdC4gSXMgaXQKPiByZWFsbHkgbmVjZXNzYXJ5PyBJIGFtIG5vdCBzbyBzdXJlLgoKWW91IGhh dmUgdG8gaGF2ZSBhIHN0cm9uZ2VyIGFyZ3VtZW50IHRoYW4gdGhhdCB0byBqdXN0aWZ5IGNyZWF0 aW5nIGEKbmV3IGluY29tcGF0aWJsZSB1c2VyIGludGVyZmFjZS4gVGhlIFhGUyBpbnRlcmZhY2Vz IGhhdmUgYmVlbgphdmFpbGFibGUgZm9yIG1vcmUgdGhhbiAxMCB5ZWFycyBhbmQgc3VwcG9ydCBh bGwgdGhlIGZ1bmN0aW9uYWxpdHkKZXh0NCByZXF1aXJlcy4gSWYgaXQgd2FzIGFueSBvdGhlciB1 c2Vyc3BhY2UgaW50ZXJmYWNlIChlLmcuCnN5c2NhbGxzKSBvciBhbnkgZmlsZXN5c3RlbSBvdGhl ciB0aGFuIGV4dDQgdGhlcmUgd291bGQgYmUgcGVvcGxlCmZyb20gYWxsIG92ZXIgdGVsbGluZyB5 b3UgInVzZSB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlcyEiIGFuZCB5b3UnZApuZWVkIHZlcnkgc3Ry b25nIHJlYXNvbnMgZm9yIGNyZWF0aW5nIGEgbmV3IG9uZS4KCmkuZS4geW91IG5lZWQgdG8gZGVt b25zdHJhdGUgdGhhdCB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlcyBhcmUKaW5hZGVxdWF0ZSBmb3Ig dGhlIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIG5ldyBmdW5jdGlvbmFsaXR5LiBUaGF0J3MKY2xl YXJseSBub3QgdGhlIGNhc2UgaGVyZSBzbyB3aHkgc2hvdWxkIHdlIGFsbG93IHlvdSB0byBjcmVh dGUgYW4KaW5jb21wYXRpYmxlIHVzZXJzcGFjZSBBUEkgcmF0aGVyIHRoYW4gdXNlIHRoZSBleGlz dGluZywgZnVsbHkKZnVuY3Rpb25hbCBBUEk/Cgo+IEl0IGlzIHNvIGVhc3kgdG8gY2hhbmdlIHVz ZXIgc3BhY2UgYXBwbGljYXRpb25zIGNvbXBhcmluZyB0bwo+IGNoYW5naW5nIGEgd2VpcmQgaW50 ZXJmYWNlcy4KClRoZSBleGlzdGluZyBnZW5lcmljIHF1b3RhIHRvb2xzIChpLmUgcXVvdGFjdGws IHJlcHF1b3RhLCBldGMpCmFscmVhZHkgaW1wbGVtZW50IHRoZSBYRlMgcXVvdGEgQVBJIHRvIGJl IGFibGUgdG8gcXVlcnkgWEZTCmZpbGVzeXN0ZW1zLiAgVGhlcmUncyBubyAiY2hhbmdpbmcgdG8g d2llcmQgaW50ZXJmYWNlcyIgbmVjZXNzYXJ5CmZvciB1c2Vyc3BhY2U7IGl0J3MgYWxyZWFkeSBh bGwgdGhlcmUuIEhlbmNlIGFueSB3b3JrIHlvdSBkbyB0byBhZGQKcHJvamVjdCBxdW90YSBhd2Fy ZW5lc3MgdG8gdGhvc2UgZ2VuZXJpYyB1c2Vyc3BhY2UgdG9vbHMgd2lsbCBuZWVkIHRvCmFkZCB0 aGUgc3VwcG9ydCB0byB0aGUgWEZTIHF1ZXJpZXMgYW55d2F5LgoKSU9XcywgeW91J3JlIG5vdCBt YWtpbmcgaXQgYW55IGVhc2llciBmb3IgeW91cnNlbGYgaW4gdXNlcnNwYWNlIGJ5CmNyZWF0aW5n IGEgbmV3IEFQSSBmb3IgZXh0NCAtIGl0IGp1c3QgZG91YmxlcyB0aGUgYW1vdW50IG9mIHdvcmsg eW91CmhhdmUgdG8gaW4gdXNlcnNwYWNlIHRvIG1ha2UgZXhpc3RpbmcgdG9vbHMgcHJvamVjdCBx dW90YSBhd2FyZS4KCj4gRm9yCj4gZXhhbXBsZSwgSSB0aGluayBpdCB3b27igJl0IGNvc3QgZXZl biBtb3JlIHRoYW4gYSBkYXkgdG8gYWRkIHhmc3Rlc3QKPiBzdXBwb3J0IGZvciBuZXcgRXh0NCBw cm9qZWN0IHF1b3RhLgoKQSBkYXkgb2Ygd2hvc2UgdGltZT8gCgpFdmVyIHRob3VnaHQgYWJvdXQg aG93IG11Y2ggdGltZSBpdCB3aWxsIHRha2UgcmV2aWV3ZXJzIHRvIGxvb2sgYXQKeW91ciB0ZXN0 cyBhbmQgaXRlcmF0ZSBvdmVyIHRoZW0gdG8gZ2V0IGl0IGFsbCByaWdodD8gSWYgeW91J3JlCmlu dHJvZHVjaW5nIG5ldyB1c2Vyc3BhY2UgaW5mcmFzdHJ1Y3R1cmUgdGhhdCB4ZnN0ZXN0cyB3aWxs IG5lZWQgdG8KZGVwZW5kIG9uIGFuZCB0ZXN0IGZvciwgdGhlbiBpdCdzIGEgbG90IG1vcmUgdGhh biBqdXN0IHdyaXRpbmcgbmV3CnRlc3RzLgoKSW5kZWVkLCBJJ20gbGlrZWx5IHRvIHdhbnQgbmV3 IHByb2plY3QgcXVvdGEgdGVzdHMgdG8gYmUgZ2VuZXJpYwooaS5lLiB3b3JrcyBhbmQgcGFzc2Vz IG9uIGFueSBmaWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgcHJvamVjdApxdW90YXMpIHdpdGggdGhl IGludHJvZHVjdGlvbiBvZiBleHQ0IHByb2plY3QgcXVvdGEgc3VwcG9ydC4gSXQncwp0aGUgc2Ft ZSBmdW5jdGlvbmFsaXR5IGFuZCBzbyBpdCBzaG91bGQgd29yayB0aGUgc2FtZSBqdXN0IGxpa2Ug dXNlcgphbmQgZ3JvdXAgcXVvdGFzIGRvIGFjcm9zcyBhbGwgZmlsZXN5c3RlbXMuCgo+IEFuZCBz aW5jZSBwcm9qZWN0IHF1b3RhIGlzIGZhciBmcm9tCj4gYSB3aWRlbHkgdXNlZCBmZWF0dXJlLAoK SSBkb24ndCB0aGluayB5b3UgcmVhbGlzZSBxdWl0ZSBob3cgd2lkZXNwcmVhZCBpdCdzIHVzZSBp cyBvbiBYRlMuCgo+IEkgZG9u4oCZdCB0aGluayB0aGVyZSBpcyBtdWNoIGNvbXBhdGliaWxpdHkg cHJvYmxlbXMKPiBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLiAgQW5kIElmIHRoZSBuZXcgcHJv amVjdCBpbnRlcmZhY2UgYXJlIGdlbmVyYWwKPiBlbm91Z2gsIHRoZXJlIHdvbuKAmXQgYmUgYW55 IGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgZm9yIG5ldyBhcHBsaWNhdGlvbnMKPiBhdCBhbGwuCgpB Z2FpbiwgeW91IGFyZSBpZ25vcmluZyB0aGUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIGV4 aXN0aW5nCmFwcGxpY2F0aW9ucyB0aGF0IGFyZSBwcm9qZWN0IHF1b3RhIGF3YXJlLiBGb3IgdGhl bSB5b3UgYXJlCipjcmVhdGluZyBuZXcgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyogYnkgaW1wbGVt ZW50aW5nIGEgbmV3CmludGVyZmFjZS4gaS5lLiBFeGlzdGluZyBhcHBsaWNhdGlvbnMgd2lsbCBu b3Qgd29yayBvbiBleHQ0LCBhbmQKbmV3IGFwcGxpY2F0aW9ucyB3cml0dGVuIHRvIHdvcmsgb24g ZXh0NCB3b24ndCB3b3JrIG9uIFhGUy4KClRoYXQncyB0aGUgY3J1eCBvZiB0aGUgaXNzdWUgLSB3 ZSBoYXZlIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB1c2luZwp0aGUgZXhpc3RpbmcgaW50ZXJmYWNl IGFuZCBzbyBpbnRyb2R1Y2luZyBhIG5ldyBpbnRlcmZhY2UgaW50cm9kdWNlcwpjb21wYXRpYmls aXR5IHByb2JsZW1zLiAgWW91IGNhbid0IGp1c3Qgd2F2ZSB0aGlzIHByb2JsZW0gYXdheQpiZWNh dXNlIHlvdSBkb24ndCB0aGluayB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlIG1hdHRlcnMuCgoiSXQn cyBlYXNpZXIgZm9yIG1lIHRvIGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UiIGlzIG5vdCBhIHZhbGlk IHJlYXNvbgpmb3IgY3JlYXRpbmcgYSBuZXcgaW50ZXJmYWNlLi4uLgoKQ2hlZXJzLAoKRGF2ZS4K LS0gCkRhdmUgQ2hpbm5lcgpkYXZpZEBmcm9tb3JiaXQuY29tCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwp4ZnMgbWFpbGluZyBsaXN0Cnhmc0Bvc3Muc2dp LmNvbQpodHRwOi8vb3NzLnNnaS5jb20vbWFpbG1hbi9saXN0aW5mby94ZnMK