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 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E731BC433FE for ; Mon, 23 May 2022 17:30:46 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.336042.560281 (Exim 4.92) (envelope-from ) id 1ntBsv-0003VP-8e; Mon, 23 May 2022 17:30:25 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 336042.560281; Mon, 23 May 2022 17:30:25 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ntBsv-0003VI-4c; Mon, 23 May 2022 17:30:25 +0000 Received: by outflank-mailman (input) for mailman id 336042; Mon, 23 May 2022 17:30:24 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ntBsu-0003VC-DB for xen-devel@lists.xenproject.org; Mon, 23 May 2022 17:30:24 +0000 Received: from mail-lj1-x22d.google.com (mail-lj1-x22d.google.com [2a00:1450:4864:20::22d]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 068a3799-dabe-11ec-bd2c-47488cf2e6aa; Mon, 23 May 2022 19:30:23 +0200 (CEST) Received: by mail-lj1-x22d.google.com with SMTP id i23so18055981ljb.4 for ; Mon, 23 May 2022 10:30:23 -0700 (PDT) Received: from [192.168.1.7] ([212.22.223.21]) by smtp.gmail.com with ESMTPSA id f11-20020a05651232cb00b004786243ab08sm1229661lfg.108.2022.05.23.10.30.21 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 23 May 2022 10:30:22 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 068a3799-dabe-11ec-bd2c-47488cf2e6aa DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=mPzl0IxVpOBD7BXqIA/dVHyw+aKjOBb3ATUZ7spN2qg=; b=YBXi34/97S1J6MVRP9bjFSy6nwf8akZPAOC/SZxPbaoEJt38sG+LmdKjzh08RriLXa /82hF+iabCGUoXkCr++jGmyKd2eu0EPfZuPLmIYT2uuXAE1b2qAPOVGDak/cGhL4fEjO W4MPf0p9X1zgwnrLxftV+Tzaxe6/boss5X1KQb5kPEawpyIt6kV100rXzWTZveBjJutc wwFm+vv8k1hjJztqFZhroiNW32+bzO04NNPPf6PlnO8Z7YvGXEx3+RnfTBTFsaE0aTVf hjech1zrcYaDw6PSWg8f9wOaMmC4Qn28WLbCEyYpLmkNv0YwawmXEPOS1JUsFnuEqS14 hz2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=mPzl0IxVpOBD7BXqIA/dVHyw+aKjOBb3ATUZ7spN2qg=; b=gC01Nix32hiTFyQIcj68/8m8k2goNjwDb8xHqQLzVchYtqL//nZu03dQy4TP4eXwnS 7tj4JUoyCj2tjH580Fj29Jce3y73YJ+KzqoPgomhu39zMzRibLwaTIF5+0wHFFXkeBal MUFtxuyW2Dq4rwKdVTG7tQrC0ObF7rSjcY/ZzKBka0wQrV0zGhxhcgDP75knvoYg0IQa Clz6bvKSxo7P1X55P0d3XMoc1ucFhwPbV7xDOrTFKPj6ijc/MofN8G7VZBpfGL4cLBZj m557RG/dr7TklngORbymcyufLB9QtR9tk4J6091TpGmZ0WIoSQMNTIoTcaW8CRBfDqW1 5BLg== X-Gm-Message-State: AOAM532yEYJYIxqJLvRD/BuB/3pbQdNeiFOH6kpFxJ42Fw1Eh+e76vv6 kcHW+H7je7AlQaaTGs4q52w= X-Google-Smtp-Source: ABdhPJzwZfozEnQDt+CrjQ7uTvPbLWypALeKVlqUmFxBKfIWsyPw8Alci4bEMHh/m6nHITXZtcC2TA== X-Received: by 2002:a2e:7a0d:0:b0:253:decb:be0f with SMTP id v13-20020a2e7a0d000000b00253decbbe0fmr9414809ljc.525.1653327022433; Mon, 23 May 2022 10:30:22 -0700 (PDT) Subject: Re: [PATCH V2 5/7] dt-bindings: Add xen,dev-domid property description for xen-grant DMA ops From: Oleksandr To: Stefano Stabellini , xen-devel , "open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE" , DTML , Linux Kernel Mailing List , Linux ARM Cc: Arnd Bergmann , Oleksandr Tyshchenko , Jason Wang , Rob Herring , Krzysztof Kozlowski , Julien Grall , Juergen Gross , "Michael S. Tsirkin" , Christoph Hellwig , Jean-Philippe Brucker References: <1651947548-4055-1-git-send-email-olekstysh@gmail.com> <1651947548-4055-6-git-send-email-olekstysh@gmail.com> <56e8c32d-6771-7179-005f-26ca58555659@gmail.com> <460a746c-6b61-214b-4653-44a1430e314d@gmail.com> <6f469e9c-c26e-f4be-9a85-710afb0d77eb@gmail.com> Message-ID: <390ba7bb-ee9e-b7b7-5f08-71a7245fa4ec@gmail.com> Date: Mon, 23 May 2022 20:30:20 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <6f469e9c-c26e-f4be-9a85-710afb0d77eb@gmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US On 19.05.22 09:03, Oleksandr wrote: Hello Stefano, all > > On 19.05.22 04:06, Stefano Stabellini wrote: > > > Hello Stefano, all > >> On Thu, 19 May 2022, Oleksandr wrote: >>>> On Wed, May 18, 2022 at 5:06 PM Oleksandr wrote: >>>>> On 18.05.22 17:32, Arnd Bergmann wrote: >>>>>> On Sat, May 7, 2022 at 7:19 PM Oleksandr Tyshchenko >>>>>> wrote: >>>>>>     This would mean having a device >>>>>> node for the grant-table mechanism that can be referred to using the >>>>>> 'iommus' >>>>>> phandle property, with the domid as an additional argument. >>>>> I assume, you are speaking about something like the following? >>>>> >>>>> >>>>> xen_dummy_iommu { >>>>>       compatible = "xen,dummy-iommu"; >>>>>       #iommu-cells = <1>; >>>>> }; >>>>> >>>>> virtio@3000 { >>>>>       compatible = "virtio,mmio"; >>>>>       reg = <0x3000 0x100>; >>>>>       interrupts = <41>; >>>>> >>>>>       /* The device is located in Xen domain with ID 1 */ >>>>>       iommus = <&xen_dummy_iommu 1>; >>>>> }; >>>> Right, that's that's the idea, >>> thank you for the confirmation >>> >>> >>> >>>>    except I would not call it a 'dummy'. >>>>   From the perspective of the DT, this behaves just like an IOMMU, >>>> even if the exact mechanism is different from most hardware IOMMU >>>> implementations. >>> well, agree >>> >>> >>>>>> It does not quite fit the model that Linux currently uses for >>>>>> iommus, >>>>>> as that has an allocator for dma_addr_t space >>>>> yes (# 3/7 adds grant-table based allocator) >>>>> >>>>> >>>>>> , but it would think it's >>>>>> conceptually close enough that it makes sense for the binding. >>>>> Interesting idea. I am wondering, do we need an extra actions for >>>>> this >>>>> to work in Linux guest (dummy IOMMU driver, etc)? >>>> It depends on how closely the guest implementation can be made to >>>> resemble a normal iommu. If you do allocate dma_addr_t addresses, >>>> it may actually be close enough that you can just turn the grant-table >>>> code into a normal iommu driver and change nothing else. >>> Unfortunately, I failed to find a way how use grant references at the >>> iommu_ops level (I mean to fully pretend that we are an IOMMU >>> driver). I am >>> not too familiar with that, so what is written below might be wrong >>> or at >>> least not precise. >>> >>> The normal IOMMU driver in Linux doesn’t allocate DMA addresses by >>> itself, it >>> just maps (IOVA-PA) what was requested to be mapped by the upper >>> layer. The >>> DMA address allocation is done by the upper layer (DMA-IOMMU which >>> is the glue >>> layer between DMA API and IOMMU API allocates IOVA for PA?). But, >>> all what we >>> need here is just to allocate our specific grant-table based DMA >>> addresses >>> (DMA address = grant reference + offset in the page), so let’s say >>> we need an >>> entity to take a physical address as parameter and return a DMA >>> address (what >>> actually commit #3/7 is doing), and that’s all. So working at the >>> dma_ops >>> layer we get exactly what we need, with the minimal changes to guest >>> infrastructure. In our case the Xen itself acts as an IOMMU. >>> >>> Assuming that we want to reuse the IOMMU infrastructure somehow for >>> our needs. >>> I think, in that case we will likely need to introduce a new >>> specific IOVA >>> allocator (alongside with a generic one) to be hooked up by the >>> DMA-IOMMU >>> layer if we run on top of Xen. But, even having the specific IOVA >>> allocator to >>> return what we indeed need (DMA address = grant reference + offset >>> in the >>> page) we will still need the specific minimal required IOMMU driver >>> to be >>> present in the system anyway in order to track the mappings(?) and >>> do nothing >>> with them, returning a success (this specific IOMMU driver should >>> have all >>> mandatory callbacks implemented). >>> >>> I completely agree, it would be really nice to reuse generic IOMMU >>> bindings >>> rather than introducing Xen specific property if what we are trying to >>> implement in current patch series fits in the usage of "iommus" in >>> Linux >>> more-less. But, if we will have to add more complexity/more >>> components to the >>> code for the sake of reusing device tree binding, this raises a >>> question >>> whether that’s worthwhile. >>> >>> Or I really missed something? >> I think Arnd was primarily suggesting to reuse the IOMMU Device Tree >> bindings, not necessarily the IOMMU drivers framework in Linux (although >> that would be an added bonus.) >> >> I know from previous discussions with you that making the grant table >> fit in the existing IOMMU drivers model is difficult, but just reusing >> the Device Tree bindings seems feasible? > > I started experimenting with that. As wrote in a separate email, I got > a deferred probe timeout, > > after inserting required nodes into guest device tree, which seems to > be a consequence of the unavailability of IOMMU, I will continue to > investigate this question. I have experimented with that. Yes, just reusing the Device Tree bindings is technically feasible (and we are able to do this by only touching grant-dma-ops.c), although deferred probe timeout still stands (as there is no IOMMU driver being present actually). [    0.583771] virtio-mmio 2000000.virtio: deferred probe timeout, ignoring dependency [    0.615556] virtio_blk virtio0: [vda] 4096000 512-byte logical blocks (2.10 GB/1.95 GiB) Below the working diff (on top of current series): diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c index da9c7ff..6586152 100644 --- a/drivers/xen/grant-dma-ops.c +++ b/drivers/xen/grant-dma-ops.c @@ -272,17 +272,24 @@ static const struct dma_map_ops xen_grant_dma_ops = {  bool xen_is_grant_dma_device(struct device *dev)  { +       struct device_node *iommu_np; +       bool has_iommu; +         /* XXX Handle only DT devices for now */         if (!dev->of_node)                 return false; -       return of_property_read_bool(dev->of_node, "xen,backend-domid"); +       iommu_np = of_parse_phandle(dev->of_node, "iommus", 0); +       has_iommu = iommu_np && of_device_is_compatible(iommu_np, "xen,grant-dma"); +       of_node_put(iommu_np); + +       return has_iommu;  }  void xen_grant_setup_dma_ops(struct device *dev)  {         struct xen_grant_dma_data *data; -       uint32_t domid; +       struct of_phandle_args iommu_spec;         data = find_xen_grant_dma_data(dev);         if (data) { @@ -294,16 +301,30 @@ void xen_grant_setup_dma_ops(struct device *dev)         if (!dev->of_node)                 goto err; -       if (of_property_read_u32(dev->of_node, "xen,backend-domid", &domid)) { -               dev_err(dev, "xen,backend-domid property is not present\n"); +       if (of_parse_phandle_with_args(dev->of_node, "iommus", "#iommu-cells", +                       0, &iommu_spec)) { +               dev_err(dev, "Cannot parse iommus property\n"); +               goto err; +       } + +       if (!of_device_is_compatible(iommu_spec.np, "xen,grant-dma") || +                       iommu_spec.args_count != 1) { +               dev_err(dev, "Incompatible IOMMU node\n"); +               of_node_put(iommu_spec.np);                 goto err;         } +       of_node_put(iommu_spec.np); +         data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);         if (!data)                 goto err; -       data->backend_domid = domid; +       /* +        * The endpoint ID here means the ID of the domain where the corresponding +        * backend is running +        */ +       data->backend_domid = iommu_spec.args[0];         if (xa_err(xa_store(&xen_grant_dma_devices, (unsigned long)dev, data,                         GFP_KERNEL))) { (END) Below, the nodes generated by Xen toolstack:         xen_grant_dma {                 compatible = "xen,grant-dma";                 #iommu-cells = <0x01>;                 phandle = <0xfde9>;         };         virtio@2000000 {                 compatible = "virtio,mmio";                 reg = <0x00 0x2000000 0x00 0x200>;                 interrupts = <0x00 0x01 0xf01>;                 interrupt-parent = <0xfde8>;                 dma-coherent;                 iommus = <0xfde9 0x01>;         }; I am wondering, would be the proper solution to eliminate deferred probe timeout issue in our particular case (without introducing an extra IOMMU driver)? > > > > -- Regards, Oleksandr Tyshchenko 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 6D067C433EF for ; Mon, 23 May 2022 17:31:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:References: Cc:To:From:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=1TD0QDQWytuclGvPETsiKRrwivkriv2mJG3nc8YdI40=; b=s9QtYLbrwX9+sTtvpSaZQcg3Qh IGP2t83PVAAuwL5XeumGAIgZYKTcsmOGlkWTLXKobbIhSQwbp4I5jJRTuAtDNMJGwAULFXnkS6Hy4 Y++1mwNJZ0AmrFQ94T6yOzZ/qmxS17f9Ga3isTDfIX0pp/YwOHotZt+F6n3CbggogctdAJWFecR1J txg9Yn/eHfYI/crVS8Po7tj0EYg6xfEpKeuziar329MuGJMIkKdvAWJmIxArP0kSLAv5lbwnfp4dT qzhXiaCSmxpoJgLOZvp2eiGa6V7h0qyX0FMONKI6wqP9iY88Hzvq9OzrRpKm/Y0vhrIu0k/J2uB6n TNoDGECQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ntBtC-005Ofx-HL; Mon, 23 May 2022 17:30:42 +0000 Received: from mail-lj1-x229.google.com ([2a00:1450:4864:20::229]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ntBsw-005Oai-Mr for linux-arm-kernel@lists.infradead.org; Mon, 23 May 2022 17:30:29 +0000 Received: by mail-lj1-x229.google.com with SMTP id m11so6601450ljc.1 for ; Mon, 23 May 2022 10:30:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=mPzl0IxVpOBD7BXqIA/dVHyw+aKjOBb3ATUZ7spN2qg=; b=YBXi34/97S1J6MVRP9bjFSy6nwf8akZPAOC/SZxPbaoEJt38sG+LmdKjzh08RriLXa /82hF+iabCGUoXkCr++jGmyKd2eu0EPfZuPLmIYT2uuXAE1b2qAPOVGDak/cGhL4fEjO W4MPf0p9X1zgwnrLxftV+Tzaxe6/boss5X1KQb5kPEawpyIt6kV100rXzWTZveBjJutc wwFm+vv8k1hjJztqFZhroiNW32+bzO04NNPPf6PlnO8Z7YvGXEx3+RnfTBTFsaE0aTVf hjech1zrcYaDw6PSWg8f9wOaMmC4Qn28WLbCEyYpLmkNv0YwawmXEPOS1JUsFnuEqS14 hz2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=mPzl0IxVpOBD7BXqIA/dVHyw+aKjOBb3ATUZ7spN2qg=; b=dPg8npFpKutytdFi6/YvdqQ3p6BriG/kMmifvsAMHw2zuYfKZ2izJlSEn10tYjNBxk Qj6KSgZQ8kgTM24I6iZB+DG4umElNAxaODMPyMNzRPugCnLSjgowBRK+KUzP6X5P6Zfw 8Ci0TJnVA7aQh7PeYyRlI85KXMmAmrr1mdAGY/MSTixDC2c5Eey5/nzZQ9eue9ec4Ib5 GRln6wxNmrfrMqWWCzg6x6znl75xRDx3padq2pHkqRVWWN0f8U+DgcxGntBE7VH2alPD n5yVdBuv+dwjNVn+dj4KtR7YuJpROirLc15k1GNlR7VR1wBvPcJI8MoPqZBEKYnv07/U u/PQ== X-Gm-Message-State: AOAM5310wQ+8kPK02prAV5GJ7uWlsMcnxCE7LPpWBvVOT86WijDA+XSz ZJO47YiZ7huA778dDDG+oGY= X-Google-Smtp-Source: ABdhPJzwZfozEnQDt+CrjQ7uTvPbLWypALeKVlqUmFxBKfIWsyPw8Alci4bEMHh/m6nHITXZtcC2TA== X-Received: by 2002:a2e:7a0d:0:b0:253:decb:be0f with SMTP id v13-20020a2e7a0d000000b00253decbbe0fmr9414809ljc.525.1653327022433; Mon, 23 May 2022 10:30:22 -0700 (PDT) Received: from [192.168.1.7] ([212.22.223.21]) by smtp.gmail.com with ESMTPSA id f11-20020a05651232cb00b004786243ab08sm1229661lfg.108.2022.05.23.10.30.21 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 23 May 2022 10:30:22 -0700 (PDT) Subject: Re: [PATCH V2 5/7] dt-bindings: Add xen,dev-domid property description for xen-grant DMA ops From: Oleksandr To: Stefano Stabellini , xen-devel , "open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE" , DTML , Linux Kernel Mailing List , Linux ARM Cc: Arnd Bergmann , Oleksandr Tyshchenko , Jason Wang , Rob Herring , Krzysztof Kozlowski , Julien Grall , Juergen Gross , "Michael S. Tsirkin" , Christoph Hellwig , Jean-Philippe Brucker References: <1651947548-4055-1-git-send-email-olekstysh@gmail.com> <1651947548-4055-6-git-send-email-olekstysh@gmail.com> <56e8c32d-6771-7179-005f-26ca58555659@gmail.com> <460a746c-6b61-214b-4653-44a1430e314d@gmail.com> <6f469e9c-c26e-f4be-9a85-710afb0d77eb@gmail.com> Message-ID: <390ba7bb-ee9e-b7b7-5f08-71a7245fa4ec@gmail.com> Date: Mon, 23 May 2022 20:30:20 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <6f469e9c-c26e-f4be-9a85-710afb0d77eb@gmail.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220523_103026_821567_131C47AB X-CRM114-Status: GOOD ( 43.72 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDE5LjA1LjIyIDA5OjAzLCBPbGVrc2FuZHIgd3JvdGU6CgpIZWxsbyBTdGVmYW5vLCBhbGwK Cgo+Cj4gT24gMTkuMDUuMjIgMDQ6MDYsIFN0ZWZhbm8gU3RhYmVsbGluaSB3cm90ZToKPgo+Cj4g SGVsbG8gU3RlZmFubywgYWxsCj4KPj4gT24gVGh1LCAxOSBNYXkgMjAyMiwgT2xla3NhbmRyIHdy b3RlOgo+Pj4+IE9uIFdlZCwgTWF5IDE4LCAyMDIyIGF0IDU6MDYgUE0gT2xla3NhbmRyIDxvbGVr c3R5c2hAZ21haWwuY29tPiB3cm90ZToKPj4+Pj4gT24gMTguMDUuMjIgMTc6MzIsIEFybmQgQmVy Z21hbm4gd3JvdGU6Cj4+Pj4+PiBPbiBTYXQsIE1heSA3LCAyMDIyIGF0IDc6MTkgUE0gT2xla3Nh bmRyIFR5c2hjaGVua28KPj4+Pj4+IDxvbGVrc3R5c2hAZ21haWwuY29tPiB3cm90ZToKPj4+Pj4+ IMKgwqDCoCBUaGlzIHdvdWxkIG1lYW4gaGF2aW5nIGEgZGV2aWNlCj4+Pj4+PiBub2RlIGZvciB0 aGUgZ3JhbnQtdGFibGUgbWVjaGFuaXNtIHRoYXQgY2FuIGJlIHJlZmVycmVkIHRvIHVzaW5nIHRo ZQo+Pj4+Pj4gJ2lvbW11cycKPj4+Pj4+IHBoYW5kbGUgcHJvcGVydHksIHdpdGggdGhlIGRvbWlk IGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQuCj4+Pj4+IEkgYXNzdW1lLCB5b3UgYXJlIHNwZWFr aW5nIGFib3V0IHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc/Cj4+Pj4+Cj4+Pj4+Cj4+Pj4+ IHhlbl9kdW1teV9pb21tdSB7Cj4+Pj4+IMKgwqDCoMKgwqAgY29tcGF0aWJsZSA9ICJ4ZW4sZHVt bXktaW9tbXUiOwo+Pj4+PiDCoMKgwqDCoMKgICNpb21tdS1jZWxscyA9IDwxPjsKPj4+Pj4gfTsK Pj4+Pj4KPj4+Pj4gdmlydGlvQDMwMDAgewo+Pj4+PiDCoMKgwqDCoMKgIGNvbXBhdGlibGUgPSAi dmlydGlvLG1taW8iOwo+Pj4+PiDCoMKgwqDCoMKgIHJlZyA9IDwweDMwMDAgMHgxMDA+Owo+Pj4+ PiDCoMKgwqDCoMKgIGludGVycnVwdHMgPSA8NDE+Owo+Pj4+Pgo+Pj4+PiDCoMKgwqDCoMKgIC8q IFRoZSBkZXZpY2UgaXMgbG9jYXRlZCBpbiBYZW4gZG9tYWluIHdpdGggSUQgMSAqLwo+Pj4+PiDC oMKgwqDCoMKgIGlvbW11cyA9IDwmeGVuX2R1bW15X2lvbW11IDE+Owo+Pj4+PiB9Owo+Pj4+IFJp Z2h0LCB0aGF0J3MgdGhhdCdzIHRoZSBpZGVhLAo+Pj4gdGhhbmsgeW91IGZvciB0aGUgY29uZmly bWF0aW9uCj4+Pgo+Pj4KPj4+Cj4+Pj4gwqDCoCBleGNlcHQgSSB3b3VsZCBub3QgY2FsbCBpdCBh ICdkdW1teScuCj4+Pj4gwqAgRnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIERULCB0aGlzIGJl aGF2ZXMganVzdCBsaWtlIGFuIElPTU1VLAo+Pj4+IGV2ZW4gaWYgdGhlIGV4YWN0IG1lY2hhbmlz bSBpcyBkaWZmZXJlbnQgZnJvbSBtb3N0IGhhcmR3YXJlIElPTU1VCj4+Pj4gaW1wbGVtZW50YXRp b25zLgo+Pj4gd2VsbCwgYWdyZWUKPj4+Cj4+Pgo+Pj4+Pj4gSXQgZG9lcyBub3QgcXVpdGUgZml0 IHRoZSBtb2RlbCB0aGF0IExpbnV4IGN1cnJlbnRseSB1c2VzIGZvciAKPj4+Pj4+IGlvbW11cywK Pj4+Pj4+IGFzIHRoYXQgaGFzIGFuIGFsbG9jYXRvciBmb3IgZG1hX2FkZHJfdCBzcGFjZQo+Pj4+ PiB5ZXMgKCMgMy83IGFkZHMgZ3JhbnQtdGFibGUgYmFzZWQgYWxsb2NhdG9yKQo+Pj4+Pgo+Pj4+ Pgo+Pj4+Pj4gLCBidXQgaXQgd291bGQgdGhpbmsgaXQncwo+Pj4+Pj4gY29uY2VwdHVhbGx5IGNs b3NlIGVub3VnaCB0aGF0IGl0IG1ha2VzIHNlbnNlIGZvciB0aGUgYmluZGluZy4KPj4+Pj4gSW50 ZXJlc3RpbmcgaWRlYS4gSSBhbSB3b25kZXJpbmcsIGRvIHdlIG5lZWQgYW4gZXh0cmEgYWN0aW9u cyBmb3IgCj4+Pj4+IHRoaXMKPj4+Pj4gdG8gd29yayBpbiBMaW51eCBndWVzdCAoZHVtbXkgSU9N TVUgZHJpdmVyLCBldGMpPwo+Pj4+IEl0IGRlcGVuZHMgb24gaG93IGNsb3NlbHkgdGhlIGd1ZXN0 IGltcGxlbWVudGF0aW9uIGNhbiBiZSBtYWRlIHRvCj4+Pj4gcmVzZW1ibGUgYSBub3JtYWwgaW9t bXUuIElmIHlvdSBkbyBhbGxvY2F0ZSBkbWFfYWRkcl90IGFkZHJlc3NlcywKPj4+PiBpdCBtYXkg YWN0dWFsbHkgYmUgY2xvc2UgZW5vdWdoIHRoYXQgeW91IGNhbiBqdXN0IHR1cm4gdGhlIGdyYW50 LXRhYmxlCj4+Pj4gY29kZSBpbnRvIGEgbm9ybWFsIGlvbW11IGRyaXZlciBhbmQgY2hhbmdlIG5v dGhpbmcgZWxzZS4KPj4+IFVuZm9ydHVuYXRlbHksIEkgZmFpbGVkIHRvIGZpbmQgYSB3YXkgaG93 IHVzZSBncmFudCByZWZlcmVuY2VzIGF0IHRoZQo+Pj4gaW9tbXVfb3BzIGxldmVsIChJIG1lYW4g dG8gZnVsbHkgcHJldGVuZCB0aGF0IHdlIGFyZSBhbiBJT01NVSAKPj4+IGRyaXZlcikuIEkgYW0K Pj4+IG5vdCB0b28gZmFtaWxpYXIgd2l0aCB0aGF0LCBzbyB3aGF0IGlzIHdyaXR0ZW4gYmVsb3cg bWlnaHQgYmUgd3JvbmcgCj4+PiBvciBhdAo+Pj4gbGVhc3Qgbm90IHByZWNpc2UuCj4+Pgo+Pj4g VGhlIG5vcm1hbCBJT01NVSBkcml2ZXIgaW4gTGludXggZG9lc27igJl0IGFsbG9jYXRlIERNQSBh ZGRyZXNzZXMgYnkgCj4+PiBpdHNlbGYsIGl0Cj4+PiBqdXN0IG1hcHMgKElPVkEtUEEpIHdoYXQg d2FzIHJlcXVlc3RlZCB0byBiZSBtYXBwZWQgYnkgdGhlIHVwcGVyIAo+Pj4gbGF5ZXIuIFRoZQo+ Pj4gRE1BIGFkZHJlc3MgYWxsb2NhdGlvbiBpcyBkb25lIGJ5IHRoZSB1cHBlciBsYXllciAoRE1B LUlPTU1VIHdoaWNoIAo+Pj4gaXMgdGhlIGdsdWUKPj4+IGxheWVyIGJldHdlZW4gRE1BIEFQSSBh bmQgSU9NTVUgQVBJIGFsbG9jYXRlcyBJT1ZBIGZvciBQQT8pLiBCdXQsIAo+Pj4gYWxsIHdoYXQg d2UKPj4+IG5lZWQgaGVyZSBpcyBqdXN0IHRvIGFsbG9jYXRlIG91ciBzcGVjaWZpYyBncmFudC10 YWJsZSBiYXNlZCBETUEgCj4+PiBhZGRyZXNzZXMKPj4+IChETUEgYWRkcmVzcyA9IGdyYW50IHJl ZmVyZW5jZSArIG9mZnNldCBpbiB0aGUgcGFnZSksIHNvIGxldOKAmXMgc2F5IAo+Pj4gd2UgbmVl ZCBhbgo+Pj4gZW50aXR5IHRvIHRha2UgYSBwaHlzaWNhbCBhZGRyZXNzIGFzIHBhcmFtZXRlciBh bmQgcmV0dXJuIGEgRE1BIAo+Pj4gYWRkcmVzcyAod2hhdAo+Pj4gYWN0dWFsbHkgY29tbWl0ICMz LzcgaXMgZG9pbmcpLCBhbmQgdGhhdOKAmXMgYWxsLiBTbyB3b3JraW5nIGF0IHRoZSAKPj4+IGRt YV9vcHMKPj4+IGxheWVyIHdlIGdldCBleGFjdGx5IHdoYXQgd2UgbmVlZCwgd2l0aCB0aGUgbWlu aW1hbCBjaGFuZ2VzIHRvIGd1ZXN0Cj4+PiBpbmZyYXN0cnVjdHVyZS4gSW4gb3VyIGNhc2UgdGhl IFhlbiBpdHNlbGYgYWN0cyBhcyBhbiBJT01NVS4KPj4+Cj4+PiBBc3N1bWluZyB0aGF0IHdlIHdh bnQgdG8gcmV1c2UgdGhlIElPTU1VIGluZnJhc3RydWN0dXJlIHNvbWVob3cgZm9yIAo+Pj4gb3Vy IG5lZWRzLgo+Pj4gSSB0aGluaywgaW4gdGhhdCBjYXNlIHdlIHdpbGwgbGlrZWx5IG5lZWQgdG8g aW50cm9kdWNlIGEgbmV3IAo+Pj4gc3BlY2lmaWMgSU9WQQo+Pj4gYWxsb2NhdG9yIChhbG9uZ3Np ZGUgd2l0aCBhIGdlbmVyaWMgb25lKSB0byBiZSBob29rZWQgdXAgYnkgdGhlIAo+Pj4gRE1BLUlP TU1VCj4+PiBsYXllciBpZiB3ZSBydW4gb24gdG9wIG9mIFhlbi4gQnV0LCBldmVuIGhhdmluZyB0 aGUgc3BlY2lmaWMgSU9WQSAKPj4+IGFsbG9jYXRvciB0bwo+Pj4gcmV0dXJuIHdoYXQgd2UgaW5k ZWVkIG5lZWQgKERNQSBhZGRyZXNzID0gZ3JhbnQgcmVmZXJlbmNlICsgb2Zmc2V0IAo+Pj4gaW4g dGhlCj4+PiBwYWdlKSB3ZSB3aWxsIHN0aWxsIG5lZWQgdGhlIHNwZWNpZmljIG1pbmltYWwgcmVx dWlyZWQgSU9NTVUgZHJpdmVyIAo+Pj4gdG8gYmUKPj4+IHByZXNlbnQgaW4gdGhlIHN5c3RlbSBh bnl3YXkgaW4gb3JkZXIgdG8gdHJhY2sgdGhlIG1hcHBpbmdzKD8pIGFuZCAKPj4+IGRvIG5vdGhp bmcKPj4+IHdpdGggdGhlbSwgcmV0dXJuaW5nIGEgc3VjY2VzcyAodGhpcyBzcGVjaWZpYyBJT01N VSBkcml2ZXIgc2hvdWxkIAo+Pj4gaGF2ZSBhbGwKPj4+IG1hbmRhdG9yeSBjYWxsYmFja3MgaW1w bGVtZW50ZWQpLgo+Pj4KPj4+IEkgY29tcGxldGVseSBhZ3JlZSwgaXQgd291bGQgYmUgcmVhbGx5 IG5pY2UgdG8gcmV1c2UgZ2VuZXJpYyBJT01NVSAKPj4+IGJpbmRpbmdzCj4+PiByYXRoZXIgdGhh biBpbnRyb2R1Y2luZyBYZW4gc3BlY2lmaWMgcHJvcGVydHkgaWYgd2hhdCB3ZSBhcmUgdHJ5aW5n IHRvCj4+PiBpbXBsZW1lbnQgaW4gY3VycmVudCBwYXRjaCBzZXJpZXMgZml0cyBpbiB0aGUgdXNh Z2Ugb2YgImlvbW11cyIgaW4gCj4+PiBMaW51eAo+Pj4gbW9yZS1sZXNzLiBCdXQsIGlmIHdlIHdp bGwgaGF2ZSB0byBhZGQgbW9yZSBjb21wbGV4aXR5L21vcmUgCj4+PiBjb21wb25lbnRzIHRvIHRo ZQo+Pj4gY29kZSBmb3IgdGhlIHNha2Ugb2YgcmV1c2luZyBkZXZpY2UgdHJlZSBiaW5kaW5nLCB0 aGlzIHJhaXNlcyBhIAo+Pj4gcXVlc3Rpb24KPj4+IHdoZXRoZXIgdGhhdOKAmXMgd29ydGh3aGls ZS4KPj4+Cj4+PiBPciBJIHJlYWxseSBtaXNzZWQgc29tZXRoaW5nPwo+PiBJIHRoaW5rIEFybmQg d2FzIHByaW1hcmlseSBzdWdnZXN0aW5nIHRvIHJldXNlIHRoZSBJT01NVSBEZXZpY2UgVHJlZQo+ PiBiaW5kaW5ncywgbm90IG5lY2Vzc2FyaWx5IHRoZSBJT01NVSBkcml2ZXJzIGZyYW1ld29yayBp biBMaW51eCAoYWx0aG91Z2gKPj4gdGhhdCB3b3VsZCBiZSBhbiBhZGRlZCBib251cy4pCj4+Cj4+ IEkga25vdyBmcm9tIHByZXZpb3VzIGRpc2N1c3Npb25zIHdpdGggeW91IHRoYXQgbWFraW5nIHRo ZSBncmFudCB0YWJsZQo+PiBmaXQgaW4gdGhlIGV4aXN0aW5nIElPTU1VIGRyaXZlcnMgbW9kZWwg aXMgZGlmZmljdWx0LCBidXQganVzdCByZXVzaW5nCj4+IHRoZSBEZXZpY2UgVHJlZSBiaW5kaW5n cyBzZWVtcyBmZWFzaWJsZT8KPgo+IEkgc3RhcnRlZCBleHBlcmltZW50aW5nIHdpdGggdGhhdC4g QXMgd3JvdGUgaW4gYSBzZXBhcmF0ZSBlbWFpbCwgSSBnb3QgCj4gYSBkZWZlcnJlZCBwcm9iZSB0 aW1lb3V0LAo+Cj4gYWZ0ZXIgaW5zZXJ0aW5nIHJlcXVpcmVkIG5vZGVzIGludG8gZ3Vlc3QgZGV2 aWNlIHRyZWUsIHdoaWNoIHNlZW1zIHRvIAo+IGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHVuYXZh aWxhYmlsaXR5IG9mIElPTU1VLCBJIHdpbGwgY29udGludWUgdG8gCj4gaW52ZXN0aWdhdGUgdGhp cyBxdWVzdGlvbi4KCgpJIGhhdmUgZXhwZXJpbWVudGVkIHdpdGggdGhhdC4gWWVzLCBqdXN0IHJl dXNpbmcgdGhlIERldmljZSBUcmVlIApiaW5kaW5ncyBpcyB0ZWNobmljYWxseSBmZWFzaWJsZSAo YW5kIHdlIGFyZSBhYmxlIHRvIGRvIHRoaXMgYnkgb25seSAKdG91Y2hpbmcgZ3JhbnQtZG1hLW9w cy5jKSwgYWx0aG91Z2ggZGVmZXJyZWQgcHJvYmUgdGltZW91dCBzdGlsbCBzdGFuZHMgCihhcyB0 aGVyZSBpcyBubyBJT01NVSBkcml2ZXIgYmVpbmcgcHJlc2VudCBhY3R1YWxseSkuCgpbwqDCoMKg IDAuNTgzNzcxXSB2aXJ0aW8tbW1pbyAyMDAwMDAwLnZpcnRpbzogZGVmZXJyZWQgcHJvYmUgdGlt ZW91dCwgCmlnbm9yaW5nIGRlcGVuZGVuY3kKW8KgwqDCoCAwLjYxNTU1Nl0gdmlydGlvX2JsayB2 aXJ0aW8wOiBbdmRhXSA0MDk2MDAwIDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzIAooMi4xMCBHQi8x Ljk1IEdpQikKCgpCZWxvdyB0aGUgd29ya2luZyBkaWZmIChvbiB0b3Agb2YgY3VycmVudCBzZXJp ZXMpOgoKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2dyYW50LWRtYS1vcHMuYyBiL2RyaXZlcnMv eGVuL2dyYW50LWRtYS1vcHMuYwppbmRleCBkYTljN2ZmLi42NTg2MTUyIDEwMDY0NAotLS0gYS9k cml2ZXJzL3hlbi9ncmFudC1kbWEtb3BzLmMKKysrIGIvZHJpdmVycy94ZW4vZ3JhbnQtZG1hLW9w cy5jCkBAIC0yNzIsMTcgKzI3MiwyNCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9tYXBfb3Bz IHhlbl9ncmFudF9kbWFfb3BzID0gewoKIMKgYm9vbCB4ZW5faXNfZ3JhbnRfZG1hX2RldmljZShz dHJ1Y3QgZGV2aWNlICpkZXYpCiDCoHsKK8KgwqDCoMKgwqDCoCBzdHJ1Y3QgZGV2aWNlX25vZGUg KmlvbW11X25wOworwqDCoMKgwqDCoMKgIGJvb2wgaGFzX2lvbW11OworCiDCoMKgwqDCoMKgwqDC oCAvKiBYWFggSGFuZGxlIG9ubHkgRFQgZGV2aWNlcyBmb3Igbm93ICovCiDCoMKgwqDCoMKgwqDC oCBpZiAoIWRldi0+b2Zfbm9kZSkKIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gZmFsc2U7CgotwqDCoMKgwqDCoMKgIHJldHVybiBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2 LT5vZl9ub2RlLCAieGVuLGJhY2tlbmQtZG9taWQiKTsKK8KgwqDCoMKgwqDCoCBpb21tdV9ucCA9 IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiaW9tbXVzIiwgMCk7CivCoMKgwqDCoMKg wqAgaGFzX2lvbW11ID0gaW9tbXVfbnAgJiYgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoaW9tbXVf bnAsIAoieGVuLGdyYW50LWRtYSIpOworwqDCoMKgwqDCoMKgIG9mX25vZGVfcHV0KGlvbW11X25w KTsKKworwqDCoMKgwqDCoMKgIHJldHVybiBoYXNfaW9tbXU7CiDCoH0KCiDCoHZvaWQgeGVuX2dy YW50X3NldHVwX2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQogwqB7CiDCoMKgwqDCoMKgwqDC oCBzdHJ1Y3QgeGVuX2dyYW50X2RtYV9kYXRhICpkYXRhOwotwqDCoMKgwqDCoMKgIHVpbnQzMl90 IGRvbWlkOworwqDCoMKgwqDCoMKgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgaW9tbXVfc3BlYzsK CiDCoMKgwqDCoMKgwqDCoCBkYXRhID0gZmluZF94ZW5fZ3JhbnRfZG1hX2RhdGEoZGV2KTsKIMKg wqDCoMKgwqDCoMKgIGlmIChkYXRhKSB7CkBAIC0yOTQsMTYgKzMwMSwzMCBAQCB2b2lkIHhlbl9n cmFudF9zZXR1cF9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldikKIMKgwqDCoMKgwqDCoMKgIGlm ICghZGV2LT5vZl9ub2RlKQogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJy OwoKLcKgwqDCoMKgwqDCoCBpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAi eGVuLGJhY2tlbmQtZG9taWQiLCAKJmRvbWlkKSkgewotwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBkZXZfZXJyKGRldiwgInhlbixiYWNrZW5kLWRvbWlkIHByb3BlcnR5IGlzIG5vdCBwcmVz ZW50XG4iKTsKK8KgwqDCoMKgwqDCoCBpZiAob2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MoZGV2 LT5vZl9ub2RlLCAiaW9tbXVzIiwgCiIjaW9tbXUtY2VsbHMiLAorwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCwgJmlvbW11X3NwZWMpKSB7CivCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGRldl9lcnIoZGV2LCAiQ2Fubm90IHBhcnNlIGlvbW11cyBwcm9w ZXJ0eVxuIik7CivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyOworwqDCoMKg wqDCoMKgIH0KKworwqDCoMKgwqDCoMKgIGlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoaW9t bXVfc3BlYy5ucCwgInhlbixncmFudC1kbWEiKSB8fAorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXVfc3BlYy5hcmdzX2NvdW50ICE9IDEpIHsKK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2VycihkZXYsICJJbmNvbXBhdGlibGUgSU9NTVUg bm9kZVxuIik7CivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG9mX25vZGVfcHV0KGlvbW11 X3NwZWMubnApOwogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyOwogwqDC oMKgwqDCoMKgwqAgfQoKK8KgwqDCoMKgwqDCoCBvZl9ub2RlX3B1dChpb21tdV9zcGVjLm5wKTsK KwogwqDCoMKgwqDCoMKgwqAgZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGF0YSks IEdGUF9LRVJORUwpOwogwqDCoMKgwqDCoMKgwqAgaWYgKCFkYXRhKQogwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyOwoKLcKgwqDCoMKgwqDCoCBkYXRhLT5iYWNrZW5kX2Rv bWlkID0gZG9taWQ7CivCoMKgwqDCoMKgwqAgLyoKK8KgwqDCoMKgwqDCoMKgICogVGhlIGVuZHBv aW50IElEIGhlcmUgbWVhbnMgdGhlIElEIG9mIHRoZSBkb21haW4gd2hlcmUgdGhlIApjb3JyZXNw b25kaW5nCivCoMKgwqDCoMKgwqDCoCAqIGJhY2tlbmQgaXMgcnVubmluZworwqDCoMKgwqDCoMKg wqAgKi8KK8KgwqDCoMKgwqDCoCBkYXRhLT5iYWNrZW5kX2RvbWlkID0gaW9tbXVfc3BlYy5hcmdz WzBdOwoKIMKgwqDCoMKgwqDCoMKgIGlmICh4YV9lcnIoeGFfc3RvcmUoJnhlbl9ncmFudF9kbWFf ZGV2aWNlcywgKHVuc2lnbmVkIGxvbmcpZGV2LCAKZGF0YSwKIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgR0ZQX0tFUk5FTCkpKSB7CihFTkQpCgoKCkJlbG93 LCB0aGUgbm9kZXMgZ2VuZXJhdGVkIGJ5IFhlbiB0b29sc3RhY2s6CgogwqDCoMKgwqDCoMKgwqAg eGVuX2dyYW50X2RtYSB7CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29tcGF0aWJs ZSA9ICJ4ZW4sZ3JhbnQtZG1hIjsKIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAjaW9t bXUtY2VsbHMgPSA8MHgwMT47CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGhhbmRs ZSA9IDwweGZkZTk+OwogwqDCoMKgwqDCoMKgwqAgfTsKCiDCoMKgwqDCoMKgwqDCoCB2aXJ0aW9A MjAwMDAwMCB7CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29tcGF0aWJsZSA9ICJ2 aXJ0aW8sbW1pbyI7CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVnID0gPDB4MDAg MHgyMDAwMDAwIDB4MDAgMHgyMDA+OwogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlu dGVycnVwdHMgPSA8MHgwMCAweDAxIDB4ZjAxPjsKIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBpbnRlcnJ1cHQtcGFyZW50ID0gPDB4ZmRlOD47CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZG1hLWNvaGVyZW50OwogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlv bW11cyA9IDwweGZkZTkgMHgwMT47CiDCoMKgwqDCoMKgwqDCoCB9OwoKCgpJIGFtIHdvbmRlcmlu Zywgd291bGQgYmUgdGhlIHByb3BlciBzb2x1dGlvbiB0byBlbGltaW5hdGUgZGVmZXJyZWQgcHJv YmUgCnRpbWVvdXQgaXNzdWUgaW4gb3VyIHBhcnRpY3VsYXIgY2FzZSAod2l0aG91dCBpbnRyb2R1 Y2luZyBhbiBleHRyYSBJT01NVSAKZHJpdmVyKT8KCgoKCj4KPgo+Cj4KLS0gClJlZ2FyZHMsCgpP bGVrc2FuZHIgVHlzaGNoZW5rbwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK