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=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 1249FC433DB for ; Sat, 13 Mar 2021 06:46:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DC70464F21 for ; Sat, 13 Mar 2021 06:46:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233053AbhCMGqJ (ORCPT ); Sat, 13 Mar 2021 01:46:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230380AbhCMGpp (ORCPT ); Sat, 13 Mar 2021 01:45:45 -0500 Received: from mail-ot1-x32a.google.com (mail-ot1-x32a.google.com [IPv6:2607:f8b0:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 67D06C061574; Fri, 12 Mar 2021 22:45:45 -0800 (PST) Received: by mail-ot1-x32a.google.com with SMTP id w21-20020a9d63950000b02901ce7b8c45b4so2573306otk.5; Fri, 12 Mar 2021 22:45:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=Wv/LMcmadMeUumH6ChNUQyFDgkOiRB4yQBi9GtlL0DY=; b=uwFQXeSe5I4Y0uveJAgLUCSn08KNnILED4VTFjvZAGKPJ/QHGxMUDEBtkt04T4hh/k lKud6//FkR9v90HqPAdywFlEJUujOUGTS/6RsEf2AwB9lZjZUxNQalKW3QAEvcDL3+aK Fss16KlG7VpKILc84WERKovU2/9riFWSWdvHCdtU8unOMPjZDZtyHN5gRGZoLi1hyRin WhMQ3SwIvLzTlCv5wUSGLThQGomyCdXwVPpD1Ss7Axsu20m8x4rqiSyI1/SlNq0VgzZ7 xVhB+YpraQKeQi096e3NkH36ARq9AWAiEx3tTcEjRz2KZ6Lnzqfy1JPjn+BeUpFriojo Dr2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=Wv/LMcmadMeUumH6ChNUQyFDgkOiRB4yQBi9GtlL0DY=; b=WxpAq3IHgJWhLJ7aQ21pSOknUd61ZFfcGrYpC8rvfs64byASRkBfkFfOnTwO7V1NIk q2QzlGJjGUzlNOIngWRYqvfWVrFYTb1WtzClfh7xNb9odMwhZ2JWc+k8axDWfxRDMCow FBWnZWBPc1B5MbZk9921r/SmwfZyai44tzb7frrmKeq+acOF9q2EWa5Vraw1A/C29GMq 3hacnkKQj4SccU+KXrEJbWUNi/t18Dm64qxGHg5nbR43RtYkVCUxjdM9afsVhlXNSlEj r3FzK48PqqkOJbPWPrzg58F8Pegty2zQyJhn839bzioaaW02EOcCCZXZlHGC3rmJ/vwM 4K1w== X-Gm-Message-State: AOAM533i7LS+qzoPoWfEf8+Wr24BooOjCs/0jW0Paj+fYqQCpUvOoZB+ WYX2Yyx9xwm/J4+PuEeGs/h2QnGnzwx0NnrY0OVxx6zXdy8= X-Google-Smtp-Source: ABdhPJwAkmsk5b/FgPzsWHNQadRp0KK8ozGAFNSA8BwyRwssRCe63Iowa88F4rlFCWcgeB/dBSswDtcg1jq/9997BiU= X-Received: by 2002:a05:6830:408a:: with SMTP id x10mr6228991ott.248.1615617944837; Fri, 12 Mar 2021 22:45:44 -0800 (PST) MIME-Version: 1.0 References: <1615294733-22761-1-git-send-email-aisheng.dong@nxp.com> <1615294733-22761-8-git-send-email-aisheng.dong@nxp.com> <31be2267-8988-f162-f5a6-6e6389bbf1fb@samsung.com> In-Reply-To: From: Dong Aisheng Date: Sat, 13 Mar 2021 14:45:39 +0800 Message-ID: Subject: Re: [PATCH 07/11] PM / devfreq: check get_dev_status before start monitor To: Chanwoo Choi Cc: Chanwoo Choi , Dong Aisheng , Linux PM , "moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" , Sascha Hauer , Shawn Guo , dl-linux-imx , open list , myungjoo.ham@samsung.com, kyungmin.park@samsung.com, Abel Vesa Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Mar 13, 2021 at 12:09 AM Chanwoo Choi wrote: > > On 21. 3. 12. =EC=98=A4=ED=9B=84 7:57, Dong Aisheng wrote: > > On Thu, Mar 11, 2021 at 2:54 PM Chanwoo Choi wr= ote: > >> > >> On 3/10/21 1:56 PM, Dong Aisheng wrote: > >>> On Wed, Mar 10, 2021 at 11:08 AM Chanwoo Choi = wrote: > >>>> > >>>> On 3/10/21 11:56 AM, Dong Aisheng wrote: > >>>>> On Wed, Mar 10, 2021 at 12:12 AM Chanwoo Choi = wrote: > >>>>>> > >>>>>> On 21. 3. 10. =EC=98=A4=EC=A0=84 12:58, Chanwoo Choi wrote: > >>>>>>> On 21. 3. 9. =EC=98=A4=ED=9B=84 9:58, Dong Aisheng wrote: > >>>>>>>> The devfreq monitor depends on the device to provide load inform= ation > >>>>>>>> by .get_dev_status() to calculate the next target freq. > >>>>>>>> > >>>>>>>> And this will cause changing governor to simple ondemand fail > >>>>>>>> if device can't support. > >>>>>>>> > >>>>>>>> Signed-off-by: Dong Aisheng > >>>>>>>> --- > >>>>>>>> drivers/devfreq/devfreq.c | 10 +++++++--- > >>>>>>>> drivers/devfreq/governor.h | 2 +- > >>>>>>>> drivers/devfreq/governor_simpleondemand.c | 3 +-- > >>>>>>>> 3 files changed, 9 insertions(+), 6 deletions(-) > >>>>>>>> > >>>>>>>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq= .c > >>>>>>>> index 7231fe6862a2..d1787b6c7d7c 100644 > >>>>>>>> --- a/drivers/devfreq/devfreq.c > >>>>>>>> +++ b/drivers/devfreq/devfreq.c > >>>>>>>> @@ -482,10 +482,13 @@ static void devfreq_monitor(struct work_st= ruct > >>>>>>>> *work) > >>>>>>>> * to be called from governor in response to DEVFREQ_GOV_STAR= T > >>>>>>>> * event when device is added to devfreq framework. > >>>>>>>> */ > >>>>>>>> -void devfreq_monitor_start(struct devfreq *devfreq) > >>>>>>>> +int devfreq_monitor_start(struct devfreq *devfreq) > >>>>>>>> { > >>>>>>>> if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVE= N)) > >>>>>>>> - return; > >>>>>>>> + return 0; > >>>>>>>> + > >>>>>>>> + if (!devfreq->profile->get_dev_status) > >>>>>>>> + return -EINVAL; > >>>>>> > >>>>>> Again, I think that get_dev_status is not used for all governors. > >>>>>> So that it cause the governor start fail. Don't check whether > >>>>>> .get_dev_status is NULL or not. > >>>>>> > >>>>> > >>>>> I'm not quite understand your point. > >>>>> it is used by governor_simpleondemand.c and tegra_devfreq_governor. > >>>>> get_target_freq -> devfreq_update_stats -> get_dev_status > >>>> > >>>> The devfreq can add the new governor by anyone. > >>>> So these functions like devfreq_monitor_* have to support > >>>> the governors and also must support the governor to be added > >>>> in the future. > >>> > >>> Yes, but devfreq_monitor_* is only used by polling mode, right? > >>> The governor using it has to implement get_dev_status unless > >>> there's an exception in the future. > >>> > >>> Currently this patch wants to address the issue that user can switch > >>> to ondemand governor (polling mode) by sysfs even devices does > >>> not support it (no get_dev_status implemented). > >> > >> As I commented, I'll fix this issue. If devfreq driver doesn't impleme= nt > >> the .get_dev_status, don't show it via available_governors. I think th= at > >> it is fundamental solution to fix this issue. > > > > Sounds good > > > >> So on this version, > >> don't add the this conditional statement on this function > >> > > > > Almost all this patch did is adding a checking for get_dev_status. > > So do you mean drop this patch? > > I wonder it's still a necessary checking to explicitly tell devfreq mon= itor > > users that get_dev_status is needed during governor startup. > > I think that the it is enough to check .get_dev_status in > devfreq_update_stats. We have to check it on where it is used. > I think the drawback of only checking .get_dev_status in devfreq_update_stats is: 1. devfreq will still register successfully and ondemand governor starts ok 2. ondemand governor will still be shown in sysfs which is something you want to fix 3. devfreq will end up printing endless error messages in devfreq_monitor w= orker "dvfs failed with (%d) error" as the possible missing .get_dev_status So i wonder if you don't like changing the common devfreq_monitor_start in = order to make it look common for all governors, then we probably still need to fix it in ondemand governor in order to avoid the possible above issues. static int devfreq_simple_ondemand_handler(struct devfreq *devfreq, unsigned int event, void *data) { switch (event) { case DEVFREQ_GOV_START: if (!devfreq->profile->get_dev_status) return -EINVAL; return devfreq_monitor_start(devfreq); ... } How do you think? Regards Aisheng > > > >> And on next version, please use the capital letter for first character > >> on patch title as following: > >> > >> - PM / devfreq: Check get_dev_status before start monitor > >> > > > > Okay to me. > > Thanks for the suggestion. > > > > Regards > > Aisheng > > > >>> > >>> Regards > >>> Aisheng > >>> > >>>> > >>>>> > >>>>> Without checking, device can switch to ondemand governor if it does= not support. > >>>>> > >>>>> Am i missed something? > >>>>> > >>>>> Regards > >>>>> Aisheng > >>>>> > >>>>>>>> switch (devfreq->profile->timer) { > >>>>>>>> case DEVFREQ_TIMER_DEFERRABLE: > >>>>>>>> @@ -495,12 +498,13 @@ void devfreq_monitor_start(struct devfreq = *devfreq) > >>>>>>>> INIT_DELAYED_WORK(&devfreq->work, devfreq_monitor); > >>>>>>>> break; > >>>>>>>> default: > >>>>>>>> - return; > >>>>>>>> + return -EINVAL; > >>>>>>>> } > >>>>>>>> if (devfreq->profile->polling_ms) > >>>>>>>> queue_delayed_work(devfreq_wq, &devfreq->work, > >>>>>>>> msecs_to_jiffies(devfreq->profile->polling_ms)); > >>>>>>>> + return 0; > >>>>>>>> } > >>>>>>>> EXPORT_SYMBOL(devfreq_monitor_start); > >>>>>>>> diff --git a/drivers/devfreq/governor.h b/drivers/devfreq/govern= or.h > >>>>>>>> index 5cee3f64fe2b..31af6d072a10 100644 > >>>>>>>> --- a/drivers/devfreq/governor.h > >>>>>>>> +++ b/drivers/devfreq/governor.h > >>>>>>>> @@ -75,7 +75,7 @@ struct devfreq_governor { > >>>>>>>> unsigned int event, void *data); > >>>>>>>> }; > >>>>>>>> -void devfreq_monitor_start(struct devfreq *devfreq); > >>>>>>>> +int devfreq_monitor_start(struct devfreq *devfreq); > >>>>>>>> void devfreq_monitor_stop(struct devfreq *devfreq); > >>>>>>>> void devfreq_monitor_suspend(struct devfreq *devfreq); > >>>>>>>> void devfreq_monitor_resume(struct devfreq *devfreq); > >>>>>>>> diff --git a/drivers/devfreq/governor_simpleondemand.c > >>>>>>>> b/drivers/devfreq/governor_simpleondemand.c > >>>>>>>> index d57b82a2b570..ea287b57cbf3 100644 > >>>>>>>> --- a/drivers/devfreq/governor_simpleondemand.c > >>>>>>>> +++ b/drivers/devfreq/governor_simpleondemand.c > >>>>>>>> @@ -89,8 +89,7 @@ static int devfreq_simple_ondemand_handler(str= uct > >>>>>>>> devfreq *devfreq, > >>>>>>>> { > >>>>>>>> switch (event) { > >>>>>>>> case DEVFREQ_GOV_START: > >>>>>>>> - devfreq_monitor_start(devfreq); > >>>>>>>> - break; > >>>>>>>> + return devfreq_monitor_start(devfreq); > >>>>>>>> case DEVFREQ_GOV_STOP: > >>>>>>>> devfreq_monitor_stop(devfreq); > >>>>>>>> > >>>>>>> > >>>>>>> Need to handle the all points of devfreq_monitor_start() usage. > >>>>>>> please check the tegra30-devfreq.c for this update. > >>>>>>> > >>>>>>> $ grep -rn "devfreq_monitor_start" drivers/ > >>>>>>> drivers/devfreq/governor_simpleondemand.c:92: > >>>>>>> devfreq_monitor_start(devfreq); > >>>>>>> drivers/devfreq/tegra30-devfreq.c:744: > >>>>>>> devfreq_monitor_start(devfreq); > >>>>>>> ...... > >>>>>>> > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> Best Regards, > >>>>>> Samsung Electronics > >>>>>> Chanwoo Choi > >>>>> > >>>>> > >>>> > >>>> > >>>> -- > >>>> Best Regards, > >>>> Chanwoo Choi > >>>> Samsung Electronics > >>> > >>> > >> > >> > >> -- > >> Best Regards, > >> Chanwoo Choi > >> Samsung Electronics > > > -- > Best Regards, > Samsung Electronics > Chanwoo Choi 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=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 94AECC433DB for ; Sat, 13 Mar 2021 06:48:58 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E6B1F64ECB for ; Sat, 13 Mar 2021 06:48:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E6B1F64ECB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=jvlQ/cFD+GTPUlAiZ5gpmws8SrnwVnZMI4yk0ZlxOoU=; b=lpUN1Cg5WBhkgmhtrrBDaW2KB 5H4zGHVJP2OK+Rc/cwuGw0j5Nxro7+HmyWrCBjA66hKt8uaBnS0YMJMHoG7CL6mOrmY54WzW74ZV0 TcZBsDzqL/yQhN+UPYnVLpZUaEdlwJwmn6IK/uUtGvowbfuwVRhsaxXqOgZrMec8Wc04uHupEsDJI ++0e3g4K4Z6kdHs9v3QEfu/kZpCqgY5vS62IKEqtwLVfFS6tB1s4rO7wfQwbn60bmUF2dFi1WYLfT ZfqucQb8VEMqGttvyfgvLQRhwiCVrtK6tnye3Say5E2JkXLX3UoZ+VjoSP+x53wNFgU062FoPLFqA 5jWk6Sa3A==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lKy35-00Cw3K-9Q; Sat, 13 Mar 2021 06:46:57 +0000 Received: from mail-ot1-x32b.google.com ([2607:f8b0:4864:20::32b]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lKy1y-00Cw0Q-3r for linux-arm-kernel@lists.infradead.org; Sat, 13 Mar 2021 06:45:52 +0000 Received: by mail-ot1-x32b.google.com with SMTP id a17so4642830oto.5 for ; Fri, 12 Mar 2021 22:45:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=Wv/LMcmadMeUumH6ChNUQyFDgkOiRB4yQBi9GtlL0DY=; b=uwFQXeSe5I4Y0uveJAgLUCSn08KNnILED4VTFjvZAGKPJ/QHGxMUDEBtkt04T4hh/k lKud6//FkR9v90HqPAdywFlEJUujOUGTS/6RsEf2AwB9lZjZUxNQalKW3QAEvcDL3+aK Fss16KlG7VpKILc84WERKovU2/9riFWSWdvHCdtU8unOMPjZDZtyHN5gRGZoLi1hyRin WhMQ3SwIvLzTlCv5wUSGLThQGomyCdXwVPpD1Ss7Axsu20m8x4rqiSyI1/SlNq0VgzZ7 xVhB+YpraQKeQi096e3NkH36ARq9AWAiEx3tTcEjRz2KZ6Lnzqfy1JPjn+BeUpFriojo Dr2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=Wv/LMcmadMeUumH6ChNUQyFDgkOiRB4yQBi9GtlL0DY=; b=uI11X5ff1NIBalcL04B5DBD/oDKDxtoi+r8MRYFyiNAdjNKeJeeW16KLzdS8ZLFvUR sRvPbiQwgFMRIjM1eCZA/D2aeDWFVVvzyftnb5zD2954IyKSbuQsSJeJh67PrpCm1mBQ mbCgDIrCYpA6Is7e3FV1bceRUvJvTVQ+ACP6x12svyP41E4SppdsgxZ5tctHm5oQxoWF R4KTdeJ4jhGt5kyNIpufFFwjQmAgnlDQufRhqCNBYSR+U9fakkABuBw0k9s0owOi6Fek KJqXuFizHJRM0kBbtLpRCYi1qdaHQvzNMbhPKF7K+OLaL4UOXlHsy+r2gqOjRc9p6ysb K/DA== X-Gm-Message-State: AOAM533GHevV1eUzEX5jcDDNjR+2M4p6d7aRWfdT6TL+IU22amVoJ/bY 0VNmQJ9lNEfOJL0PMnFw0HOP582JQK6d390CvLk= X-Google-Smtp-Source: ABdhPJwAkmsk5b/FgPzsWHNQadRp0KK8ozGAFNSA8BwyRwssRCe63Iowa88F4rlFCWcgeB/dBSswDtcg1jq/9997BiU= X-Received: by 2002:a05:6830:408a:: with SMTP id x10mr6228991ott.248.1615617944837; Fri, 12 Mar 2021 22:45:44 -0800 (PST) MIME-Version: 1.0 References: <1615294733-22761-1-git-send-email-aisheng.dong@nxp.com> <1615294733-22761-8-git-send-email-aisheng.dong@nxp.com> <31be2267-8988-f162-f5a6-6e6389bbf1fb@samsung.com> In-Reply-To: From: Dong Aisheng Date: Sat, 13 Mar 2021 14:45:39 +0800 Message-ID: Subject: Re: [PATCH 07/11] PM / devfreq: check get_dev_status before start monitor To: Chanwoo Choi Cc: Chanwoo Choi , Dong Aisheng , Linux PM , "moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" , Sascha Hauer , Shawn Guo , dl-linux-imx , open list , myungjoo.ham@samsung.com, kyungmin.park@samsung.com, Abel Vesa X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210313_064550_540876_3496682E X-CRM114-Status: GOOD ( 45.41 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gU2F0LCBNYXIgMTMsIDIwMjEgYXQgMTI6MDkgQU0gQ2hhbndvbyBDaG9pIDxjd2Nob2kwMEBn bWFpbC5jb20+IHdyb3RlOgo+Cj4gT24gMjEuIDMuIDEyLiDsmKTtm4QgNzo1NywgRG9uZyBBaXNo ZW5nIHdyb3RlOgo+ID4gT24gVGh1LCBNYXIgMTEsIDIwMjEgYXQgMjo1NCBQTSBDaGFud29vIENo b2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4gd3JvdGU6Cj4gPj4KPiA+PiBPbiAzLzEwLzIxIDE6 NTYgUE0sIERvbmcgQWlzaGVuZyB3cm90ZToKPiA+Pj4gT24gV2VkLCBNYXIgMTAsIDIwMjEgYXQg MTE6MDggQU0gQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+IHdyb3RlOgo+ID4+ Pj4KPiA+Pj4+IE9uIDMvMTAvMjEgMTE6NTYgQU0sIERvbmcgQWlzaGVuZyB3cm90ZToKPiA+Pj4+ PiBPbiBXZWQsIE1hciAxMCwgMjAyMSBhdCAxMjoxMiBBTSBDaGFud29vIENob2kgPGN3Y2hvaTAw QGdtYWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pj4+Cj4gPj4+Pj4+IE9uIDIxLiAzLiAxMC4g7Jik7KCE IDEyOjU4LCBDaGFud29vIENob2kgd3JvdGU6Cj4gPj4+Pj4+PiBPbiAyMS4gMy4gOS4g7Jik7ZuE IDk6NTgsIERvbmcgQWlzaGVuZyB3cm90ZToKPiA+Pj4+Pj4+PiBUaGUgZGV2ZnJlcSBtb25pdG9y IGRlcGVuZHMgb24gdGhlIGRldmljZSB0byBwcm92aWRlIGxvYWQgaW5mb3JtYXRpb24KPiA+Pj4+ Pj4+PiBieSAuZ2V0X2Rldl9zdGF0dXMoKSB0byBjYWxjdWxhdGUgdGhlIG5leHQgdGFyZ2V0IGZy ZXEuCj4gPj4+Pj4+Pj4KPiA+Pj4+Pj4+PiBBbmQgdGhpcyB3aWxsIGNhdXNlIGNoYW5naW5nIGdv dmVybm9yIHRvIHNpbXBsZSBvbmRlbWFuZCBmYWlsCj4gPj4+Pj4+Pj4gaWYgZGV2aWNlIGNhbid0 IHN1cHBvcnQuCj4gPj4+Pj4+Pj4KPiA+Pj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBEb25nIEFpc2hl bmcgPGFpc2hlbmcuZG9uZ0BueHAuY29tPgo+ID4+Pj4+Pj4+IC0tLQo+ID4+Pj4+Pj4+ICAgIGRy aXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMgICAgICAgICAgICAgICAgIHwgMTAgKysrKysrKy0tLQo+ ID4+Pj4+Pj4+ICAgIGRyaXZlcnMvZGV2ZnJlcS9nb3Zlcm5vci5oICAgICAgICAgICAgICAgIHwg IDIgKy0KPiA+Pj4+Pj4+PiAgICBkcml2ZXJzL2RldmZyZXEvZ292ZXJub3Jfc2ltcGxlb25kZW1h bmQuYyB8ICAzICstLQo+ID4+Pj4+Pj4+ICAgIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25z KCspLCA2IGRlbGV0aW9ucygtKQo+ID4+Pj4+Pj4+Cj4gPj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMgYi9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jCj4gPj4+ Pj4+Pj4gaW5kZXggNzIzMWZlNjg2MmEyLi5kMTc4N2I2YzdkN2MgMTAwNjQ0Cj4gPj4+Pj4+Pj4g LS0tIGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwo+ID4+Pj4+Pj4+ICsrKyBiL2RyaXZlcnMv ZGV2ZnJlcS9kZXZmcmVxLmMKPiA+Pj4+Pj4+PiBAQCAtNDgyLDEwICs0ODIsMTMgQEAgc3RhdGlj IHZvaWQgZGV2ZnJlcV9tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdAo+ID4+Pj4+Pj4+ICp3b3Jr KQo+ID4+Pj4+Pj4+ICAgICAqIHRvIGJlIGNhbGxlZCBmcm9tIGdvdmVybm9yIGluIHJlc3BvbnNl IHRvIERFVkZSRVFfR09WX1NUQVJUCj4gPj4+Pj4+Pj4gICAgICogZXZlbnQgd2hlbiBkZXZpY2Ug aXMgYWRkZWQgdG8gZGV2ZnJlcSBmcmFtZXdvcmsuCj4gPj4+Pj4+Pj4gICAgICovCj4gPj4+Pj4+ Pj4gLXZvaWQgZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KHN0cnVjdCBkZXZmcmVxICpkZXZmcmVxKQo+ ID4+Pj4+Pj4+ICtpbnQgZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KHN0cnVjdCBkZXZmcmVxICpkZXZm cmVxKQo+ID4+Pj4+Pj4+ICAgIHsKPiA+Pj4+Pj4+PiAgICAgICAgaWYgKElTX1NVUFBPUlRFRF9G TEFHKGRldmZyZXEtPmdvdmVybm9yLT5mbGFncywgSVJRX0RSSVZFTikpCj4gPj4+Pj4+Pj4gLSAg ICAgICAgcmV0dXJuOwo+ID4+Pj4+Pj4+ICsgICAgICAgIHJldHVybiAwOwo+ID4+Pj4+Pj4+ICsK PiA+Pj4+Pj4+PiArICAgIGlmICghZGV2ZnJlcS0+cHJvZmlsZS0+Z2V0X2Rldl9zdGF0dXMpCj4g Pj4+Pj4+Pj4gKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPj4+Pj4+Cj4gPj4+Pj4+IEFnYWlu LCBJIHRoaW5rIHRoYXQgZ2V0X2Rldl9zdGF0dXMgaXMgbm90IHVzZWQgZm9yIGFsbCBnb3Zlcm5v cnMuCj4gPj4+Pj4+IFNvIHRoYXQgaXQgY2F1c2UgdGhlIGdvdmVybm9yIHN0YXJ0IGZhaWwuIERv bid0IGNoZWNrIHdoZXRoZXIKPiA+Pj4+Pj4gLmdldF9kZXZfc3RhdHVzIGlzIE5VTEwgb3Igbm90 Lgo+ID4+Pj4+Pgo+ID4+Pj4+Cj4gPj4+Pj4gSSdtIG5vdCBxdWl0ZSB1bmRlcnN0YW5kIHlvdXIg cG9pbnQuCj4gPj4+Pj4gaXQgaXMgdXNlZCBieSBnb3Zlcm5vcl9zaW1wbGVvbmRlbWFuZC5jIGFu ZCB0ZWdyYV9kZXZmcmVxX2dvdmVybm9yLgo+ID4+Pj4+IGdldF90YXJnZXRfZnJlcSAtPiBkZXZm cmVxX3VwZGF0ZV9zdGF0cyAtPiBnZXRfZGV2X3N0YXR1cwo+ID4+Pj4KPiA+Pj4+IFRoZSBkZXZm cmVxIGNhbiBhZGQgdGhlIG5ldyBnb3Zlcm5vciBieSBhbnlvbmUuCj4gPj4+PiBTbyB0aGVzZSBm dW5jdGlvbnMgbGlrZSBkZXZmcmVxX21vbml0b3JfKiBoYXZlIHRvIHN1cHBvcnQKPiA+Pj4+IHRo ZSBnb3Zlcm5vcnMgYW5kIGFsc28gbXVzdCBzdXBwb3J0IHRoZSBnb3Zlcm5vciB0byBiZSBhZGRl ZAo+ID4+Pj4gaW4gdGhlIGZ1dHVyZS4KPiA+Pj4KPiA+Pj4gWWVzLCBidXQgZGV2ZnJlcV9tb25p dG9yXyogaXMgb25seSB1c2VkIGJ5IHBvbGxpbmcgbW9kZSwgcmlnaHQ/Cj4gPj4+IFRoZSBnb3Zl cm5vciB1c2luZyBpdCBoYXMgdG8gaW1wbGVtZW50IGdldF9kZXZfc3RhdHVzIHVubGVzcwo+ID4+ PiB0aGVyZSdzIGFuIGV4Y2VwdGlvbiBpbiB0aGUgZnV0dXJlLgo+ID4+Pgo+ID4+PiBDdXJyZW50 bHkgdGhpcyBwYXRjaCB3YW50cyB0byBhZGRyZXNzIHRoZSBpc3N1ZSB0aGF0IHVzZXIgY2FuIHN3 aXRjaAo+ID4+PiB0byBvbmRlbWFuZCBnb3Zlcm5vciAocG9sbGluZyBtb2RlKSBieSBzeXNmcyBl dmVuIGRldmljZXMgZG9lcwo+ID4+PiBub3Qgc3VwcG9ydCBpdCAobm8gZ2V0X2Rldl9zdGF0dXMg aW1wbGVtZW50ZWQpLgo+ID4+Cj4gPj4gQXMgSSBjb21tZW50ZWQsIEknbGwgZml4IHRoaXMgaXNz dWUuIElmIGRldmZyZXEgZHJpdmVyIGRvZXNuJ3QgaW1wbGVtZW50Cj4gPj4gdGhlIC5nZXRfZGV2 X3N0YXR1cywgZG9uJ3Qgc2hvdyBpdCB2aWEgYXZhaWxhYmxlX2dvdmVybm9ycy4gSSB0aGluayB0 aGF0Cj4gPj4gaXQgaXMgZnVuZGFtZW50YWwgc29sdXRpb24gdG8gZml4IHRoaXMgaXNzdWUuCj4g Pgo+ID4gU291bmRzIGdvb2QKPiA+Cj4gPj4gU28gb24gdGhpcyB2ZXJzaW9uLAo+ID4+IGRvbid0 IGFkZCB0aGUgdGhpcyBjb25kaXRpb25hbCBzdGF0ZW1lbnQgb24gdGhpcyBmdW5jdGlvbgo+ID4+ Cj4gPgo+ID4gQWxtb3N0IGFsbCB0aGlzIHBhdGNoIGRpZCBpcyBhZGRpbmcgYSBjaGVja2luZyBm b3IgZ2V0X2Rldl9zdGF0dXMuCj4gPiBTbyBkbyB5b3UgbWVhbiBkcm9wIHRoaXMgcGF0Y2g/Cj4g PiBJIHdvbmRlciBpdCdzIHN0aWxsIGEgbmVjZXNzYXJ5IGNoZWNraW5nIHRvIGV4cGxpY2l0bHkg dGVsbCBkZXZmcmVxIG1vbml0b3IKPiA+IHVzZXJzIHRoYXQgZ2V0X2Rldl9zdGF0dXMgaXMgbmVl ZGVkIGR1cmluZyBnb3Zlcm5vciBzdGFydHVwLgo+Cj4gSSB0aGluayB0aGF0IHRoZSBpdCBpcyBl bm91Z2ggdG8gY2hlY2sgLmdldF9kZXZfc3RhdHVzIGluCj4gZGV2ZnJlcV91cGRhdGVfc3RhdHMu IFdlIGhhdmUgdG8gY2hlY2sgaXQgb24gd2hlcmUgaXQgaXMgdXNlZC4KPgoKSSB0aGluayB0aGUg ZHJhd2JhY2sgb2Ygb25seSBjaGVja2luZyAuZ2V0X2Rldl9zdGF0dXMgaW4KZGV2ZnJlcV91cGRh dGVfc3RhdHMgaXM6CjEuIGRldmZyZXEgd2lsbCBzdGlsbCByZWdpc3RlciBzdWNjZXNzZnVsbHkg YW5kIG9uZGVtYW5kIGdvdmVybm9yIHN0YXJ0cyBvawoyLiBvbmRlbWFuZCBnb3Zlcm5vciB3aWxs IHN0aWxsIGJlIHNob3duIGluIHN5c2ZzIHdoaWNoIGlzIHNvbWV0aGluZwp5b3Ugd2FudCB0byBm aXgKMy4gZGV2ZnJlcSB3aWxsIGVuZCB1cCBwcmludGluZyBlbmRsZXNzIGVycm9yIG1lc3NhZ2Vz IGluIGRldmZyZXFfbW9uaXRvciB3b3JrZXIKICAgICJkdmZzIGZhaWxlZCB3aXRoICglZCkgZXJy b3IiIGFzIHRoZSBwb3NzaWJsZSBtaXNzaW5nIC5nZXRfZGV2X3N0YXR1cwoKU28gaSB3b25kZXIg aWYgeW91IGRvbid0IGxpa2UgY2hhbmdpbmcgdGhlIGNvbW1vbiBkZXZmcmVxX21vbml0b3Jfc3Rh cnQgaW4gb3JkZXIKdG8gbWFrZSBpdCBsb29rIGNvbW1vbiBmb3IgYWxsIGdvdmVybm9ycywgdGhl biB3ZSBwcm9iYWJseSBzdGlsbCBuZWVkCnRvIGZpeCBpdCBpbgpvbmRlbWFuZCBnb3Zlcm5vciBp biBvcmRlciB0byBhdm9pZCB0aGUgcG9zc2libGUgYWJvdmUgaXNzdWVzLgoKc3RhdGljIGludCBk ZXZmcmVxX3NpbXBsZV9vbmRlbWFuZF9oYW5kbGVyKHN0cnVjdCBkZXZmcmVxICpkZXZmcmVxLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBldmVudCwgdm9pZCAq ZGF0YSkKewogICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICBjYXNlIERFVkZSRVFfR09W X1NUQVJUOgogICAgICAgICAgICAgICAgaWYgKCFkZXZmcmVxLT5wcm9maWxlLT5nZXRfZGV2X3N0 YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CgogICAgICAgICAg ICAgICAgcmV0dXJuIGRldmZyZXFfbW9uaXRvcl9zdGFydChkZXZmcmVxKTsKLi4uCn0KCkhvdyBk byB5b3UgdGhpbms/CgpSZWdhcmRzCkFpc2hlbmcKCgo+ID4KPiA+PiBBbmQgb24gbmV4dCB2ZXJz aW9uLCBwbGVhc2UgdXNlIHRoZSBjYXBpdGFsIGxldHRlciBmb3IgZmlyc3QgY2hhcmFjdGVyCj4g Pj4gb24gcGF0Y2ggdGl0bGUgYXMgZm9sbG93aW5nOgo+ID4+Cj4gPj4gLSBQTSAvIGRldmZyZXE6 IENoZWNrIGdldF9kZXZfc3RhdHVzIGJlZm9yZSBzdGFydCBtb25pdG9yCj4gPj4KPiA+Cj4gPiBP a2F5IHRvIG1lLgo+ID4gVGhhbmtzIGZvciB0aGUgc3VnZ2VzdGlvbi4KPiA+Cj4gPiBSZWdhcmRz Cj4gPiBBaXNoZW5nCj4gPgo+ID4+Pgo+ID4+PiBSZWdhcmRzCj4gPj4+IEFpc2hlbmcKPiA+Pj4K PiA+Pj4+Cj4gPj4+Pj4KPiA+Pj4+PiBXaXRob3V0IGNoZWNraW5nLCBkZXZpY2UgY2FuIHN3aXRj aCB0byBvbmRlbWFuZCBnb3Zlcm5vciBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0Lgo+ID4+Pj4+Cj4g Pj4+Pj4gQW0gaSBtaXNzZWQgc29tZXRoaW5nPwo+ID4+Pj4+Cj4gPj4+Pj4gUmVnYXJkcwo+ID4+ Pj4+IEFpc2hlbmcKPiA+Pj4+Pgo+ID4+Pj4+Pj4+ICAgICAgICBzd2l0Y2ggKGRldmZyZXEtPnBy b2ZpbGUtPnRpbWVyKSB7Cj4gPj4+Pj4+Pj4gICAgICAgIGNhc2UgREVWRlJFUV9USU1FUl9ERUZF UlJBQkxFOgo+ID4+Pj4+Pj4+IEBAIC00OTUsMTIgKzQ5OCwxMyBAQCB2b2lkIGRldmZyZXFfbW9u aXRvcl9zdGFydChzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcSkKPiA+Pj4+Pj4+PiAgICAgICAgICAg IElOSVRfREVMQVlFRF9XT1JLKCZkZXZmcmVxLT53b3JrLCBkZXZmcmVxX21vbml0b3IpOwo+ID4+ Pj4+Pj4+ICAgICAgICAgICAgYnJlYWs7Cj4gPj4+Pj4+Pj4gICAgICAgIGRlZmF1bHQ6Cj4gPj4+ Pj4+Pj4gLSAgICAgICAgcmV0dXJuOwo+ID4+Pj4+Pj4+ICsgICAgICAgIHJldHVybiAtRUlOVkFM Owo+ID4+Pj4+Pj4+ICAgICAgICB9Cj4gPj4+Pj4+Pj4gICAgICAgIGlmIChkZXZmcmVxLT5wcm9m aWxlLT5wb2xsaW5nX21zKQo+ID4+Pj4+Pj4+ICAgICAgICAgICAgcXVldWVfZGVsYXllZF93b3Jr KGRldmZyZXFfd3EsICZkZXZmcmVxLT53b3JrLAo+ID4+Pj4+Pj4+ICAgICAgICAgICAgICAgIG1z ZWNzX3RvX2ppZmZpZXMoZGV2ZnJlcS0+cHJvZmlsZS0+cG9sbGluZ19tcykpOwo+ID4+Pj4+Pj4+ ICsgICAgcmV0dXJuIDA7Cj4gPj4+Pj4+Pj4gICAgfQo+ID4+Pj4+Pj4+ICAgIEVYUE9SVF9TWU1C T0woZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KTsKPiA+Pj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9kZXZmcmVxL2dvdmVybm9yLmggYi9kcml2ZXJzL2RldmZyZXEvZ292ZXJub3IuaAo+ID4+Pj4+ Pj4+IGluZGV4IDVjZWUzZjY0ZmUyYi4uMzFhZjZkMDcyYTEwIDEwMDY0NAo+ID4+Pj4+Pj4+IC0t LSBhL2RyaXZlcnMvZGV2ZnJlcS9nb3Zlcm5vci5oCj4gPj4+Pj4+Pj4gKysrIGIvZHJpdmVycy9k ZXZmcmVxL2dvdmVybm9yLmgKPiA+Pj4+Pj4+PiBAQCAtNzUsNyArNzUsNyBAQCBzdHJ1Y3QgZGV2 ZnJlcV9nb3Zlcm5vciB7Cj4gPj4+Pj4+Pj4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGlu dCBldmVudCwgdm9pZCAqZGF0YSk7Cj4gPj4+Pj4+Pj4gICAgfTsKPiA+Pj4+Pj4+PiAtdm9pZCBk ZXZmcmVxX21vbml0b3Jfc3RhcnQoc3RydWN0IGRldmZyZXEgKmRldmZyZXEpOwo+ID4+Pj4+Pj4+ ICtpbnQgZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KHN0cnVjdCBkZXZmcmVxICpkZXZmcmVxKTsKPiA+ Pj4+Pj4+PiAgICB2b2lkIGRldmZyZXFfbW9uaXRvcl9zdG9wKHN0cnVjdCBkZXZmcmVxICpkZXZm cmVxKTsKPiA+Pj4+Pj4+PiAgICB2b2lkIGRldmZyZXFfbW9uaXRvcl9zdXNwZW5kKHN0cnVjdCBk ZXZmcmVxICpkZXZmcmVxKTsKPiA+Pj4+Pj4+PiAgICB2b2lkIGRldmZyZXFfbW9uaXRvcl9yZXN1 bWUoc3RydWN0IGRldmZyZXEgKmRldmZyZXEpOwo+ID4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2RldmZyZXEvZ292ZXJub3Jfc2ltcGxlb25kZW1hbmQuYwo+ID4+Pj4+Pj4+IGIvZHJpdmVy cy9kZXZmcmVxL2dvdmVybm9yX3NpbXBsZW9uZGVtYW5kLmMKPiA+Pj4+Pj4+PiBpbmRleCBkNTdi ODJhMmI1NzAuLmVhMjg3YjU3Y2JmMyAxMDA2NDQKPiA+Pj4+Pj4+PiAtLS0gYS9kcml2ZXJzL2Rl dmZyZXEvZ292ZXJub3Jfc2ltcGxlb25kZW1hbmQuYwo+ID4+Pj4+Pj4+ICsrKyBiL2RyaXZlcnMv ZGV2ZnJlcS9nb3Zlcm5vcl9zaW1wbGVvbmRlbWFuZC5jCj4gPj4+Pj4+Pj4gQEAgLTg5LDggKzg5 LDcgQEAgc3RhdGljIGludCBkZXZmcmVxX3NpbXBsZV9vbmRlbWFuZF9oYW5kbGVyKHN0cnVjdAo+ ID4+Pj4+Pj4+IGRldmZyZXEgKmRldmZyZXEsCj4gPj4+Pj4+Pj4gICAgewo+ID4+Pj4+Pj4+ICAg ICAgICBzd2l0Y2ggKGV2ZW50KSB7Cj4gPj4+Pj4+Pj4gICAgICAgIGNhc2UgREVWRlJFUV9HT1Zf U1RBUlQ6Cj4gPj4+Pj4+Pj4gLSAgICAgICAgZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KGRldmZyZXEp Owo+ID4+Pj4+Pj4+IC0gICAgICAgIGJyZWFrOwo+ID4+Pj4+Pj4+ICsgICAgICAgIHJldHVybiBk ZXZmcmVxX21vbml0b3Jfc3RhcnQoZGV2ZnJlcSk7Cj4gPj4+Pj4+Pj4gICAgICAgIGNhc2UgREVW RlJFUV9HT1ZfU1RPUDoKPiA+Pj4+Pj4+PiAgICAgICAgICAgIGRldmZyZXFfbW9uaXRvcl9zdG9w KGRldmZyZXEpOwo+ID4+Pj4+Pj4+Cj4gPj4+Pj4+Pgo+ID4+Pj4+Pj4gTmVlZCB0byBoYW5kbGUg dGhlIGFsbCBwb2ludHMgb2YgZGV2ZnJlcV9tb25pdG9yX3N0YXJ0KCkgdXNhZ2UuCj4gPj4+Pj4+ PiBwbGVhc2UgY2hlY2sgdGhlIHRlZ3JhMzAtZGV2ZnJlcS5jIGZvciB0aGlzIHVwZGF0ZS4KPiA+ Pj4+Pj4+Cj4gPj4+Pj4+PiAkIGdyZXAgLXJuICJkZXZmcmVxX21vbml0b3Jfc3RhcnQiIGRyaXZl cnMvCj4gPj4+Pj4+PiBkcml2ZXJzL2RldmZyZXEvZ292ZXJub3Jfc2ltcGxlb25kZW1hbmQuYzo5 MjoKPiA+Pj4+Pj4+IGRldmZyZXFfbW9uaXRvcl9zdGFydChkZXZmcmVxKTsKPiA+Pj4+Pj4+IGRy aXZlcnMvZGV2ZnJlcS90ZWdyYTMwLWRldmZyZXEuYzo3NDQ6Cj4gPj4+Pj4+PiBkZXZmcmVxX21v bml0b3Jfc3RhcnQoZGV2ZnJlcSk7Cj4gPj4+Pj4+PiAuLi4uLi4KPiA+Pj4+Pj4+Cj4gPj4+Pj4+ Cj4gPj4+Pj4+Cj4gPj4+Pj4+IC0tCj4gPj4+Pj4+IEJlc3QgUmVnYXJkcywKPiA+Pj4+Pj4gU2Ft c3VuZyBFbGVjdHJvbmljcwo+ID4+Pj4+PiBDaGFud29vIENob2kKPiA+Pj4+Pgo+ID4+Pj4+Cj4g Pj4+Pgo+ID4+Pj4KPiA+Pj4+IC0tCj4gPj4+PiBCZXN0IFJlZ2FyZHMsCj4gPj4+PiBDaGFud29v IENob2kKPiA+Pj4+IFNhbXN1bmcgRWxlY3Ryb25pY3MKPiA+Pj4KPiA+Pj4KPiA+Pgo+ID4+Cj4g Pj4gLS0KPiA+PiBCZXN0IFJlZ2FyZHMsCj4gPj4gQ2hhbndvbyBDaG9pCj4gPj4gU2Ftc3VuZyBF bGVjdHJvbmljcwo+Cj4KPiAtLQo+IEJlc3QgUmVnYXJkcywKPiBTYW1zdW5nIEVsZWN0cm9uaWNz Cj4gQ2hhbndvbyBDaG9pCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1hcm0ta2VybmVsCg==