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=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, 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 5A44AC43381 for ; Tue, 12 Mar 2019 09:35:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 137D1214AE for ; Tue, 12 Mar 2019 09:35:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ho/t6fM8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726083AbfCLJfo (ORCPT ); Tue, 12 Mar 2019 05:35:44 -0400 Received: from mail-lf1-f53.google.com ([209.85.167.53]:42562 "EHLO mail-lf1-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725844AbfCLJfo (ORCPT ); Tue, 12 Mar 2019 05:35:44 -0400 Received: by mail-lf1-f53.google.com with SMTP id p1so1497121lfk.9 for ; Tue, 12 Mar 2019 02:35:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=/U0yCm8oVnDtshliaoA1zCWa+TP3lEiEQIx5/QrMe8g=; b=ho/t6fM8fCRq1z5Izhxd+Z45IDV9XKFGqXnSTJvcFnjt0QztpqAgrQOgfDOqqkVF8j s4ZxmaUyTsR1evHHKoHr2ALiP2bYKbEsiAwThZbF8d/qd11vjHiPJ6lQpwCRArCts/Dh 8qtuZnj+IJlR5O6yegOXE6R1S8HfBOZUOYEl0FRpFJjPLX6CN1uJFlldzLLF8x2vzbEj ckvgNXoquSbRirYRiKk4BmePL/eq30UgNLRJ028OK5uItv9As+/vchV5NSRZy11mju0v p/ZYcQRKWFT299lEgXgUo75+SkGpWwpq6aEzgt34K7y14juOiw76/LUPuD3KJPPnReH7 dnVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=/U0yCm8oVnDtshliaoA1zCWa+TP3lEiEQIx5/QrMe8g=; b=DReM/TfqIpJ1ipELrp+36odKDR+EK/1JuIRsbcZiwxTDTMouT8I20uWZ8fjnSsIe6S oQNf3eAfkJAzAinQC1cWZvUraPlEVSqhOLmT2sxxXJx7ACrUZhaL1XdubL6+nqom9LzZ eftXiL8x9HWrxdssjL++x9maL1rUn8vFOokxEOUiRMfz4PCm9rtXnn03Sw8qrt5ClB91 AE7sEwgK4IhljZk/UZUFbn6yljyCeC/XWW8vPYrEcm6Yzlhi9gw0ot9Ud2S3XEDN47Z2 NO+qUveUGdwFWbcPAJXhS7aHcgHXXnXPTg1ec2xh2dF0OJcvaGa4pnsf4BkDF3n+KMb7 /irA== X-Gm-Message-State: APjAAAVEhT6eSMSrilJ65rckTBGnRYQrJGbQykVCAuM978LdJUArn5b+ 1LYEi8bc5+bZuJBC3W3ioAnebCfa X-Google-Smtp-Source: APXvYqwdp1qESOjW0J8XvP3F/2TrGibjD31Ow8knJPo/jyIwS51qUGTdyv004RAMhmU9ulhGcZXSLQ== X-Received: by 2002:a19:294d:: with SMTP id p74mr19742083lfp.101.1552383340784; Tue, 12 Mar 2019 02:35:40 -0700 (PDT) Received: from [10.17.182.20] (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id q22sm1266854ljc.59.2019.03.12.02.35.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Mar 2019 02:35:40 -0700 (PDT) Subject: Re: [Xen-devel][PATCH v5 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com References: <20190312082000.32181-1-andr2000@gmail.com> <20190312082000.32181-2-andr2000@gmail.com> <82d683f9-72a6-f806-33fd-294da10c95f9@xs4all.nl> <27235a93-3896-6353-9665-15dd701cf634@xs4all.nl> From: Oleksandr Andrushchenko Message-ID: Date: Tue, 12 Mar 2019 11:35:39 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: <27235a93-3896-6353-9665-15dd701cf634@xs4all.nl> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On 3/12/19 11:30 AM, Hans Verkuil wrote: > On 3/12/19 10:08 AM, Oleksandr Andrushchenko wrote: >> On 3/12/19 10:58 AM, Hans Verkuil wrote: >>> Hi Oleksandr, >>> >>> Just one comment: >>> >>> On 3/12/19 9:20 AM, Oleksandr Andrushchenko wrote: >>>> From: Oleksandr Andrushchenko >>>> >>>> This is the ABI for the two halves of a para-virtualized >>>> camera driver which extends Xen's reach multimedia capabilities even >>>> farther enabling it for video conferencing, In-Vehicle Infotainment, >>>> high definition maps etc. >>>> >>>> The initial goal is to support most needed functionality with the >>>> final idea to make it possible to extend the protocol if need be: >>>> >>>> 1. Provide means for base virtual device configuration: >>>> - pixel formats >>>> - resolutions >>>> - frame rates >>>> 2. Support basic camera controls: >>>> - contrast >>>> - brightness >>>> - hue >>>> - saturation >>>> 3. Support streaming control >>>> >>>> Signed-off-by: Oleksandr Andrushchenko >>>> --- >>>> xen/include/public/io/cameraif.h | 1370 ++++++++++++++++++++++++++++++ >>>> 1 file changed, 1370 insertions(+) >>>> create mode 100644 xen/include/public/io/cameraif.h >>>> >>>> diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h >>>> new file mode 100644 >>>> index 000000000000..1ae4c51ea758 >>>> --- /dev/null >>>> +++ b/xen/include/public/io/cameraif.h >>>> @@ -0,0 +1,1370 @@ >>> >>> >>>> +/* >>>> + * Request camera buffer's layout: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _BUF_GET_LAYOUT| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * See response format for this request. >>>> + * >>>> + * >>>> + * Request number of buffers to be used: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _OP_BUF_REQUEST| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | num_bufs | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * num_bufs - uint8_t, desired number of buffers to be used. >>>> + * >>>> + * If num_bufs is not zero then the backend validates the requested number of >>>> + * buffers and responds with the number of buffers allowed for this frontend. >>>> + * Frontend is responsible for checking the corresponding response in order to >>>> + * see if the values reported back by the backend do match the desired ones >>>> + * and can be accepted. >>>> + * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests >>>> + * before sending XENCAMERA_OP_STREAM_START request to update or tune the >>>> + * final configuration. >>>> + * Frontend is not allowed to change the number of buffers and/or camera >>>> + * configuration after the streaming has started. >>> This last sentence isn't quite right, and I missed that when reviewing the >>> proposed text during the v4 discussions. >>> >>> The bit about not being allowed to change the number of buffers when streaming >>> has started is correct. >>> >>> But the camera configuration is more strict: you can't change the camera >>> configuration after this request unless you call this again with num_bufs = 0. >>> >>> The camera configuration changes the buffer size, so once the buffers are >>> allocated you can no longer change the camera config. It is unrelated to streaming. >> Can you please give me a hint of what would be the right thing to put in? > How about this: > > Frontend is not allowed to change the camera configuration after this call with > a non-zero value of num_bufs. If camera reconfiguration is required then this > request must be sent with num_bufs set to zero and any created buffers must be > destroyed first. > > Frontend is not allowed to change the number of buffers after the streaming has started. Sounds great, so I'll replace: "Frontend is not allowed to change the number of buffers and/or camera  configuration after the streaming has started." with: "Frontend is not allowed to change the camera configuration after this call with  a non-zero value of num_bufs. If camera reconfiguration is required then this  request must be sent with num_bufs set to zero and any created buffers must be  destroyed first.  Frontend is not allowed to change the number of buffers after the streaming has started. " Are these all the changes you see at the moment? Thank you! > >> Thank you, >> Oleksandr >>> Regards, >>> >>> Hans >>> >>>> + * >>>> + * If num_bufs is 0 and streaming has not started yet, then the backend will >>>> + * free all previously allocated buffers (if any). >>>> + * Trying to call this if streaming is in progress will result in an error. >>>> + * >>>> + * If camera reconfiguration is required then the streaming must be stopped >>>> + * and this request must be sent with num_bufs set to zero and finally >>>> + * buffers destroyed. > I would rewrite the last part as well: > > ...set to zero and any created buffers must be destroyed. > > > Note that "any created buffers must be destroyed" is something that you need to > check for in your code if I am not mistaken. > > Regards, > > Hans > >>>> + * >>>> + * Please note, that the number of buffers in this request must not exceed >>>> + * the value configured in XenStore.max-buffers. >>>> + * >>>> + * See response format for this request. >>>> + */ >>> >>> >>> Regards, >>> >>> Hans From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH v5 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 12 Mar 2019 11:35:39 +0200 Message-ID: References: <20190312082000.32181-1-andr2000@gmail.com> <20190312082000.32181-2-andr2000@gmail.com> <82d683f9-72a6-f806-33fd-294da10c95f9@xs4all.nl> <27235a93-3896-6353-9665-15dd701cf634@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1h3dp1-000746-VK for xen-devel@lists.xenproject.org; Tue, 12 Mar 2019 09:35:44 +0000 Received: by mail-lf1-x135.google.com with SMTP id u9so1484649lfe.11 for ; Tue, 12 Mar 2019 02:35:42 -0700 (PDT) In-Reply-To: <27235a93-3896-6353-9665-15dd701cf634@xs4all.nl> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com List-Id: xen-devel@lists.xenproject.org T24gMy8xMi8xOSAxMTozMCBBTSwgSGFucyBWZXJrdWlsIHdyb3RlOgo+IE9uIDMvMTIvMTkgMTA6 MDggQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+PiBPbiAzLzEyLzE5IDEwOjU4 IEFNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4+PiBIaSBPbGVrc2FuZHIsCj4+Pgo+Pj4gSnVzdCBv bmUgY29tbWVudDoKPj4+Cj4+PiBPbiAzLzEyLzE5IDk6MjAgQU0sIE9sZWtzYW5kciBBbmRydXNo Y2hlbmtvIHdyb3RlOgo+Pj4+IEZyb206IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVrc2Fu ZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4+Pgo+Pj4+IFRoaXMgaXMgdGhlIEFCSSBmb3Ig dGhlIHR3byBoYWx2ZXMgb2YgYSBwYXJhLXZpcnR1YWxpemVkCj4+Pj4gY2FtZXJhIGRyaXZlciB3 aGljaCBleHRlbmRzIFhlbidzIHJlYWNoIG11bHRpbWVkaWEgY2FwYWJpbGl0aWVzIGV2ZW4KPj4+ PiBmYXJ0aGVyIGVuYWJsaW5nIGl0IGZvciB2aWRlbyBjb25mZXJlbmNpbmcsIEluLVZlaGljbGUg SW5mb3RhaW5tZW50LAo+Pj4+IGhpZ2ggZGVmaW5pdGlvbiBtYXBzIGV0Yy4KPj4+Pgo+Pj4+IFRo ZSBpbml0aWFsIGdvYWwgaXMgdG8gc3VwcG9ydCBtb3N0IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdp dGggdGhlCj4+Pj4gZmluYWwgaWRlYSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUg cHJvdG9jb2wgaWYgbmVlZCBiZToKPj4+Pgo+Pj4+IDEuIFByb3ZpZGUgbWVhbnMgZm9yIGJhc2Ug dmlydHVhbCBkZXZpY2UgY29uZmlndXJhdGlvbjoKPj4+PiAgICAtIHBpeGVsIGZvcm1hdHMKPj4+ PiAgICAtIHJlc29sdXRpb25zCj4+Pj4gICAgLSBmcmFtZSByYXRlcwo+Pj4+IDIuIFN1cHBvcnQg YmFzaWMgY2FtZXJhIGNvbnRyb2xzOgo+Pj4+ICAgIC0gY29udHJhc3QKPj4+PiAgICAtIGJyaWdo dG5lc3MKPj4+PiAgICAtIGh1ZQo+Pj4+ICAgIC0gc2F0dXJhdGlvbgo+Pj4+IDMuIFN1cHBvcnQg c3RyZWFtaW5nIGNvbnRyb2wKPj4+Pgo+Pj4+IFNpZ25lZC1vZmYtYnk6IE9sZWtzYW5kciBBbmRy dXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4+PiAtLS0KPj4+ PiAgICB4ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCB8IDEzNzAgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCj4+Pj4gICAgMSBmaWxlIGNoYW5nZWQsIDEzNzAgaW5zZXJ0aW9u cygrKQo+Pj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2Ft ZXJhaWYuaAo+Pj4+Cj4+Pj4gZGlmZiAtLWdpdCBhL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1l cmFpZi5oIGIveGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVyYWlmLmgKPj4+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMWFlNGM1MWVhNzU4Cj4+Pj4gLS0t IC9kZXYvbnVsbAo+Pj4+ICsrKyBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4+ Pj4gQEAgLTAsMCArMSwxMzcwIEBACj4+PiA8c25pcD4KPj4+Cj4+Pj4gKy8qCj4+Pj4gKyAqIFJl cXVlc3QgY2FtZXJhIGJ1ZmZlcidzIGxheW91dDoKPj4+PiArICogICAgICAgICAwICAgICAgICAg ICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHwgX0JVRl9HRVRfTEFZT1VUfCAgIHJlc2VydmVkICAgICB8IDQKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVk ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA2NAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICoKPj4+PiArICogU2VlIHJl c3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ICsg KiBSZXF1ZXN0IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQ6Cj4+Pj4gKyAqICAgICAgICAg MCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAg ICAgb2N0ZXQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICBp ZCAgICAgICAgICAgICAgICB8IF9PUF9CVUZfUkVRVUVTVHwgICByZXNlcnZlZCAgICAgfCA0Cj4+ Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+Pj4+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPj4+PiArICogfCAgICBudW1fYnVmcyAgICB8ICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMTYKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0 Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKiBudW1fYnVmcyAtIHVpbnQ4 X3QsIGRlc2lyZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZC4KPj4+PiArICoKPj4+PiAr ICogSWYgbnVtX2J1ZnMgaXMgbm90IHplcm8gdGhlbiB0aGUgYmFja2VuZCB2YWxpZGF0ZXMgdGhl IHJlcXVlc3RlZCBudW1iZXIgb2YKPj4+PiArICogYnVmZmVycyBhbmQgcmVzcG9uZHMgd2l0aCB0 aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dlZCBmb3IgdGhpcyBmcm9udGVuZC4KPj4+PiArICog RnJvbnRlbmQgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIHJl c3BvbnNlIGluIG9yZGVyIHRvCj4+Pj4gKyAqIHNlZSBpZiB0aGUgdmFsdWVzIHJlcG9ydGVkIGJh Y2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2ggdGhlIGRlc2lyZWQgb25lcwo+Pj4+ICsgKiBhbmQg Y2FuIGJlIGFjY2VwdGVkLgo+Pj4+ICsgKiBGcm9udGVuZCBpcyBhbGxvd2VkIHRvIHNlbmQgbXVs dGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUIHJlcXVlc3RzCj4+Pj4gKyAqIGJlZm9yZSBz ZW5kaW5nIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgcmVxdWVzdCB0byB1cGRhdGUgb3IgdHVu ZSB0aGUKPj4+PiArICogZmluYWwgY29uZmlndXJhdGlvbi4KPj4+PiArICogRnJvbnRlbmQgaXMg bm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBhbmQvb3IgY2FtZXJh Cj4+Pj4gKyAqIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIHN0cmVhbWluZyBoYXMgc3RhcnRlZC4K Pj4+IFRoaXMgbGFzdCBzZW50ZW5jZSBpc24ndCBxdWl0ZSByaWdodCwgYW5kIEkgbWlzc2VkIHRo YXQgd2hlbiByZXZpZXdpbmcgdGhlCj4+PiBwcm9wb3NlZCB0ZXh0IGR1cmluZyB0aGUgdjQgZGlz Y3Vzc2lvbnMuCj4+Pgo+Pj4gVGhlIGJpdCBhYm91dCBub3QgYmVpbmcgYWxsb3dlZCB0byBjaGFu Z2UgdGhlIG51bWJlciBvZiBidWZmZXJzIHdoZW4gc3RyZWFtaW5nCj4+PiBoYXMgc3RhcnRlZCBp cyBjb3JyZWN0Lgo+Pj4KPj4+IEJ1dCB0aGUgY2FtZXJhIGNvbmZpZ3VyYXRpb24gaXMgbW9yZSBz dHJpY3Q6IHlvdSBjYW4ndCBjaGFuZ2UgdGhlIGNhbWVyYQo+Pj4gY29uZmlndXJhdGlvbiBhZnRl ciB0aGlzIHJlcXVlc3QgdW5sZXNzIHlvdSBjYWxsIHRoaXMgYWdhaW4gd2l0aCBudW1fYnVmcyA9 IDAuCj4+Pgo+Pj4gVGhlIGNhbWVyYSBjb25maWd1cmF0aW9uIGNoYW5nZXMgdGhlIGJ1ZmZlciBz aXplLCBzbyBvbmNlIHRoZSBidWZmZXJzIGFyZQo+Pj4gYWxsb2NhdGVkIHlvdSBjYW4gbm8gbG9u Z2VyIGNoYW5nZSB0aGUgY2FtZXJhIGNvbmZpZy4gSXQgaXMgdW5yZWxhdGVkIHRvIHN0cmVhbWlu Zy4KPj4gQ2FuIHlvdSBwbGVhc2UgZ2l2ZSBtZSBhIGhpbnQgb2Ygd2hhdCB3b3VsZCBiZSB0aGUg cmlnaHQgdGhpbmcgdG8gcHV0IGluPwo+IEhvdyBhYm91dCB0aGlzOgo+Cj4gRnJvbnRlbmQgaXMg bm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBjYW1lcmEgY29uZmlndXJhdGlvbiBhZnRlciB0aGlz IGNhbGwgd2l0aAo+IGEgbm9uLXplcm8gdmFsdWUgb2YgbnVtX2J1ZnMuIElmIGNhbWVyYSByZWNv bmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgdGhlbiB0aGlzCj4gcmVxdWVzdCBtdXN0IGJlIHNlbnQg d2l0aCBudW1fYnVmcyBzZXQgdG8gemVybyBhbmQgYW55IGNyZWF0ZWQgYnVmZmVycyBtdXN0IGJl Cj4gZGVzdHJveWVkIGZpcnN0Lgo+Cj4gRnJvbnRlbmQgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdl IHRoZSBudW1iZXIgb2YgYnVmZmVycyBhZnRlciB0aGUgc3RyZWFtaW5nIGhhcyBzdGFydGVkLgpT b3VuZHMgZ3JlYXQsIHNvIEknbGwgcmVwbGFjZToKCiJGcm9udGVuZCBpcyBub3QgYWxsb3dlZCB0 byBjaGFuZ2UgdGhlIG51bWJlciBvZiBidWZmZXJzIGFuZC9vciBjYW1lcmEKIMKgY29uZmlndXJh dGlvbiBhZnRlciB0aGUgc3RyZWFtaW5nIGhhcyBzdGFydGVkLiIKCndpdGg6CgoiRnJvbnRlbmQg aXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBjYW1lcmEgY29uZmlndXJhdGlvbiBhZnRlciB0 aGlzIApjYWxsIHdpdGgKIMKgYSBub24temVybyB2YWx1ZSBvZiBudW1fYnVmcy4gSWYgY2FtZXJh IHJlY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCAKdGhlbiB0aGlzCiDCoHJlcXVlc3QgbXVzdCBi ZSBzZW50IHdpdGggbnVtX2J1ZnMgc2V0IHRvIHplcm8gYW5kIGFueSBjcmVhdGVkIGJ1ZmZlcnMg Cm11c3QgYmUKIMKgZGVzdHJveWVkIGZpcnN0LgoKIMKgRnJvbnRlbmQgaXMgbm90IGFsbG93ZWQg dG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBhZnRlciB0aGUgCnN0cmVhbWluZyBoYXMg c3RhcnRlZC4KIgoKQXJlIHRoZXNlIGFsbCB0aGUgY2hhbmdlcyB5b3Ugc2VlIGF0IHRoZSBtb21l bnQ/CgpUaGFuayB5b3UhCj4KPj4gVGhhbmsgeW91LAo+PiBPbGVrc2FuZHIKPj4+IFJlZ2FyZHMs Cj4+Pgo+Pj4gCUhhbnMKPj4+Cj4+Pj4gKyAqCj4+Pj4gKyAqIElmIG51bV9idWZzIGlzIDAgYW5k IHN0cmVhbWluZyBoYXMgbm90IHN0YXJ0ZWQgeWV0LCB0aGVuIHRoZSBiYWNrZW5kIHdpbGwKPj4+ PiArICogZnJlZSBhbGwgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVycyAoaWYgYW55KS4KPj4+ PiArICogVHJ5aW5nIHRvIGNhbGwgdGhpcyBpZiBzdHJlYW1pbmcgaXMgaW4gcHJvZ3Jlc3Mgd2ls bCByZXN1bHQgaW4gYW4gZXJyb3IuCj4+Pj4gKyAqCj4+Pj4gKyAqIElmIGNhbWVyYSByZWNvbmZp Z3VyYXRpb24gaXMgcmVxdWlyZWQgdGhlbiB0aGUgc3RyZWFtaW5nIG11c3QgYmUgc3RvcHBlZAo+ Pj4+ICsgKiBhbmQgdGhpcyByZXF1ZXN0IG11c3QgYmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0 byB6ZXJvIGFuZCBmaW5hbGx5Cj4+Pj4gKyAqIGJ1ZmZlcnMgZGVzdHJveWVkLgo+IEkgd291bGQg cmV3cml0ZSB0aGUgbGFzdCBwYXJ0IGFzIHdlbGw6Cj4KPiAuLi5zZXQgdG8gemVybyBhbmQgYW55 IGNyZWF0ZWQgYnVmZmVycyBtdXN0IGJlIGRlc3Ryb3llZC4KPgo+Cj4gTm90ZSB0aGF0ICJhbnkg Y3JlYXRlZCBidWZmZXJzIG11c3QgYmUgZGVzdHJveWVkIiBpcyBzb21ldGhpbmcgdGhhdCB5b3Ug bmVlZCB0bwo+IGNoZWNrIGZvciBpbiB5b3VyIGNvZGUgaWYgSSBhbSBub3QgbWlzdGFrZW4uCj4K PiBSZWdhcmRzLAo+Cj4gCUhhbnMKPgo+Pj4+ICsgKgo+Pj4+ICsgKiBQbGVhc2Ugbm90ZSwgdGhh dCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyByZXF1ZXN0IG11c3Qgbm90IGV4Y2VlZAo+ Pj4+ICsgKiB0aGUgdmFsdWUgY29uZmlndXJlZCBpbiBYZW5TdG9yZS5tYXgtYnVmZmVycy4KPj4+ PiArICoKPj4+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+Pj4+ ICsgKi8KPj4+IDxzbmlwPgo+Pj4KPj4+IFJlZ2FyZHMsCj4+Pgo+Pj4gCUhhbnMKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGlu ZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnBy b2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs