From mboxrd@z Thu Jan 1 00:00:00 1970 From: mick@ics.forth.gr (Nick Kossifidis) Date: Sun, 11 Nov 2018 15:17:07 +0200 Subject: [sw-dev] SBI extension proposal v2 In-Reply-To: References: <4aef7216-726c-f565-5c0f-cebd2aefb46d@wdc.com> <2e5329eff04e2b0bc2433b5d974bf10f@mailhost.ics.forth.gr> <84838217ee26d70634368ef63d43427d@mailhost.ics.forth.gr> Message-ID: <1927796907ae3d5630baba51c121f18c@mailhost.ics.forth.gr> To: linux-riscv@lists.infradead.org List-Id: linux-riscv.lists.infradead.org ???? 2018-11-11 09:14, Luke Kenneth Casson Leighton ??????: > --- > crowd-funded eco-conscious hardware: https://www.crowdsupply.com/eoma68 > > On Sun, Nov 11, 2018 at 3:15 AM Nick Kossifidis > wrote: >> >> ???? 2018-11-10 21:39, Luke Kenneth Casson Leighton ??????: >> > --- >> > crowd-funded eco-conscious hardware: https://www.crowdsupply.com/eoma68 >> > >> > On Sat, Nov 10, 2018 at 5:59 PM Nick Kossifidis >> > wrote: >> >> >> >> ???? 2018-11-10 19:47, Luke Kenneth Casson Leighton ??????: >> >> > On Sat, Nov 10, 2018 at 5:42 PM Olof Johansson wrote: >> >> > >> >> >> The case of console is in this case pretty simple: It's intended for >> >> >> early boot for very simplistic environments (before the rest of the >> >> >> kernel is up, etc). Keeping the SBI console around beyond early boot, >> >> >> and somehow trying to optimize for it for those use cases is a >> >> >> misdirected effort; that's what native drivers are for. >> >> > >> >> > spike (which is only around 7,000 lines of code) doesn't have native >> >> > drivers, and qemu is too heavy-duty to consider adding custom >> >> > extensions and experimental research onto. >> >> > >> >> > with nothing in spike *other* than the serial console, it's the only >> >> > way in and out. >> >> > >> >> > l. >> >> >> >> Anything more than a main/debug console is too much for the SBI, its >> >> goal is to be used early on in the boot process until the OS or the >> >> bare metal app takes control. >> > >> > nooo, that's just _one_ use to which it's being put. >> > >> >> Having multiple serial lines through >> >> the SBI for things like PPP, UPS, virtual consoles and all the stuff >> >> you mentioned is out of scope. >> > >> > why? >> > >> >> Because the firmware is meant to be something minimal, not to replace >> the >> OS. Let me ask you this, if you want to change UART speed or settings >> in >> general would you also ask for an SBI call for that ? > > of course, not, nick. it's a simple cut/paste of the existing > console getchar/putchar code. you're beginning to alarm me by making > this out to be much more complex than it is. > > if i'd thought it was a good idea to propose an SBI call to change > UART speed or settings, i would have said so. there's absolutely no > need to make it *look* like i've proposed that. doing so - putting > words into someone else's mouth - is unethical, and i'd appreciate it > if you could stop doing it. > > Sorry that wasn't my intention, my intention was to understand what you want to achieve. On the one hand you mentioned that you want an SBI API change so that you can better work with spike, on the other hand in order to convince the rest of us that this is a good approach for the SBI API, you mentioned some examples that to me look like overengineering at this point. I would never e.g. use getchar/putchar for example for PPP etc. On another example you mentioned using this serial line for providing networking with spike. My questions are honest, I'm not trying to put words on your mouth. >> What's coming up next ? > > nothing, nick. just one extra parameter to the console > getchar/putchar function [or a duplicate function which does] that's > all. > ACK and as I told you on my first reply, my only concern there is that this argument shouldn't be about serial line indices but about "types" so that (since this thing is going to end up on actual hardware) vendors don't mess up. If you say serial line 0 for example and your code assumes this is the main console, another vendor might put the debug console there or an auxiliary console. By using a console id instead of a serial line index, you can hide this on the firmware and deal with it there. >> Adding networking support for example ? > > of course not. why on earth would that make sense? how on earth > would networking fit into a 16k Boot ROM? > I don't know, why on earth should a 16k Boot ROM be used for accessing multiple serial lines for PPP, UPS etc ? To me that's the work of an OS, the same OS that will handle the running of PPP/UPS monitor/whatever. If you use such examples you should expect that people will assume the worst (I'm not the only one that assumed the worst btw), and that's what any reviewer should do. > i feel that you're arguing and throwing up straw-man questions for > arguments' sake, here, hoping that one of them will stick, and that by > ignoring the positive aspects of the (incredibly simple) > cut/paste-style minimalist proposal and throwing as many "bad" ones > out there, it'll somehow.. do.. i dunno, what *is* the purpose of the > questions you're asking? > The positive aspects of supporting multiple serial lines through the SBI getchar/putchar code that you mention are not clear to me, that's why I'm asking what's the purpose of this other than a hack to get around limitations on spike. Supporting PPP for example without being able to set serial parameters is a hack and we shouldn't be discussing that in the context of the SBI. >> Where do you put the >> barrier >> on firmware's complexity / scope ? > > at the exact same point that you do, under the circumstances and > context in which you're looking at and from. > > now, can you recognise that there are *other* needs and requirements > as well, beyond the ones that you have? > I can understand changing the current SBI and adding an extra argument to chose between a main and a debug console (not by serial line index as I mentioned above but through a console id argument). Could you please help me understand why you want support for more ports than that on the base SBI ? You mentioned the following... > * boot message separation from console login ACK I agree on that, that's what the debug uart can be used for, lots of people are doing that. However if by boot messages you mean anything other than dmesg output, you need syslog for that and a /dev/tty* entry for the debug (or any other) console. To me providing this through a driver that's just a wrapper around the SBI and provides only a small subset of what a tty driver should provide is fundamentally wrong. That's why I believe the SBI should only be used for earlyprintk and in general for things before the OS boots. Once the OS boots we should have proper UART support. > * boot management separation from other purposes (u-boot/coreboot) That makes more sense, at least in this case everything is built-in on u-boot/coreboot so using a different way of accessing the main and the debug console shouldn't be a big deal. However I still don't see any value here for more consoles than main/debug. > * virtual /dev/ttyS0-3 > * clean UPS reporting and management > * remote virtual machine power management (power-on / off) > * simple bog-standard multiple virtual login consoles To me this is way off, we have networking for that, why on earth should anyone use serial ports ? > * separation of debug messages (stdout/stderr) to ease debugging and > development > * remote and virtual OpenOCD and kernel debugging without disrupting > the main serial console > * PPP serial links. So again you'll need /dev/tty* for that, which should be handled by a proper UART driver. Especially for the PPP, unless all you want to do is hack your way through. >> By the way spike is an ISA simulator, I don't see why it should >> emulate >> UART ports, last time I checked it didn't, > > ah, nick, i get the feeling you're deliberately looking for ways to > be obstructive, and also fundamentally misunderstanding how the > getchar / putchar code works. > > spike provides a minimal implementation of the SBI, via libfesvr. > the data that goes to the getchar/putchar function is ultimately > redirected to a minimalist stdin / stdout implementation. there *is* > no call to UART ports. > So as I said spike doesn't emulate UART ports, and it shouldn't, it's an ISA simulator, it doesn't and shouldn't emulate devices. > come on, man, be a little less adversarial: it makes life easier for > everyone. > > >> so someone will need to write >> code for that, more money ! > > i'll happily do it, as i need it. it's a straight cut/paste of > pre-existing code. > So what's the issue ? You can patch spike and add your custom SBI calls (vendor-specific) on libfesvr and you are done with it. Why should this extension about multiple serial lines, so that you can do your hacks when testing on spike, should be on the base SBI ? >> You can use QEMU for that where you can have >> as many UARTs as you want and the drivers for them are already >> available >> for you. > > i *can't*. qemu is too complex and i've invested 2 months of > personal money - without funding or grants from any corporation or > institution - into spike, precisely because it's only 7,000 lines of > code. > > modifying qemu is too much. i've seen signs that they're moving into > JIT optimisation territory, which is far too complex to get involved > with. > > spike is simple, it's straightforward, it's fast, and it works. > > What are you trying to do ? Test a specific piece of code / ISA extension etc or emulate a full blown system ? If you just want networking support on spike let's talk about this instead, that's not an issue regarding the SBI. >> > i'm an ethical libre developer: i can't go footing the bill for other >> > people to sponge off my efforts all the time, i've had 20 years of >> > people doing that and i'm f*****g well not putting up with it on this >> > project. >> > >> > so no, mick, sorry, not buying the argument "it's open source". >> > >> > l. >> >> Don't assume you are the only one. > > good to hear. > > now... can i ask you if you could possibly turn down the adversarial > straw-man thing just a leeeetle tiny bit? it takes a huge amount of > effort on your part to maintain, and makes it really really difficult > for everyone to have to read, "no, that's not right, no, that's not > true either, no, i didn't say that at all" and so on. > > what do you think? > > > l. I think that on a technical discussion labeling your peers as "obstructive" and "adversarial" and bringing non-technical arguments like funding issues etc and how ethical/libre developer you are to the table is not appropriate. I never judged your intentions or characterized you in any way, I'd expect from you to do the same. Regards, Nick 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=-2.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS, URIBL_BLOCKED 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 2A79EC43441 for ; Sun, 11 Nov 2018 13:19:06 +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 D55D620871 for ; Sun, 11 Nov 2018 13:19:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="otB3mFPV"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="dEVDfccs" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D55D620871 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ics.forth.gr Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=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:Message-ID:References:In-Reply-To:Subject:To:From: Date:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=8ZRsPQH4fqxakhfkn4UFepgqABp+520a53AkCyE076o=; b=otB3mFPVIbjY0AoxI9Mp1zmje 4Lnc05KoQ36JmsgEDmAMo9cSROnJ+y0eVllfJeie+eDa1zMgi2acn6k2gA9Pmu6t4Wy6RQFNXl6OH 0Xi66ryCddxnhz3zxPPaoxbLYeNPEsj9rQv/J/60S+QqDim/e5ftsW/DiRhD7nY5jNLOlk+ApZffN Zk9XJiMTNBGNLTPwc80/pDGa1Q7OkwEPzD49vFjuTvkbD8zumipUhxt73+LHqYCZFPOpKk43K396Q M9O1PV7FD9W9lAc+zlIWsozdtu5zX1X0XfdRNuZlBp9feTrbt3T2JpF7XBUecO1Xo2WuNVS/2LVD7 DMZ/CgbuA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gLpdo-0003Jm-1m; Sun, 11 Nov 2018 13:19:04 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gLpdm-0003Jg-Pg for linux-riscv@bombadil.infradead.org; Sun, 11 Nov 2018 13:19:02 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Message-ID:References:In-Reply-To: Subject:Cc:To:From:Date:Content-Transfer-Encoding:Content-Type:MIME-Version: Sender:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=ib6w2V5DTWgfV9nYAjZbLVnoPKq7/3zvIErBl0LFSs4=; b=dEVDfccsCXNh4WRGVTr+0Qmr9w ilxaMwWZJ6kBB5YVF+Lj3iMl3yVQ6qU1fszeWpx7yNmqq019g5sC95kOSuwKbbbtFZ+q01rBt5EHN TlgqAKbdmGzjkuX2BGtJ7jJxE/zBjvbuHqv/4Xf7Z+gKqGNKrZSaBRB5zwRnZD8apOgrAT+tZkMtH 9K7kvfUVsroOkrzdRO/71lIg95nj9JUXhn94ycM+5U4B04p0wVjIgcDgLVBCi2beOlnGEk1n6ZSl1 ZOuccuirrZC+YeQS0Y3TKkAlIjpksdUZ0rx5IHGcBdbzXieoOrx3EFL/7sKLc6EWMm4vh38rKOX4i owSxP8lQ==; Received: from mailgate-4.ics.forth.gr ([139.91.1.7]) by casper.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gLpdj-0007Mp-48 for linux-riscv@lists.infradead.org; Sun, 11 Nov 2018 13:19:01 +0000 Received: from av1.ics.forth.gr (av3in.ics.forth.gr. [139.91.1.77]) by mailgate-4.ics.forth.gr (8.14.5/ICS-FORTH/V10-1.9-GATE-OUT) with ESMTP id wABDHBct070735; Sun, 11 Nov 2018 15:17:13 +0200 (EET) X-AuditID: 8b5b9d4d-903ff70000000e62-26-5be82bd63039 Received: from enigma.ics.forth.gr (enigma.ics.forth.gr [139.91.1.35]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 45.0E.03682.6DB28EB5; Sun, 11 Nov 2018 15:17:10 +0200 (EET) Received: from webmail.ics.forth.gr (localhost [127.0.0.1]) by enigma.ics.forth.gr (8.15.1//ICS-FORTH/V10.5.0C-EXTNULL-SSL-SASL) with ESMTP id wABDH73r026662; Sun, 11 Nov 2018 15:17:07 +0200 X-ICS-AUTH-INFO: Authenticated user: at ics.forth.gr MIME-Version: 1.0 Date: Sun, 11 Nov 2018 15:17:07 +0200 From: Nick Kossifidis To: Luke Kenneth Casson Leighton Subject: Re: [sw-dev] SBI extension proposal v2 Organization: FORTH In-Reply-To: References: <4aef7216-726c-f565-5c0f-cebd2aefb46d@wdc.com> <2e5329eff04e2b0bc2433b5d974bf10f@mailhost.ics.forth.gr> <84838217ee26d70634368ef63d43427d@mailhost.ics.forth.gr> Message-ID: <1927796907ae3d5630baba51c121f18c@mailhost.ics.forth.gr> X-Sender: mick@mailhost.ics.forth.gr User-Agent: Roundcube Webmail/1.1.2 X-Brightmail-Tracker: H4sIAAAAAAAAA02RbUhTURjHO/dt19HyOo0OSogzhQydadH5IJUQeQtCjSJqgV316kxTuVvi y4d8y5EWSiW6SU5MQ90qcabpMnUamIbgEKeoNa1wiMyhWYgQ6Ubgt9/5P3/O+XEeGpfOEv50 RraaF7K5LBklJqoUIDh85oRDETmjj0FLjxcwNDb9F6CeFgOJ+swOEnXP30blLieJmtv+EOih 5jeGJmqaMdSzWU6hibUmDLXapjBU5pwUob7KBRKN2zYpZKppIlGFzht1DaehXkc1hVban1Dn /dgPEzqcNTYaAVu784Vg+3SLIla7uoSx/f0lInapy4qxprYw1tTygJ0eKyXZddsOxVrLbCLW NFHEaoaqsIRDt8QxqXxWRh4vyM/eESs17VxuxbX8xtItrBgsxVYCLxoyp2CJ1QwqgZiWMiMA mjvWRZ6DBcA5cx3paZ2GDQOPwB5LGB/4WfuD2GOcQbB2ehB4OBCWvWvA95hgQqCz3uXOKeY4 1FuHd/s07cdEwqqVxL37cWaVgM7Bdnffl5HD55sW91vejC/cWJxysxeTCO3mV5RHaIGEmjmD yCNxAf5yfcI8csega8fuzg8zwdAxVkfWAKlun6tun6tun2sTwDsAw+VFR2SkqCLScgS1MiJd 6ALufb+48h5MNp2zAIYGsoOSzrAVhZTk8lQF93Z/hsZlfpKj3T8VUkkqV1DICzlJwv0sXmUB ATQhOyIZcdy4KmXSOTWfyfO5vPB/itFe/sXgspaC+pCgAep69ZR+o3AuxbD91J58s7flozE6 W7cs2Ed9uhvbwyveBMYPRN31Vrc+m08adb1cj7tYLtd3Li5HkZYirTL2K5+2hr5n5kvUhd7A ELqmqbd1uPy2xucXk0PPvD5gDIL4kHh99u2l6Pj0cOl2HNsfUGRt+JYglxEqJXcyDBdU3D9+ RWI66wIAAA== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181111_131859_404323_CCF2FAD3 X-CRM114-Status: GOOD ( 64.86 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, hch@infradead.org, Damien.LeMoal@wdc.com, Olof Johansson , alankao@andestech.com, abner.chang@hpe.com, atish.patra@wdc.com, Anup Patel , Palmer Dabbelt , Alexander Graf , zong@andestech.com, Olof Johansson , ron minnich , sw-dev@groups.riscv.org, paul.walmsley@sifive.com, mick@ics.forth.gr, Alistair.Francis@wdc.com, linux-riscv@lists.infradead.org, Andrew Waterman Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org Message-ID: <20181111131707.wy53Z4XOlZkQducDyTQVBoiWW9pU-UKhhvCu05h5dNY@z> zqPPhM65z4IgMjAxOC0xMS0xMSAwOToxNCwgTHVrZSBLZW5uZXRoIENhc3NvbiBMZWlnaHRvbiDO rc6zz4HOsc+IzrU6Cj4gLS0tCj4gY3Jvd2QtZnVuZGVkIGVjby1jb25zY2lvdXMgaGFyZHdhcmU6 IGh0dHBzOi8vd3d3LmNyb3dkc3VwcGx5LmNvbS9lb21hNjgKPiAKPiBPbiBTdW4sIE5vdiAxMSwg MjAxOCBhdCAzOjE1IEFNIE5pY2sgS29zc2lmaWRpcyA8bWlja0BpY3MuZm9ydGguZ3I+IAo+IHdy b3RlOgo+PiAKPj4gzqPPhM65z4IgMjAxOC0xMS0xMCAyMTozOSwgTHVrZSBLZW5uZXRoIENhc3Nv biBMZWlnaHRvbiDOrc6zz4HOsc+IzrU6Cj4+ID4gLS0tCj4+ID4gY3Jvd2QtZnVuZGVkIGVjby1j b25zY2lvdXMgaGFyZHdhcmU6IGh0dHBzOi8vd3d3LmNyb3dkc3VwcGx5LmNvbS9lb21hNjgKPj4g Pgo+PiA+IE9uIFNhdCwgTm92IDEwLCAyMDE4IGF0IDU6NTkgUE0gTmljayBLb3NzaWZpZGlzIDxt aWNrQGljcy5mb3J0aC5ncj4KPj4gPiB3cm90ZToKPj4gPj4KPj4gPj4gzqPPhM65z4IgMjAxOC0x MS0xMCAxOTo0NywgTHVrZSBLZW5uZXRoIENhc3NvbiBMZWlnaHRvbiDOrc6zz4HOsc+IzrU6Cj4+ ID4+ID4gT24gU2F0LCBOb3YgMTAsIDIwMTggYXQgNTo0MiBQTSBPbG9mIEpvaGFuc3NvbiA8b2xv ZkBsaXhvbS5uZXQ+IHdyb3RlOgo+PiA+PiA+Cj4+ID4+ID4+IFRoZSBjYXNlIG9mIGNvbnNvbGUg aXMgaW4gdGhpcyBjYXNlIHByZXR0eSBzaW1wbGU6IEl0J3MgaW50ZW5kZWQgZm9yCj4+ID4+ID4+ IGVhcmx5IGJvb3QgZm9yIHZlcnkgc2ltcGxpc3RpYyBlbnZpcm9ubWVudHMgKGJlZm9yZSB0aGUg cmVzdCBvZiB0aGUKPj4gPj4gPj4ga2VybmVsIGlzIHVwLCBldGMpLiBLZWVwaW5nIHRoZSBTQkkg Y29uc29sZSBhcm91bmQgYmV5b25kIGVhcmx5IGJvb3QsCj4+ID4+ID4+IGFuZCBzb21laG93IHRy eWluZyB0byBvcHRpbWl6ZSBmb3IgaXQgZm9yIHRob3NlIHVzZSBjYXNlcyBpcyBhCj4+ID4+ID4+ IG1pc2RpcmVjdGVkIGVmZm9ydDsgdGhhdCdzIHdoYXQgbmF0aXZlIGRyaXZlcnMgYXJlIGZvci4K Pj4gPj4gPgo+PiA+PiA+ICBzcGlrZSAod2hpY2ggaXMgb25seSBhcm91bmQgNywwMDAgbGluZXMg b2YgY29kZSkgZG9lc24ndCBoYXZlIG5hdGl2ZQo+PiA+PiA+IGRyaXZlcnMsIGFuZCBxZW11IGlz IHRvbyBoZWF2eS1kdXR5IHRvIGNvbnNpZGVyIGFkZGluZyBjdXN0b20KPj4gPj4gPiBleHRlbnNp b25zIGFuZCBleHBlcmltZW50YWwgcmVzZWFyY2ggb250by4KPj4gPj4gPgo+PiA+PiA+ICB3aXRo IG5vdGhpbmcgaW4gc3Bpa2UgKm90aGVyKiB0aGFuIHRoZSBzZXJpYWwgY29uc29sZSwgaXQncyB0 aGUgb25seQo+PiA+PiA+IHdheSBpbiBhbmQgb3V0Lgo+PiA+PiA+Cj4+ID4+ID4gIGwuCj4+ID4+ Cj4+ID4+IEFueXRoaW5nIG1vcmUgdGhhbiBhIG1haW4vZGVidWcgY29uc29sZSBpcyB0b28gbXVj aCBmb3IgdGhlIFNCSSwgaXRzCj4+ID4+IGdvYWwgaXMgdG8gYmUgdXNlZCBlYXJseSBvbiBpbiB0 aGUgYm9vdCBwcm9jZXNzIHVudGlsIHRoZSBPUyBvciB0aGUKPj4gPj4gYmFyZSBtZXRhbCBhcHAg dGFrZXMgY29udHJvbC4KPj4gPgo+PiA+ICBub29vLCB0aGF0J3MganVzdCBfb25lXyB1c2UgdG8g d2hpY2ggaXQncyBiZWluZyBwdXQuCj4+ID4KPj4gPj4gSGF2aW5nIG11bHRpcGxlIHNlcmlhbCBs aW5lcyB0aHJvdWdoCj4+ID4+IHRoZSBTQkkgZm9yIHRoaW5ncyBsaWtlIFBQUCwgVVBTLCB2aXJ0 dWFsIGNvbnNvbGVzIGFuZCBhbGwgdGhlIHN0dWZmCj4+ID4+IHlvdSBtZW50aW9uZWQgaXMgb3V0 IG9mIHNjb3BlLgo+PiA+Cj4+ID4gIHdoeT8KPj4gPgo+PiAKPj4gQmVjYXVzZSB0aGUgZmlybXdh cmUgaXMgbWVhbnQgdG8gYmUgc29tZXRoaW5nIG1pbmltYWwsIG5vdCB0byByZXBsYWNlCj4+IHRo ZQo+PiBPUy4gTGV0IG1lIGFzayB5b3UgdGhpcywgaWYgeW91IHdhbnQgdG8gY2hhbmdlIFVBUlQg c3BlZWQgb3Igc2V0dGluZ3MgCj4+IGluCj4+IGdlbmVyYWwgd291bGQgeW91IGFsc28gYXNrIGZv ciBhbiBTQkkgY2FsbCBmb3IgdGhhdCA/Cj4gCj4gIG9mIGNvdXJzZSwgbm90LCBuaWNrLiAgaXQn cyBhIHNpbXBsZSBjdXQvcGFzdGUgb2YgdGhlIGV4aXN0aW5nCj4gY29uc29sZSBnZXRjaGFyL3B1 dGNoYXIgY29kZS4gIHlvdSdyZSBiZWdpbm5pbmcgdG8gYWxhcm0gbWUgYnkgbWFraW5nCj4gdGhp cyBvdXQgdG8gYmUgbXVjaCBtb3JlIGNvbXBsZXggdGhhbiBpdCBpcy4KPiAKPiAgaWYgaSdkIHRo b3VnaHQgaXQgd2FzIGEgZ29vZCBpZGVhIHRvIHByb3Bvc2UgYW4gU0JJIGNhbGwgdG8gY2hhbmdl Cj4gVUFSVCBzcGVlZCBvciBzZXR0aW5ncywgaSB3b3VsZCBoYXZlIHNhaWQgc28uICB0aGVyZSdz IGFic29sdXRlbHkgbm8KPiBuZWVkIHRvIG1ha2UgaXQgKmxvb2sqIGxpa2UgaSd2ZSBwcm9wb3Nl ZCB0aGF0LiAgZG9pbmcgc28gLSBwdXR0aW5nCj4gd29yZHMgaW50byBzb21lb25lIGVsc2UncyBt b3V0aCAtIGlzIHVuZXRoaWNhbCwgYW5kIGknZCBhcHByZWNpYXRlIGl0Cj4gaWYgeW91IGNvdWxk IHN0b3AgZG9pbmcgaXQuCj4gCj4gCgpTb3JyeSB0aGF0IHdhc24ndCBteSBpbnRlbnRpb24sIG15 IGludGVudGlvbiB3YXMgdG8gdW5kZXJzdGFuZCB3aGF0IHlvdQp3YW50IHRvIGFjaGlldmUuIE9u IHRoZSBvbmUgaGFuZCB5b3UgbWVudGlvbmVkIHRoYXQgeW91IHdhbnQgYW4gU0JJCkFQSSBjaGFu Z2Ugc28gdGhhdCB5b3UgY2FuIGJldHRlciB3b3JrIHdpdGggc3Bpa2UsIG9uIHRoZSBvdGhlciBo YW5kCmluIG9yZGVyIHRvIGNvbnZpbmNlIHRoZSByZXN0IG9mIHVzIHRoYXQgdGhpcyBpcyBhIGdv b2QgYXBwcm9hY2ggZm9yCnRoZSBTQkkgQVBJLCB5b3UgbWVudGlvbmVkIHNvbWUgZXhhbXBsZXMg dGhhdCB0byBtZSBsb29rIGxpa2UKb3ZlcmVuZ2luZWVyaW5nIGF0IHRoaXMgcG9pbnQuIEkgd291 bGQgbmV2ZXIgZS5nLiB1c2UgZ2V0Y2hhci9wdXRjaGFyIApmb3IKZXhhbXBsZSBmb3IgUFBQIGV0 Yy4gT24gYW5vdGhlciBleGFtcGxlIHlvdSBtZW50aW9uZWQgdXNpbmcgdGhpcyBzZXJpYWwKbGlu ZSBmb3IgcHJvdmlkaW5nIG5ldHdvcmtpbmcgd2l0aCBzcGlrZS4gTXkgcXVlc3Rpb25zIGFyZSBo b25lc3QsIEknbQpub3QgdHJ5aW5nIHRvIHB1dCB3b3JkcyBvbiB5b3VyIG1vdXRoLgoKPj4gV2hh dCdzIGNvbWluZyB1cCBuZXh0ID8KPiAKPiAgbm90aGluZywgbmljay4gIGp1c3Qgb25lIGV4dHJh IHBhcmFtZXRlciB0byB0aGUgY29uc29sZQo+IGdldGNoYXIvcHV0Y2hhciBmdW5jdGlvbiBbb3Ig YSBkdXBsaWNhdGUgZnVuY3Rpb24gd2hpY2ggZG9lc10gdGhhdCdzCj4gYWxsLgo+IAoKQUNLIGFu ZCBhcyBJIHRvbGQgeW91IG9uIG15IGZpcnN0IHJlcGx5LCBteSBvbmx5IGNvbmNlcm4gdGhlcmUg aXMgdGhhdAp0aGlzIGFyZ3VtZW50IHNob3VsZG4ndCBiZSBhYm91dCBzZXJpYWwgbGluZSBpbmRp Y2VzIGJ1dCBhYm91dCAidHlwZXMiCnNvIHRoYXQgKHNpbmNlIHRoaXMgdGhpbmcgaXMgZ29pbmcg dG8gZW5kIHVwIG9uIGFjdHVhbCBoYXJkd2FyZSkgdmVuZG9ycwpkb24ndCBtZXNzIHVwLiBJZiB5 b3Ugc2F5IHNlcmlhbCBsaW5lIDAgZm9yIGV4YW1wbGUgYW5kIHlvdXIgY29kZSAKYXNzdW1lcwp0 aGlzIGlzIHRoZSBtYWluIGNvbnNvbGUsIGFub3RoZXIgdmVuZG9yIG1pZ2h0IHB1dCB0aGUgZGVi dWcgY29uc29sZSAKdGhlcmUKb3IgYW4gYXV4aWxpYXJ5IGNvbnNvbGUuIEJ5IHVzaW5nIGEgY29u c29sZSBpZCBpbnN0ZWFkIG9mIGEgc2VyaWFsIGxpbmUKaW5kZXgsIHlvdSBjYW4gaGlkZSB0aGlz IG9uIHRoZSBmaXJtd2FyZSBhbmQgZGVhbCB3aXRoIGl0IHRoZXJlLgoKPj4gQWRkaW5nIG5ldHdv cmtpbmcgc3VwcG9ydCBmb3IgZXhhbXBsZSA/Cj4gCj4gIG9mIGNvdXJzZSBub3QuICB3aHkgb24g ZWFydGggd291bGQgdGhhdCBtYWtlIHNlbnNlPyAgaG93IG9uIGVhcnRoCj4gd291bGQgbmV0d29y a2luZyBmaXQgaW50byBhIDE2ayBCb290IFJPTT8KPiAKCkkgZG9uJ3Qga25vdywgd2h5IG9uIGVh cnRoIHNob3VsZCBhIDE2ayBCb290IFJPTSBiZSB1c2VkIGZvciBhY2Nlc3NpbmcKbXVsdGlwbGUg c2VyaWFsIGxpbmVzIGZvciBQUFAsIFVQUyBldGMgPyBUbyBtZSB0aGF0J3MgdGhlIHdvcmsgb2Yg YW4gT1MsCnRoZSBzYW1lIE9TIHRoYXQgd2lsbCBoYW5kbGUgdGhlIHJ1bm5pbmcgb2YgUFBQL1VQ UyBtb25pdG9yL3doYXRldmVyLgpJZiB5b3UgdXNlIHN1Y2ggZXhhbXBsZXMgeW91IHNob3VsZCBl eHBlY3QgdGhhdCBwZW9wbGUgd2lsbCBhc3N1bWUgdGhlCndvcnN0IChJJ20gbm90IHRoZSBvbmx5 IG9uZSB0aGF0IGFzc3VtZWQgdGhlIHdvcnN0IGJ0dyksIGFuZCB0aGF0J3Mgd2hhdAphbnkgcmV2 aWV3ZXIgc2hvdWxkIGRvLgoKPiAgaSBmZWVsIHRoYXQgeW91J3JlIGFyZ3VpbmcgYW5kIHRocm93 aW5nIHVwIHN0cmF3LW1hbiBxdWVzdGlvbnMgZm9yCj4gYXJndW1lbnRzJyBzYWtlLCBoZXJlLCBo b3BpbmcgdGhhdCBvbmUgb2YgdGhlbSB3aWxsIHN0aWNrLCBhbmQgdGhhdCBieQo+IGlnbm9yaW5n IHRoZSBwb3NpdGl2ZSBhc3BlY3RzIG9mIHRoZSAoaW5jcmVkaWJseSBzaW1wbGUpCj4gY3V0L3Bh c3RlLXN0eWxlIG1pbmltYWxpc3QgcHJvcG9zYWwgYW5kIHRocm93aW5nIGFzIG1hbnkgImJhZCIg b25lcwo+IG91dCB0aGVyZSwgaXQnbGwgc29tZWhvdy4uIGRvLi4gaSBkdW5ubywgd2hhdCAqaXMq IHRoZSBwdXJwb3NlIG9mIHRoZQo+IHF1ZXN0aW9ucyB5b3UncmUgYXNraW5nPwo+IAoKVGhlIHBv c2l0aXZlIGFzcGVjdHMgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBzZXJpYWwgbGluZXMgdGhyb3Vn aCB0aGUgU0JJCmdldGNoYXIvcHV0Y2hhciBjb2RlIHRoYXQgeW91IG1lbnRpb24gYXJlIG5vdCBj bGVhciB0byBtZSwgdGhhdCdzIHdoeSAKSSdtCmFza2luZyB3aGF0J3MgdGhlIHB1cnBvc2Ugb2Yg dGhpcyBvdGhlciB0aGFuIGEgaGFjayB0byBnZXQgYXJvdW5kCmxpbWl0YXRpb25zIG9uIHNwaWtl LiBTdXBwb3J0aW5nIFBQUCBmb3IgZXhhbXBsZSB3aXRob3V0IGJlaW5nIGFibGUKdG8gc2V0IHNl cmlhbCBwYXJhbWV0ZXJzIGlzIGEgaGFjayBhbmQgd2Ugc2hvdWxkbid0IGJlIGRpc2N1c3Npbmcg dGhhdAppbiB0aGUgY29udGV4dCBvZiB0aGUgU0JJLgoKPj4gV2hlcmUgZG8geW91IHB1dCB0aGUK Pj4gYmFycmllcgo+PiBvbiBmaXJtd2FyZSdzIGNvbXBsZXhpdHkgLyBzY29wZSA/Cj4gCj4gIGF0 IHRoZSBleGFjdCBzYW1lIHBvaW50IHRoYXQgeW91IGRvLCB1bmRlciB0aGUgY2lyY3Vtc3RhbmNl cyBhbmQKPiBjb250ZXh0IGluIHdoaWNoIHlvdSdyZSBsb29raW5nIGF0IGFuZCBmcm9tLgo+IAo+ ICBub3csIGNhbiB5b3UgcmVjb2duaXNlIHRoYXQgdGhlcmUgYXJlICpvdGhlciogbmVlZHMgYW5k IHJlcXVpcmVtZW50cwo+IGFzIHdlbGwsIGJleW9uZCB0aGUgb25lcyB0aGF0IHlvdSBoYXZlPwo+ IAoKSSBjYW4gdW5kZXJzdGFuZCBjaGFuZ2luZyB0aGUgY3VycmVudCBTQkkgYW5kIGFkZGluZyBh biBleHRyYSBhcmd1bWVudCAKdG8KY2hvc2UgYmV0d2VlbiBhIG1haW4gYW5kIGEgZGVidWcgY29u c29sZSAobm90IGJ5IHNlcmlhbCBsaW5lIGluZGV4IGFzIEkKbWVudGlvbmVkIGFib3ZlIGJ1dCB0 aHJvdWdoIGEgY29uc29sZSBpZCBhcmd1bWVudCkuIENvdWxkIHlvdSBwbGVhc2UgCmhlbHAKbWUg dW5kZXJzdGFuZCB3aHkgeW91IHdhbnQgc3VwcG9ydCBmb3IgbW9yZSBwb3J0cyB0aGFuIHRoYXQg b24gdGhlIGJhc2UgClNCSSA/CgpZb3UgbWVudGlvbmVkIHRoZSBmb2xsb3dpbmcuLi4KCj4gKiBi b290IG1lc3NhZ2Ugc2VwYXJhdGlvbiBmcm9tIGNvbnNvbGUgbG9naW4KCkFDSyBJIGFncmVlIG9u IHRoYXQsIHRoYXQncyB3aGF0IHRoZSBkZWJ1ZyB1YXJ0IGNhbiBiZSB1c2VkIGZvciwgbG90cwpv ZiBwZW9wbGUgYXJlIGRvaW5nIHRoYXQuIEhvd2V2ZXIgaWYgYnkgYm9vdCBtZXNzYWdlcyB5b3Ug bWVhbiBhbnl0aGluZwpvdGhlciB0aGFuIGRtZXNnIG91dHB1dCwgeW91IG5lZWQgc3lzbG9nIGZv ciB0aGF0IGFuZCBhIC9kZXYvdHR5KiBlbnRyeQpmb3IgdGhlIGRlYnVnIChvciBhbnkgb3RoZXIp IGNvbnNvbGUuIFRvIG1lIHByb3ZpZGluZyB0aGlzIHRocm91Z2ggYSAKZHJpdmVyCnRoYXQncyBq dXN0IGEgd3JhcHBlciBhcm91bmQgdGhlIFNCSSBhbmQgcHJvdmlkZXMgb25seSBhIHNtYWxsIHN1 YnNldCBvZgp3aGF0IGEgdHR5IGRyaXZlciBzaG91bGQgcHJvdmlkZSBpcyBmdW5kYW1lbnRhbGx5 IHdyb25nLgoKVGhhdCdzIHdoeSBJIGJlbGlldmUgdGhlIFNCSSBzaG91bGQgb25seSBiZSB1c2Vk IGZvciBlYXJseXByaW50ayBhbmQgaW4KZ2VuZXJhbCBmb3IgdGhpbmdzIGJlZm9yZSB0aGUgT1Mg Ym9vdHMuIE9uY2UgdGhlIE9TIGJvb3RzIHdlIHNob3VsZApoYXZlIHByb3BlciBVQVJUIHN1cHBv cnQuCgo+ICogYm9vdCBtYW5hZ2VtZW50IHNlcGFyYXRpb24gZnJvbSBvdGhlciBwdXJwb3NlcyAo dS1ib290L2NvcmVib290KQoKVGhhdCBtYWtlcyBtb3JlIHNlbnNlLCBhdCBsZWFzdCBpbiB0aGlz IGNhc2UgZXZlcnl0aGluZyBpcyBidWlsdC1pbgpvbiB1LWJvb3QvY29yZWJvb3Qgc28gdXNpbmcg YSBkaWZmZXJlbnQgd2F5IG9mIGFjY2Vzc2luZyB0aGUKbWFpbiBhbmQgdGhlIGRlYnVnIGNvbnNv bGUgc2hvdWxkbid0IGJlIGEgYmlnIGRlYWwuIEhvd2V2ZXIgSSBzdGlsbApkb24ndCBzZWUgYW55 IHZhbHVlIGhlcmUgZm9yIG1vcmUgY29uc29sZXMgdGhhbiBtYWluL2RlYnVnLgoKPiAqIHZpcnR1 YWwgL2Rldi90dHlTMC0zCj4gKiBjbGVhbiBVUFMgcmVwb3J0aW5nIGFuZCBtYW5hZ2VtZW50Cj4g KiByZW1vdGUgdmlydHVhbCBtYWNoaW5lIHBvd2VyIG1hbmFnZW1lbnQgKHBvd2VyLW9uIC8gb2Zm KQo+ICogc2ltcGxlIGJvZy1zdGFuZGFyZCBtdWx0aXBsZSB2aXJ0dWFsIGxvZ2luIGNvbnNvbGVz CgpUbyBtZSB0aGlzIGlzIHdheSBvZmYsIHdlIGhhdmUgbmV0d29ya2luZyBmb3IgdGhhdCwgd2h5 IG9uIGVhcnRoIHNob3VsZAphbnlvbmUgdXNlIHNlcmlhbCBwb3J0cyA/Cgo+ICogc2VwYXJhdGlv biBvZiBkZWJ1ZyBtZXNzYWdlcyAoc3Rkb3V0L3N0ZGVycikgdG8gZWFzZSBkZWJ1Z2dpbmcgYW5k Cj4gZGV2ZWxvcG1lbnQKPiAqIHJlbW90ZSBhbmQgdmlydHVhbCBPcGVuT0NEIGFuZCBrZXJuZWwg ZGVidWdnaW5nIHdpdGhvdXQgZGlzcnVwdGluZwo+IHRoZSBtYWluIHNlcmlhbCBjb25zb2xlCj4g KiBQUFAgc2VyaWFsIGxpbmtzLgoKU28gYWdhaW4geW91J2xsIG5lZWQgL2Rldi90dHkqIGZvciB0 aGF0LCB3aGljaCBzaG91bGQgYmUgaGFuZGxlZCBieQphIHByb3BlciBVQVJUIGRyaXZlci4gRXNw ZWNpYWxseSBmb3IgdGhlIFBQUCwgdW5sZXNzIGFsbCB5b3Ugd2FudCB0bwpkbyBpcyBoYWNrIHlv dXIgd2F5IHRocm91Z2guCgo+PiBCeSB0aGUgd2F5IHNwaWtlIGlzIGFuIElTQSBzaW11bGF0b3Is IEkgZG9uJ3Qgc2VlIHdoeSBpdCBzaG91bGQgCj4+IGVtdWxhdGUKPj4gVUFSVCBwb3J0cywgbGFz dCB0aW1lIEkgY2hlY2tlZCBpdCBkaWRuJ3QsCj4gCj4gIGFoLCBuaWNrLCBpIGdldCB0aGUgZmVl bGluZyB5b3UncmUgZGVsaWJlcmF0ZWx5IGxvb2tpbmcgZm9yIHdheXMgdG8KPiBiZSBvYnN0cnVj dGl2ZSwgYW5kIGFsc28gZnVuZGFtZW50YWxseSBtaXN1bmRlcnN0YW5kaW5nIGhvdyB0aGUKPiBn ZXRjaGFyIC8gcHV0Y2hhciBjb2RlIHdvcmtzLgo+IAo+ICBzcGlrZSBwcm92aWRlcyBhIG1pbmlt YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNCSSwgdmlhIGxpYmZlc3ZyLgo+IHRoZSBkYXRhIHRo YXQgZ29lcyB0byB0aGUgZ2V0Y2hhci9wdXRjaGFyIGZ1bmN0aW9uIGlzIHVsdGltYXRlbHkKPiBy ZWRpcmVjdGVkIHRvIGEgbWluaW1hbGlzdCBzdGRpbiAvIHN0ZG91dCBpbXBsZW1lbnRhdGlvbi4g IHRoZXJlICppcyoKPiBubyBjYWxsIHRvIFVBUlQgcG9ydHMuCj4gCgpTbyBhcyBJIHNhaWQgc3Bp a2UgZG9lc24ndCBlbXVsYXRlIFVBUlQgcG9ydHMsIGFuZCBpdCBzaG91bGRuJ3QsIGl0J3MgYW4K SVNBIHNpbXVsYXRvciwgaXQgZG9lc24ndCBhbmQgc2hvdWxkbid0IGVtdWxhdGUgZGV2aWNlcy4K Cj4gIGNvbWUgb24sIG1hbiwgYmUgYSBsaXR0bGUgbGVzcyBhZHZlcnNhcmlhbDogaXQgbWFrZXMg bGlmZSBlYXNpZXIgZm9yIAo+IGV2ZXJ5b25lLgo+IAo+IAo+PiBzbyBzb21lb25lIHdpbGwgbmVl ZCB0byB3cml0ZQo+PiBjb2RlIGZvciB0aGF0LCBtb3JlIG1vbmV5ICEKPiAKPiAgaSdsbCBoYXBw aWx5IGRvIGl0LCBhcyBpIG5lZWQgaXQuICBpdCdzIGEgc3RyYWlnaHQgY3V0L3Bhc3RlIG9mCj4g cHJlLWV4aXN0aW5nIGNvZGUuCj4gCgpTbyB3aGF0J3MgdGhlIGlzc3VlID8gWW91IGNhbiBwYXRj aCBzcGlrZSBhbmQgYWRkIHlvdXIgY3VzdG9tIFNCSSBjYWxscwoodmVuZG9yLXNwZWNpZmljKSBv biBsaWJmZXN2ciBhbmQgeW91IGFyZSBkb25lIHdpdGggaXQuIFdoeSBzaG91bGQgdGhpcwpleHRl bnNpb24gYWJvdXQgbXVsdGlwbGUgc2VyaWFsIGxpbmVzLCBzbyB0aGF0IHlvdSBjYW4gZG8geW91 ciBoYWNrcyAKd2hlbgp0ZXN0aW5nIG9uIHNwaWtlLCBzaG91bGQgYmUgb24gdGhlIGJhc2UgU0JJ ID8KCj4+IFlvdSBjYW4gdXNlIFFFTVUgZm9yIHRoYXQgd2hlcmUgeW91IGNhbiBoYXZlCj4+IGFz IG1hbnkgVUFSVHMgYXMgeW91IHdhbnQgYW5kIHRoZSBkcml2ZXJzIGZvciB0aGVtIGFyZSBhbHJl YWR5IAo+PiBhdmFpbGFibGUKPj4gZm9yIHlvdS4KPiAKPiAgaSAqY2FuJ3QqLiAgcWVtdSBpcyB0 b28gY29tcGxleCBhbmQgaSd2ZSBpbnZlc3RlZCAyIG1vbnRocyBvZgo+IHBlcnNvbmFsIG1vbmV5 IC0gd2l0aG91dCBmdW5kaW5nIG9yIGdyYW50cyBmcm9tIGFueSBjb3Jwb3JhdGlvbiBvcgo+IGlu c3RpdHV0aW9uIC0gaW50byBzcGlrZSwgcHJlY2lzZWx5IGJlY2F1c2UgaXQncyBvbmx5IDcsMDAw IGxpbmVzIG9mCj4gY29kZS4KPiAKPiAgbW9kaWZ5aW5nIHFlbXUgaXMgdG9vIG11Y2guICBpJ3Zl IHNlZW4gc2lnbnMgdGhhdCB0aGV5J3JlIG1vdmluZyBpbnRvCj4gSklUIG9wdGltaXNhdGlvbiB0 ZXJyaXRvcnksIHdoaWNoIGlzIGZhciB0b28gY29tcGxleCB0byBnZXQgaW52b2x2ZWQKPiB3aXRo Lgo+IAo+IHNwaWtlIGlzIHNpbXBsZSwgaXQncyBzdHJhaWdodGZvcndhcmQsIGl0J3MgZmFzdCwg YW5kIGl0IHdvcmtzLgo+IAo+IAoKV2hhdCBhcmUgeW91IHRyeWluZyB0byBkbyA/IFRlc3QgYSBz cGVjaWZpYyBwaWVjZSBvZiBjb2RlIC8gSVNBIApleHRlbnNpb24KZXRjIG9yIGVtdWxhdGUgYSBm dWxsIGJsb3duIHN5c3RlbSA/IElmIHlvdSBqdXN0IHdhbnQgbmV0d29ya2luZyBzdXBwb3J0Cm9u IHNwaWtlIGxldCdzIHRhbGsgYWJvdXQgdGhpcyBpbnN0ZWFkLCB0aGF0J3Mgbm90IGFuIGlzc3Vl IHJlZ2FyZGluZyAKdGhlClNCSS4KCj4+ID4gIGknbSBhbiBldGhpY2FsIGxpYnJlIGRldmVsb3Bl cjogaSBjYW4ndCBnbyBmb290aW5nIHRoZSBiaWxsIGZvciBvdGhlcgo+PiA+IHBlb3BsZSB0byBz cG9uZ2Ugb2ZmIG15IGVmZm9ydHMgYWxsIHRoZSB0aW1lLCBpJ3ZlIGhhZCAyMCB5ZWFycyBvZgo+ PiA+IHBlb3BsZSBkb2luZyB0aGF0IGFuZCBpJ20gZioqKioqZyB3ZWxsIG5vdCBwdXR0aW5nIHVw IHdpdGggaXQgb24gdGhpcwo+PiA+IHByb2plY3QuCj4+ID4KPj4gPiAgc28gbm8sIG1pY2ssIHNv cnJ5LCBub3QgYnV5aW5nIHRoZSBhcmd1bWVudCAiaXQncyBvcGVuIHNvdXJjZSIuCj4+ID4KPj4g PiBsLgo+PiAKPj4gRG9uJ3QgYXNzdW1lIHlvdSBhcmUgdGhlIG9ubHkgb25lLgo+IAo+ICBnb29k IHRvIGhlYXIuCj4gCj4gbm93Li4uIGNhbiBpIGFzayB5b3UgaWYgeW91IGNvdWxkIHBvc3NpYmx5 IHR1cm4gZG93biB0aGUgYWR2ZXJzYXJpYWwKPiBzdHJhdy1tYW4gdGhpbmcganVzdCBhIGxlZWVl dGxlIHRpbnkgYml0PyAgaXQgdGFrZXMgYSBodWdlIGFtb3VudCBvZgo+IGVmZm9ydCBvbiB5b3Vy IHBhcnQgdG8gbWFpbnRhaW4sIGFuZCBtYWtlcyBpdCByZWFsbHkgcmVhbGx5IGRpZmZpY3VsdAo+ IGZvciBldmVyeW9uZSB0byBoYXZlIHRvIHJlYWQsICJubywgdGhhdCdzIG5vdCByaWdodCwgbm8s IHRoYXQncyBub3QKPiB0cnVlIGVpdGhlciwgbm8sIGkgZGlkbid0IHNheSB0aGF0IGF0IGFsbCIg YW5kIHNvIG9uLgo+IAo+IHdoYXQgZG8geW91IHRoaW5rPwo+IAo+IAo+IGwuCgpJIHRoaW5rIHRo YXQgb24gYSB0ZWNobmljYWwgZGlzY3Vzc2lvbiBsYWJlbGluZyB5b3VyIHBlZXJzIGFzIAoib2Jz dHJ1Y3RpdmUiCmFuZCAiYWR2ZXJzYXJpYWwiIGFuZCBicmluZ2luZyBub24tdGVjaG5pY2FsIGFy Z3VtZW50cyBsaWtlIGZ1bmRpbmcgCmlzc3VlcwpldGMgYW5kIGhvdyBldGhpY2FsL2xpYnJlIGRl dmVsb3BlciB5b3UgYXJlIHRvIHRoZSB0YWJsZSBpcyBub3QgCmFwcHJvcHJpYXRlLgpJIG5ldmVy IGp1ZGdlZCB5b3VyIGludGVudGlvbnMgb3IgY2hhcmFjdGVyaXplZCB5b3UgaW4gYW55IHdheSwg SSdkIApleHBlY3QKZnJvbSB5b3UgdG8gZG8gdGhlIHNhbWUuCgpSZWdhcmRzLApOaWNrCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBt YWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==