From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78CF84657E3; Thu, 7 May 2026 19:09:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778180954; cv=none; b=mQ6Ppos69nZ5l6D3oq8p2Z76cK1IX05+Q/ton83zpl6QMS5YRudEmysmUF7kmeNuQLIPQoc0WCxYUV2ohlUuEZkR07b0VkHgvegEV+R1GG1Bdl/LWWT23SNa1pucKL5uGNGwEvLuK123Y6SNTXTD7MX1awv/8upUgvtFgN6YSgY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778180954; c=relaxed/simple; bh=7ZZx7qoY+3l4F2zGbIwrdroZTOSdiWyvaNkWIj+CxDY=; h=Content-Type:Message-ID:Date:MIME-Version:Subject:To:Cc: References:From:In-Reply-To; b=f88JIttrSkc29o+j/vmOXyCO+Es845qYw1XBrlrkueo0WwCBYgTwi4bWo6nRN+ZQ/UpgzAHWU5PdVZAcpc1R9RyB011EfNelGJEae1KOTPvPcbrYFEXlBLlCMcD+HF26B2r4KhGlNRa6d8vvlZAQI3+8QnP7gkEuuqTC2uREK/Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FTxnZ3Ct; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FTxnZ3Ct" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7AB1C2BCB2; Thu, 7 May 2026 19:09:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778180954; bh=7ZZx7qoY+3l4F2zGbIwrdroZTOSdiWyvaNkWIj+CxDY=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=FTxnZ3CtTVGpHJVhc/444yWjIZtxqEbf6JtsuCk6ZTdR13xI1IR/syel0FbqI6Y7H DO5eWFWExmFclo/lmmlMEYXJ2NudNCo3/QRuPDZHNTP49dnJQCpw8Q7LB522tquGf9 Ppsu3VD6fLNobbNxTSpglCcuT6HoaUuyuedg9Gl3gkNmRK9YUJa7hQ8sDCsMiBZ7I7 DMwq8gPIvDR8UStVQcq3cTDLYLYtKPrqrfG5MAowJiPnYtww9of696wmpHKJm/UhUJ T7krWTR3OTC0xBco5bWlN6TuHfCaZu34mUt3r/utkPG9rqH0cL5BVjcqEn+kyyOYe7 Kanqh5nc0M55w== Content-Type: multipart/mixed; boundary="------------FeRgX0Ubec7oqm9WkwKmFiP7" Message-ID: <6a597dbd-70bf-4b14-b495-2f7248fd3220@kernel.org> Date: Thu, 7 May 2026 21:09:09 +0200 Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next v5 3/5] veth: implement Byte Queue Limits (BQL) for latency reduction To: Simon Schippers , Paolo Abeni , netdev@vger.kernel.org Cc: kernel-team@cloudflare.com, Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Alexei Starovoitov , Daniel Borkmann , John Fastabend , Stanislav Fomichev , linux-kernel@vger.kernel.org, bpf@vger.kernel.org References: <20260505132159.241305-1-hawk@kernel.org> <20260505132159.241305-4-hawk@kernel.org> <8f2f7f2e-6aa2-4e5b-b52d-0025b2525579@redhat.com> Content-Language: en-US From: Jesper Dangaard Brouer In-Reply-To: This is a multi-part message in MIME format. --------------FeRgX0Ubec7oqm9WkwKmFiP7 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 07/05/2026 16.46, Simon Schippers wrote: > > > On 5/7/26 16:34, Paolo Abeni wrote: >> On 5/7/26 8:54 AM, Simon Schippers wrote: >>> On 5/5/26 15:21, hawk@kernel.org wrote: >>>> @@ -928,9 +968,13 @@ static int veth_xdp_rcv(struct veth_rq *rq, int budget, >>>> } >>>> } else { >>>> /* ndo_start_xmit */ >>>> - struct sk_buff *skb = ptr; >>>> + bool bql_charged = veth_ptr_is_bql(ptr); >>>> + struct sk_buff *skb = veth_ptr_to_skb(ptr); >>>> >>>> stats->xdp_bytes += skb->len; >>>> + if (peer_txq && bql_charged) >>>> + netdev_tx_completed_queue(peer_txq, 1, VETH_BQL_UNIT); >>> >>> In the discussion with Jonas [1], I left a comment explaining why I think >>> this doesn’t work. >>> I've experimented with doing the "completion" at NAPI-end in veth_poll(), but that resulted in BQL limit being 128 packets, which leads to bad latency results (not acceptable). (See detailed report later) >>> I still think first that adding an option to modify the hard-coded >>> VETH_RING_SIZE is the way to go. >>> Not against being able to modify VETH_RING_SIZE, but I don't think it is the solution here. The simply solution is the configure BQL limit_min: `/sys/class/net//queues/tx-N/byte_queue_limits/limit_min` My experiments (below) find that limit_min=8 is gives good performance. We can simply set default to 8 as this still allows userspace to change this later if lower latency is preferred. >>> Thanks! >>> >>> [1] Link: https://lore.kernel.org/netdev/e8cdba04-aa9a-45c6-9807-8274b62920df@tu-dortmund.de/ >> >> In the above discussion a 20% regression is reported, which IMHO can't >> be ignored. Still the tput figures in the data are extremely low, >> something is possibly off?!? I would expect a few Mpps with pktgen on >> top of veth, while the reported data is ~20-30Kpps. >> >> /P >> > > The ~20-30Kpps occur when thousands of iptables rules are applied and > an UDP userspace application is sending. > > And there is a 20% pktgen regression (no iptables rules applied). > The pktgen test is a little dubious/weird and Jonas had to modify pktgen to test this. John Fastabend added a config to pktgen that allows us to benchmarking egress qdisc path, this might be better to use this. The samples/pktgen/pktgen_bench_xmit_mode_queue_xmit.sh is a demo usage. If redoing the tests, can you adjust limit_min to see the effect? /sys/class/net//queues/tx-N/byte_queue_limits/limit_min 20% throughput performance regression is of-cause too much, but I will remind us, that adding a qdisc will "cost" some overhead, that is a configuration choice. Our purpose here is to reduce bufferbloat and latency, not optimize for throughput. > I am pretty sure the reason is because the BQL limit is stuck at 2 > packets (because the completed queue is always called with 1 packet > and not in a interrupt/timer with multiple packets...). > I've run a lot of experiments, which I made AI write a report over, see attachment. The TL;DR is that best performance vs latency tradeoff is defaulting BQL/DQL limit_min to be 8 packets. I fear this patchset will stall forever, if we keep searching for a perfect solution without any overhead. The qdisc layer will be a baseline overhead. The limit=2 packets is actually the optimal darkbuffer queue size, but I acknowledge that this causes too many qdisc requeue events (leading to overhead). I suggest that I add another patch in V6, that defaults limit_min to 8 (separate patch to make it easier to revert/adjust later). I've talked with Jonas, and we want to experiment with different solutions to make BQL/DQL work better with virtual devices. This patchset helps our (production) use-case reduce mice-flow latency from approx 22ms to 1.3ms for latency under-load. Due to the consumer namespace being the bottleneck the requeue overhead is negligible in comparison. -Jesper --------------FeRgX0Ubec7oqm9WkwKmFiP7 Content-Type: text/markdown; charset=UTF-8; name="PERF-2651-bql-completion-experiment.md" Content-Disposition: attachment; filename="PERF-2651-bql-completion-experiment.md" Content-Transfer-Encoding: base64 IyBQRVJGLTI2NTE6IEJRTCBDb21wbGV0aW9uIEJhdGNoaW5nIEV4cGVyaW1lbnQgKDIwMjYt MDUtMDUpCgojIyBCYWNrZ3JvdW5kCgpTaW1vbiBTY2hpcHBlcnMgYW5kIEpvbmFzIEtvZXBw ZWxlciByYWlzZWQgY29uY2VybnMgdGhhdCBEUUwgc2V0dGxlcyBhdApsaW1pdD0yIHdpdGgg dmV0aCBCUUwsIGNpdGluZyB0aGUgbmV0ZGV2aWNlLmggY29tbWVudDoKCj4gIk11c3QgYmUg Y2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgVFggY29tcGxldGlvbiByb3VuZCAoYW5kIG5vdCBw ZXIKPiAgaW5kaXZpZHVhbCBwYWNrZXQpLCBzbyB0aGF0IEJRTCBjYW4gYWRqdXN0IGl0cyBs aW1pdHMgYXBwcm9wcmlhdGVseS4iCgpBbmQgVG9tIEhlcmJlcnQncyBvcmlnaW5hbCBCUUwg Y292ZXIgbGV0dGVyOgoKPiAiQlFMIGFjY291bnRpbmcgaXMgaW4gdGhlIHRyYW5zbWl0IHBh dGggZm9yIGV2ZXJ5IHBhY2tldCwgYW5kIHRoZQo+ICBmdW5jdGlvbiB0byByZWNvbXB1dGUg dGhlIGJ5dGUgbGltaXQgaXMgcnVuIG9uY2UgcGVyIHRyYW5zbWl0IGNvbXBsZXRpb24uIgoK VGhyZWFkOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9hbGwvZThjZGJhMDQtYWE5YS00NWM2 LTk4MDctODI3NGI2MjkyMGRmQHR1LWRvcnRtdW5kLmRlLwoKIyMgRXhwZXJpbWVudDogQmF0 Y2ggQlFMIGNvbXBsZXRpb24gYXQgZW5kIG9mIHZldGhfcG9sbAoKQ3JlYXRlZCBzdGcgcGF0 Y2ggYGV4cGVyaW1lbnQtYmF0Y2gtYnFsLWNvbXBsZXRpb25gIHRoYXQgbW92ZXMKYG5ldGRl dl90eF9jb21wbGV0ZWRfcXVldWUoKWAgZnJvbSBwZXItU0tCIGluc2lkZSBgdmV0aF94ZHBf cmN2KClgIHRvIGEKc2luZ2xlIGJhdGNoZWQgY2FsbCBhdCB0aGUgZW5kIG9mIGB2ZXRoX3Bv bGwoKWAuCgojIyMgQ29kZSBjaGFuZ2UgKGRyaXZlcnMvbmV0L3ZldGguYykKCkluIGB2ZXRo X3hkcF9yY3YoKWA6IHJlcGxhY2UgcGVyLVNLQiBjb21wbGV0aW9uIHdpdGggY291bnRlciBh Y2N1bXVsYXRpb246CmBgYGMKLy8gQmVmb3JlIChWNSwgcGVyLXBhY2tldCk6CmlmIChwZWVy X3R4cSAmJiBicWxfY2hhcmdlZCkKICAgIG5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUocGVl cl90eHEsIDEsIFZFVEhfQlFMX1VOSVQpOwoKLy8gQWZ0ZXIgKGV4cGVyaW1lbnQsIGFjY3Vt dWxhdGUpOgppZiAocGVlcl90eHEgJiYgYnFsX2NoYXJnZWQpCiAgICBzdGF0cy0+YnFsX2Nv bXBsZXRlZCArPSBWRVRIX0JRTF9VTklUOwpgYGAKCkluIGB2ZXRoX3BvbGwoKWA6IHNpbmds ZSBiYXRjaGVkIGNhbGwgYWZ0ZXIgdmV0aF94ZHBfcmN2KCkgcmV0dXJuczoKYGBgYwppZiAo cGVlcl90eHEgJiYgc3RhdHMuYnFsX2NvbXBsZXRlZCkKICAgIG5ldGRldl90eF9jb21wbGV0 ZWRfcXVldWUocGVlcl90eHEsIHN0YXRzLmJxbF9jb21wbGV0ZWQsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0YXRzLmJxbF9jb21wbGV0ZWQpOwpgYGAKCk5vdGU6IGNhbm5v dCB1c2UgYGRvbmVgIChyZXR1cm4gdmFsdWUgb2YgdmV0aF94ZHBfcmN2KSBiZWNhdXNlIGl0 IGNvdW50cwphbGwgY29uc3VtZWQgcmluZyBlbnRyaWVzIGluY2x1ZGluZyBYRFAgZnJhbWVz IHRoYXQgd2VyZSBuZXZlciBCUUwtY2hhcmdlZC4KVXNpbmcgYGRvbmVgIHdvdWxkIG92ZXIt Y29tcGxldGUgYW5kIGhpdCBCVUdfT04gaW4gZHFsX2NvbXBsZXRlZCgpLgoKIyMgV2h5IERR TCBzZXR0bGVzIGF0IGxpbWl0PTIgd2l0aCBwZXItcGFja2V0IGNvbXBsZXRpb24KClRoZSBE UUwgc2xhY2sgY2FsY3VsYXRpb24gaW4gYGRxbF9jb21wbGV0ZWQoKWAgdXNlczoKYGBgYwpz bGFjayA9IFBPU0RJRkYobGltaXQgKyBwcmV2X292bGltaXQsIDIgKiAoY29tcGxldGVkIC0g bnVtX2NvbXBsZXRlZCkpOwpgYGAKCmBjb21wbGV0ZWQgLSBudW1fY29tcGxldGVkYCBlcXVh bHMgdGhlIGBjb3VudGAgcGFyYW1ldGVyIChieXRlcyBjb21wbGV0ZWQKdGhpcyBjYWxsKS4g UGVyLXBhY2tldDogY291bnQ9MSwgc28gc2xhY2sgPSBsaW1pdCArIHByZXZfb3ZsaW1pdCAt IDIuCldpdGggbGltaXQ9Miwgc2xhY2s9MCwgc28gdGhlIGFsZ29yaXRobSBob2xkcyBzdGVh ZHkgYXQgMi4KCldpdGggYmF0Y2hlZCBjb21wbGV0aW9uOiBjb3VudD1+NjQsIHNsYWNrIGNh bGN1bGF0aW9uIHNlZXMgdGhlIHJlYWwgYmF0Y2gKc2l6ZSwgYW5kIERRTCBjb252ZXJnZXMg dG8gbGltaXQ9MTI4ICh+MnggTkFQSSBidWRnZXQpLgoKIyMgUmVzdWx0czogbnJ1bGVzPTM1 MDAgKHNmcSArIHRpbnktZmxvb2QpCgp8IE1ldHJpYyAgICAgICAgfCBObyBCUUwgICAgfCBQ ZXItcGt0ICAgfCBsaW1pdD00IHwgbGltaXQ9OCB8IGxpbWl0PTE2IHwgQmF0Y2hlZCAgICAg fAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAobGltaXQ9MikgfCAgICAgICAgIHwg ICAgICAgICB8ICAgICAgICAgIHwgKGxpbWl0PTEyOCkgfAp8LS0tLS0tLS0tLS0tLS0tfC0t LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwt LS0tLS0tLS0tLS0tfAp8IEJRTCBsaW1pdCAgICAgfCB1bmxpbWl0ZWQgfCAyICAgICAgICAg fCA0ICAgICAgIHwgOCAgICAgICB8IDE2ICAgICAgIHwgMTI4ICAgICAgICAgfAp8IEJRTCBp bmZsaWdodCAgfCAyNTQgICAgICAgfCAzICAgICAgICAgfCA1ICAgICAgIHwgOS0xNyAgICB8 IDI1ICAgICAgIHwgMTMzICAgICAgICAgfAp8IFBpbmcgUlRUIGF2ZyAgfCA5LjNtcyAgICAg fCAwLjk0bXMgICAgfCAxLjA3bXMgIHwgMS4yNG1zICB8IDEuNjltcyAgIHwgNC4wbXMgICAg ICAgfAp8IHJlcXVldWVzICAgICAgfCA1MksgICAgICAgfCA0NTRLICAgICAgfCA0MjZLICAg IHwgMzk5SyAgICB8IDM1NksgICAgIHwgMTEySyAgICAgICAgfAp8IE5BUEkgYXZnX3dvcmsg fCA2MyAgICAgICAgfCA1ICAgICAgICAgfCAxNSAgICAgIHwgNjMgICAgICB8IDYzICAgICAg IHwgNjMgICAgICAgICAgfAp8IE5BUEkgcG9sbHMgICAgfCB+Mi4ySyAgICAgfCB+MjdLICAg ICAgfCB+MTAuNUsgIHwgfjIuNUsgICB8IH4yLjNLICAgIHwgfjIuNUsgICAgICAgfAp8IENv bnN1bWVyIHBwcyAgfCB+MjZLICAgICAgfCB+MzBLICAgICAgfCB+MzBLICAgIHwgfjMwSyAg ICB8IH4yOUsgICAgIHwgfjMwSyAgICAgICAgfAoKIyMgUmVzdWx0czogbnJ1bGVzPTE1MDAw IChzZnEgKyB0aW55LWZsb29kLCBzbG93ZXIgY29uc3VtZXIpCgp8IE1ldHJpYyAgICAgICAg fCBObyBCUUwgICAgIHwgUGVyLXBrdCAgIHwgbGltaXQ9NCAgIHwgbGltaXQ9OCAgIHwgbGlt aXQ9MTYgIHwgQmF0Y2hlZCAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg KGxpbWl0PTIpIHwgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwgKGxpbWl0 PTEyOCkgfAp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0t LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8IEJRTCBs aW1pdCAgICAgfCB1bmxpbWl0ZWQgIHwgMiAgICAgICAgIHwgNCAgICAgICAgIHwgOCAgICAg ICAgIHwgMTYgICAgICAgIHwgMTI4ICAgICAgICAgfAp8IEJRTCBpbmZsaWdodCAgfCAyMTEt MjI3ICAgIHwgMyAgICAgICAgIHwgNS0xMiAgICAgIHwgOSAgICAgICAgIHwgMTcgICAgICAg IHwgMTMyLTEzNiAgICAgfAp8IFBpbmcgUlRUIGF2ZyAgfCAqKjM3LjhtcyoqIHwgKio0LjVt cyoqIHwgKio1LjBtcyoqIHwgKio2LjBtcyoqIHwgKio2LjRtcyoqIHwgKioyMC4wbXMqKiAg fAp8IFBpbmcgUlRUIG1pbiAgfCAyNy43bXMgICAgIHwgMS40bXMgICAgIHwgMS43bXMgICAg IHwgMi40bXMgICAgIHwgMy4wbXMgICAgIHwgMTAuNG1zICAgICAgfAp8IHJlcXVldWVzICAg ICAgfCAxMi45SyAgICAgIHwgOTNLICAgICAgIHwgODdLICAgICAgIHwgODBLICAgICAgIHwg ODZLICAgICAgIHwgMjIuOEsgICAgICAgfAp8IE5BUEkgYXZnX3dvcmsgfCA2MSAgICAgICAg IHwgNiAgICAgICAgIHwgMTcgICAgICAgIHwgNjAgICAgICAgIHwgNjEgICAgICAgIHwgNjEg ICAgICAgICAgfAp8IE5BUEkgcG9sbHMgICAgfCB+NTQwICAgICAgIHwgfjQuOUsgICAgIHwg fjEuOUsgICAgIHwgfjU0MCAgICAgIHwgfjU1MCAgICAgIHwgfjU0MCAgICAgICAgfAp8IENv bnN1bWVyIHBwcyAgfCB+Ni43SyAgICAgIHwgfjYuN0sgICAgIHwgfjYuOUsgICAgIHwgfjYu OEsgICAgIHwgfjcuMEsgICAgIHwgfjYuN0sgICAgICAgfAoKIyMgQW5hbHlzaXMKCiMjIyBC YXRjaGVkIGNvbXBsZXRpb24gaXMgY2xlYXJseSB3b3JzZSBmb3IgbGF0ZW5jeQoKQXQgbnJ1 bGVzPTE1MDAwLCBiYXRjaGVkIGNvbXBsZXRpb24gZ2l2ZXMgMjBtcyBwaW5nIFJUVCAtLSBv bmx5IDJ4IGJldHRlcgp0aGFuIG5vLUJRTCAoMzcuOG1zKS4gUGVyLXBhY2tldCBnaXZlcyA0 LjVtcyAtLSBhbiA4eCBpbXByb3ZlbWVudC4KClRoZSBtYXRoIGNvbmZpcm1zIHRoaXM6IDEy OCBwYWNrZXRzIC8gNi43SyBwcHMgPSAxOW1zIG9mIHVuY29udHJvbGxlZApxdWV1aW5nIGRl bGF5LiBUaGlzIG1hdGNoZXMgdGhlIG1lYXN1cmVkIDIwbXMgYWxtb3N0IGV4YWN0bHkuCgoj IyMgUGVyLXBhY2tldCBjb21wbGV0aW9uIChsaW1pdD0yKSBpcyBjb3JyZWN0IGZvciB2ZXRo CgpTaW1vbidzIGNvbmNlcm4gdGhhdCBsaW1pdD0yIGlzIGEgRFFMIGRlZmVjdCBpcyB3cm9u Zy4gbGltaXQ9MiBpcyB0aGUKaWRlYWwgYmVoYXZpb3IgZm9yIGRhcmstYnVmZmVyIGVsaW1p bmF0aW9uOgotIE9ubHkgMi0zIHBhY2tldHMgaW4gdGhlIHB0cl9yaW5nIGF0IGFueSB0aW1l Ci0gUWRpc2MgZ2V0cyBpbW1lZGlhdGUgY29udHJvbCBvdmVyIGFsbCBidWZmZXJpbmcKLSA4 eCBsYXRlbmN5IHJlZHVjdGlvbiB2cyBuby1CUUwKClRoZSBEUUwgY29tbWVudCAib25jZSBw ZXIgVFggY29tcGxldGlvbiByb3VuZCIgd2FzIHdyaXR0ZW4gZm9yIEhXIE5JQ3MKd2hlcmUg aW50ZXJydXB0IGNvYWxlc2NpbmcgYmF0Y2hlcyBjb21wbGV0aW9ucyBuYXR1cmFsbHkuIEZv ciB2ZXRoLCBlYWNoCnBlci1TS0IgY29tcGxldGlvbiB3aXRoaW4gYSBOQVBJIHBvbGwgdGVj aG5pY2FsbHkgdmlvbGF0ZXMgdGhlIGxldHRlciBvZgp0aGUgY29tbWVudCwgYnV0IHRoZSBy ZXN1bHRpbmcgbGltaXQ9MiBpcyBjb3JyZWN0IGZvciB0aGUgdXNlIGNhc2UuCgpUaGUgY29u Y2VybiB3aXRoIGxpbWl0PTIgaXMgdGhlIG92ZXJoZWFkIGl0IGludHJvZHVjZXM6CgojIyMg VHJhZGUtb2ZmOiBOQVBJIHBvbGxpbmcgb3ZlcmhlYWQKClBlci1wYWNrZXQgKGxpbWl0PTIp IGNhdXNlcyBtYW55IG1vcmUgTkFQSSBwb2xsczoKLSBucnVsZXM9MzUwMDogMjdLIHBvbGxz IChhdmdfd29yaz01KSB2cyAyLjVLIHBvbGxzIChhdmdfd29yaz02MykKLSBucnVsZXM9MTUw MDA6IDQuOUsgcG9sbHMgKGF2Z193b3JrPTYpIHZzIDU0MCBwb2xscyAoYXZnX3dvcms9NjEp CgpUaGlzIGlzIGJlY2F1c2Ugd2l0aCBvbmx5IDItMyBpdGVtcyBpbiB0aGUgcmluZywgZWFj aCBOQVBJIHBvbGwgZHJhaW5zCnRoZSByaW5nIHF1aWNrbHkgLT4gbmFwaV9jb21wbGV0ZV9k b25lIC0+IHJlc2NoZWR1bGUuIE1vcmUgc2NoZWR1bGluZwpvdmVyaGVhZCwgYnV0IG5vIHRo cm91Z2hwdXQgaW1wYWN0IHdoZW4gY29uc3VtZXIgaXMgdGhlIGJvdHRsZW5lY2suCgojIyMg bGltaXRfbWluIHR1bmluZyB2aWEgc3lzZnMKCkRRTCBsaW1pdF9taW4gY2FuIGJlIHNldCB2 aWE6CmAvc3lzL2NsYXNzL25ldC88ZGV2Pi9xdWV1ZXMvdHgtMC9ieXRlX3F1ZXVlX2xpbWl0 cy9saW1pdF9taW5gCgpUaGUgc2VsZnRlc3QgYC0tYnFsLW1pbi1saW1pdCBOYCBmbGFnIHdy aXRlcyB0byB0aGlzIHN5c2ZzLgoKLSAqKmxpbWl0X21pbj00Kio6IGhhbGYgYSBjYWNoZS1s aW5lICgzMiBieXRlcyBvZiBwdHJfcmluZyBwb2ludGVycykuCiAgYXZnX3dvcms9MTcsIDEu OUsgcG9sbHMuIFBpbmcgNS4wbXMgLS0gY2xvc2UgdG8gbGltaXQ9MiAoNC41bXMpLgotICoq bGltaXRfbWluPTgqKjogb25lIGNhY2hlLWxpbmUgKDY0IGJ5dGVzIG9mIHB0cl9yaW5nIHBv aW50ZXJzKS4KICBhdmdfd29yaz02MCwgNTQwIHBvbGxzLiBQaW5nIDYuMG1zIC0tIGVmZmlj aWVudCBmdWxsLWJ1ZGdldCBwb2xscy4KCiMjIyBEYXJrIGJ1ZmZlciBmb3JtdWxhCgpBdCBj b25zdW1lciByYXRlIFIgKHBwcykgYW5kIEJRTCBsaW1pdCBMIChwYWNrZXRzKToKLSBEYXJr IGJ1ZmZlciBsYXRlbmN5ID0gTCAvIFIKLSBsaW1pdD0yOiAyLzY3MDAgPSAwLjNtcyAobmVn bGlnaWJsZSkKLSBsaW1pdD04OiA4LzY3MDAgPSAxLjJtcwotIGxpbWl0PTEyODogMTI4LzY3 MDAgPSAxOW1zIChtYXRjaGVzIG1lYXN1cmVkIDIwbXMpCi0gdW5saW1pdGVkICgyNTQpOiAy NTQvNjcwMCA9IDM4bXMgKG1hdGNoZXMgbWVhc3VyZWQgMzcuOG1zKQoKIyMgUmVzdWx0czog bnJ1bGVzPTAgKG5vIGNvbnN1bWVyIG92ZXJoZWFkLCBtYXggdGhyb3VnaHB1dCkKClRoaXMg dGVzdHMgdGhlIHJhdyB0aHJvdWdocHV0IG92ZXJoZWFkIG9mIEJRTCBzdG9wL3N0YXJ0IG9z Y2lsbGF0aW9uLgpBbGwgdmFsdWVzIGFyZSBhdmVyYWdlcyBvZiA0IHJ1bnMgKFZNIG5vaXNl IGlzIH4xNS0yMCUgcGVyLXJ1biB2YXJpYW5jZSkuCgp8IE1ldHJpYyAgICAgICAgICB8IE5v IEJRTCB8IGxpbWl0PTIgfCBsaW1pdD00IHwgbGltaXQ9OCB8IGxpbWl0PTE2IHwKfC0tLS0t LS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0t LS0tLS0tLS18CnwgU2luayBwcHMgKGxhcmdlKXwgODQxSyAgIHwgNzU5SyAgICB8IDY5Mksg ICAgfCA3NjJLICAgIHwgNzM2SyAgICAgfAp8IFNpbmsgcHBzIChzbWFsbCl8IDk1MEsgICB8 IDg3NEsgICAgfCA4MDdLICAgIHwgODc0SyAgICB8IDg0NEsgICAgIHwKfCBxZGlzYyBwa3Rz ICAgICAgfCA0OC42TSAgfCA0NC44TSAgIHwgNDAuMU0gICB8IDQ1LjBNICAgfCA0NC44TSAg ICB8CnwgcmVxdWV1ZXMgICAgICAgIHwgMzExSyAgIHwgNi4xTSAgICB8IDEzLjRNICAgfCA1 LjhNICAgIHwgNS4yTSAgICAgfAp8IE5BUEkgYXZnX3dvcmsgICB8IDIyICAgICB8IDI3ICAg ICAgfCAxMiAgICAgIHwgMTkgICAgICB8IDIxICAgICAgIHwKfCBQaW5nIFJUVCBhdmcgICAg fCAwLjE3bXMgfCAwLjExbXMgIHwgMC4xMG1zICB8IDAuMDg1bXMgfCAwLjA5NW1zICB8Cnwg UnVucyAgICAgICAgICAgIHwgNCAgICAgIHwgNCAgICAgICB8IDQgICAgICAgfCA0ICAgICAg IHwgNCAgICAgICAgfAoKT2JzZXJ2YXRpb25zOgotICoqbGltaXQ9MiBpcyBOT1QgdGhlIHdv cnN0KiogLS0gbGltaXQ9NCBoYXMgaGlnaGVyIHJlcXVldWVzICgxMy40TSkgYW5kCiAgbG93 ZXIgdGhyb3VnaHB1dCAoNjkySyBzaW5rKSBkdWUgdG8gbW9yZSBzdG9wL3N0YXJ0IGN5Y2xl cyBhdCBhIGxlc3MKICBlZmZpY2llbnQgTkFQSSBiYXRjaCBzaXplIChhdmdfd29yaz0xMikK LSAqKmxpbWl0PTggYW5kIGxpbWl0PTE2IG1hdGNoIE5vLUJRTCB0aHJvdWdocHV0Kiogd2l0 aGluIG5vaXNlICh+NzYySyB2cyA4NDFLCiAgc2luayBwcHMgZm9yIGxhcmdlIHBrdHMsIH4z LTEwJSBkaWZmZXJlbmNlKQotICoqUmVxdWV1ZSBvdmVyaGVhZCoqOiAzMTFLIChObyBCUUwp IC0+IDUuMi01LjhNIChsaW1pdD04LzE2KSAtPiAxMy40TSAobGltaXQ9NCkKLSBMYXRlbmN5 IHN1Yi0wLjJtcyBmb3IgYWxsIHNldHRpbmdzIGF0IHRoaXMgc3BlZWQgLS0gbm90IGEgZGlm ZmVyZW50aWF0b3IKCiMjIENvbXBhcmlzb246IGxpbWl0PTggdnMgbGltaXQ9MTYKCk11bHRp LXJ1biAoNCBpdGVyYXRpb25zIGVhY2gsIG5ydWxlcz0wKSB0byBjdXQgdGhyb3VnaCBWTSBu b2lzZToKCiMjIyBsaW1pdD04ICg0IHJ1bnMpCgp8IFJ1biB8IFNpbmsgcHBzIChsYXJnZS9z bWFsbCkgfCBxZGlzYyBwa3RzIHwgcmVxdWV1ZXMgfCBhdmdfd29yayB8IFBpbmcgYXZnIHwK fC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0t fC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCAxICAgfCA3OTZLIC8gOTExSyAgICAgICAgICAg IHwgNDYuMk0gICAgIHwgNS42TSAgICAgfCAyMCAgICAgICB8IDAuMDYybXMgIHwKfCAyICAg fCA3OTZLIC8gODgzSyAgICAgICAgICAgIHwgNDUuNU0gICAgIHwgNC43TSAgICAgfCAxNiAg ICAgICB8IDAuMDgxbXMgIHwKfCAzICAgfCA2NTRLIC8gODM2SyAgICAgICAgICAgIHwgNDMu NU0gICAgIHwgOC4zTSAgICAgfCAyMiAgICAgICB8IDAuMTAwbXMgIHwKfCA0ICAgfCA4MDNL IC8gODY1SyAgICAgICAgICAgIHwgNDQuOE0gICAgIHwgNC40TSAgICAgfCAxNiAgICAgICB8 IDAuMDk1bXMgIHwKfCAqKmF2ZyoqIHwgKio3NjJLIC8gODc0SyoqICAgIHwgKio0NS4wTSoq IHwgKio1LjhNKiogfCAqKjE5KiogICB8ICoqMC4wODVtcyoqIHwKCiMjIyBsaW1pdD0xNiAo NCBydW5zKQoKfCBSdW4gfCBTaW5rIHBwcyAobGFyZ2Uvc21hbGwpIHwgcWRpc2MgcGt0cyB8 IHJlcXVldWVzIHwgYXZnX3dvcmsgfCBQaW5nIGF2ZyB8CnwtLS0tLXwtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0t LS18CnwgMSAgIHwgODQ0SyAvIDk0MEsgICAgICAgICAgICB8IDQ4LjFNICAgICB8IDMuM00g ICAgIHwgMjAgICAgICAgfCAwLjA4MW1zICB8CnwgMiAgIHwgNzY4SyAvIDg3M0sgICAgICAg ICAgICB8IDQ1LjZNICAgICB8IDQuMU0gICAgIHwgMTUgICAgICAgfCAwLjA5N21zICB8Cnwg MyAgIHwgNzMzSyAvIDgwNEsgICAgICAgICAgICB8IDQ0LjhNICAgICB8IDYuNU0gICAgIHwg MjYgICAgICAgfCAwLjA4NW1zICB8CnwgNCAgIHwgNTk3SyAvIDc1N0sgICAgICAgICAgICB8 IDQwLjdNICAgICB8IDYuOU0gICAgIHwgMjMgICAgICAgfCAwLjExNW1zICB8CnwgKiphdmcq KiB8ICoqNzM2SyAvIDg0NEsqKiAgICB8ICoqNDQuOE0qKiB8ICoqNS4yTSoqIHwgKioyMSoq ICAgfCAqKjAuMDk1bXMqKiB8CgojIyMgQXZlcmFnZWQgY29tcGFyaXNvbiAobnJ1bGVzPTAs IDQgcnVucykKCnwgTWV0cmljICAgICAgICAgICAgICB8IGxpbWl0PTggICB8IGxpbWl0PTE2 ICB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18Cnwg U2luayBwcHMgKGxhcmdlKSAgICB8IDc2MksgICAgICB8IDczNksgICAgICB8CnwgU2luayBw cHMgKHNtYWxsKSAgICB8IDg3NEsgICAgICB8IDg0NEsgICAgICB8CnwgcWRpc2MgcGt0cyAg ICAgICAgICB8IDQ1LjBNICAgICB8IDQ0LjhNICAgICB8CnwgcmVxdWV1ZXMgICAgICAgICAg ICB8IDUuOE0gICAgICB8IDUuMk0gICAgICB8CnwgYXZnX3dvcmsgICAgICAgICAgICB8IDE5 ICAgICAgICB8IDIxICAgICAgICB8CnwgUGluZyBSVFQgYXZnICAgICAgICB8IDAuMDg1bXMg ICB8IDAuMDk1bXMgICB8CgpBdCBtYXggdGhyb3VnaHB1dCwgbGltaXQ9OCBhbmQgbGltaXQ9 MTYgYXJlIHdpdGhpbiBWTSBub2lzZSAofjMtNCUpLgoKIyMjIENyb3NzLWxvYWQgY29tcGFy aXNvbiAoYWxsIGF2ZXJhZ2VzIG9mIDQgcnVucykKCnwgTWV0cmljICAgICAgICB8IGxpbWl0 PTggfCBsaW1pdD0xNiB8IFdpbm5lciAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tfC0tLS0t LS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwKfCBucnVsZXM9MTUwMDA6IHwgICAg ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8CnwgICBQaW5nIFJUVCAgICB8IDYu NzNtcyAgfCA4LjAwbXMgICB8IDggKCsxLjNtcykgICAgfAp8ICAgcmVxdWV1ZXMgICAgfCA3 MUsgICAgIHwgNzNLICAgICAgfCB+c2FtZSAgICAgICAgIHwKfCAgIGF2Z193b3JrICAgIHwg NTkgICAgICB8IDU5ICAgICAgIHwgfnNhbWUgICAgICAgICB8CnwgbnJ1bGVzPTM1MDA6ICB8 ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgfAp8ICAgUGluZyBSVFQgICAg fCAxLjc3bXMgIHwgMi4xMW1zICAgfCA4ICgrMC4zNG1zKSAgIHwKfCAgIHJlcXVldWVzICAg IHwgMjc5SyAgICB8IDI4MksgICAgIHwgfnNhbWUgICAgICAgICB8CnwgICBhdmdfd29yayAg ICB8IDYyICAgICAgfCA2MiAgICAgICB8IH5zYW1lICAgICAgICAgfAp8IG5ydWxlcz0wOiAg ICAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKfCAgIFNpbmsgcHBz ICAgIHwgNzYySyAgICB8IDczNksgICAgIHwgfnNhbWUgKG5vaXNlKSB8CnwgICByZXF1ZXVl cyAgICB8IDUuOE0gICAgfCA1LjJNICAgICB8IH5zYW1lIChub2lzZSkgfAoKKipWZXJkaWN0 OiBsaW1pdD04IGlzIHRoZSBiZXR0ZXIgZGVmYXVsdC4qKgotIENvbnNpc3RlbnQgbGF0ZW5j eSBhZHZhbnRhZ2UgdW5kZXIgbG9hZDogKzEuM21zIGF0IG5ydWxlcz0xNTAwMCwKICArMC4z NG1zIGF0IG5ydWxlcz0zNTAwIChyZXByb2R1Y2libGUgYWNyb3NzIDQgcnVucyBlYWNoKQot IFRocm91Z2hwdXQgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBsaW1pdD0xNiBhZnRlciBhdmVy YWdpbmcKLSBPbmUgY2FjaGUtbGluZSAoNjQgYnl0ZXMpIGlzIGEgY2xlYW4gaGFyZHdhcmUg YWxpZ25tZW50Ci0gTW9yZSBjb25zZXJ2YXRpdmUgLS0gc21hbGxlciBkYXJrIGJ1ZmZlcgoK IyMgUHJvcG9zZWQgcGF0Y2g6IGRxbF9zZXRfbWluX2xpbWl0KCkgKyB2ZXRoIGRlZmF1bHQg bWluX2xpbWl0PTgKClR3by1wYXJ0IHNvbHV0aW9uIGluIHN0ZyBwYXRjaCBgdmV0aC1zZXQt YnFsLW1pbi1saW1pdC04YDoKCiMjIyAxLiBOZXcgRFFMIEFQSSBoZWxwZXIgKGluY2x1ZGUv bGludXgvZHluYW1pY19xdWV1ZV9saW1pdHMuaCkKCmBgYGMKc3RhdGljIGlubGluZSB2b2lk IGRxbF9zZXRfbWluX2xpbWl0KHN0cnVjdCBkcWwgKmRxbCwgdW5zaWduZWQgaW50IG1pbl9s aW1pdCkKewogICAgZHFsLT5taW5fbGltaXQgPSBtaW5fbGltaXQ7Cn0KYGBgCgpHaXZlcyBk cml2ZXJzIGEgY2xlYW4gQVBJIHRvIHNldCBhIGRlZmF1bHQgZmxvb3IuICBDdXJyZW50bHkg bm8gZHJpdmVyCnNldHMgbWluX2xpbWl0IC0tIGFsbCByZWx5IG9uIHRoZSBkcWxfaW5pdCgp IGRlZmF1bHQgb2YgMCBvciB1c2VyIHN5c2ZzLgoKIyMjIDIuIFZldGggc2V0cyBtaW5fbGlt aXQ9OCBhdCBkZXZpY2UgY3JlYXRpb24gKGRyaXZlcnMvbmV0L3ZldGguYykKCkluIGB2ZXRo X2luaXRfcXVldWVzKClgLCBhZnRlciBUWCBxdWV1ZSBzZXR1cDoKYGBgYwojaWZkZWYgQ09O RklHX0JRTAogICAgZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3R4X3F1ZXVlczsgaSsrKQog ICAgICAgIGRxbF9zZXRfbWluX2xpbWl0KCZuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSkt PmRxbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBWRVRIX0JRTF9VTklUICogOCk7CiNl bmRpZgpgYGAKCkNhbGxlZCBmb3IgYm90aCBgZGV2YCBhbmQgYHBlZXJgIGluIGB2ZXRoX25l d2xpbmsoKWAuICBVc2VzCmBudW1fdHhfcXVldWVzYCAoYWxsIHByZS1hbGxvY2F0ZWQgcXVl dWVzKSwgbm90IGByZWFsX251bV90eF9xdWV1ZXNgLApzbyBjaGFubmVsIGNoYW5nZXMgdmlh IGBldGh0b29sIC1MYCBhcmUgY292ZXJlZCAtLSBubyBuZXcgcXVldWVzIGFyZQpldmVyIGNy ZWF0ZWQgYXQgcnVudGltZS4KCiMjIyBXaHkgbWluX2xpbWl0PTgKCi0gT25lIGNhY2hlLWxp bmUgb2YgcHRyX3JpbmcgcG9pbnRlcnMgKDggeCA4ID0gNjQgYnl0ZXMpCi0gTG93ZXN0IHJl cXVldWUgY291bnQgYXQgbWF4IHRocm91Z2hwdXQgKDUuM00gdnMgMTYuOU0gYXQgbGltaXQ9 MikKLSBLZWVwcyBmdWxsLWJ1ZGdldCBOQVBJIHBvbGxzIChhdmdfd29yaz02MykgLS0gbm8g c2NoZWR1bGluZyBvdmVyaGVhZAotIExhdGVuY3kgb25seSAwLjNtcyB3b3JzZSB0aGFuIGxp bWl0PTIgYXQgbW9kZXJhdGUgbG9hZCAoMS4yNG1zIHZzIDAuOTRtcykKLSBTdGlsbCA2eCBi ZXR0ZXIgbGF0ZW5jeSB0aGFuIG5vLUJRTCBhdCBoZWF2eSBsb2FkICg2bXMgdnMgMzcuOG1z KQotIFVzZXIgY2FuIGxvd2VyIHRvIDAgb3IgcmFpc2UgdmlhIHN5c2ZzIGxpbWl0X21pbiBh dCBhbnkgdGltZQoKIyMjIFZlcmlmaWVkOiBkcml2ZXIgZGVmYXVsdCB3b3JrcyAobnJ1bGVz PTE1MDAwLCAtLWhpc3QpCgpUZXN0ZWQgd2l0aCBgdmV0aC1zZXQtYnFsLW1pbi1saW1pdC04 YCBwYXRjaCBhcHBsaWVkLCBubyBgLS1icWwtbWluLWxpbWl0YApzeXNmcyBvdmVycmlkZS4g IEJRTCBsaW1pdD04IGhlbGQgc3RhYmxlLCBwaW5nIFJUVCB+Ni41bXMgKG1hdGNoZXMgc3lz ZnMKb3ZlcnJpZGUgcmVzdWx0cykuCgpCUUwgaW5mbGlnaHQgaGlzdG9ncmFtIChicGZ0cmFj ZSwgMTY5SyBzYW1wbGVzKToKYGBgClsxXSAgICAgICAgICAgICAgMTUgfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ClsyLCA0KSAgICAgICAgMjExOTMgfEBAQEBAQEBA QEBAQEAgICAgICAgICAgICAgICAgICAgICB8Cls0LCA4KSAgICAgICAgNjM2MTUgfEBAQEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB8Cls4LCAxNikgICAgICAgODAxMTYgfEBA QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAfApbMTYs IDMyKSAgICAgICA0NzA5IHxAQEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApg YGAKCi0gSW5mbGlnaHQgYXZnPTcsIG1heD0xNyAtLSByaW5nIHN0YXlzIHNoYWxsb3cKLSBQ ZWFrIGF0IFs4LDE2KTogaW5mbGlnaHQgbmVhciB0aGUgbGltaXQ9OCBmbG9vciBtb3N0IG9m IHRoZSB0aW1lCi0gWzQsOCkgc2Vjb25kOiByaW5nIGRyYWluaW5nIGJldHdlZW4gTkFQSSBw b2xscwotIFsxNiwzMikgcmFyZTogYnJpZWYgcHJvZHVjZXIgYnVyc3RzCi0gc3RhY2tfeG9m ZiB+MTVLLzVzLCBkcnZfeG9mZj0wIC0tIEJRTCBzdG9wcyBxdWV1ZSB3ZWxsIGJlZm9yZSBy aW5nIGZpbGxzCi0gTkFQSSBhdmdfd29yaz02MSwgYWxtb3N0IGFsbCBmdWxsLWJ1ZGdldCBw b2xscwoKIyMgQ29uY2x1c2lvbgoKUGVyLXBhY2tldCBCUUwgY29tcGxldGlvbiBpbiBWNSBp cyB0aGUgcmlnaHQgZGVzaWduLiBJdCBnaXZlcyBEUUwgdGhlCmluZm9ybWF0aW9uIGl0IG5l ZWRzIHRvIGtlZXAgdGhlIGRhcmsgYnVmZmVyIG1pbmltYWwsIHdoaWNoIGlzIGV4YWN0bHkK d2hhdCB3ZSB3YW50IGZvciBsYXRlbmN5IHJlZHVjdGlvbi4KClNpbW9uJ3Mgc3VnZ2VzdGlv biB0byBjYWxsIG5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUoKSBvbmNlIHBlciBOQVBJIHBv bGwKd291bGQgcmVncmVzcyBwaW5nIGxhdGVuY3kgZnJvbSA0LjVtcyB0byAyMG1zIGF0IHBy b2R1Y3Rpb24tbGlrZSBpcHRhYmxlcwpydWxlIGNvdW50cy4KClRoZSBkZWZhdWx0IG1pbl9s aW1pdD04ICh2aWEgZHFsX3NldF9taW5fbGltaXQpIGlzIHRoZSBwcm9wb3NlZCBmb2xsb3ct dXAKdG8gYWRkcmVzcyB0aGUgcmVxdWV1ZSBvdmVyaGVhZCB0aGF0IHBlci1wYWNrZXQgY29t cGxldGlvbiBjYXVzZXMuICBJdAprZWVwcyBsYXRlbmN5IGNsb3NlIHRvIG9wdGltYWwgd2hp bGUgcmVkdWNpbmcgdGhlIH4xMCUgdGhyb3VnaHB1dCBsb3NzCmFuZCAyMHggcmVxdWV1ZSBp bmNyZWFzZSAoNi4xTSB2cyAzMTFLKSB0aGF0IGxpbWl0PTIgY2F1c2VzIGF0IG1heCBzcGVl ZC4KVXNlcnMgd2FudGluZyB0aWdodGVyIGxhdGVuY3kgY2FuIHNldCBsaW1pdF9taW49MCB2 aWEgc3lzZnMgdG8gZ2V0IHRoZQpvcmlnaW5hbCBsaW1pdD0yIGJlaGF2aW9yLgo= --------------FeRgX0Ubec7oqm9WkwKmFiP7--