From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com ([192.55.52.115]:13576 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752129AbeEQHak (ORCPT ); Thu, 17 May 2018 03:30:40 -0400 From: Jani Nikula To: dhinakaran.pandiyan@intel.com, intel-gfx@lists.freedesktop.org Cc: Paulo Zanoni , Rodrigo Vivi , "# v4 . 14+" Subject: Re: [Intel-gfx] [PATCH] Revert "drm/i915/edp: Allow alternate fixed mode for eDP if available." In-Reply-To: <87y3gizr48.fsf@intel.com> References: <20180516080110.22770-1-jani.nikula@intel.com> <1526513406.17473.162.camel@intel.com> <87y3gizr48.fsf@intel.com> Date: Thu, 17 May 2018 10:33:10 +0300 Message-ID: <87po1uzqh5.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Sender: stable-owner@vger.kernel.org List-ID: On Thu, 17 May 2018, Jani Nikula wrote: > On Wed, 16 May 2018, Dhinakaran Pandiyan wrote: >> On Wed, 2018-05-16 at 11:01 +0300, Jani Nikula wrote: >>> This reverts commit dc911f5bd8aacfcf8aabd5c26c88e04c837a938e. >>> >>> Per the report, no matter what display mode you select with xrandr, >>> the >>> i915 driver will always select the alternate fixed mode. For the >>> reporter this means that the display will always run at 40Hz which is >>> quite annoying. This may be due to the mode comparison. >>> >>> But there are some other potential issues. The choice of >>> alt_fixed_mode >>> seems dubious. It's the first non-preferred mode, but there are no >>> guarantees that the only difference would be refresh rate. Similarly, >>> there may be more than one preferred mode in the probed modes list, >>> and >>> the commit changes the preferred mode selection to choose the last >>> one >>> on the list instead of the first. >>> >>> (Note that the probed modes list is the raw, unfiltered, unsorted >>> list >>> of modes from drm_add_edid_modes(), not the pretty result after a >>> drm_helper_probe_single_connector_modes() call.) >>> >>> Finally, we already have eerily similar code in place to find the >>> downclock mode for DRRS that seems like could be reused here. >>> >>> Back to the drawing board. >>> >>> Note: This is a hand-crafted revert due to conflicts. If it fails to >>> backport, please just try reverting the original commit directly. >>> >>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105469 >>> Reported-by: Rune Petersen >>> Reported-by: Mark Spencer >>> Fixes: dc911f5bd8aa ("drm/i915/edp: Allow alternate fixed mode for >>> eDP if available.") >>> Cc: Clint Taylor >>> Cc: David Weinehall >>> Cc: Rodrigo Vivi >>> Cc: Paulo Zanoni >>> Cc: Jani Nikula >>> Cc: Chris Wilson >>> Cc: Jim Bride >>> Cc: Jani Nikula >>> Cc: Joonas Lahtinen >>> Cc: intel-gfx@lists.freedesktop.org >>> Cc: # v4.14+ >>> Signed-off-by: Jani Nikula >>> --- >>>  drivers/gpu/drm/i915/intel_dp.c    | 38 +++++----------------------- >>> ---------- >>>  drivers/gpu/drm/i915/intel_drv.h   |  2 -- >>>  drivers/gpu/drm/i915/intel_dsi.c   |  2 +- >>>  drivers/gpu/drm/i915/intel_dvo.c   |  2 +- >>>  drivers/gpu/drm/i915/intel_lvds.c  |  3 +-- >>>  drivers/gpu/drm/i915/intel_panel.c |  6 ------ >>>  6 files changed, 8 insertions(+), 45 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/i915/intel_dp.c >>> b/drivers/gpu/drm/i915/intel_dp.c >>> index dde92e4af5d3..8320f0e8e3be 100644 >>> --- a/drivers/gpu/drm/i915/intel_dp.c >>> +++ b/drivers/gpu/drm/i915/intel_dp.c >>> @@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct >>> intel_dp *intel_dp, >>>   return bpp; >>>  } >>>   >>> -static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1, >>> -        struct drm_display_mode *m2) >>> -{ >>> - bool bres = false; >>> - >>> - if (m1 && m2) >>> - bres = (m1->hdisplay == m2->hdisplay && >>> - m1->hsync_start == m2->hsync_start && >>> - m1->hsync_end == m2->hsync_end && >>> - m1->htotal == m2->htotal && >>> - m1->vdisplay == m2->vdisplay && >>> - m1->vsync_start == m2->vsync_start && >>> - m1->vsync_end == m2->vsync_end && >>> - m1->vtotal == m2->vtotal); >>> - return bres; >>> -} >>> - >>>  /* Adjust link config limits based on compliance test requests. */ >>>  static void >>>  intel_dp_adjust_compliance_config(struct intel_dp *intel_dp, >>> @@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder >>> *encoder, >>>   pipe_config->has_audio = intel_conn_state- >>> >force_audio == HDMI_AUDIO_ON; >>>   >>>   if (intel_dp_is_edp(intel_dp) && intel_connector- >>> >panel.fixed_mode) { >>> - struct drm_display_mode *panel_mode = >>> - intel_connector->panel.alt_fixed_mode; >>> - struct drm_display_mode *req_mode = &pipe_config- >>> >base.mode; >>> - >>> - if (!intel_edp_compare_alt_mode(req_mode, >>> panel_mode)) >>> - panel_mode = intel_connector- >>> >panel.fixed_mode; >>> - >>> - drm_mode_debug_printmodeline(panel_mode); >>> - >>> - intel_fixed_panel_mode(panel_mode, adjusted_mode); >>> + intel_fixed_panel_mode(intel_connector- >>> >panel.fixed_mode, >>> +        adjusted_mode); >>>   >>>   if (INTEL_GEN(dev_priv) >= 9) { >>>   int ret; >>> @@ -6159,7 +6134,6 @@ static bool intel_edp_init_connector(struct >>> intel_dp *intel_dp, >>>   struct drm_i915_private *dev_priv = to_i915(dev); >>>   struct drm_connector *connector = &intel_connector->base; >>>   struct drm_display_mode *fixed_mode = NULL; >>> - struct drm_display_mode *alt_fixed_mode = NULL; >>>   struct drm_display_mode *downclock_mode = NULL; >>>   bool has_dpcd; >>>   struct drm_display_mode *scan; >>> @@ -6214,14 +6188,13 @@ static bool intel_edp_init_connector(struct >>> intel_dp *intel_dp, >>>   } >>>   intel_connector->edid = edid; >>>   >>> - /* prefer fixed mode from EDID if available, save an alt >>> mode also */ >>> + /* prefer fixed mode from EDID if available */ >>>   list_for_each_entry(scan, &connector->probed_modes, head) { >>>   if ((scan->type & DRM_MODE_TYPE_PREFERRED)) { >>>   fixed_mode = drm_mode_duplicate(dev, scan); >>>   downclock_mode = intel_dp_drrs_init( >>>   intel_connector, >>> fixed_mode); >>> - } else if (!alt_fixed_mode) { >>> - alt_fixed_mode = drm_mode_duplicate(dev, >>> scan); >>> + break; >> >> If multiple preferred modes are present, we'll now end up calling >> drrs_init() only for the first. I see that this is what the original >> code did but this revert does more than removing support for alternate >> modes. > > It boils down to which preferred mode is *the* preferred mode. I think > the original code was, uh, preferrable. Note that drrs init scans the > entire list of modes again to find the same size mode with the lowest > refresh rate. Moreover, as you can see, the original alt mode commit had more subtle changes than catches the eye, it caused regressions, and I feel pretty strongly about getting back to the drawing board and starting over with a clean slate than trying to tweak it when we are quite frankly way overdue with the revert. If after that you think the drrs/downclock selection needs tweaking, let's do that. BR, Jani. > > BR, > Jani. > >> >>>   } >>>   } >>>   >>> @@ -6258,8 +6231,7 @@ static bool intel_edp_init_connector(struct >>> intel_dp *intel_dp, >>>         pipe_name(pipe)); >>>   } >>>   >>> - intel_panel_init(&intel_connector->panel, fixed_mode, >>> alt_fixed_mode, >>> -  downclock_mode); >>> + intel_panel_init(&intel_connector->panel, fixed_mode, >>> downclock_mode); >>>   intel_connector->panel.backlight.power = >>> intel_edp_backlight_power; >>>   intel_panel_setup_backlight(connector, pipe); >>>   >>> diff --git a/drivers/gpu/drm/i915/intel_drv.h >>> b/drivers/gpu/drm/i915/intel_drv.h >>> index d7dbca1aabff..0361130500a6 100644 >>> --- a/drivers/gpu/drm/i915/intel_drv.h >>> +++ b/drivers/gpu/drm/i915/intel_drv.h >>> @@ -277,7 +277,6 @@ struct intel_encoder { >>>   >>>  struct intel_panel { >>>   struct drm_display_mode *fixed_mode; >>> - struct drm_display_mode *alt_fixed_mode; >>>   struct drm_display_mode *downclock_mode; >>>   >>>   /* backlight */ >>> @@ -1850,7 +1849,6 @@ void intel_overlay_reset(struct >>> drm_i915_private *dev_priv); >>>  /* intel_panel.c */ >>>  int intel_panel_init(struct intel_panel *panel, >>>        struct drm_display_mode *fixed_mode, >>> -      struct drm_display_mode *alt_fixed_mode, >>>        struct drm_display_mode *downclock_mode); >>>  void intel_panel_fini(struct intel_panel *panel); >>>  void intel_fixed_panel_mode(const struct drm_display_mode >>> *fixed_mode, >>> diff --git a/drivers/gpu/drm/i915/intel_dsi.c >>> b/drivers/gpu/drm/i915/intel_dsi.c >>> index 51a1d6868b1e..cf39ca90d887 100644 >>> --- a/drivers/gpu/drm/i915/intel_dsi.c >>> +++ b/drivers/gpu/drm/i915/intel_dsi.c >>> @@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private >>> *dev_priv) >>>   connector->display_info.width_mm = fixed_mode->width_mm; >>>   connector->display_info.height_mm = fixed_mode->height_mm; >>>   >>> - intel_panel_init(&intel_connector->panel, fixed_mode, NULL, >>> NULL); >>> + intel_panel_init(&intel_connector->panel, fixed_mode, NULL); >>>   intel_panel_setup_backlight(connector, INVALID_PIPE); >>>   >>>   intel_dsi_add_properties(intel_connector); >>> diff --git a/drivers/gpu/drm/i915/intel_dvo.c >>> b/drivers/gpu/drm/i915/intel_dvo.c >>> index eb0c559b2715..a70d767313aa 100644 >>> --- a/drivers/gpu/drm/i915/intel_dvo.c >>> +++ b/drivers/gpu/drm/i915/intel_dvo.c >>> @@ -536,7 +536,7 @@ void intel_dvo_init(struct drm_i915_private >>> *dev_priv) >>>    */ >>>   intel_panel_init(&intel_connector->panel, >>>    intel_dvo_get_current_mode( >>> intel_encoder), >>> -  NULL, NULL); >>> +  NULL); >>>   intel_dvo->panel_wants_dither = true; >>>   } >>>   >>> diff --git a/drivers/gpu/drm/i915/intel_lvds.c >>> b/drivers/gpu/drm/i915/intel_lvds.c >>> index 8691c86f579c..d8ece907ff54 100644 >>> --- a/drivers/gpu/drm/i915/intel_lvds.c >>> +++ b/drivers/gpu/drm/i915/intel_lvds.c >>> @@ -1140,8 +1140,7 @@ void intel_lvds_init(struct drm_i915_private >>> *dev_priv) >>>  out: >>>   mutex_unlock(&dev->mode_config.mutex); >>>   >>> - intel_panel_init(&intel_connector->panel, fixed_mode, NULL, >>> -  downclock_mode); >>> + intel_panel_init(&intel_connector->panel, fixed_mode, >>> downclock_mode); >>>   intel_panel_setup_backlight(connector, INVALID_PIPE); >>>   >>>   lvds_encoder->is_dual_link = >>> compute_is_dual_link_lvds(lvds_encoder); >>> diff --git a/drivers/gpu/drm/i915/intel_panel.c >>> b/drivers/gpu/drm/i915/intel_panel.c >>> index 41d00b1603e3..b443278e569c 100644 >>> --- a/drivers/gpu/drm/i915/intel_panel.c >>> +++ b/drivers/gpu/drm/i915/intel_panel.c >>> @@ -1928,13 +1928,11 @@ intel_panel_init_backlight_funcs(struct >>> intel_panel *panel) >>>   >>>  int intel_panel_init(struct intel_panel *panel, >>>        struct drm_display_mode *fixed_mode, >>> -      struct drm_display_mode *alt_fixed_mode, >>>        struct drm_display_mode *downclock_mode) >>>  { >>>   intel_panel_init_backlight_funcs(panel); >>>   >>>   panel->fixed_mode = fixed_mode; >>> - panel->alt_fixed_mode = alt_fixed_mode; >>>   panel->downclock_mode = downclock_mode; >>>   >>>   return 0; >>> @@ -1948,10 +1946,6 @@ void intel_panel_fini(struct intel_panel >>> *panel) >>>   if (panel->fixed_mode) >>>   drm_mode_destroy(intel_connector->base.dev, panel- >>> >fixed_mode); >>>   >>> - if (panel->alt_fixed_mode) >>> - drm_mode_destroy(intel_connector->base.dev, >>> - panel->alt_fixed_mode); >>> - >>>   if (panel->downclock_mode) >>>   drm_mode_destroy(intel_connector->base.dev, >>>   panel->downclock_mode); -- Jani Nikula, Intel Open Source Technology Center From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [PATCH] Revert "drm/i915/edp: Allow alternate fixed mode for eDP if available." Date: Thu, 17 May 2018 10:33:10 +0300 Message-ID: <87po1uzqh5.fsf@intel.com> References: <20180516080110.22770-1-jani.nikula@intel.com> <1526513406.17473.162.camel@intel.com> <87y3gizr48.fsf@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id 65A5A6E657 for ; Thu, 17 May 2018 07:30:40 +0000 (UTC) In-Reply-To: <87y3gizr48.fsf@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: dhinakaran.pandiyan@intel.com, intel-gfx@lists.freedesktop.org Cc: Paulo Zanoni , "# v4 . 14+" , Rodrigo Vivi List-Id: intel-gfx@lists.freedesktop.org T24gVGh1LCAxNyBNYXkgMjAxOCwgSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGludGVsLmNvbT4g d3JvdGU6Cj4gT24gV2VkLCAxNiBNYXkgMjAxOCwgRGhpbmFrYXJhbiBQYW5kaXlhbiA8ZGhpbmFr YXJhbi5wYW5kaXlhbkBpbnRlbC5jb20+IHdyb3RlOgo+PiBPbiBXZWQsIDIwMTgtMDUtMTYgYXQg MTE6MDEgKzAzMDAsIEphbmkgTmlrdWxhIHdyb3RlOgo+Pj4gVGhpcyByZXZlcnRzIGNvbW1pdCBk YzkxMWY1YmQ4YWFjZmNmOGFhYmQ1YzI2Yzg4ZTA0YzgzN2E5MzhlLgo+Pj4gCj4+PiBQZXIgdGhl IHJlcG9ydCwgbm8gbWF0dGVyIHdoYXQgZGlzcGxheSBtb2RlIHlvdSBzZWxlY3Qgd2l0aCB4cmFu ZHIsCj4+PiB0aGUKPj4+IGk5MTUgZHJpdmVyIHdpbGwgYWx3YXlzIHNlbGVjdCB0aGUgYWx0ZXJu YXRlIGZpeGVkIG1vZGUuIEZvciB0aGUKPj4+IHJlcG9ydGVyIHRoaXMgbWVhbnMgdGhhdCB0aGUg ZGlzcGxheSB3aWxsIGFsd2F5cyBydW4gYXQgNDBIeiB3aGljaCBpcwo+Pj4gcXVpdGUgYW5ub3lp bmcuIFRoaXMgbWF5IGJlIGR1ZSB0byB0aGUgbW9kZSBjb21wYXJpc29uLgo+Pj4gCj4+PiBCdXQg dGhlcmUgYXJlIHNvbWUgb3RoZXIgcG90ZW50aWFsIGlzc3Vlcy4gVGhlIGNob2ljZSBvZgo+Pj4g YWx0X2ZpeGVkX21vZGUKPj4+IHNlZW1zIGR1YmlvdXMuIEl0J3MgdGhlIGZpcnN0IG5vbi1wcmVm ZXJyZWQgbW9kZSwgYnV0IHRoZXJlIGFyZSBubwo+Pj4gZ3VhcmFudGVlcyB0aGF0IHRoZSBvbmx5 IGRpZmZlcmVuY2Ugd291bGQgYmUgcmVmcmVzaCByYXRlLiBTaW1pbGFybHksCj4+PiB0aGVyZSBt YXkgYmUgbW9yZSB0aGFuIG9uZSBwcmVmZXJyZWQgbW9kZSBpbiB0aGUgcHJvYmVkIG1vZGVzIGxp c3QsCj4+PiBhbmQKPj4+IHRoZSBjb21taXQgY2hhbmdlcyB0aGUgcHJlZmVycmVkIG1vZGUgc2Vs ZWN0aW9uIHRvIGNob29zZSB0aGUgbGFzdAo+Pj4gb25lCj4+PiBvbiB0aGUgbGlzdCBpbnN0ZWFk IG9mIHRoZSBmaXJzdC4KPj4+IAo+Pj4gKE5vdGUgdGhhdCB0aGUgcHJvYmVkIG1vZGVzIGxpc3Qg aXMgdGhlIHJhdywgdW5maWx0ZXJlZCwgdW5zb3J0ZWQKPj4+IGxpc3QKPj4+IG9mIG1vZGVzIGZy b20gZHJtX2FkZF9lZGlkX21vZGVzKCksIG5vdCB0aGUgcHJldHR5IHJlc3VsdCBhZnRlciBhCj4+ PiBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoKSBjYWxsLikKPj4+IAo+ Pj4gRmluYWxseSwgd2UgYWxyZWFkeSBoYXZlIGVlcmlseSBzaW1pbGFyIGNvZGUgaW4gcGxhY2Ug dG8gZmluZCB0aGUKPj4+IGRvd25jbG9jayBtb2RlIGZvciBEUlJTIHRoYXQgc2VlbXMgbGlrZSBj b3VsZCBiZSByZXVzZWQgaGVyZS4KPj4+IAo+Pj4gQmFjayB0byB0aGUgZHJhd2luZyBib2FyZC4K Pj4+IAo+Pj4gTm90ZTogVGhpcyBpcyBhIGhhbmQtY3JhZnRlZCByZXZlcnQgZHVlIHRvIGNvbmZs aWN0cy4gSWYgaXQgZmFpbHMgdG8KPj4+IGJhY2twb3J0LCBwbGVhc2UganVzdCB0cnkgcmV2ZXJ0 aW5nIHRoZSBvcmlnaW5hbCBjb21taXQgZGlyZWN0bHkuCj4+PiAKPj4+IEJ1Z3ppbGxhOiBodHRw czovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDU0NjkKPj4+IFJlcG9y dGVkLWJ5OiBSdW5lIFBldGVyc2VuIDxydW5lQG1lZ2FodXJ0cy5kaz4KPj4+IFJlcG9ydGVkLWJ5 OiBNYXJrIFNwZW5jZXIgPG43dTQ3MjJyMzVAeW56bHguYW5vbmJveC5uZXQ+Cj4+PiBGaXhlczog ZGM5MTFmNWJkOGFhICgiZHJtL2k5MTUvZWRwOiBBbGxvdyBhbHRlcm5hdGUgZml4ZWQgbW9kZSBm b3IKPj4+IGVEUCBpZiBhdmFpbGFibGUuIikKPj4+IENjOiBDbGludCBUYXlsb3IgPGNsaW50b24u YS50YXlsb3JAaW50ZWwuY29tPgo+Pj4gQ2M6IERhdmlkIFdlaW5laGFsbCA8ZGF2aWQud2VpbmVo YWxsQGxpbnV4LmludGVsLmNvbT4KPj4+IENjOiBSb2RyaWdvIFZpdmkgPHJvZHJpZ28udml2aUBp bnRlbC5jb20+Cj4+PiBDYzogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+ Cj4+PiBDYzogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGludGVsLmNvbT4KPj4+IENjOiBDaHJp cyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KPj4+IENjOiBKaW0gQnJpZGUgPGpp bS5icmlkZUBsaW51eC5pbnRlbC5jb20+Cj4+PiBDYzogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxh QGxpbnV4LmludGVsLmNvbT4KPj4+IENjOiBKb29uYXMgTGFodGluZW4gPGpvb25hcy5sYWh0aW5l bkBsaW51eC5pbnRlbC5jb20+Cj4+PiBDYzogaW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y Zwo+Pj4gQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIHY0LjE0Kwo+Pj4gU2lnbmVkLW9m Zi1ieTogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGludGVsLmNvbT4KPj4+IC0tLQo+Pj4gwqBk cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jwqDCoMKgwqB8IDM4ICsrKysrLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPj4+IC0tLS0tLS0tLS0KPj4+IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZHJ2LmjCoMKgwqB8wqDCoDIgLS0KPj4+IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHNpLmPCoMKgwqB8wqDCoDIgKy0KPj4+IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf ZHZvLmPCoMKgwqB8wqDCoDIgKy0KPj4+IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZk cy5jwqDCoHzCoMKgMyArLS0KPj4+IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwu YyB8wqDCoDYgLS0tLS0tCj4+PiDCoDYgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCA0 NSBkZWxldGlvbnMoLSkKPj4+IAo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2RwLmMKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwo+Pj4gaW5k ZXggZGRlOTJlNGFmNWQzLi44MzIwZjBlOGUzYmUgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9kcC5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9kcC5jCj4+PiBAQCAtMTY3OSwyMyArMTY3OSw2IEBAIHN0YXRpYyBpbnQgaW50ZWxfZHBfY29t cHV0ZV9icHAoc3RydWN0Cj4+PiBpbnRlbF9kcCAqaW50ZWxfZHAsCj4+PiDCoAlyZXR1cm4gYnBw Owo+Pj4gwqB9Cj4+PiDCoAo+Pj4gLXN0YXRpYyBib29sIGludGVsX2VkcF9jb21wYXJlX2FsdF9t b2RlKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptMSwKPj4+IC0JCQkJwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbTIpCj4+PiAtewo+Pj4gLQlib29sIGJyZXMgPSBmYWxz ZTsKPj4+IC0KPj4+IC0JaWYgKG0xICYmIG0yKQo+Pj4gLQkJYnJlcyA9IChtMS0+aGRpc3BsYXkg PT0gbTItPmhkaXNwbGF5ICYmCj4+PiAtCQkJbTEtPmhzeW5jX3N0YXJ0ID09IG0yLT5oc3luY19z dGFydCAmJgo+Pj4gLQkJCW0xLT5oc3luY19lbmQgPT0gbTItPmhzeW5jX2VuZCAmJgo+Pj4gLQkJ CW0xLT5odG90YWwgPT0gbTItPmh0b3RhbCAmJgo+Pj4gLQkJCW0xLT52ZGlzcGxheSA9PSBtMi0+ dmRpc3BsYXkgJiYKPj4+IC0JCQltMS0+dnN5bmNfc3RhcnQgPT0gbTItPnZzeW5jX3N0YXJ0ICYm Cj4+PiAtCQkJbTEtPnZzeW5jX2VuZCA9PSBtMi0+dnN5bmNfZW5kICYmCj4+PiAtCQkJbTEtPnZ0 b3RhbCA9PSBtMi0+dnRvdGFsKTsKPj4+IC0JcmV0dXJuIGJyZXM7Cj4+PiAtfQo+Pj4gLQo+Pj4g wqAvKiBBZGp1c3QgbGluayBjb25maWcgbGltaXRzIGJhc2VkIG9uIGNvbXBsaWFuY2UgdGVzdCBy ZXF1ZXN0cy4gKi8KPj4+IMKgc3RhdGljIHZvaWQKPj4+IMKgaW50ZWxfZHBfYWRqdXN0X2NvbXBs aWFuY2VfY29uZmlnKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCj4+PiBAQCAtMTg2MCwxNiAr MTg0Myw4IEBAIGludGVsX2RwX2NvbXB1dGVfY29uZmlnKHN0cnVjdCBpbnRlbF9lbmNvZGVyCj4+ PiAqZW5jb2RlciwKPj4+IMKgCQlwaXBlX2NvbmZpZy0+aGFzX2F1ZGlvID0gaW50ZWxfY29ubl9z dGF0ZS0KPj4+ID5mb3JjZV9hdWRpbyA9PSBIRE1JX0FVRElPX09OOwo+Pj4gwqAKPj4+IMKgCWlm IChpbnRlbF9kcF9pc19lZHAoaW50ZWxfZHApICYmIGludGVsX2Nvbm5lY3Rvci0KPj4+ID5wYW5l bC5maXhlZF9tb2RlKSB7Cj4+PiAtCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfbW9k ZSA9Cj4+PiAtCQkJaW50ZWxfY29ubmVjdG9yLT5wYW5lbC5hbHRfZml4ZWRfbW9kZTsKPj4+IC0J CXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpyZXFfbW9kZSA9ICZwaXBlX2NvbmZpZy0KPj4+ID5i YXNlLm1vZGU7Cj4+PiAtCj4+PiAtCQlpZiAoIWludGVsX2VkcF9jb21wYXJlX2FsdF9tb2RlKHJl cV9tb2RlLAo+Pj4gcGFuZWxfbW9kZSkpCj4+PiAtCQkJcGFuZWxfbW9kZSA9IGludGVsX2Nvbm5l Y3Rvci0KPj4+ID5wYW5lbC5maXhlZF9tb2RlOwo+Pj4gLQo+Pj4gLQkJZHJtX21vZGVfZGVidWdf cHJpbnRtb2RlbGluZShwYW5lbF9tb2RlKTsKPj4+IC0KPj4+IC0JCWludGVsX2ZpeGVkX3BhbmVs X21vZGUocGFuZWxfbW9kZSwgYWRqdXN0ZWRfbW9kZSk7Cj4+PiArCQlpbnRlbF9maXhlZF9wYW5l bF9tb2RlKGludGVsX2Nvbm5lY3Rvci0KPj4+ID5wYW5lbC5maXhlZF9tb2RlLAo+Pj4gKwkJCQnC oMKgwqDCoMKgwqDCoGFkanVzdGVkX21vZGUpOwo+Pj4gwqAKPj4+IMKgCQlpZiAoSU5URUxfR0VO KGRldl9wcml2KSA+PSA5KSB7Cj4+PiDCoAkJCWludCByZXQ7Cj4+PiBAQCAtNjE1OSw3ICs2MTM0 LDYgQEAgc3RhdGljIGJvb2wgaW50ZWxfZWRwX2luaXRfY29ubmVjdG9yKHN0cnVjdAo+Pj4gaW50 ZWxfZHAgKmludGVsX2RwLAo+Pj4gwqAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gdG9faTkxNShkZXYpOwo+Pj4gwqAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9 ICZpbnRlbF9jb25uZWN0b3ItPmJhc2U7Cj4+PiDCoAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq Zml4ZWRfbW9kZSA9IE5VTEw7Cj4+PiAtCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphbHRfZml4 ZWRfbW9kZSA9IE5VTEw7Cj4+PiDCoAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZG93bmNsb2Nr X21vZGUgPSBOVUxMOwo+Pj4gwqAJYm9vbCBoYXNfZHBjZDsKPj4+IMKgCXN0cnVjdCBkcm1fZGlz cGxheV9tb2RlICpzY2FuOwo+Pj4gQEAgLTYyMTQsMTQgKzYxODgsMTMgQEAgc3RhdGljIGJvb2wg aW50ZWxfZWRwX2luaXRfY29ubmVjdG9yKHN0cnVjdAo+Pj4gaW50ZWxfZHAgKmludGVsX2RwLAo+ Pj4gwqAJfQo+Pj4gwqAJaW50ZWxfY29ubmVjdG9yLT5lZGlkID0gZWRpZDsKPj4+IMKgCj4+PiAt CS8qIHByZWZlciBmaXhlZCBtb2RlIGZyb20gRURJRCBpZiBhdmFpbGFibGUsIHNhdmUgYW4gYWx0 Cj4+PiBtb2RlIGFsc28gKi8KPj4+ICsJLyogcHJlZmVyIGZpeGVkIG1vZGUgZnJvbSBFRElEIGlm IGF2YWlsYWJsZSAqLwo+Pj4gwqAJbGlzdF9mb3JfZWFjaF9lbnRyeShzY2FuLCAmY29ubmVjdG9y LT5wcm9iZWRfbW9kZXMsIGhlYWQpIHsKPj4+IMKgCQlpZiAoKHNjYW4tPnR5cGUgJiBEUk1fTU9E RV9UWVBFX1BSRUZFUlJFRCkpIHsKPj4+IMKgCQkJZml4ZWRfbW9kZSA9IGRybV9tb2RlX2R1cGxp Y2F0ZShkZXYsIHNjYW4pOwo+Pj4gwqAJCQlkb3duY2xvY2tfbW9kZSA9IGludGVsX2RwX2RycnNf aW5pdCgKPj4+IMKgCQkJCQkJaW50ZWxfY29ubmVjdG9yLAo+Pj4gZml4ZWRfbW9kZSk7Cj4+PiAt CQl9IGVsc2UgaWYgKCFhbHRfZml4ZWRfbW9kZSkgewo+Pj4gLQkJCWFsdF9maXhlZF9tb2RlID0g ZHJtX21vZGVfZHVwbGljYXRlKGRldiwKPj4+IHNjYW4pOwo+Pj4gKwkJCWJyZWFrOwo+Pgo+PiBJ ZiBtdWx0aXBsZSBwcmVmZXJyZWQgbW9kZXMgYXJlIHByZXNlbnQsIHdlJ2xsIG5vdyBlbmQgdXAg Y2FsbGluZwo+PiBkcnJzX2luaXQoKSBvbmx5IGZvciB0aGUgZmlyc3QuIEkgc2VlIHRoYXQgdGhp cyBpcyB3aGF0IHRoZSBvcmlnaW5hbAo+PiBjb2RlIGRpZCBidXQgdGhpcyByZXZlcnQgZG9lcyBt b3JlIHRoYW4gcmVtb3Zpbmcgc3VwcG9ydCBmb3IgYWx0ZXJuYXRlCj4+IG1vZGVzLgo+Cj4gSXQg Ym9pbHMgZG93biB0byB3aGljaCBwcmVmZXJyZWQgbW9kZSBpcyAqdGhlKiBwcmVmZXJyZWQgbW9k ZS4gSSB0aGluawo+IHRoZSBvcmlnaW5hbCBjb2RlIHdhcywgdWgsIHByZWZlcnJhYmxlLiBOb3Rl IHRoYXQgZHJycyBpbml0IHNjYW5zIHRoZQo+IGVudGlyZSBsaXN0IG9mIG1vZGVzIGFnYWluIHRv IGZpbmQgdGhlIHNhbWUgc2l6ZSBtb2RlIHdpdGggdGhlIGxvd2VzdAo+IHJlZnJlc2ggcmF0ZS4K Ck1vcmVvdmVyLCBhcyB5b3UgY2FuIHNlZSwgdGhlIG9yaWdpbmFsIGFsdCBtb2RlIGNvbW1pdCBo YWQgbW9yZSBzdWJ0bGUKY2hhbmdlcyB0aGFuIGNhdGNoZXMgdGhlIGV5ZSwgaXQgY2F1c2VkIHJl Z3Jlc3Npb25zLCBhbmQgSSBmZWVsIHByZXR0eQpzdHJvbmdseSBhYm91dCBnZXR0aW5nIGJhY2sg dG8gdGhlIGRyYXdpbmcgYm9hcmQgYW5kIHN0YXJ0aW5nIG92ZXIgd2l0aAphIGNsZWFuIHNsYXRl IHRoYW4gdHJ5aW5nIHRvIHR3ZWFrIGl0IHdoZW4gd2UgYXJlIHF1aXRlIGZyYW5rbHkgd2F5Cm92 ZXJkdWUgd2l0aCB0aGUgcmV2ZXJ0LiBJZiBhZnRlciB0aGF0IHlvdSB0aGluayB0aGUgZHJycy9k b3duY2xvY2sKc2VsZWN0aW9uIG5lZWRzIHR3ZWFraW5nLCBsZXQncyBkbyB0aGF0LgoKQlIsCkph bmkuCgoKPgo+IEJSLAo+IEphbmkuCj4KPj4KPj4+IMKgCQl9Cj4+PiDCoAl9Cj4+PiDCoAo+Pj4g QEAgLTYyNTgsOCArNjIzMSw3IEBAIHN0YXRpYyBib29sIGludGVsX2VkcF9pbml0X2Nvbm5lY3Rv cihzdHJ1Y3QKPj4+IGludGVsX2RwICppbnRlbF9kcCwKPj4+IMKgCQkJwqDCoMKgwqDCoMKgcGlw ZV9uYW1lKHBpcGUpKTsKPj4+IMKgCX0KPj4+IMKgCj4+PiAtCWludGVsX3BhbmVsX2luaXQoJmlu dGVsX2Nvbm5lY3Rvci0+cGFuZWwsIGZpeGVkX21vZGUsCj4+PiBhbHRfZml4ZWRfbW9kZSwKPj4+ IC0JCQnCoGRvd25jbG9ja19tb2RlKTsKPj4+ICsJaW50ZWxfcGFuZWxfaW5pdCgmaW50ZWxfY29u bmVjdG9yLT5wYW5lbCwgZml4ZWRfbW9kZSwKPj4+IGRvd25jbG9ja19tb2RlKTsKPj4+IMKgCWlu dGVsX2Nvbm5lY3Rvci0+cGFuZWwuYmFja2xpZ2h0LnBvd2VyID0KPj4+IGludGVsX2VkcF9iYWNr bGlnaHRfcG93ZXI7Cj4+PiDCoAlpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoY29ubmVjdG9y LCBwaXBlKTsKPj4+IMKgCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHJ2LmgKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKPj4+IGluZGV4 IGQ3ZGJjYTFhYWJmZi4uMDM2MTEzMDUwMGE2IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZHJ2LmgKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2Rydi5oCj4+PiBAQCAtMjc3LDcgKzI3Nyw2IEBAIHN0cnVjdCBpbnRlbF9lbmNvZGVyIHsKPj4+ IMKgCj4+PiDCoHN0cnVjdCBpbnRlbF9wYW5lbCB7Cj4+PiDCoAlzdHJ1Y3QgZHJtX2Rpc3BsYXlf bW9kZSAqZml4ZWRfbW9kZTsKPj4+IC0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFsdF9maXhl ZF9tb2RlOwo+Pj4gwqAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRvd25jbG9ja19tb2RlOwo+ Pj4gwqAKPj4+IMKgCS8qIGJhY2tsaWdodCAqLwo+Pj4gQEAgLTE4NTAsNyArMTg0OSw2IEBAIHZv aWQgaW50ZWxfb3ZlcmxheV9yZXNldChzdHJ1Y3QKPj4+IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2KTsKPj4+IMKgLyogaW50ZWxfcGFuZWwuYyAqLwo+Pj4gwqBpbnQgaW50ZWxfcGFuZWxfaW5p dChzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsLAo+Pj4gwqAJCcKgwqDCoMKgwqBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSwKPj4+IC0JCcKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqYWx0X2ZpeGVkX21vZGUsCj4+PiDCoAkJwqDCoMKgwqDCoHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICpkb3duY2xvY2tfbW9kZSk7Cj4+PiDCoHZvaWQgaW50ZWxfcGFuZWxfZmlu aShzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsKTsKPj4+IMKgdm9pZCBpbnRlbF9maXhlZF9wYW5l bF9tb2RlKGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlCj4+PiAqZml4ZWRfbW9kZSwKPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuYwo+Pj4gYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2kuYwo+Pj4gaW5kZXggNTFhMWQ2ODY4YjFlLi5jZjM5 Y2E5MGQ4ODcgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kc2ku Ywo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHNpLmMKPj4+IEBAIC0xODQ2 LDcgKzE4NDYsNyBAQCB2b2lkIGludGVsX2RzaV9pbml0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRl Cj4+PiAqZGV2X3ByaXYpCj4+PiDCoAljb25uZWN0b3ItPmRpc3BsYXlfaW5mby53aWR0aF9tbSA9 IGZpeGVkX21vZGUtPndpZHRoX21tOwo+Pj4gwqAJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVp Z2h0X21tID0gZml4ZWRfbW9kZS0+aGVpZ2h0X21tOwo+Pj4gwqAKPj4+IC0JaW50ZWxfcGFuZWxf aW5pdCgmaW50ZWxfY29ubmVjdG9yLT5wYW5lbCwgZml4ZWRfbW9kZSwgTlVMTCwKPj4+IE5VTEwp Owo+Pj4gKwlpbnRlbF9wYW5lbF9pbml0KCZpbnRlbF9jb25uZWN0b3ItPnBhbmVsLCBmaXhlZF9t b2RlLCBOVUxMKTsKPj4+IMKgCWludGVsX3BhbmVsX3NldHVwX2JhY2tsaWdodChjb25uZWN0b3Is IElOVkFMSURfUElQRSk7Cj4+PiDCoAo+Pj4gwqAJaW50ZWxfZHNpX2FkZF9wcm9wZXJ0aWVzKGlu dGVsX2Nvbm5lY3Rvcik7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHZvLmMKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHZvLmMKPj4+IGluZGV4 IGViMGM1NTliMjcxNS4uYTcwZDc2NzMxM2FhIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZHZvLmMKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2R2by5jCj4+PiBAQCAtNTM2LDcgKzUzNiw3IEBAIHZvaWQgaW50ZWxfZHZvX2luaXQoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUKPj4+ICpkZXZfcHJpdikKPj4+IMKgCQkJwqAqLwo+Pj4gwqAJCQlp bnRlbF9wYW5lbF9pbml0KCZpbnRlbF9jb25uZWN0b3ItPnBhbmVsLAo+Pj4gwqAJCQkJCcKgaW50 ZWxfZHZvX2dldF9jdXJyZW50X21vZGUoCj4+PiBpbnRlbF9lbmNvZGVyKSwKPj4+IC0JCQkJCcKg TlVMTCwgTlVMTCk7Cj4+PiArCQkJCQnCoE5VTEwpOwo+Pj4gwqAJCQlpbnRlbF9kdm8tPnBhbmVs X3dhbnRzX2RpdGhlciA9IHRydWU7Cj4+PiDCoAkJfQo+Pj4gwqAKPj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfbHZkcy5jCj4+PiBpbmRleCA4NjkxYzg2ZjU3OWMuLmQ4ZWNlOTA3ZmY1NCAxMDA2 NDQKPj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwo+Pj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCj4+PiBAQCAtMTE0MCw4ICsxMTQwLDcg QEAgdm9pZCBpbnRlbF9sdmRzX2luaXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUKPj4+ICpkZXZf cHJpdikKPj4+IMKgb3V0Ogo+Pj4gwqAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11 dGV4KTsKPj4+IMKgCj4+PiAtCWludGVsX3BhbmVsX2luaXQoJmludGVsX2Nvbm5lY3Rvci0+cGFu ZWwsIGZpeGVkX21vZGUsIE5VTEwsCj4+PiAtCQkJwqBkb3duY2xvY2tfbW9kZSk7Cj4+PiArCWlu dGVsX3BhbmVsX2luaXQoJmludGVsX2Nvbm5lY3Rvci0+cGFuZWwsIGZpeGVkX21vZGUsCj4+PiBk b3duY2xvY2tfbW9kZSk7Cj4+PiDCoAlpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoY29ubmVj dG9yLCBJTlZBTElEX1BJUEUpOwo+Pj4gwqAKPj4+IMKgCWx2ZHNfZW5jb2Rlci0+aXNfZHVhbF9s aW5rID0KPj4+IGNvbXB1dGVfaXNfZHVhbF9saW5rX2x2ZHMobHZkc19lbmNvZGVyKTsKPj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCj4+PiBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKPj4+IGluZGV4IDQxZDAwYjE2MDNlMy4uYjQ0 MzI3OGU1NjljIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFu ZWwuYwo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwo+Pj4gQEAg LTE5MjgsMTMgKzE5MjgsMTEgQEAgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHRfZnVuY3Moc3Ry dWN0Cj4+PiBpbnRlbF9wYW5lbCAqcGFuZWwpCj4+PiDCoAo+Pj4gwqBpbnQgaW50ZWxfcGFuZWxf aW5pdChzdHJ1Y3QgaW50ZWxfcGFuZWwgKnBhbmVsLAo+Pj4gwqAJCcKgwqDCoMKgwqBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSwKPj4+IC0JCcKgwqDCoMKgwqBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqYWx0X2ZpeGVkX21vZGUsCj4+PiDCoAkJwqDCoMKgwqDCoHN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICpkb3duY2xvY2tfbW9kZSkKPj4+IMKgewo+Pj4gwqAJaW50ZWxfcGFu ZWxfaW5pdF9iYWNrbGlnaHRfZnVuY3MocGFuZWwpOwo+Pj4gwqAKPj4+IMKgCXBhbmVsLT5maXhl ZF9tb2RlID0gZml4ZWRfbW9kZTsKPj4+IC0JcGFuZWwtPmFsdF9maXhlZF9tb2RlID0gYWx0X2Zp eGVkX21vZGU7Cj4+PiDCoAlwYW5lbC0+ZG93bmNsb2NrX21vZGUgPSBkb3duY2xvY2tfbW9kZTsK Pj4+IMKgCj4+PiDCoAlyZXR1cm4gMDsKPj4+IEBAIC0xOTQ4LDEwICsxOTQ2LDYgQEAgdm9pZCBp bnRlbF9wYW5lbF9maW5pKHN0cnVjdCBpbnRlbF9wYW5lbAo+Pj4gKnBhbmVsKQo+Pj4gwqAJaWYg KHBhbmVsLT5maXhlZF9tb2RlKQo+Pj4gwqAJCWRybV9tb2RlX2Rlc3Ryb3koaW50ZWxfY29ubmVj dG9yLT5iYXNlLmRldiwgcGFuZWwtCj4+PiA+Zml4ZWRfbW9kZSk7Cj4+PiDCoAo+Pj4gLQlpZiAo cGFuZWwtPmFsdF9maXhlZF9tb2RlKQo+Pj4gLQkJZHJtX21vZGVfZGVzdHJveShpbnRlbF9jb25u ZWN0b3ItPmJhc2UuZGV2LAo+Pj4gLQkJCQlwYW5lbC0+YWx0X2ZpeGVkX21vZGUpOwo+Pj4gLQo+ Pj4gwqAJaWYgKHBhbmVsLT5kb3duY2xvY2tfbW9kZSkKPj4+IMKgCQlkcm1fbW9kZV9kZXN0cm95 KGludGVsX2Nvbm5lY3Rvci0+YmFzZS5kZXYsCj4+PiDCoAkJCQlwYW5lbC0+ZG93bmNsb2NrX21v ZGUpOwoKLS0gCkphbmkgTmlrdWxhLCBJbnRlbCBPcGVuIFNvdXJjZSBUZWNobm9sb2d5IENlbnRl cgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK