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=-7.1 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 AD682C169C4 for ; Tue, 12 Feb 2019 01:20:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6FBD9214DA for ; Tue, 12 Feb 2019 01:20:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Uzc9e6OS" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726363AbfBLBUj (ORCPT ); Mon, 11 Feb 2019 20:20:39 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:40474 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726079AbfBLBUi (ORCPT ); Mon, 11 Feb 2019 20:20:38 -0500 Received: by mail-wr1-f68.google.com with SMTP id q1so836435wrp.7; Mon, 11 Feb 2019 17:20:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=EgLaCrrg+rEM+zWvavr49CeHkq97YjP+4BZM2b2bB48=; b=Uzc9e6OS3wYobpzCPAuolRPLOSkEGUPrOmSF5fteNzsviQrHn+Qe1ajWiY25kyMWsL o6OlylIVMuq8VAgpsmPmfHoH173Si37MNRImlm3lB6fIu4uCaFGnm+frOC3VvR97CjSa 7RPz+fk7iWYaZWZfbjXyjCAQaFrsno3WJH7tu5qkYO8ahSGv+rd2THcsEz80vSn5/Ogv QSYPyuMMS5mi4V0Lft9mucmfTyyS2mY0SbxbEoqsSEMq7iIzR0EZIyoQw8pShe8/ydSR MQgbUe+LP8SNtC5CY1RelKE4mu0YX2dAMGgr0APleNVYifBIn0XDioqXix1lUPyqEqfq WcXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=EgLaCrrg+rEM+zWvavr49CeHkq97YjP+4BZM2b2bB48=; b=cNqZ+P+n1bQnYzTZG42GS8wYXRUJjC2ro+xDFJdNrdAcqWjhOtDl89Lk6JwolFmJb+ AXjuUYE9UQdcejkpLXbGInW+6lQ3VmUaV3yIi9eQ+TdA57EMq9hnk6aqmnwcmUbBpI6X oh6E2V6Q8ugfBYqOlJG2EtSacOqNTYPJkZn1dys31UncCC+eoTXvyldFvnU03mD1+gmp c2T73nqfDYU/oGW47J1rQVitlQRcIwC1nZ40X1eH28xyCMrd36ioVQugEkQzmh1oFABk 6tKK+DQ6KEUevuZQR+cpJlj2ScmlyeD3bX2YrJsEHFpVgiFPCRtPLO1Mu+WJg8q1cyTd KETA== X-Gm-Message-State: AHQUAubt9fZyMjM82heVGb1OR5oswIQJwF2tcyuMkYK1YASqcWOFhdV7 QaYWsfNgeTcRr8WYttE9v+T1TC9s X-Google-Smtp-Source: AHgI3IYiknGAMwPn6cnNLiudpgYUU5vFgGwEN9pAPT3oHUgUG0qlBFHg1btYDHVw7oqvtN8ZO4FIJw== X-Received: by 2002:adf:e342:: with SMTP id n2mr738900wrj.60.1549934435138; Mon, 11 Feb 2019 17:20:35 -0800 (PST) Received: from [172.30.89.184] (sjewanfw1-nat.mentorg.com. [139.181.7.34]) by smtp.gmail.com with ESMTPSA id x186sm1538900wmg.41.2019.02.11.17.20.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Feb 2019 17:20:34 -0800 (PST) Subject: Re: [PATCH v4 3/4] gpu: ipu-v3: ipu-ic: Add support for BT.709 encoding To: Philipp Zabel , linux-media@vger.kernel.org Cc: Tim Harvey , Mauro Carvalho Chehab , Greg Kroah-Hartman , Bartlomiej Zolnierkiewicz , "open list:DRM DRIVERS FOR FREESCALE IMX" , open list , "open list:STAGING SUBSYSTEM" , "open list:FRAMEBUFFER LAYER" References: <20190209014748.10427-1-slongerbeam@gmail.com> <20190209014748.10427-4-slongerbeam@gmail.com> <1549879951.7687.6.camel@pengutronix.de> From: Steve Longerbeam Message-ID: <440e12af-33ea-5eac-e570-8afa74e3133c@gmail.com> Date: Mon, 11 Feb 2019 17:20:31 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <1549879951.7687.6.camel@pengutronix.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/11/19 2:12 AM, Philipp Zabel wrote: > On Fri, 2019-02-08 at 17:47 -0800, Steve Longerbeam wrote: >> Pass v4l2 encoding enum to the ipu_ic task init functions, and add >> support for the BT.709 encoding and inverse encoding matrices. >> >> Reported-by: Tim Harvey >> Signed-off-by: Steve Longerbeam >> --- >> Changes in v4: >> - fix compile error. >> Chnges in v3: >> - none. >> Changes in v2: >> - only return "Unsupported YCbCr encoding" error if inf != outf, >> since if inf == outf, the identity matrix can be used. Reported >> by Tim Harvey. >> --- >> drivers/gpu/ipu-v3/ipu-ic.c | 71 +++++++++++++++++++-- >> drivers/gpu/ipu-v3/ipu-image-convert.c | 1 + >> drivers/staging/media/imx/imx-ic-prpencvf.c | 4 +- >> include/video/imx-ipu-v3.h | 5 +- >> 4 files changed, 71 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/gpu/ipu-v3/ipu-ic.c b/drivers/gpu/ipu-v3/ipu-ic.c >> index e459615a49a1..c5f83d7e357f 100644 >> --- a/drivers/gpu/ipu-v3/ipu-ic.c >> +++ b/drivers/gpu/ipu-v3/ipu-ic.c >> @@ -212,6 +212,23 @@ static const struct ic_csc_params ic_csc_identity = { >> .scale = 2, >> }; >> >> +/* >> + * BT.709 encoding from RGB full range to YUV limited range: >> + * >> + * Y = R * .2126 + G * .7152 + B * .0722; >> + * U = R * -.1146 + G * -.3854 + B * .5000 + 128.; >> + * V = R * .5000 + G * -.4542 + B * -.0458 + 128.; > This is a conversion to YUV full range. Limited range should be: > > Y   R * .1826 + G *  .6142 + B *  .0620 + 16; > U = R * -.1007 + G * -.3385 + B *  .4392 + 128; > V   R * .4392 + G * -.3990 + B * -.0402 + 128; Yep, I fixed these to encode to limited range YUV, and ... >> + */ >> +static const struct ic_csc_params ic_csc_rgb2ycbcr_bt709 = { >> + .coeff = { >> + { 54, 183, 18 }, >> + { 483, 413, 128 }, >> + { 128, 396, 500 }, >> + }, >> + .offset = { 0, 512, 512 }, >> + .scale = 1, >> +}; >> + >> /* >> * Inverse BT.601 encoding from YUV limited range to RGB full range: >> * >> @@ -229,12 +246,31 @@ static const struct ic_csc_params ic_csc_ycbcr2rgb_bt601 = { >> .scale = 2, >> }; >> >> +/* >> + * Inverse BT.709 encoding from YUV limited range to RGB full range: >> + * >> + * R = (1. * (Y - 16)) + (1.5748 * (Cr - 128)); >> + * G = (1. * (Y - 16)) - (0.1873 * (Cb - 128)) - (0.4681 * (Cr - 128)); >> + * B = (1. * (Y - 16)) + (1.8556 * (Cb - 128); > The coefficients look like full range again, conversion from limited > range YUV should look like: > > R = (1.1644 * (Y - 16)) + (1.7927 * (Cr - 128)); > G = (1.1644 * (Y - 16)) - (0.2132 * (Cb - 128)) - (0.5329 * (Cr - 128)); > B = (1.1644 * (Y - 16)) + (2.1124 * (Cb - 128); fixed these to inverse encode from limited range YUV. >> + */ >> +static const struct ic_csc_params ic_csc_ycbcr2rgb_bt709 = { >> + .coeff = { >> + { 128, 0, 202 }, >> + { 128, 488, 452 }, >> + { 128, 238, 0 }, >> + }, >> + .offset = { -435, 136, -507 }, >> + .scale = 2, >> +}; >> + >> static int init_csc(struct ipu_ic *ic, >> enum ipu_color_space inf, >> enum ipu_color_space outf, >> + enum v4l2_ycbcr_encoding encoding, > Should we support YUV BT.601 <-> YUV REC.709 conversions? That would > require separate encodings for input and output. How about if we pass the input and output encodings to the init ic task functions, but for now require they be the same? We can support transcoding in a later series. > Also, this might be a > good time to think about adding quantization range parameters as well. Again, I think for now, just include input/output quantization but require full range for RGB and limited range for YUV. But that really balloons the arguments to ipu_ic_task_init_*(). Should we create an ipu_ic_task_init structure? Steve From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steve Longerbeam Date: Tue, 12 Feb 2019 01:20:31 +0000 Subject: Re: [PATCH v4 3/4] gpu: ipu-v3: ipu-ic: Add support for BT.709 encoding Message-Id: <440e12af-33ea-5eac-e570-8afa74e3133c@gmail.com> List-Id: References: <20190209014748.10427-1-slongerbeam@gmail.com> <20190209014748.10427-4-slongerbeam@gmail.com> <1549879951.7687.6.camel@pengutronix.de> In-Reply-To: <1549879951.7687.6.camel@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: Philipp Zabel , linux-media@vger.kernel.org Cc: "open list:STAGING SUBSYSTEM" , "open list:FRAMEBUFFER LAYER" , Bartlomiej Zolnierkiewicz , Greg Kroah-Hartman , Tim Harvey , open list , "open list:DRM DRIVERS FOR FREESCALE IMX" , Mauro Carvalho Chehab On 2/11/19 2:12 AM, Philipp Zabel wrote: > On Fri, 2019-02-08 at 17:47 -0800, Steve Longerbeam wrote: >> Pass v4l2 encoding enum to the ipu_ic task init functions, and add >> support for the BT.709 encoding and inverse encoding matrices. >> >> Reported-by: Tim Harvey >> Signed-off-by: Steve Longerbeam >> --- >> Changes in v4: >> - fix compile error. >> Chnges in v3: >> - none. >> Changes in v2: >> - only return "Unsupported YCbCr encoding" error if inf != outf, >> since if inf = outf, the identity matrix can be used. Reported >> by Tim Harvey. >> --- >> drivers/gpu/ipu-v3/ipu-ic.c | 71 +++++++++++++++++++-- >> drivers/gpu/ipu-v3/ipu-image-convert.c | 1 + >> drivers/staging/media/imx/imx-ic-prpencvf.c | 4 +- >> include/video/imx-ipu-v3.h | 5 +- >> 4 files changed, 71 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/gpu/ipu-v3/ipu-ic.c b/drivers/gpu/ipu-v3/ipu-ic.c >> index e459615a49a1..c5f83d7e357f 100644 >> --- a/drivers/gpu/ipu-v3/ipu-ic.c >> +++ b/drivers/gpu/ipu-v3/ipu-ic.c >> @@ -212,6 +212,23 @@ static const struct ic_csc_params ic_csc_identity = { >> .scale = 2, >> }; >> >> +/* >> + * BT.709 encoding from RGB full range to YUV limited range: >> + * >> + * Y = R * .2126 + G * .7152 + B * .0722; >> + * U = R * -.1146 + G * -.3854 + B * .5000 + 128.; >> + * V = R * .5000 + G * -.4542 + B * -.0458 + 128.; > This is a conversion to YUV full range. Limited range should be: > > Y   R * .1826 + G *  .6142 + B *  .0620 + 16; > U = R * -.1007 + G * -.3385 + B *  .4392 + 128; > V   R * .4392 + G * -.3990 + B * -.0402 + 128; Yep, I fixed these to encode to limited range YUV, and ... >> + */ >> +static const struct ic_csc_params ic_csc_rgb2ycbcr_bt709 = { >> + .coeff = { >> + { 54, 183, 18 }, >> + { 483, 413, 128 }, >> + { 128, 396, 500 }, >> + }, >> + .offset = { 0, 512, 512 }, >> + .scale = 1, >> +}; >> + >> /* >> * Inverse BT.601 encoding from YUV limited range to RGB full range: >> * >> @@ -229,12 +246,31 @@ static const struct ic_csc_params ic_csc_ycbcr2rgb_bt601 = { >> .scale = 2, >> }; >> >> +/* >> + * Inverse BT.709 encoding from YUV limited range to RGB full range: >> + * >> + * R = (1. * (Y - 16)) + (1.5748 * (Cr - 128)); >> + * G = (1. * (Y - 16)) - (0.1873 * (Cb - 128)) - (0.4681 * (Cr - 128)); >> + * B = (1. * (Y - 16)) + (1.8556 * (Cb - 128); > The coefficients look like full range again, conversion from limited > range YUV should look like: > > R = (1.1644 * (Y - 16)) + (1.7927 * (Cr - 128)); > G = (1.1644 * (Y - 16)) - (0.2132 * (Cb - 128)) - (0.5329 * (Cr - 128)); > B = (1.1644 * (Y - 16)) + (2.1124 * (Cb - 128); fixed these to inverse encode from limited range YUV. >> + */ >> +static const struct ic_csc_params ic_csc_ycbcr2rgb_bt709 = { >> + .coeff = { >> + { 128, 0, 202 }, >> + { 128, 488, 452 }, >> + { 128, 238, 0 }, >> + }, >> + .offset = { -435, 136, -507 }, >> + .scale = 2, >> +}; >> + >> static int init_csc(struct ipu_ic *ic, >> enum ipu_color_space inf, >> enum ipu_color_space outf, >> + enum v4l2_ycbcr_encoding encoding, > Should we support YUV BT.601 <-> YUV REC.709 conversions? That would > require separate encodings for input and output. How about if we pass the input and output encodings to the init ic task functions, but for now require they be the same? We can support transcoding in a later series. > Also, this might be a > good time to think about adding quantization range parameters as well. Again, I think for now, just include input/output quantization but require full range for RGB and limited range for YUV. But that really balloons the arguments to ipu_ic_task_init_*(). Should we create an ipu_ic_task_init structure? Steve From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steve Longerbeam Subject: Re: [PATCH v4 3/4] gpu: ipu-v3: ipu-ic: Add support for BT.709 encoding Date: Mon, 11 Feb 2019 17:20:31 -0800 Message-ID: <440e12af-33ea-5eac-e570-8afa74e3133c@gmail.com> References: <20190209014748.10427-1-slongerbeam@gmail.com> <20190209014748.10427-4-slongerbeam@gmail.com> <1549879951.7687.6.camel@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1549879951.7687.6.camel@pengutronix.de> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" To: Philipp Zabel , linux-media@vger.kernel.org Cc: "open list:STAGING SUBSYSTEM" , "open list:FRAMEBUFFER LAYER" , Bartlomiej Zolnierkiewicz , Greg Kroah-Hartman , Tim Harvey , open list , "open list:DRM DRIVERS FOR FREESCALE IMX" , Mauro Carvalho Chehab List-Id: dri-devel@lists.freedesktop.org CgpPbiAyLzExLzE5IDI6MTIgQU0sIFBoaWxpcHAgWmFiZWwgd3JvdGU6Cj4gT24gRnJpLCAyMDE5 LTAyLTA4IGF0IDE3OjQ3IC0wODAwLCBTdGV2ZSBMb25nZXJiZWFtIHdyb3RlOgo+PiBQYXNzIHY0 bDIgZW5jb2RpbmcgZW51bSB0byB0aGUgaXB1X2ljIHRhc2sgaW5pdCBmdW5jdGlvbnMsIGFuZCBh ZGQKPj4gc3VwcG9ydCBmb3IgdGhlIEJULjcwOSBlbmNvZGluZyBhbmQgaW52ZXJzZSBlbmNvZGlu ZyBtYXRyaWNlcy4KPj4KPj4gUmVwb3J0ZWQtYnk6IFRpbSBIYXJ2ZXkgPHRoYXJ2ZXlAZ2F0ZXdv cmtzLmNvbT4KPj4gU2lnbmVkLW9mZi1ieTogU3RldmUgTG9uZ2VyYmVhbSA8c2xvbmdlcmJlYW1A Z21haWwuY29tPgo+PiAtLS0KPj4gQ2hhbmdlcyBpbiB2NDoKPj4gLSBmaXggY29tcGlsZSBlcnJv ci4KPj4gQ2huZ2VzIGluIHYzOgo+PiAtIG5vbmUuCj4+IENoYW5nZXMgaW4gdjI6Cj4+IC0gb25s eSByZXR1cm4gIlVuc3VwcG9ydGVkIFlDYkNyIGVuY29kaW5nIiBlcnJvciBpZiBpbmYgIT0gb3V0 ZiwKPj4gICAgc2luY2UgaWYgaW5mID09IG91dGYsIHRoZSBpZGVudGl0eSBtYXRyaXggY2FuIGJl IHVzZWQuIFJlcG9ydGVkCj4+ICAgIGJ5IFRpbSBIYXJ2ZXkuCj4+IC0tLQo+PiAgIGRyaXZlcnMv Z3B1L2lwdS12My9pcHUtaWMuYyAgICAgICAgICAgICAgICAgfCA3MSArKysrKysrKysrKysrKysr KysrLS0KPj4gICBkcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWltYWdlLWNvbnZlcnQuYyAgICAgIHwg IDEgKwo+PiAgIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9pbXgvaW14LWljLXBycGVuY3ZmLmMgfCAg NCArLQo+PiAgIGluY2x1ZGUvdmlkZW8vaW14LWlwdS12My5oICAgICAgICAgICAgICAgICAgfCAg NSArLQo+PiAgIDQgZmlsZXMgY2hhbmdlZCwgNzEgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25z KC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMgYi9kcml2 ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMKPj4gaW5kZXggZTQ1OTYxNWE0OWExLi5jNWY4M2Q3ZTM1 N2YgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtaWMuYwo+PiArKysgYi9k cml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMKPj4gQEAgLTIxMiw2ICsyMTIsMjMgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBpY19jc2NfcGFyYW1zIGljX2NzY19pZGVudGl0eSA9IHsKPj4gICAJLnNj YWxlID0gMiwKPj4gICB9Owo+PiAgIAo+PiArLyoKPj4gKyAqIEJULjcwOSBlbmNvZGluZyBmcm9t IFJHQiBmdWxsIHJhbmdlIHRvIFlVViBsaW1pdGVkIHJhbmdlOgo+PiArICoKPj4gKyAqIFkgPSBS ICogIC4yMTI2ICsgRyAqICAuNzE1MiArIEIgKiAgLjA3MjI7Cj4+ICsgKiBVID0gUiAqIC0uMTE0 NiArIEcgKiAtLjM4NTQgKyBCICogIC41MDAwICsgMTI4LjsKPj4gKyAqIFYgPSBSICogIC41MDAw ICsgRyAqIC0uNDU0MiArIEIgKiAtLjA0NTggKyAxMjguOwo+IFRoaXMgaXMgYSBjb252ZXJzaW9u IHRvIFlVViBmdWxsIHJhbmdlLiBMaW1pdGVkIHJhbmdlIHNob3VsZCBiZToKPgo+IFnCoMKgwqBS ICogIC4xODI2wqArIEcgKsKgIC42MTQyICsgQiAqwqDCoC4wNjIwICsgMTY7Cj4gVSA9IFIgKiAt LjEwMDfCoCsgRyAqIC0uMzM4NSArIEIgKsKgwqAuNDM5MiArIDEyODsKPiBWwqDCoMKgUiAqICAu NDM5MsKgKyBHICogLS4zOTkwICsgQiAqIC0uMDQwMiArIDEyODsKClllcCwgSSBmaXhlZCB0aGVz ZSB0byBlbmNvZGUgdG8gbGltaXRlZCByYW5nZSBZVVYsIGFuZCAuLi4KCj4+ICsgKi8KPj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgaWNfY3NjX3BhcmFtcyBpY19jc2NfcmdiMnljYmNyX2J0NzA5ID0g ewo+PiArCS5jb2VmZiA9IHsKPj4gKwkJeyA1NCwgMTgzLCAxOCB9LAo+PiArCQl7IDQ4MywgNDEz LCAxMjggfSwKPj4gKwkJeyAxMjgsIDM5NiwgNTAwIH0sCj4+ICsJfSwKPj4gKwkub2Zmc2V0ID0g eyAwLCA1MTIsIDUxMiB9LAo+PiArCS5zY2FsZSA9IDEsCj4+ICt9Owo+PiArCj4+ICAgLyoKPj4g ICAgKiBJbnZlcnNlIEJULjYwMSBlbmNvZGluZyBmcm9tIFlVViBsaW1pdGVkIHJhbmdlIHRvIFJH QiBmdWxsIHJhbmdlOgo+PiAgICAqCj4+IEBAIC0yMjksMTIgKzI0NiwzMSBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IGljX2NzY19wYXJhbXMgaWNfY3NjX3ljYmNyMnJnYl9idDYwMSA9IHsKPj4gICAJ LnNjYWxlID0gMiwKPj4gICB9Owo+PiAgIAo+PiArLyoKPj4gKyAqIEludmVyc2UgQlQuNzA5IGVu Y29kaW5nIGZyb20gWVVWIGxpbWl0ZWQgcmFuZ2UgdG8gUkdCIGZ1bGwgcmFuZ2U6Cj4+ICsgKgo+ PiArICogUiA9ICgxLiAqIChZIC0gMTYpKSArICgxLjU3NDggKiAoQ3IgLSAxMjgpKTsKPj4gKyAq IEcgPSAoMS4gKiAoWSAtIDE2KSkgLSAoMC4xODczICogKENiIC0gMTI4KSkgLSAoMC40NjgxICog KENyIC0gMTI4KSk7Cj4+ICsgKiBCID0gKDEuICogKFkgLSAxNikpICsgKDEuODU1NiAqIChDYiAt IDEyOCk7Cj4gVGhlIGNvZWZmaWNpZW50cyBsb29rIGxpa2UgZnVsbCByYW5nZSBhZ2FpbiwgY29u dmVyc2lvbiBmcm9tIGxpbWl0ZWQKPiByYW5nZSBZVVYgc2hvdWxkIGxvb2sgbGlrZToKPgo+ICAg IFIgPSAoMS4xNjQ0ICogKFkgLSAxNikpICsgKDEuNzkyNyAqIChDciAtIDEyOCkpOwo+ICAgIEcg PSAoMS4xNjQ0ICogKFkgLSAxNikpIC0gKDAuMjEzMiAqIChDYiAtIDEyOCkpIC0gKDAuNTMyOSAq IChDciAtIDEyOCkpOwo+ICAgIEIgPSAoMS4xNjQ0ICogKFkgLSAxNikpICsgKDIuMTEyNCAqIChD YiAtIDEyOCk7CgpmaXhlZCB0aGVzZSB0byBpbnZlcnNlIGVuY29kZSBmcm9tIGxpbWl0ZWQgcmFu Z2UgWVVWLgoKPj4gKyAqLwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpY19jc2NfcGFyYW1zIGlj X2NzY195Y2JjcjJyZ2JfYnQ3MDkgPSB7Cj4+ICsJLmNvZWZmID0gewo+PiArCQl7IDEyOCwgMCwg MjAyIH0sCj4+ICsJCXsgMTI4LCA0ODgsIDQ1MiB9LAo+PiArCQl7IDEyOCwgMjM4LCAwIH0sCj4+ ICsJfSwKPj4gKwkub2Zmc2V0ID0geyAtNDM1LCAxMzYsIC01MDcgfSwKPj4gKwkuc2NhbGUgPSAy LAo+PiArfTsKPj4gKwo+PiAgIHN0YXRpYyBpbnQgaW5pdF9jc2Moc3RydWN0IGlwdV9pYyAqaWMs Cj4+ICAgCQkgICAgZW51bSBpcHVfY29sb3Jfc3BhY2UgaW5mLAo+PiAgIAkJICAgIGVudW0gaXB1 X2NvbG9yX3NwYWNlIG91dGYsCj4+ICsJCSAgICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgZW5j b2RpbmcsCj4gU2hvdWxkIHdlIHN1cHBvcnQgWVVWIEJULjYwMSA8LT4gWVVWIFJFQy43MDkgY29u dmVyc2lvbnM/IFRoYXQgd291bGQKPiByZXF1aXJlIHNlcGFyYXRlIGVuY29kaW5ncyBmb3IgaW5w dXQgYW5kIG91dHB1dC4KCkhvdyBhYm91dCBpZiB3ZSBwYXNzIHRoZSBpbnB1dCBhbmQgb3V0cHV0 IGVuY29kaW5ncyB0byB0aGUgaW5pdCBpYyB0YXNrIApmdW5jdGlvbnMsIGJ1dCBmb3Igbm93IHJl cXVpcmUgdGhleSBiZSB0aGUgc2FtZT8gV2UgY2FuIHN1cHBvcnQgCnRyYW5zY29kaW5nIGluIGEg bGF0ZXIgc2VyaWVzLgoKPiAgIEFsc28sIHRoaXMgbWlnaHQgYmUgYQo+IGdvb2QgdGltZSB0byB0 aGluayBhYm91dCBhZGRpbmcgcXVhbnRpemF0aW9uIHJhbmdlIHBhcmFtZXRlcnMgYXMgd2VsbC4K CkFnYWluLCBJIHRoaW5rIGZvciBub3csIGp1c3QgaW5jbHVkZSBpbnB1dC9vdXRwdXQgcXVhbnRp emF0aW9uIGJ1dCAKcmVxdWlyZSBmdWxsIHJhbmdlIGZvciBSR0IgYW5kIGxpbWl0ZWQgcmFuZ2Ug Zm9yIFlVVi4KCkJ1dCB0aGF0IHJlYWxseSBiYWxsb29ucyB0aGUgYXJndW1lbnRzIHRvIGlwdV9p Y190YXNrX2luaXRfKigpLiBTaG91bGQgCndlIGNyZWF0ZSBhbiBpcHVfaWNfdGFza19pbml0IHN0 cnVjdHVyZT8KClN0ZXZlCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkZXZlbCBtYWlsaW5nIGxpc3QKZGV2ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9yZwpo dHRwOi8vZHJpdmVyZGV2LmxpbnV4ZHJpdmVycHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cml2ZXJkZXYtZGV2ZWwK