<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>234115</bug_id>
          
          <creation_ts>2021-12-09 17:39:50 -0800</creation_ts>
          <short_desc>Web Inspector: save and restore extension tab positions</short_desc>
          <delta_ts>2022-03-01 02:23:55 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Blaze Burg">bburg</reporter>
          <assigned_to name="Blaze Burg">bburg</assigned_to>
          <cc>bburg</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>hi</cc>
    
    <cc>inspector-bugzilla-changes</cc>
    
    <cc>pangle</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1822460</commentid>
    <comment_count>0</comment_count>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-09 17:39:50 -0800</bug_when>
    <thetext>.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1822461</commentid>
    <comment_count>1</comment_count>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-09 17:40:04 -0800</bug_when>
    <thetext>&lt;rdar://85560636&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1822918</commentid>
    <comment_count>2</comment_count>
      <attachid>446791</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 13:10:36 -0800</bug_when>
    <thetext>Created attachment 446791
Patch v1.0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1822953</commentid>
    <comment_count>3</comment_count>
      <attachid>446791</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-10 13:48:20 -0800</bug_when>
    <thetext>Comment on attachment 446791
Patch v1.0

View in context: https://bugs.webkit.org/attachment.cgi?id=446791&amp;action=review

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:119
&gt; +        let options = {

NIT: please inline this

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:204
&gt; +        options.insertionIndex = this._insertionIndexForExtensionTab(tabContentView);

please inline this below the `...options`

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:320
&gt; +        let savedTabPositions = await WI.objectStores.general.get(WebInspectorExtensionController.extensionTabPositionsObjectStoreKey);

Aside: While this is fine, why can&apos;t we create a `WI.Setting` inside `WI.WebInspectorExtensionTabContentView` so that each extension tab keeps track of its own position?  IMO `WI.Setting` is way easier to deal with than `WI.ObjectStore` and should be preferred when the data being stored is simple.  I realize that the position info is a JSON object (and one that could have new keys added in the future), but I think it&apos;s maybe simple enough to not be that worried about the cost (especially since it&apos;s unlikely that a developer will have more than say a dozen extensions).

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:329
&gt; +        let visibleTabs = WI.tabBrowser.tabBar.tabBarItems.filter((tabBarItem) =&gt; !tabBarItem.hidden &amp;&amp; !(tabBarItem instanceof WI.PinnedTabBarItem));

Can we create a `WI.TabBar.prototype.get visibleTabBarItems` so that the logic dealing with `WI.PinnedTabBarItem` is kept within `WI.TabBar`?  Also, why does this need to care about `WI.PinnedTabBarItem` in the first place?

NIT: this should be named `visibleTabBarItems` since it&apos;s an array of `WI.TabBarItem`

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:334
&gt; +            let {anchorTabType, baseIndex, relativeIndex} = this._computeIndicesForExtensionTab(tabBarItem.representedObject, {recomputePositions: true});

We should move all of this logic inside the `Debouncer` so that we&apos;re not `_computeIndicesForExtensionTab` on every call.

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:338
&gt; +        // Save to the object store five seconds after the last change.

IMO this is an unnecessary comment just by reading the subsequent code

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:340
&gt; +        if (!this._saveTabPositionsToObjectStoreTimeout) {
&gt; +            this._saveTabPositionsToObjectStoreTimeout = new Debouncer(() =&gt; {

```
    this._saveTabPositionsDebouncer ||= new Debouncer(() =&gt; {
        ...
    });
    this._saveTabPositionsDebouncer.delayForTime(5000);
```

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:354
&gt; +    _computeIndicesForExtensionTab(tabContentView, options = {})

Why not `{recomputePositions} = {}` instead of having to `options.recomputePositions` multiple times below?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:358
&gt; +        let visibleTabs = WI.tabBrowser.tabBar.tabBarItems.filter((tabBarItem) =&gt; !tabBarItem.hidden &amp;&amp; !(tabBarItem instanceof WI.PinnedTabBarItem));

ditto (:329)

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:359
&gt; +        let baseIndex = 0;

Correct me if I&apos;m wrong, but this makes me think that new extension tabs will be inserted right after the first tab.  That seems kinda odd.  Why aren&apos;t we adding them at the end of the tab bar?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:364
&gt; +        for (let i = 0; i &lt; visibleTabs.length; i++) {

`++i` instead of `i++`

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:366
&gt; +            // Stop looking once we&apos;ve found the target tab.

this comment is unnecessary

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:371
&gt; +            // Skip past extension tabs.
&gt; +            if (!visibleTab.constructor.shouldSaveTab())

This code does not match the comment.  Should it be `visibleTab instanceof WI.WebInspectorExtensionTabContentView` instead?  Or maybe just drop the comment?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:374
&gt; +            // We&apos;ve found the next anchor tab.

ditto (:366)

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:379
&gt; +            // If looking for savedPositions.anchorTabType, keep looking.

ditto (:366)

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:380
&gt; +            else if (visibleTab.type !== anchorTabType)

Style: an `else` is not needed after an `if` that has a `continue`/`break`/`return`/etc.

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:388
&gt; +        // Adding `relativeIndex` to `baseIndex` should not insert the tab after a different anchor tab.

Can we come up with better names for these?  How about `anchorTabIndex` and `distanceFromAnchorTab`?  Also, is it actually really necessary to even have a `anchorTabIndex` given that we don&apos;t allow for more than one instance of any single `anchorTabType` (i.e. if you have an `anchorTabType` you could just search for the index of a tab that matches it)?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:389
&gt; +        for (let j = 1; j &lt; visibleTabs.length - baseIndex; j++) {

Why doesn&apos;t this start at `0`?  What if the `anchorTabIndex` (a.k.a. `baseIndex`) is `0`?  I think in that case the below logic would result in `distanceFromAnchorTab` (a.k.a. `relativeIndex`) also being `0` instead of `1`.

Style: `i` instead of `j`
Style: `++i` instead of `j++`</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1822954</commentid>
    <comment_count>4</comment_count>
      <attachid>446791</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-10 13:51:23 -0800</bug_when>
    <thetext>Comment on attachment 446791
Patch v1.0

View in context: https://bugs.webkit.org/attachment.cgi?id=446791&amp;action=review

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:123
&gt; +        let options = {
&gt; +            suppressAnimations: true,
&gt; +            insertionIndex: this._insertionIndexForExtensionTab(tabContentView),
&gt; +        };
&gt; +        WI.tabBrowser.addTabForContentView(tabContentView, options);

NIT: I would just inline `options`.
```
WI.tabBrowser.addTabForContentView(tabContentView, {
    suppressAnimations: true,
    insertionIndex: this._insertionIndexForExtensionTab(tabContentView),
});
```

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:324
&gt; +    async _saveExtensionTabPositions()

Am I missing a reason for this to be async?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:371
&gt; +            // Skip past extension tabs.
&gt; +            if (!visibleTab.constructor.shouldSaveTab())

If we truly want to check if this is an extension tab, shouldn&apos;t we check the type of visibleTab instead? Or do we really mean to skip based on `shouldSaveTab()` and update the comment instead?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:399
&gt; +        // If the anchor tab is now hidden upon restoring, place the extension at the end.
&gt; +        // This could happen if a smaller set of tabs are enabled for the inspection target.
&gt; +        baseIndex = visibleTabs.length - 1;
&gt; +        return {anchorTabType, baseIndex, relativeIndex};

Does this also mean that the position of extension tabs could be lost if the developer switches frequently between inspecting JS-only contexts, like ServiceWorkers, and web pages?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1822990</commentid>
    <comment_count>5</comment_count>
      <attachid>446791</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-10 14:42:04 -0800</bug_when>
    <thetext>Comment on attachment 446791
Patch v1.0

View in context: https://bugs.webkit.org/attachment.cgi?id=446791&amp;action=review

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:399
&gt;&gt; +        return {anchorTabType, baseIndex, relativeIndex};
&gt; 
&gt; Does this also mean that the position of extension tabs could be lost if the developer switches frequently between inspecting JS-only contexts, like ServiceWorkers, and web pages?

Actually, speaking of, what do extension tabs even do when inspecting non-`WebPage` debuggables?  AFAIK the debuggable type isn&apos;t exposed to the extension in any way, so unless they do some injected JS testing (e.g. `globalThis.constructor.name === &quot;ServiceWorkerGlobalScope&quot;) the extension could be wrongly assuming that it&apos;s dealing with a `WebPage`.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823006</commentid>
    <comment_count>6</comment_count>
      <attachid>446791</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 14:54:10 -0800</bug_when>
    <thetext>Comment on attachment 446791
Patch v1.0

View in context: https://bugs.webkit.org/attachment.cgi?id=446791&amp;action=review

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:123
&gt;&gt; +        WI.tabBrowser.addTabForContentView(tabContentView, options);
&gt; 
&gt; NIT: I would just inline `options`.
&gt; ```
&gt; WI.tabBrowser.addTabForContentView(tabContentView, {
&gt;     suppressAnimations: true,
&gt;     insertionIndex: this._insertionIndexForExtensionTab(tabContentView),
&gt; });
&gt; ```

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:204
&gt;&gt; +        options.insertionIndex = this._insertionIndexForExtensionTab(tabContentView);
&gt; 
&gt; please inline this below the `...options`

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:320
&gt;&gt; +        let savedTabPositions = await WI.objectStores.general.get(WebInspectorExtensionController.extensionTabPositionsObjectStoreKey);
&gt; 
&gt; Aside: While this is fine, why can&apos;t we create a `WI.Setting` inside `WI.WebInspectorExtensionTabContentView` so that each extension tab keeps track of its own position?  IMO `WI.Setting` is way easier to deal with than `WI.ObjectStore` and should be preferred when the data being stored is simple.  I realize that the position info is a JSON object (and one that could have new keys added in the future), but I think it&apos;s maybe simple enough to not be that worried about the cost (especially since it&apos;s unlikely that a developer will have more than say a dozen extensions).

I decided to use WI.ObjectStore because of the async API.

I don&apos;t think it makes sense for the tab itself to compute and store its position, because the controller is responsible for adding it to the tab bar.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:324
&gt;&gt; +    async _saveExtensionTabPositions()
&gt; 
&gt; Am I missing a reason for this to be async?

ooops

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:329
&gt;&gt; +        let visibleTabs = WI.tabBrowser.tabBar.tabBarItems.filter((tabBarItem) =&gt; !tabBarItem.hidden &amp;&amp; !(tabBarItem instanceof WI.PinnedTabBarItem));
&gt; 
&gt; Can we create a `WI.TabBar.prototype.get visibleTabBarItems` so that the logic dealing with `WI.PinnedTabBarItem` is kept within `WI.TabBar`?  Also, why does this need to care about `WI.PinnedTabBarItem` in the first place?
&gt; 
&gt; NIT: this should be named `visibleTabBarItems` since it&apos;s an array of `WI.TabBarItem`

It is allowed for PinnedTabBarItem to have an empty representedObject, which is problematic later. So I filter these out.

I will rename and add the getter.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:338
&gt;&gt; +        // Save to the object store five seconds after the last change.
&gt; 
&gt; IMO this is an unnecessary comment just by reading the subsequent code

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:340
&gt;&gt; +            this._saveTabPositionsToObjectStoreTimeout = new Debouncer(() =&gt; {
&gt; 
&gt; ```
&gt;     this._saveTabPositionsDebouncer ||= new Debouncer(() =&gt; {
&gt;         ...
&gt;     });
&gt;     this._saveTabPositionsDebouncer.delayForTime(5000);
&gt; ```

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:354
&gt;&gt; +    _computeIndicesForExtensionTab(tabContentView, options = {})
&gt; 
&gt; Why not `{recomputePositions} = {}` instead of having to `options.recomputePositions` multiple times below?

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:359
&gt;&gt; +        let baseIndex = 0;
&gt; 
&gt; Correct me if I&apos;m wrong, but this makes me think that new extension tabs will be inserted right after the first tab.  That seems kinda odd.  Why aren&apos;t we adding them at the end of the tab bar?

They are added to the end, the value of baseIndex gets fixed up if we didn&apos;t find the anchorTabType.

&gt;&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:371
&gt;&gt;&gt; +            if (!visibleTab.constructor.shouldSaveTab())
&gt;&gt; 
&gt;&gt; This code does not match the comment.  Should it be `visibleTab instanceof WI.WebInspectorExtensionTabContentView` instead?  Or maybe just drop the comment?
&gt; 
&gt; If we truly want to check if this is an extension tab, shouldn&apos;t we check the type of visibleTab instead? Or do we really mean to skip based on `shouldSaveTab()` and update the comment instead?

Fixed

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:380
&gt;&gt; +            else if (visibleTab.type !== anchorTabType)
&gt; 
&gt; Style: an `else` is not needed after an `if` that has a `continue`/`break`/`return`/etc.

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:388
&gt;&gt; +        // Adding `relativeIndex` to `baseIndex` should not insert the tab after a different anchor tab.
&gt; 
&gt; Can we come up with better names for these?  How about `anchorTabIndex` and `distanceFromAnchorTab`?  Also, is it actually really necessary to even have a `anchorTabIndex` given that we don&apos;t allow for more than one instance of any single `anchorTabType` (i.e. if you have an `anchorTabType` you could just search for the index of a tab that matches it)?

Name suggestions are fine.

This is the place where the anchorTabType is resolved into a real index. I don&apos;t want multiple callsites to do the resolution. It&apos;s also valid for anchorTabType to be missing or null, so a simple indexOf will not do the right thing.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:389
&gt;&gt; +        for (let j = 1; j &lt; visibleTabs.length - baseIndex; j++) {
&gt; 
&gt; Why doesn&apos;t this start at `0`?  What if the `anchorTabIndex` (a.k.a. `baseIndex`) is `0`?  I think in that case the below logic would result in `distanceFromAnchorTab` (a.k.a. `relativeIndex`) also being `0` instead of `1`.
&gt; 
&gt; Style: `i` instead of `j`
&gt; Style: `++i` instead of `j++`

baseIndex=0 relativeIndex=0 means the tab is before any anchor tabs.

This is a lookahead (starting at i=1) because we know that i=0 is always a valid anchor position. I would rather subtract 1 from j rather than adding 1 to j to get a valid insertionIndex.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:399
&gt;&gt; +        return {anchorTabType, baseIndex, relativeIndex};
&gt; 
&gt; Does this also mean that the position of extension tabs could be lost if the developer switches frequently between inspecting JS-only contexts, like ServiceWorkers, and web pages?

Yes, if it&apos;s anchored to something like Audits, but I don&apos;t think this is a common use case. And extension tabs don&apos;t currently work with remote inspection, so it seems moot for now. When switching from webpage to JSContext inspection, It is possible for the anchorTabType to not be found, and in that case we put the extension at the very end and save it relative to a new anchorTabType that appears in both webpage and JSContext inspection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823017</commentid>
    <comment_count>7</comment_count>
      <attachid>446823</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 15:05:46 -0800</bug_when>
    <thetext>Created attachment 446823
Patch v1.1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823025</commentid>
    <comment_count>8</comment_count>
      <attachid>446791</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-10 15:15:57 -0800</bug_when>
    <thetext>Comment on attachment 446791
Patch v1.0

View in context: https://bugs.webkit.org/attachment.cgi?id=446791&amp;action=review

&gt;&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:329
&gt;&gt;&gt; +        let visibleTabs = WI.tabBrowser.tabBar.tabBarItems.filter((tabBarItem) =&gt; !tabBarItem.hidden &amp;&amp; !(tabBarItem instanceof WI.PinnedTabBarItem));
&gt;&gt; 
&gt;&gt; Can we create a `WI.TabBar.prototype.get visibleTabBarItems` so that the logic dealing with `WI.PinnedTabBarItem` is kept within `WI.TabBar`?  Also, why does this need to care about `WI.PinnedTabBarItem` in the first place?
&gt;&gt; 
&gt;&gt; NIT: this should be named `visibleTabBarItems` since it&apos;s an array of `WI.TabBarItem`
&gt; 
&gt; It is allowed for PinnedTabBarItem to have an empty representedObject, which is problematic later. So I filter these out.
&gt; 
&gt; I will rename and add the getter.

FYI all `WI.TabBarItem` are allowed to not provide a `representedObject`.  That is not something unique to `WI.PinnedTabBarItem`.  The only difference between `WI.PinnedTabBarItem` and `WI.GeneralTabBarItem` is whether it&apos;s always shown in the `WI.TabBar` or not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823037</commentid>
    <comment_count>9</comment_count>
      <attachid>446823</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-10 15:34:55 -0800</bug_when>
    <thetext>Comment on attachment 446823
Patch v1.1

View in context: https://bugs.webkit.org/attachment.cgi?id=446823&amp;action=review

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:323
&gt; +    async _saveExtensionTabPositions()

Still `async`?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:334
&gt; +        for (let tabBarItem of WI.tabBrowser.tabBar.visibleTabBarItems) {
&gt; +            if (!(tabBarItem.representedObject instanceof WI.WebInspectorExtensionTabContentView))
&gt; +                continue;
&gt; +
&gt; +            let {anchorTabType, anchorTabIndex, distanceFromAnchorTab} = this._computeIndicesForExtensionTab(tabBarItem.representedObject, {recomputePositions: true});
&gt; +            this._extensionTabPositions[tabBarItem.representedObject.savedTabPositionKey] = {anchorTabType, distanceFromAnchorTab};
&gt; +        }

Following up on Devin&apos;s comment from the previous patch this should still probably be moved inside the Debouncer below so that we only do the work when we actually intend to save, not a few times leading up to actually saving.

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:359
&gt; +        for (let i = 0; i &lt; visibleTabBarItems.length; i++) {

++i

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:381
&gt; +        for (let j = 1; j &lt; visibleTabBarItems.length - anchorTabIndex; j++) {

Can we use `i` instead since this isn&apos;t a nested loop? Also `++i`</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823043</commentid>
    <comment_count>10</comment_count>
      <attachid>446823</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-10 15:37:37 -0800</bug_when>
    <thetext>Comment on attachment 446823
Patch v1.1

View in context: https://bugs.webkit.org/attachment.cgi?id=446823&amp;action=review

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:339
&gt; +

Style: unnecessary newline

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:356
&gt; +        let anchorTabType = !recomputePositions ? savedPositions.anchorTabType : null;
&gt; +        let distanceFromAnchorTab = !recomputePositions ? savedPositions.distanceFromAnchorTab : 0;

Should these also check that `savedPosition` is valid?
```
    let savedPosition = this._extensionTabPositions[tabContentView.savedTabPositionKey];
    let anchorTabType = (recomputePositions &amp;&amp; savedPosition.anchorTabType) || null;
    let distanceFromAnchorTab = (recomputePositions &amp; savedPosition.distanceFromAnchorTab) || 0;
```

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:368
&gt; +            if (recomputePositions) {
&gt; +                anchorTabType = visibleTab.type;

Doesn&apos;t this mean that every extension tab will match to the leftmost non-extension tab when recomputing positions?  I would think that the anchor would be the closest tab before the extension tab.

&gt; Source/WebInspectorUI/UserInterface/Views/TabBar.js:412
&gt; +         return this._tabBarItems.filter((item) =&gt; !item.hidden &amp;&amp; !(item instanceof WI.PinnedTabBarItem));

ditto (comment #8)

Also, I think you may want to use `this._tabBarItemsFromLeftToRight` (and if so please rename this to `visibleTabBarItemsFromLeftToRight`) 🤔</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823053</commentid>
    <comment_count>11</comment_count>
      <attachid>446823</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 15:54:30 -0800</bug_when>
    <thetext>Comment on attachment 446823
Patch v1.1

View in context: https://bugs.webkit.org/attachment.cgi?id=446823&amp;action=review

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:323
&gt;&gt; +    async _saveExtensionTabPositions()
&gt; 
&gt; Still `async`?

Ok

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:334
&gt;&gt; +        }
&gt; 
&gt; Following up on Devin&apos;s comment from the previous patch this should still probably be moved inside the Debouncer below so that we only do the work when we actually intend to save, not a few times leading up to actually saving.

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:356
&gt;&gt; +        let distanceFromAnchorTab = !recomputePositions ? savedPositions.distanceFromAnchorTab : 0;
&gt; 
&gt; Should these also check that `savedPosition` is valid?
&gt; ```
&gt;     let savedPosition = this._extensionTabPositions[tabContentView.savedTabPositionKey];
&gt;     let anchorTabType = (recomputePositions &amp;&amp; savedPosition.anchorTabType) || null;
&gt;     let distanceFromAnchorTab = (recomputePositions &amp; savedPosition.distanceFromAnchorTab) || 0;
&gt; ```

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:359
&gt;&gt; +        for (let i = 0; i &lt; visibleTabBarItems.length; i++) {
&gt; 
&gt; ++i

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:368
&gt;&gt; +                anchorTabType = visibleTab.type;
&gt; 
&gt; Doesn&apos;t this mean that every extension tab will match to the leftmost non-extension tab when recomputing positions?  I would think that the anchor would be the closest tab before the extension tab.

Initially yes, but it keeps getting updated with later anchorTabTypes as the search continues.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:381
&gt;&gt; +        for (let j = 1; j &lt; visibleTabBarItems.length - anchorTabIndex; j++) {
&gt; 
&gt; Can we use `i` instead since this isn&apos;t a nested loop? Also `++i`

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Views/TabBar.js:412
&gt;&gt; +         return this._tabBarItems.filter((item) =&gt; !item.hidden &amp;&amp; !(item instanceof WI.PinnedTabBarItem));
&gt; 
&gt; ditto (comment #8)
&gt; 
&gt; Also, I think you may want to use `this._tabBarItemsFromLeftToRight` (and if so please rename this to `visibleTabBarItemsFromLeftToRight`) 🤔

OK</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823058</commentid>
    <comment_count>12</comment_count>
      <attachid>446834</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 15:56:54 -0800</bug_when>
    <thetext>Created attachment 446834
Patch v1.2

Addressed all outstanding feedback in v1.2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823072</commentid>
    <comment_count>13</comment_count>
      <attachid>446834</attachid>
    <who name="Patrick Angle">pangle</who>
    <bug_when>2021-12-10 16:13:09 -0800</bug_when>
    <thetext>Comment on attachment 446834
Patch v1.2

View in context: https://bugs.webkit.org/attachment.cgi?id=446834&amp;action=review

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:338
&gt; +        }, 5000);

NIT: Debouncer doesn&apos;t take a time parameter in its constructor. (Leftover from a timeout-based approach?)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823075</commentid>
    <comment_count>14</comment_count>
      <attachid>446834</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2021-12-10 16:15:31 -0800</bug_when>
    <thetext>Comment on attachment 446834
Patch v1.2

View in context: https://bugs.webkit.org/attachment.cgi?id=446834&amp;action=review

r=me, nice work!

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:360
&gt; +            if (!representedObject)

Did you mean `visibleTab`?

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:370
&gt; +                anchorTabType = visibleTab.type;

This assumes that the `representedObject` has a type.  It&apos;s probably not an issue, but you might wanna add a `|| null` just in case.

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:383
&gt; +        for (let i = 1; i &lt; visibleTabBarItems.length - anchorTabIndex; ++j) {

oops `++j` instead of `++i`

&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:384
&gt; +            if (visibleTabBarItems[anchorTabIndex + i].representedObject.constructor.shouldSaveTab()) {

This should check `representedObject` (and `constructor` and `shouldSaveTab` just in case the `representedObject` is not a `WI.TabContentView`).
```
    if (visibleTabBarItems[anchorTabIndex + i].representedObject?.constructor?.shouldSaveTab?.()) {
```</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823080</commentid>
    <comment_count>15</comment_count>
      <attachid>446834</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 16:23:56 -0800</bug_when>
    <thetext>Comment on attachment 446834
Patch v1.2

View in context: https://bugs.webkit.org/attachment.cgi?id=446834&amp;action=review

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:338
&gt;&gt; +        }, 5000);
&gt; 
&gt; NIT: Debouncer doesn&apos;t take a time parameter in its constructor. (Leftover from a timeout-based approach?)

Haha, it used to be a Throttler.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:384
&gt;&gt; +            if (visibleTabBarItems[anchorTabIndex + i].representedObject.constructor.shouldSaveTab()) {
&gt; 
&gt; This should check `representedObject` (and `constructor` and `shouldSaveTab` just in case the `representedObject` is not a `WI.TabContentView`).
&gt; ```
&gt;     if (visibleTabBarItems[anchorTabIndex + i].representedObject?.constructor?.shouldSaveTab?.()) {
&gt; ```

&gt; shouldSaveTab?.()

is that really the syntax? Yikes.. (-:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823085</commentid>
    <comment_count>16</comment_count>
      <attachid>446845</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 16:31:51 -0800</bug_when>
    <thetext>Created attachment 446845
Patch v1.3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1823099</commentid>
    <comment_count>17</comment_count>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2021-12-10 16:47:32 -0800</bug_when>
    <thetext>Committed r286887 (245116@trunk): &lt;https://commits.webkit.org/245116@trunk&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>446791</attachid>
            <date>2021-12-10 13:10:36 -0800</date>
            <delta_ts>2021-12-10 15:05:45 -0800</delta_ts>
            <desc>Patch v1.0</desc>
            <filename>bug-234115-20211210131036.patch</filename>
            <type>text/plain</type>
            <size>13851</size>
            <attacher name="Blaze Burg">bburg</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2Nzk5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCA5
ZjlkZTg2MmY1ODZkZDhmYjA2YzgwZTEzMTQxNjA3YTc4ZjZjYjkyLi40YTJjNzA0ZThkZjA3YzJj
MDNlNTc1OTk5NDI3MjJmNGM1ZTdhNzZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw2NCBAQAorMjAyMS0xMi0xMCAgQkogQnVyZyAgPGJidXJnQGFwcGxlLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBzYXZlIGFuZCByZXN0b3JlIGV4dGVuc2lvbiB0YWIgcG9zaXRp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQx
MTUKKyAgICAgICAgPHJkYXI6Ly84NTU2MDYzNj4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgZXhpc3RpbmcgdGFiIHN0YXRlIHJlc3RvcmF0aW9u
IHN5c3RlbSB3b3JrcyBieSBzYXZpbmcgb3IgbG9hZGluZyB0YWIgcG9zaXRpb25zCisgICAgICAg
IGZyb20gcGVyc2lzdGVudCBzdG9yYWdlIGFuZCBzYXZpbmcgb3IgcmVzdG9yaW5nIGVhY2ggdGFi
J3Mgc3RhdGUgdXNpbmcgb25lIGNvb2tpZSBwZXIgdGFiIHR5cGUuCisKKyAgICAgICAgV2l0aCBl
eHRlbnNpb24gdGFicywgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSB0
YWIgcGVyIHRhYiB0eXBlLgorICAgICAgICBBZGRpdGlvbmFsbHksIGV4dGVuc2lvbiB0YWJzIGNh
biBiZSBhZGRlZCBhdCBhbnkgdGltZSB2aWEgSW5zcGVjdG9yRnJvbnRlbmRBUEkuCisgICAgICAg
IEdpdmVuIHRoZXNlIGNoYWxsZW5nZXMsIHdlIG5lZWQgYSBkaWZmZXJlbnQgc3lzdGVtIGZvciBz
YXZpbmcgYW5kIHJlc3RvcmluZyBleHRlbnNpb24gdGFicy4KKworICAgICAgICBFeHRlbnNpb24g
dGFiIHJlc3RvcmF0aW9uIGlzIG5vdyBoYW5kbGVkIGJ5IFdJLldlYkluc3BlY3RvckV4dGVuc2lv
bkNvbnRyb2xsZXIuCisgICAgICAgIFdlIGNvbnNpZGVyIGEgdGFiIHRvIGJlIGFuICdhbmNob3In
IHRhYiBpZiBpdCBpcyBzYXZlYWJsZSwgdmlzaWJsZSwgYW5kIG5vdCBwaW5uYWJsZS4KKyAgICAg
ICAgSW4gb3RoZXIgd29yZHMsIGFuIGFuY2hvciB0YWIgaXMgb25lIG9mIHRoZSBidWlsdC1pbiBz
aW5nbGV0b24gdGFicyBsaWtlIENvbnNvbGUsIEVsZW1lbnRzLCBldGMuCisKKyAgICAgICAgV2hl
biB0aGUgdGFiIGJhciBpdGVtIGxpc3QgaXMgbW9kaWZpZWQsIGZvciBlYWNoIGV4dGVuc2lvbiB0
YWIsIHdlIHNhdmUgdGhlIG9ic2VydmVkCisgICAgICAgICdhbmNob3InIHRhYidzIHR5cGUgYW5k
IGEgcmVsYXRpdmUgaW5kZXggZnJvbSB0aGF0IGFuY2hvciB0YWIncyBpbnNlcnRpb24gaW5kZXgu
CisgICAgICAgIFVwZGF0ZXMgdG8gZXh0ZW5zaW9uIHRhYiBwb3NpdGlvbnMgYXJlIHNhdmVkIHRv
IHBlcnNpc3RlbnQgc3RvcmFnZSBhdCBtb3N0IGV2ZXJ5IDUgc2Vjb25kcy4KKworICAgICAgICBX
aGVuIGl0IGlzIHRpbWUgdG8gcGxhY2UgYW4gZXh0ZW5zaW9uIHRhYiB3aXRoIGNyZWF0ZVRhYkZv
ckV4dGVuc2lvbigpIG9yIHNob3dFeHRlbnNpb25UYWIoKSwKKyAgICAgICAgcGVyZm9ybSB0aGUg
cmV2ZXJzZSBvcGVyYXRpb24gb2YgY29tcHV0aW5nIGFuIGluc2VydGlvbiBpbmRleCBmcm9tIGEg
YW5jaG9yVGFiVHlwZSBhbmQgcmVsYXRpdmVJbmRleC4KKworICAgICAgICBUaGlzIHBhdGNoIHdh
cyB0ZXN0ZWQgd2l0aCBvbmUgZXh0ZW5zaW9uLCBtdWx0aXBsZSBleHRlbnNpb25zLCBzaG93aW5n
L2hpZGluZyBleHRlbnNpb24gdGFicywKKyAgICAgICAgcmVtb3RlIGluc3BlY3RpbmcgYSBKU0Nv
bnRleHQsIGFuZCByZW1vdGUgaW5zcGVjdGluZyBhIFdLV2ViVmlldy4KKworICAgICAgICAqIFVz
ZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5q
czoKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIpOgorICAgICAg
ICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5nZXQgZXh0ZW5zaW9uVGFiUG9z
aXRpb25zT2JqZWN0U3RvcmVLZXkpOiBBZGRlZC4KKworICAgICAgICAoV0kuV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUucmVnaXN0ZXJFeHRlbnNpb24pOgorICAgICAg
ICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUudW5yZWdpc3Rl
ckV4dGVuc2lvbik6CisgICAgICAgIEFkZCBhbmQgcmVtb3ZlIFdJLlRhYkJhciBldmVudCBsaXN0
ZW5lcnMgdGhhdCBub3RpZnkgdXMgb2YgY2hhbmdlcyB0byB0aGUgdGFiIGJhci4KKworICAgICAg
ICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUuY3JlYXRlVGFi
Rm9yRXh0ZW5zaW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lv
bkNvbnRyb2xsZXIucHJvdG90eXBlLmFzeW5jIGNyZWF0ZVRhYkZvckV4dGVuc2lvbik6IFJlbmFt
ZWQuCisgICAgICAgIExvYWQgc2F2ZWQgdGFiIHBvc2l0aW9ucyBmcm9tIHBlcnNpc3RlbnQgc3Rv
cmFnZSBpZiBuZWVkZWQuIENvbXB1dGUgdGhlIGluc2VydGlvbiBpbmRleCBmb3IgdGhlIG5ldyB0
YWIuCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGFscmVhZHkgZXhwZWN0ZWQgdG8gcmV0dXJuIGEg
cHJvbWlzZSwgc28gbWFrZSBpdCBgYXN5bmNgIHRvIGFsbG93IHVzaW5nIGBhd2FpdGAuCisKKyAg
ICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLnNob3dF
eHRlbnNpb25UYWIpOgorICAgICAgICBDb21wdXRlIHRoZSBpbnNlcnRpb24gaW5kZXggZm9yIHRo
ZSBuZXcgdGFiLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVy
LnByb3RvdHlwZS5hc3luYyBfbG9hZEV4dGVuc2lvblRhYlBvc2l0aW9ucyk6CisgICAgICAgIExv
YWQgc2F2ZWQgdGFiIHBvc2l0aW9ucyBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZSwgYWxsb3dpbmcg
Zm9yIHRoZSBjYXNlIHdoZXJlIG5vdGhpbmcgaGFzIGJlZW4gc2F2ZWQgeWV0LgorCisgICAgICAg
IChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3RvdHlwZS5hc3luYyBfc2F2
ZUV4dGVuc2lvblRhYlBvc2l0aW9ucyk6CisgICAgICAgIFJlY29tcHV0ZSBhbmQgc2F2ZSB0YWIg
cG9zaXRpb25zIGZvciBhbGwgZXh0ZW5zaW9uIHRhYnMuIFRoZW4gd3JpdGUgdG8gcGVyc2lzdGVu
dCBzdG9yYWdlCisgICAgICAgIGF0IG1vc3QgZXZlcnkgNSBzZWNvbmRzIHVzaW5nIGEgV0kuRGVi
b3VuY2VyLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnBy
b3RvdHlwZS5faW5zZXJ0aW9uSW5kZXhGb3JFeHRlbnNpb25UYWIpOiBBZGRlZCwgd3JhcHBlciBt
ZXRob2QuCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3Rv
dHlwZS5fY29tcHV0ZUluZGljZXNGb3JFeHRlbnNpb25UYWIpOgorICAgICAgICBDb21wdXRlIHRo
ZSBhbmNob3JUYWJUeXBlLCByZWxhdGl2ZUluZGV4LCBhbmQgaW5zZXJ0aW9uSW5kZXggZm9yIHRo
ZSBleHRlbnNpb24gdGFiLgorICAgICAgICBJZiBzYXZpbmcgdGFiIHBvc2l0aW9ucywgcGFzcyBg
b3B0aW9ucy5yZWNvbXB1dGVQb3NpdGlvbnNgIHRvIGlnbm9yZSBzYXZlZCBwb3NpdGlvbnMKKyAg
ICAgICAgYW5kIHJlY29tcHV0ZSB0aGVzZSBmaWVsZHMgYmFzZWQgb24gd2hhdCBpcyBjdXJyZW50
bHkgdmlzaWJsZSBpbiB0aGUgdGFiIGJhci4KKworICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmll
d3MvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcuanM6CisgICAgICAgIChXSS5X
ZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5wcm90b3R5cGUuZ2V0IHNhdmVkVGFi
UG9zaXRpb25LZXkpOiBBZGRlZC4KKwogMjAyMS0xMi0wOCAgQkogQnVyZyAgPGJidXJnQGFwcGxl
LmNvbT4KIAogICAgICAgICBbQ29jb2FdIFdlYiBJbnNwZWN0b3I6IHByb3ZpZGUgYSB3YXkgZm9y
IF9XS0luc3BlY3RvckV4dGVuc2lvbiBjbGllbnRzIHRvIGJlIHRvIG5vdGlmaWVkIHdoZW4gYW4g
ZXh0ZW5zaW9uIHRhYiBuYXZpZ2F0ZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JV
SS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1dlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xs
ZXIuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9X
ZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmpzCmluZGV4IDdmZWI0NWRjODdjNDYzZGYz
Y2Y5NWRkOTNkMDBiYjgzNGRlM2M0ZDcuLjJjZjRmYTA2ZTZkOWMyZTNkYWM2NmJhMmY2MjQ3ZmMx
MjgwOTk1NmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L0NvbnRyb2xsZXJzL1dlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuanMKKysrIGIvU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlci5qcwpAQCAtMzQsOSArMzQsMTkgQEAgV0kuV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xs
ZXIgZXh0ZW4KICAgICAgICAgdGhpcy5fdGFiSURzRm9yRXh0ZW5zaW9uSURNYXAgPSBuZXcgTXVs
dGltYXA7CiAgICAgICAgIHRoaXMuX25leHRFeHRlbnNpb25UYWJJRCA9IDE7CiAKKyAgICAgICAg
dGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zID0gbnVsbDsKKyAgICAgICAgdGhpcy5fc2F2ZVRh
YlBvc2l0aW9uc1RvT2JqZWN0U3RvcmVUaW1lb3V0ID0gbnVsbDsKKwogICAgICAgICBXSS5GcmFt
ZS5hZGRFdmVudExpc3RlbmVyKFdJLkZyYW1lLkV2ZW50Lk1haW5SZXNvdXJjZURpZENoYW5nZSwg
dGhpcy5faGFuZGxlTWFpblJlc291cmNlRGlkQ2hhbmdlLCB0aGlzKTsKICAgICB9CiAKKyAgICAv
LyBTdGF0aWMKKworICAgIHN0YXRpYyBnZXQgZXh0ZW5zaW9uVGFiUG9zaXRpb25zT2JqZWN0U3Rv
cmVLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJleHRlbnNpb24tdGFiLXBvc2l0aW9ucyI7
CisgICAgfQorCiAgICAgLy8gUHVibGljCiAKICAgICBnZXQgcmVnaXN0ZXJlZEV4dGVuc2lvbklE
cygpCkBAIC01MSw2ICs2MSwxMiBAQCBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVy
ID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciBleHRlbgogICAgICAgICAg
ICAgcmV0dXJuIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbi5FcnJvckNvZGUuUmVnaXN0cmF0aW9u
RmFpbGVkOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCF0aGlzLl9leHRlbnNpb25Gb3JFeHRl
bnNpb25JRE1hcC5zaXplKSB7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5hZGRF
dmVudExpc3RlbmVyKFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtQWRkZWQsIHRoaXMuX3NhdmVF
eHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICAgICAgV0kudGFiQnJvd3Nlci50
YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFySXRlbVJlbW92ZWQs
IHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICAgICAgV0ku
dGFiQnJvd3Nlci50YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFy
SXRlbXNSZW9yZGVyZWQsIHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOwor
ICAgICAgICB9CisKICAgICAgICAgbGV0IGV4dGVuc2lvbiA9IG5ldyBXSS5XZWJJbnNwZWN0b3JF
eHRlbnNpb24oZXh0ZW5zaW9uSUQsIGV4dGVuc2lvbkJ1bmRsZUlkZW50aWZpZXIsIGRpc3BsYXlO
YW1lKTsKICAgICAgICAgdGhpcy5fZXh0ZW5zaW9uRm9yRXh0ZW5zaW9uSURNYXAuc2V0KGV4dGVu
c2lvbklELCBleHRlbnNpb24pOwogCkBAIC02NSw2ICs4MSwxMiBAQCBXSS5XZWJJbnNwZWN0b3JF
eHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxl
ciBleHRlbgogICAgICAgICAgICAgcmV0dXJuIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbi5FcnJv
ckNvZGUuSW52YWxpZFJlcXVlc3Q7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIXRoaXMuX2V4
dGVuc2lvbkZvckV4dGVuc2lvbklETWFwLnNpemUpIHsKKyAgICAgICAgICAgIFdJLnRhYkJyb3dz
ZXIudGFiQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoV0kuVGFiQmFyLkV2ZW50LlRhYkJhckl0ZW1B
ZGRlZCwgdGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAgICAgICAg
ICBXSS50YWJCcm93c2VyLnRhYkJhci5yZW1vdmVFdmVudExpc3RlbmVyKFdJLlRhYkJhci5FdmVu
dC5UYWJCYXJJdGVtUmVtb3ZlZCwgdGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucywgdGhp
cyk7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5yZW1vdmVFdmVudExpc3RlbmVy
KFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtc1Jlb3JkZXJlZCwgdGhpcy5fc2F2ZUV4dGVuc2lv
blRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICBsZXQgZXh0ZW5zaW9u
VGFiSURzVG9SZW1vdmUgPSB0aGlzLl90YWJJRHNGb3JFeHRlbnNpb25JRE1hcC50YWtlKGV4dGVu
c2lvbklEKSB8fCBbXTsKICAgICAgICAgZm9yIChsZXQgZXh0ZW5zaW9uVGFiSUQgb2YgZXh0ZW5z
aW9uVGFiSURzVG9SZW1vdmUpIHsKICAgICAgICAgICAgIGxldCB0YWJDb250ZW50VmlldyA9IHRo
aXMuX2V4dGVuc2lvblRhYkNvbnRlbnRWaWV3Rm9yRXh0ZW5zaW9uVGFiSURNYXAudGFrZShleHRl
bnNpb25UYWJJRCk7CkBAIC03Nyw3ICs5OSw3IEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNv
bnRyb2xsZXIgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAg
ICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdJLldlYkluc3BlY3RvckV4dGVu
c2lvbkNvbnRyb2xsZXIuRXZlbnQuRXh0ZW5zaW9uUmVtb3ZlZCwge2V4dGVuc2lvbn0pOwogICAg
IH0KIAotICAgIGNyZWF0ZVRhYkZvckV4dGVuc2lvbihleHRlbnNpb25JRCwgdGFiTmFtZSwgdGFi
SWNvblVSTCwgc291cmNlVVJMKQorICAgIGFzeW5jIGNyZWF0ZVRhYkZvckV4dGVuc2lvbihleHRl
bnNpb25JRCwgdGFiTmFtZSwgdGFiSWNvblVSTCwgc291cmNlVVJMKQogICAgIHsKICAgICAgICAg
bGV0IGV4dGVuc2lvbiA9IHRoaXMuX2V4dGVuc2lvbkZvckV4dGVuc2lvbklETWFwLmdldChleHRl
bnNpb25JRCk7CiAgICAgICAgIGlmICghZXh0ZW5zaW9uKSB7CkBAIC05MCw3ICsxMTIsMTUgQEAg
V0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3BlY3RvckV4
dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KIAogICAgICAgICB0aGlzLl90YWJJRHNGb3JFeHRlbnNp
b25JRE1hcC5hZGQoZXh0ZW5zaW9uSUQsIGV4dGVuc2lvblRhYklEKTsKICAgICAgICAgdGhpcy5f
ZXh0ZW5zaW9uVGFiQ29udGVudFZpZXdGb3JFeHRlbnNpb25UYWJJRE1hcC5zZXQoZXh0ZW5zaW9u
VGFiSUQsIHRhYkNvbnRlbnRWaWV3KTsKLSAgICAgICAgV0kudGFiQnJvd3Nlci5hZGRUYWJGb3JD
b250ZW50Vmlldyh0YWJDb250ZW50Vmlldywge3N1cHByZXNzQW5pbWF0aW9uczogdHJ1ZX0pOwor
CisgICAgICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zKQorICAgICAgICAgICAg
YXdhaXQgdGhpcy5fbG9hZEV4dGVuc2lvblRhYlBvc2l0aW9ucygpOworCisgICAgICAgIGxldCBv
cHRpb25zID0geworICAgICAgICAgICAgc3VwcHJlc3NBbmltYXRpb25zOiB0cnVlLAorICAgICAg
ICAgICAgaW5zZXJ0aW9uSW5kZXg6IHRoaXMuX2luc2VydGlvbkluZGV4Rm9yRXh0ZW5zaW9uVGFi
KHRhYkNvbnRlbnRWaWV3KSwKKyAgICAgICAgfTsKKyAgICAgICAgV0kudGFiQnJvd3Nlci5hZGRU
YWJGb3JDb250ZW50Vmlldyh0YWJDb250ZW50Vmlldywgb3B0aW9ucyk7CiAKICAgICAgICAgLy8g
VGhlIGNhbGxpbmcgY29udmVudGlvbiBpcyB0byByZXR1cm4gYW4gZXJyb3Igc3RyaW5nIG9yIGEg
cmVzdWx0IG9iamVjdC4KICAgICAgICAgcmV0dXJuIHsicmVzdWx0IjogZXh0ZW5zaW9uVGFiSUR9
OwpAQCAtMTcxLDYgKzIwMSw3IEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIg
PSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAgICAgICAgICAg
ICByZXR1cm4gV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uLkVycm9yQ29kZS5JbnZhbGlkUmVxdWVz
dDsKICAgICAgICAgfQogCisgICAgICAgIG9wdGlvbnMuaW5zZXJ0aW9uSW5kZXggPSB0aGlzLl9p
bnNlcnRpb25JbmRleEZvckV4dGVuc2lvblRhYih0YWJDb250ZW50Vmlldyk7CiAgICAgICAgIHRh
YkNvbnRlbnRWaWV3LnZpc2libGUgPSB0cnVlOwogICAgICAgICBsZXQgc3VjY2VzcyA9IFdJLnRh
YkJyb3dzZXIuc2hvd1RhYkZvckNvbnRlbnRWaWV3KHRhYkNvbnRlbnRWaWV3LCB7CiAgICAgICAg
ICAgICAuLi5vcHRpb25zLApAQCAtMjg0LDYgKzMxNSw5MCBAQCBXSS5XZWJJbnNwZWN0b3JFeHRl
bnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciBl
eHRlbgogCiAgICAgLy8gUHJpdmF0ZQogCisgICAgYXN5bmMgX2xvYWRFeHRlbnNpb25UYWJQb3Np
dGlvbnMoKQorICAgIHsKKyAgICAgICAgbGV0IHNhdmVkVGFiUG9zaXRpb25zID0gYXdhaXQgV0ku
b2JqZWN0U3RvcmVzLmdlbmVyYWwuZ2V0KFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIu
ZXh0ZW5zaW9uVGFiUG9zaXRpb25zT2JqZWN0U3RvcmVLZXkpOworICAgICAgICB0aGlzLl9leHRl
bnNpb25UYWJQb3NpdGlvbnMgPSBzYXZlZFRhYlBvc2l0aW9ucyB8fCB7fTsKKyAgICB9CisKKyAg
ICBhc3luYyBfc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucygpCisgICAgeworICAgICAgICBpZiAo
IXRoaXMuX2V4dGVuc2lvblRhYlBvc2l0aW9ucykKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBsZXQgdmlzaWJsZVRhYnMgPSBXSS50YWJCcm93c2VyLnRhYkJhci50YWJCYXJJdGVtcy5m
aWx0ZXIoKHRhYkJhckl0ZW0pID0+ICF0YWJCYXJJdGVtLmhpZGRlbiAmJiAhKHRhYkJhckl0ZW0g
aW5zdGFuY2VvZiBXSS5QaW5uZWRUYWJCYXJJdGVtKSk7CisgICAgICAgIGZvciAobGV0IHRhYkJh
ckl0ZW0gb2YgdmlzaWJsZVRhYnMpIHsKKyAgICAgICAgICAgIGlmICghKHRhYkJhckl0ZW0ucmVw
cmVzZW50ZWRPYmplY3QgaW5zdGFuY2VvZiBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250
ZW50VmlldykpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGxldCB7
YW5jaG9yVGFiVHlwZSwgYmFzZUluZGV4LCByZWxhdGl2ZUluZGV4fSA9IHRoaXMuX2NvbXB1dGVJ
bmRpY2VzRm9yRXh0ZW5zaW9uVGFiKHRhYkJhckl0ZW0ucmVwcmVzZW50ZWRPYmplY3QsIHtyZWNv
bXB1dGVQb3NpdGlvbnM6IHRydWV9KTsKKyAgICAgICAgICAgIHRoaXMuX2V4dGVuc2lvblRhYlBv
c2l0aW9uc1t0YWJCYXJJdGVtLnJlcHJlc2VudGVkT2JqZWN0LnNhdmVkVGFiUG9zaXRpb25LZXld
ID0ge2FuY2hvclRhYlR5cGUsIHJlbGF0aXZlSW5kZXh9OworICAgICAgICB9CisKKyAgICAgICAg
Ly8gU2F2ZSB0byB0aGUgb2JqZWN0IHN0b3JlIGZpdmUgc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBj
aGFuZ2UuCisgICAgICAgIGlmICghdGhpcy5fc2F2ZVRhYlBvc2l0aW9uc1RvT2JqZWN0U3RvcmVU
aW1lb3V0KSB7CisgICAgICAgICAgICB0aGlzLl9zYXZlVGFiUG9zaXRpb25zVG9PYmplY3RTdG9y
ZVRpbWVvdXQgPSBuZXcgRGVib3VuY2VyKCgpID0+IHsKKyAgICAgICAgICAgICAgICBXSS5vYmpl
Y3RTdG9yZXMuZ2VuZXJhbC5wdXQodGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zLCBXZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmV4dGVuc2lvblRhYlBvc2l0aW9uc09iamVjdFN0b3Jl
S2V5KTsKKyAgICAgICAgICAgIH0sIDUwMDApOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5f
c2F2ZVRhYlBvc2l0aW9uc1RvT2JqZWN0U3RvcmVUaW1lb3V0LmRlbGF5Rm9yVGltZSgzMDAwKTsK
KyAgICB9CisKKyAgICBfaW5zZXJ0aW9uSW5kZXhGb3JFeHRlbnNpb25UYWIodGFiQ29udGVudFZp
ZXcsIG9wdGlvbnMgPSB7fSkKKyAgICB7CisgICAgICAgIGxldCB7YW5jaG9yVGFiVHlwZSwgYmFz
ZUluZGV4LCByZWxhdGl2ZUluZGV4fSA9IHRoaXMuX2NvbXB1dGVJbmRpY2VzRm9yRXh0ZW5zaW9u
VGFiKHRhYkNvbnRlbnRWaWV3LCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIGJhc2VJbmRleCAr
IHJlbGF0aXZlSW5kZXggKyAxOworICAgIH0KKworICAgIF9jb21wdXRlSW5kaWNlc0ZvckV4dGVu
c2lvblRhYih0YWJDb250ZW50Vmlldywgb3B0aW9ucyA9IHt9KQorICAgIHsKKyAgICAgICAgLy8g
Tm90ZTogcGlubmVkIHRhYnMgYWx3YXlzIGFwcGVhciBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgc28g
d2UgY2FuIGlnbm9yZSB0aGVtCisgICAgICAgIC8vIGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0
aW5nIGFuIGBpbnNlcnRpb25JbmRleGBgIGZvciBgdGFiQ29udGVudFZpZXdgLgorICAgICAgICBs
ZXQgdmlzaWJsZVRhYnMgPSBXSS50YWJCcm93c2VyLnRhYkJhci50YWJCYXJJdGVtcy5maWx0ZXIo
KHRhYkJhckl0ZW0pID0+ICF0YWJCYXJJdGVtLmhpZGRlbiAmJiAhKHRhYkJhckl0ZW0gaW5zdGFu
Y2VvZiBXSS5QaW5uZWRUYWJCYXJJdGVtKSk7CisgICAgICAgIGxldCBiYXNlSW5kZXggPSAwOwor
ICAgICAgICBsZXQgc2F2ZWRQb3NpdGlvbnMgPSB0aGlzLl9leHRlbnNpb25UYWJQb3NpdGlvbnNb
dGFiQ29udGVudFZpZXcuc2F2ZWRUYWJQb3NpdGlvbktleV0gfHwge307CisgICAgICAgIGxldCBh
bmNob3JUYWJUeXBlID0gIW9wdGlvbnMucmVjb21wdXRlUG9zaXRpb25zID8gc2F2ZWRQb3NpdGlv
bnMuYW5jaG9yVGFiVHlwZSA6IG51bGw7CisgICAgICAgIGxldCByZWxhdGl2ZUluZGV4ID0gIW9w
dGlvbnMucmVjb21wdXRlUG9zaXRpb25zID8gc2F2ZWRQb3NpdGlvbnMucmVsYXRpdmVJbmRleCA6
IDA7CisKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlVGFicy5sZW5ndGg7IGkr
KykgeworICAgICAgICAgICAgbGV0IHZpc2libGVUYWIgPSB2aXNpYmxlVGFic1tpXS5yZXByZXNl
bnRlZE9iamVjdDsKKyAgICAgICAgICAgIC8vIFN0b3AgbG9va2luZyBvbmNlIHdlJ3ZlIGZvdW5k
IHRoZSB0YXJnZXQgdGFiLgorICAgICAgICAgICAgaWYgKHZpc2libGVUYWIgPT09IHRhYkNvbnRl
bnRWaWV3KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBTa2lwIHBh
c3QgZXh0ZW5zaW9uIHRhYnMuCisgICAgICAgICAgICBpZiAoIXZpc2libGVUYWIuY29uc3RydWN0
b3Iuc2hvdWxkU2F2ZVRhYigpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
ICAgICAvLyBXZSd2ZSBmb3VuZCB0aGUgbmV4dCBhbmNob3IgdGFiLgorICAgICAgICAgICAgaWYg
KG9wdGlvbnMucmVjb21wdXRlUG9zaXRpb25zKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVGFi
VHlwZSA9IHZpc2libGVUYWIudHlwZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGxvb2tpbmcgZm9yIHNhdmVkUG9zaXRpb25zLmFu
Y2hvclRhYlR5cGUsIGtlZXAgbG9va2luZy4KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpc2libGVU
YWIudHlwZSAhPT0gYW5jaG9yVGFiVHlwZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgYmFzZUluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisKKyAgICAgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIG5vbi1zYXZlYWJsZSB0YWJzIGFmdGVy
IHRoZSBhbmNob3IgdGFiIHRvIGNvbXB1dGUgdGhlIHJlYWwgcmVsYXRpdmVJbmRleC4KKyAgICAg
ICAgLy8gQWRkaW5nIGByZWxhdGl2ZUluZGV4YCB0byBgYmFzZUluZGV4YCBzaG91bGQgbm90IGlu
c2VydCB0aGUgdGFiIGFmdGVyIGEgZGlmZmVyZW50IGFuY2hvciB0YWIuCisgICAgICAgIGZvciAo
bGV0IGogPSAxOyBqIDwgdmlzaWJsZVRhYnMubGVuZ3RoIC0gYmFzZUluZGV4OyBqKyspIHsKKyAg
ICAgICAgICAgIGlmICh2aXNpYmxlVGFic1tiYXNlSW5kZXggKyBqXS5yZXByZXNlbnRlZE9iamVj
dC5jb25zdHJ1Y3Rvci5zaG91bGRTYXZlVGFiKCkpIHsKKyAgICAgICAgICAgICAgICByZWxhdGl2
ZUluZGV4ID0gTnVtYmVyLmNvbnN0cmFpbihyZWxhdGl2ZUluZGV4LCAwLCBNYXRoLm1heCgwLCBq
IC0gMSkpOworICAgICAgICAgICAgICAgIHJldHVybiB7YW5jaG9yVGFiVHlwZSwgYmFzZUluZGV4
LCByZWxhdGl2ZUluZGV4fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8v
IElmIHRoZSBhbmNob3IgdGFiIGlzIG5vdyBoaWRkZW4gdXBvbiByZXN0b3JpbmcsIHBsYWNlIHRo
ZSBleHRlbnNpb24gYXQgdGhlIGVuZC4KKyAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYg
YSBzbWFsbGVyIHNldCBvZiB0YWJzIGFyZSBlbmFibGVkIGZvciB0aGUgaW5zcGVjdGlvbiB0YXJn
ZXQuCisgICAgICAgIGJhc2VJbmRleCA9IHZpc2libGVUYWJzLmxlbmd0aCAtIDE7CisgICAgICAg
IHJldHVybiB7YW5jaG9yVGFiVHlwZSwgYmFzZUluZGV4LCByZWxhdGl2ZUluZGV4fTsKKyAgICB9
CisKICAgICBfaGFuZGxlTWFpblJlc291cmNlRGlkQ2hhbmdlKGV2ZW50KQogICAgIHsKICAgICAg
ICAgaWYgKCFldmVudC50YXJnZXQuaXNNYWluRnJhbWUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1dlYkluc3BlY3RvckV4dGVuc2lvblRh
YkNvbnRlbnRWaWV3LmpzIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmll
d3MvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcuanMKaW5kZXggNDJmOGYyYTlj
OTA2MWIwMTg3OTIzMWY2MDFkODhmNTg2NTY3MjYzZi4uYjhjNzNkNGExMGVjMmI3ZjRhZTk5YWUz
MDliNGFkNGU5NmUxYWY4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvVmlld3MvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcuanMKKysr
IGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uVGFiQ29udGVudFZpZXcuanMKQEAgLTczLDYgKzczLDExIEBAIFdJLldlYkluc3Bl
Y3RvckV4dGVuc2lvblRhYkNvbnRlbnRWaWV3ID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9u
VGFiQ29udGVudFZpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGdldCBzYXZl
ZFRhYlBvc2l0aW9uS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBgRXh0ZW5zaW9uVGFiLSR7
dGhpcy5fZXh0ZW5zaW9uLmV4dGVuc2lvbkJ1bmRsZUlkZW50aWZpZXJ9LSR7dGhpcy5fdGFiSW5m
by5kaXNwbGF5TmFtZX1gOworICAgIH0KKwogICAgIHdoZW5QYWdlQXZhaWxhYmxlKCkKICAgICB7
CiAgICAgICAgIHJldHVybiB0aGlzLl93aGVuUGFnZUF2YWlsYWJsZVByb21pc2UucHJvbWlzZTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>446823</attachid>
            <date>2021-12-10 15:05:46 -0800</date>
            <delta_ts>2021-12-10 15:56:53 -0800</delta_ts>
            <desc>Patch v1.1</desc>
            <filename>bug-234115-20211210150545.patch</filename>
            <type>text/plain</type>
            <size>14236</size>
            <attacher name="Blaze Burg">bburg</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2Nzk5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCA5
ZjlkZTg2MmY1ODZkZDhmYjA2YzgwZTEzMTQxNjA3YTc4ZjZjYjkyLi5lYmNjMzU0NjY3MWNhYmQ1
MTE2ZjA3NmJjNjBlMzFkMWFjYzk1MmMyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw2NyBAQAorMjAyMS0xMi0xMCAgQkogQnVyZyAgPGJidXJnQGFwcGxlLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBzYXZlIGFuZCByZXN0b3JlIGV4dGVuc2lvbiB0YWIgcG9zaXRp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQx
MTUKKyAgICAgICAgPHJkYXI6Ly84NTU2MDYzNj4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgZXhpc3RpbmcgdGFiIHN0YXRlIHJlc3RvcmF0aW9u
IHN5c3RlbSB3b3JrcyBieSBzYXZpbmcgb3IgbG9hZGluZyB0YWIgcG9zaXRpb25zCisgICAgICAg
IGZyb20gcGVyc2lzdGVudCBzdG9yYWdlIGFuZCBzYXZpbmcgb3IgcmVzdG9yaW5nIGVhY2ggdGFi
J3Mgc3RhdGUgdXNpbmcgb25lIGNvb2tpZSBwZXIgdGFiIHR5cGUuCisKKyAgICAgICAgV2l0aCBl
eHRlbnNpb24gdGFicywgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSB0
YWIgcGVyIHRhYiB0eXBlLgorICAgICAgICBBZGRpdGlvbmFsbHksIGV4dGVuc2lvbiB0YWJzIGNh
biBiZSBhZGRlZCBhdCBhbnkgdGltZSB2aWEgSW5zcGVjdG9yRnJvbnRlbmRBUEkuCisgICAgICAg
IEdpdmVuIHRoZXNlIGNoYWxsZW5nZXMsIHdlIG5lZWQgYSBkaWZmZXJlbnQgc3lzdGVtIGZvciBz
YXZpbmcgYW5kIHJlc3RvcmluZyBleHRlbnNpb24gdGFicy4KKworICAgICAgICBFeHRlbnNpb24g
dGFiIHJlc3RvcmF0aW9uIGlzIG5vdyBoYW5kbGVkIGJ5IFdJLldlYkluc3BlY3RvckV4dGVuc2lv
bkNvbnRyb2xsZXIuCisgICAgICAgIFdlIGNvbnNpZGVyIGEgdGFiIHRvIGJlIGFuICdhbmNob3In
IHRhYiBpZiBpdCBpcyBzYXZlYWJsZSwgdmlzaWJsZSwgYW5kIG5vdCBwaW5uYWJsZS4KKyAgICAg
ICAgSW4gb3RoZXIgd29yZHMsIGFuIGFuY2hvciB0YWIgaXMgb25lIG9mIHRoZSBidWlsdC1pbiBz
aW5nbGV0b24gdGFicyBsaWtlIENvbnNvbGUsIEVsZW1lbnRzLCBldGMuCisKKyAgICAgICAgV2hl
biB0aGUgdGFiIGJhciBpdGVtIGxpc3QgaXMgbW9kaWZpZWQsIGZvciBlYWNoIGV4dGVuc2lvbiB0
YWIsIHdlIHNhdmUgdGhlIG9ic2VydmVkCisgICAgICAgICdhbmNob3InIHRhYidzIHR5cGUgYW5k
IGEgZGlzdGFuY2UgZnJvbSB0aGF0IGFuY2hvciB0YWIncyBpbnNlcnRpb24gaW5kZXguCisgICAg
ICAgIFVwZGF0ZXMgdG8gZXh0ZW5zaW9uIHRhYiBwb3NpdGlvbnMgYXJlIHNhdmVkIHRvIHBlcnNp
c3RlbnQgc3RvcmFnZSBhdCBtb3N0IGV2ZXJ5IDUgc2Vjb25kcy4KKworICAgICAgICBXaGVuIGl0
IGlzIHRpbWUgdG8gcGxhY2UgYW4gZXh0ZW5zaW9uIHRhYiB3aXRoIGNyZWF0ZVRhYkZvckV4dGVu
c2lvbigpIG9yIHNob3dFeHRlbnNpb25UYWIoKSwKKyAgICAgICAgcGVyZm9ybSB0aGUgcmV2ZXJz
ZSBvcGVyYXRpb24gb2YgY29tcHV0aW5nIGFuIGluc2VydGlvbiBpbmRleCBmcm9tIGEgYW5jaG9y
VGFiVHlwZSBhbmQgZGlzdGFuY2VGcm9tQW5jaG9yVGFiLgorCisgICAgICAgIFRoaXMgcGF0Y2gg
d2FzIHRlc3RlZCB3aXRoIG9uZSBleHRlbnNpb24sIG11bHRpcGxlIGV4dGVuc2lvbnMsIHNob3dp
bmcvaGlkaW5nIGV4dGVuc2lvbiB0YWJzLAorICAgICAgICByZW1vdGUgaW5zcGVjdGluZyBhIEpT
Q29udGV4dCwgYW5kIHJlbW90ZSBpbnNwZWN0aW5nIGEgV0tXZWJWaWV3LgorCisgICAgICAgICog
VXNlckludGVyZmFjZS9WaWV3cy9UYWJCYXIuanM6CisgICAgICAgIChXSS5UYWJCYXIucHJvdG90
eXBlLmdldCB2aXNpYmxlVGFiQmFySXRlbXMpOgorCisgICAgICAgICogVXNlckludGVyZmFjZS9D
b250cm9sbGVycy9XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmpzOgorICAgICAgICAo
V0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlcik6CisgICAgICAgIChXSS5XZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmdldCBleHRlbnNpb25UYWJQb3NpdGlvbnNPYmplY3RT
dG9yZUtleSk6IEFkZGVkLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250
cm9sbGVyLnByb3RvdHlwZS5yZWdpc3RlckV4dGVuc2lvbik6CisgICAgICAgIChXSS5XZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyRXh0ZW5zaW9uKToK
KyAgICAgICAgQWRkIGFuZCByZW1vdmUgV0kuVGFiQmFyIGV2ZW50IGxpc3RlbmVycyB0aGF0IG5v
dGlmeSB1cyBvZiBjaGFuZ2VzIHRvIHRoZSB0YWIgYmFyLgorCisgICAgICAgIChXSS5XZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3RvdHlwZS5jcmVhdGVUYWJGb3JFeHRlbnNpb24p
OiBEZWxldGVkLgorICAgICAgICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5w
cm90b3R5cGUuYXN5bmMgY3JlYXRlVGFiRm9yRXh0ZW5zaW9uKTogUmVuYW1lZC4KKyAgICAgICAg
TG9hZCBzYXZlZCB0YWIgcG9zaXRpb25zIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlIGlmIG5lZWRl
ZC4gQ29tcHV0ZSB0aGUgaW5zZXJ0aW9uIGluZGV4IGZvciB0aGUgbmV3IHRhYi4KKyAgICAgICAg
VGhpcyBtZXRob2QgaXMgYWxyZWFkeSBleHBlY3RlZCB0byByZXR1cm4gYSBwcm9taXNlLCBzbyBt
YWtlIGl0IGBhc3luY2AgdG8gYWxsb3cgdXNpbmcgYGF3YWl0YC4KKworICAgICAgICAoV0kuV2Vi
SW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUuc2hvd0V4dGVuc2lvblRhYik6
CisgICAgICAgIENvbXB1dGUgdGhlIGluc2VydGlvbiBpbmRleCBmb3IgdGhlIG5ldyB0YWIuCisK
KyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLmFz
eW5jIF9sb2FkRXh0ZW5zaW9uVGFiUG9zaXRpb25zKToKKyAgICAgICAgTG9hZCBzYXZlZCB0YWIg
cG9zaXRpb25zIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlLCBhbGxvd2luZyBmb3IgdGhlIGNhc2Ug
d2hlcmUgbm90aGluZyBoYXMgYmVlbiBzYXZlZCB5ZXQuCisKKyAgICAgICAgKFdJLldlYkluc3Bl
Y3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLmFzeW5jIF9zYXZlRXh0ZW5zaW9uVGFi
UG9zaXRpb25zKToKKyAgICAgICAgUmVjb21wdXRlIGFuZCBzYXZlIHRhYiBwb3NpdGlvbnMgZm9y
IGFsbCBleHRlbnNpb24gdGFicy4gVGhlbiB3cml0ZSB0byBwZXJzaXN0ZW50IHN0b3JhZ2UKKyAg
ICAgICAgYXQgbW9zdCBldmVyeSA1IHNlY29uZHMgdXNpbmcgYSBXSS5EZWJvdW5jZXIuCisKKyAg
ICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9pbnNl
cnRpb25JbmRleEZvckV4dGVuc2lvblRhYik6IEFkZGVkLCB3cmFwcGVyIG1ldGhvZC4KKyAgICAg
ICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9jb21wdXRl
SW5kaWNlc0ZvckV4dGVuc2lvblRhYik6CisgICAgICAgIENvbXB1dGUgdGhlIGFuY2hvclRhYlR5
cGUsIGRpc3RhbmNlRnJvbUFuY2hvclRhYiwgYW5kIGluc2VydGlvbkluZGV4IGZvciB0aGUgZXh0
ZW5zaW9uIHRhYi4KKyAgICAgICAgSWYgc2F2aW5nIHRhYiBwb3NpdGlvbnMsIHBhc3MgYG9wdGlv
bnMucmVjb21wdXRlUG9zaXRpb25zYCB0byBpZ25vcmUgc2F2ZWQgcG9zaXRpb25zCisgICAgICAg
IGFuZCByZWNvbXB1dGUgdGhlc2UgZmllbGRzIGJhc2VkIG9uIHdoYXQgaXMgY3VycmVudGx5IHZp
c2libGUgaW4gdGhlIHRhYiBiYXIuCisKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1dl
Ykluc3BlY3RvckV4dGVuc2lvblRhYkNvbnRlbnRWaWV3LmpzOgorICAgICAgICAoV0kuV2ViSW5z
cGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcucHJvdG90eXBlLmdldCBzYXZlZFRhYlBvc2l0
aW9uS2V5KTogQWRkZWQuCisKIDIwMjEtMTItMDggIEJKIEJ1cmcgIDxiYnVyZ0BhcHBsZS5jb20+
CiAKICAgICAgICAgW0NvY29hXSBXZWIgSW5zcGVjdG9yOiBwcm92aWRlIGEgd2F5IGZvciBfV0tJ
bnNwZWN0b3JFeHRlbnNpb24gY2xpZW50cyB0byBiZSB0byBub3RpZmllZCB3aGVuIGFuIGV4dGVu
c2lvbiB0YWIgbmF2aWdhdGVzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNl
ckludGVyZmFjZS9Db250cm9sbGVycy9XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmpz
IGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5z
cGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5qcwppbmRleCA3ZmViNDVkYzg3YzQ2M2RmM2NmOTVk
ZDkzZDAwYmI4MzRkZTNjNGQ3Li4zNGFiYWU5ZDNjMDMyM2ZkZTU1ZWVhMWMwZWMyMjk1MjdmYWQ2
NzdlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250
cm9sbGVycy9XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmpzCisrKyBiL1NvdXJjZS9X
ZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1dlYkluc3BlY3RvckV4dGVu
c2lvbkNvbnRyb2xsZXIuanMKQEAgLTM0LDkgKzM0LDE5IEBAIFdJLldlYkluc3BlY3RvckV4dGVu
c2lvbkNvbnRyb2xsZXIgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4
dGVuCiAgICAgICAgIHRoaXMuX3RhYklEc0ZvckV4dGVuc2lvbklETWFwID0gbmV3IE11bHRpbWFw
OwogICAgICAgICB0aGlzLl9uZXh0RXh0ZW5zaW9uVGFiSUQgPSAxOwogCisgICAgICAgIHRoaXMu
X2V4dGVuc2lvblRhYlBvc2l0aW9ucyA9IG51bGw7CisgICAgICAgIHRoaXMuX3NhdmVUYWJQb3Np
dGlvbnNEZWJvdW5jZXIgPSBudWxsOworCiAgICAgICAgIFdJLkZyYW1lLmFkZEV2ZW50TGlzdGVu
ZXIoV0kuRnJhbWUuRXZlbnQuTWFpblJlc291cmNlRGlkQ2hhbmdlLCB0aGlzLl9oYW5kbGVNYWlu
UmVzb3VyY2VEaWRDaGFuZ2UsIHRoaXMpOwogICAgIH0KIAorICAgIC8vIFN0YXRpYworCisgICAg
c3RhdGljIGdldCBleHRlbnNpb25UYWJQb3NpdGlvbnNPYmplY3RTdG9yZUtleSgpCisgICAgewor
ICAgICAgICByZXR1cm4gImV4dGVuc2lvbi10YWItcG9zaXRpb25zIjsKKyAgICB9CisKICAgICAv
LyBQdWJsaWMKIAogICAgIGdldCByZWdpc3RlcmVkRXh0ZW5zaW9uSURzKCkKQEAgLTUxLDYgKzYx
LDEyIEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgPSBjbGFzcyBXZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAgICAgICAgICAgICByZXR1cm4gV0kuV2Vi
SW5zcGVjdG9yRXh0ZW5zaW9uLkVycm9yQ29kZS5SZWdpc3RyYXRpb25GYWlsZWQ7CiAgICAgICAg
IH0KIAorICAgICAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbkZvckV4dGVuc2lvbklETWFwLnNpemUp
IHsKKyAgICAgICAgICAgIFdJLnRhYkJyb3dzZXIudGFiQmFyLmFkZEV2ZW50TGlzdGVuZXIoV0ku
VGFiQmFyLkV2ZW50LlRhYkJhckl0ZW1BZGRlZCwgdGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0
aW9ucywgdGhpcyk7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5hZGRFdmVudExp
c3RlbmVyKFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtUmVtb3ZlZCwgdGhpcy5fc2F2ZUV4dGVu
c2lvblRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJh
ci5hZGRFdmVudExpc3RlbmVyKFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtc1Jlb3JkZXJlZCwg
dGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAgICAgIH0KKwogICAg
ICAgICBsZXQgZXh0ZW5zaW9uID0gbmV3IFdJLldlYkluc3BlY3RvckV4dGVuc2lvbihleHRlbnNp
b25JRCwgZXh0ZW5zaW9uQnVuZGxlSWRlbnRpZmllciwgZGlzcGxheU5hbWUpOwogICAgICAgICB0
aGlzLl9leHRlbnNpb25Gb3JFeHRlbnNpb25JRE1hcC5zZXQoZXh0ZW5zaW9uSUQsIGV4dGVuc2lv
bik7CiAKQEAgLTY1LDYgKzgxLDEyIEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xs
ZXIgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAgICAgICAg
ICAgICByZXR1cm4gV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uLkVycm9yQ29kZS5JbnZhbGlkUmVx
dWVzdDsKICAgICAgICAgfQogCisgICAgICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uRm9yRXh0ZW5z
aW9uSURNYXAuc2l6ZSkgeworICAgICAgICAgICAgV0kudGFiQnJvd3Nlci50YWJCYXIucmVtb3Zl
RXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFySXRlbUFkZGVkLCB0aGlzLl9zYXZl
RXh0ZW5zaW9uVGFiUG9zaXRpb25zLCB0aGlzKTsKKyAgICAgICAgICAgIFdJLnRhYkJyb3dzZXIu
dGFiQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoV0kuVGFiQmFyLkV2ZW50LlRhYkJhckl0ZW1SZW1v
dmVkLCB0aGlzLl9zYXZlRXh0ZW5zaW9uVGFiUG9zaXRpb25zLCB0aGlzKTsKKyAgICAgICAgICAg
IFdJLnRhYkJyb3dzZXIudGFiQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoV0kuVGFiQmFyLkV2ZW50
LlRhYkJhckl0ZW1zUmVvcmRlcmVkLCB0aGlzLl9zYXZlRXh0ZW5zaW9uVGFiUG9zaXRpb25zLCB0
aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGxldCBleHRlbnNpb25UYWJJRHNUb1JlbW92ZSA9
IHRoaXMuX3RhYklEc0ZvckV4dGVuc2lvbklETWFwLnRha2UoZXh0ZW5zaW9uSUQpIHx8IFtdOwog
ICAgICAgICBmb3IgKGxldCBleHRlbnNpb25UYWJJRCBvZiBleHRlbnNpb25UYWJJRHNUb1JlbW92
ZSkgewogICAgICAgICAgICAgbGV0IHRhYkNvbnRlbnRWaWV3ID0gdGhpcy5fZXh0ZW5zaW9uVGFi
Q29udGVudFZpZXdGb3JFeHRlbnNpb25UYWJJRE1hcC50YWtlKGV4dGVuc2lvblRhYklEKTsKQEAg
LTc3LDcgKzk5LDcgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNz
IFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KICAgICAgICAgdGhpcy5kaXNw
YXRjaEV2ZW50VG9MaXN0ZW5lcnMoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5F
dmVudC5FeHRlbnNpb25SZW1vdmVkLCB7ZXh0ZW5zaW9ufSk7CiAgICAgfQogCi0gICAgY3JlYXRl
VGFiRm9yRXh0ZW5zaW9uKGV4dGVuc2lvbklELCB0YWJOYW1lLCB0YWJJY29uVVJMLCBzb3VyY2VV
UkwpCisgICAgYXN5bmMgY3JlYXRlVGFiRm9yRXh0ZW5zaW9uKGV4dGVuc2lvbklELCB0YWJOYW1l
LCB0YWJJY29uVVJMLCBzb3VyY2VVUkwpCiAgICAgewogICAgICAgICBsZXQgZXh0ZW5zaW9uID0g
dGhpcy5fZXh0ZW5zaW9uRm9yRXh0ZW5zaW9uSURNYXAuZ2V0KGV4dGVuc2lvbklEKTsKICAgICAg
ICAgaWYgKCFleHRlbnNpb24pIHsKQEAgLTkwLDcgKzExMiwxNCBAQCBXSS5XZWJJbnNwZWN0b3JF
eHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxl
ciBleHRlbgogCiAgICAgICAgIHRoaXMuX3RhYklEc0ZvckV4dGVuc2lvbklETWFwLmFkZChleHRl
bnNpb25JRCwgZXh0ZW5zaW9uVGFiSUQpOwogICAgICAgICB0aGlzLl9leHRlbnNpb25UYWJDb250
ZW50Vmlld0ZvckV4dGVuc2lvblRhYklETWFwLnNldChleHRlbnNpb25UYWJJRCwgdGFiQ29udGVu
dFZpZXcpOwotICAgICAgICBXSS50YWJCcm93c2VyLmFkZFRhYkZvckNvbnRlbnRWaWV3KHRhYkNv
bnRlbnRWaWV3LCB7c3VwcHJlc3NBbmltYXRpb25zOiB0cnVlfSk7CisKKyAgICAgICAgaWYgKCF0
aGlzLl9leHRlbnNpb25UYWJQb3NpdGlvbnMpCisgICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2Fk
RXh0ZW5zaW9uVGFiUG9zaXRpb25zKCk7CisKKyAgICAgICAgV0kudGFiQnJvd3Nlci5hZGRUYWJG
b3JDb250ZW50Vmlldyh0YWJDb250ZW50VmlldywgeworICAgICAgICAgICAgc3VwcHJlc3NBbmlt
YXRpb25zOiB0cnVlLAorICAgICAgICAgICAgaW5zZXJ0aW9uSW5kZXg6IHRoaXMuX2luc2VydGlv
bkluZGV4Rm9yRXh0ZW5zaW9uVGFiKHRhYkNvbnRlbnRWaWV3KSwKKyAgICAgICAgfSk7CiAKICAg
ICAgICAgLy8gVGhlIGNhbGxpbmcgY29udmVudGlvbiBpcyB0byByZXR1cm4gYW4gZXJyb3Igc3Ry
aW5nIG9yIGEgcmVzdWx0IG9iamVjdC4KICAgICAgICAgcmV0dXJuIHsicmVzdWx0IjogZXh0ZW5z
aW9uVGFiSUR9OwpAQCAtMTc0LDYgKzIwMyw3IEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNv
bnRyb2xsZXIgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAg
ICAgICAgIHRhYkNvbnRlbnRWaWV3LnZpc2libGUgPSB0cnVlOwogICAgICAgICBsZXQgc3VjY2Vz
cyA9IFdJLnRhYkJyb3dzZXIuc2hvd1RhYkZvckNvbnRlbnRWaWV3KHRhYkNvbnRlbnRWaWV3LCB7
CiAgICAgICAgICAgICAuLi5vcHRpb25zLAorICAgICAgICAgICAgaW5zZXJ0aW9uSW5kZXg6IHRo
aXMuX2luc2VydGlvbkluZGV4Rm9yRXh0ZW5zaW9uVGFiKHRhYkNvbnRlbnRWaWV3KSwKICAgICAg
ICAgICAgIGluaXRpYXRvckhpbnQ6IFdJLlRhYkJyb3dzZXIuVGFiTmF2aWdhdGlvbkluaXRpYXRv
ci5Gcm9udGVuZEFQSSwKICAgICAgICAgfSk7CiAKQEAgLTI4NCw2ICszMTQsODMgQEAgV0kuV2Vi
SW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3BlY3RvckV4dGVuc2lv
bkNvbnRyb2xsZXIgZXh0ZW4KIAogICAgIC8vIFByaXZhdGUKIAorICAgIGFzeW5jIF9sb2FkRXh0
ZW5zaW9uVGFiUG9zaXRpb25zKCkKKyAgICB7CisgICAgICAgIGxldCBzYXZlZFRhYlBvc2l0aW9u
cyA9IGF3YWl0IFdJLm9iamVjdFN0b3Jlcy5nZW5lcmFsLmdldChXZWJJbnNwZWN0b3JFeHRlbnNp
b25Db250cm9sbGVyLmV4dGVuc2lvblRhYlBvc2l0aW9uc09iamVjdFN0b3JlS2V5KTsKKyAgICAg
ICAgdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zID0gc2F2ZWRUYWJQb3NpdGlvbnMgfHwge307
CisgICAgfQorCisgICAgYXN5bmMgX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMoKQorICAgIHsK
KyAgICAgICAgaWYgKCF0aGlzLl9leHRlbnNpb25UYWJQb3NpdGlvbnMpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgZm9yIChsZXQgdGFiQmFySXRlbSBvZiBXSS50YWJCcm93c2VyLnRh
YkJhci52aXNpYmxlVGFiQmFySXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghKHRhYkJhckl0ZW0u
cmVwcmVzZW50ZWRPYmplY3QgaW5zdGFuY2VvZiBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJD
b250ZW50VmlldykpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGxl
dCB7YW5jaG9yVGFiVHlwZSwgYW5jaG9yVGFiSW5kZXgsIGRpc3RhbmNlRnJvbUFuY2hvclRhYn0g
PSB0aGlzLl9jb21wdXRlSW5kaWNlc0ZvckV4dGVuc2lvblRhYih0YWJCYXJJdGVtLnJlcHJlc2Vu
dGVkT2JqZWN0LCB7cmVjb21wdXRlUG9zaXRpb25zOiB0cnVlfSk7CisgICAgICAgICAgICB0aGlz
Ll9leHRlbnNpb25UYWJQb3NpdGlvbnNbdGFiQmFySXRlbS5yZXByZXNlbnRlZE9iamVjdC5zYXZl
ZFRhYlBvc2l0aW9uS2V5XSA9IHthbmNob3JUYWJUeXBlLCBkaXN0YW5jZUZyb21BbmNob3JUYWJ9
OworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fc2F2ZVRhYlBvc2l0aW9uc0RlYm91bmNlciB8
fD0gbmV3IERlYm91bmNlcigoKSA9PiB7CisgICAgICAgICAgICBXSS5vYmplY3RTdG9yZXMuZ2Vu
ZXJhbC5wdXQodGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zLCBXZWJJbnNwZWN0b3JFeHRlbnNp
b25Db250cm9sbGVyLmV4dGVuc2lvblRhYlBvc2l0aW9uc09iamVjdFN0b3JlS2V5KTsKKyAgICAg
ICAgfSwgNTAwMCk7CisKKyAgICAgICAgdGhpcy5fc2F2ZVRhYlBvc2l0aW9uc0RlYm91bmNlci5k
ZWxheUZvclRpbWUoMzAwMCk7CisgICAgfQorCisgICAgX2luc2VydGlvbkluZGV4Rm9yRXh0ZW5z
aW9uVGFiKHRhYkNvbnRlbnRWaWV3LCBvcHRpb25zID0ge30pCisgICAgeworICAgICAgICBsZXQg
e2FuY2hvclRhYlR5cGUsIGFuY2hvclRhYkluZGV4LCBkaXN0YW5jZUZyb21BbmNob3JUYWJ9ID0g
dGhpcy5fY29tcHV0ZUluZGljZXNGb3JFeHRlbnNpb25UYWIodGFiQ29udGVudFZpZXcsIG9wdGlv
bnMpOworICAgICAgICByZXR1cm4gYW5jaG9yVGFiSW5kZXggKyBkaXN0YW5jZUZyb21BbmNob3JU
YWIgKyAxOworICAgIH0KKworICAgIF9jb21wdXRlSW5kaWNlc0ZvckV4dGVuc2lvblRhYih0YWJD
b250ZW50Vmlldywge3JlY29tcHV0ZVBvc2l0aW9uc30gPSB7fSkKKyAgICB7CisgICAgICAgIC8v
IE5vdGU6IHBpbm5lZCB0YWJzIGFsd2F5cyBhcHBlYXIgb24gdGhlIHRyYWlsaW5nIGVkZ2UsIHNv
IHdlIGNhbiBpZ25vcmUgdGhlbQorICAgICAgICAvLyBmb3IgdGhlIHB1cnBvc2VzIG9mIGNvbXB1
dGluZyBhbiBgaW5zZXJ0aW9uSW5kZXhgYCBmb3IgYHRhYkNvbnRlbnRWaWV3YC4KKyAgICAgICAg
bGV0IGFuY2hvclRhYkluZGV4ID0gMDsKKyAgICAgICAgbGV0IHNhdmVkUG9zaXRpb25zID0gdGhp
cy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zW3RhYkNvbnRlbnRWaWV3LnNhdmVkVGFiUG9zaXRpb25L
ZXldIHx8IHt9OworICAgICAgICBsZXQgYW5jaG9yVGFiVHlwZSA9ICFyZWNvbXB1dGVQb3NpdGlv
bnMgPyBzYXZlZFBvc2l0aW9ucy5hbmNob3JUYWJUeXBlIDogbnVsbDsKKyAgICAgICAgbGV0IGRp
c3RhbmNlRnJvbUFuY2hvclRhYiA9ICFyZWNvbXB1dGVQb3NpdGlvbnMgPyBzYXZlZFBvc2l0aW9u
cy5kaXN0YW5jZUZyb21BbmNob3JUYWIgOiAwOworCisgICAgICAgIGxldCB2aXNpYmxlVGFiQmFy
SXRlbXMgPSBXSS50YWJCcm93c2VyLnRhYkJhci52aXNpYmxlVGFiQmFySXRlbXM7CisgICAgICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVRhYkJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7Cisg
ICAgICAgICAgICBsZXQgdmlzaWJsZVRhYiA9IHZpc2libGVUYWJCYXJJdGVtc1tpXS5yZXByZXNl
bnRlZE9iamVjdDsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiID09PSB0YWJDb250ZW50Vmll
dykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKHZpc2libGVUYWIg
aW5zdGFuY2VvZiBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50VmlldykKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHJlY29tcHV0ZVBvc2l0aW9u
cykgeworICAgICAgICAgICAgICAgIGFuY2hvclRhYlR5cGUgPSB2aXNpYmxlVGFiLnR5cGU7Cisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICh2aXNpYmxlVGFiLnR5cGUgIT09IGFuY2hvclRhYlR5cGUpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgICAgIGFuY2hvclRhYkluZGV4ID0gaTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgY291bnQgb2YgZXh0ZW5zaW9u
IHRhYnMgYWZ0ZXIgdGhlIGFuY2hvciB0YWIgdG8gY29tcHV0ZSB0aGUgcmVhbCBkaXN0YW5jZUZy
b21BbmNob3JUYWIuCisgICAgICAgIC8vIEFkZGluZyBgZGlzdGFuY2VGcm9tQW5jaG9yVGFiYCB0
byBgYW5jaG9yVGFiSW5kZXhgIHNob3VsZCBub3QgaW5zZXJ0IHRoZSB0YWIgYWZ0ZXIgYSBkaWZm
ZXJlbnQgYW5jaG9yIHRhYi4KKyAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCB2aXNpYmxlVGFi
QmFySXRlbXMubGVuZ3RoIC0gYW5jaG9yVGFiSW5kZXg7IGorKykgeworICAgICAgICAgICAgaWYg
KHZpc2libGVUYWJCYXJJdGVtc1thbmNob3JUYWJJbmRleCArIGpdLnJlcHJlc2VudGVkT2JqZWN0
LmNvbnN0cnVjdG9yLnNob3VsZFNhdmVUYWIoKSkgeworICAgICAgICAgICAgICAgIGRpc3RhbmNl
RnJvbUFuY2hvclRhYiA9IE51bWJlci5jb25zdHJhaW4oZGlzdGFuY2VGcm9tQW5jaG9yVGFiLCAw
LCBNYXRoLm1heCgwLCBqIC0gMSkpOworICAgICAgICAgICAgICAgIHJldHVybiB7YW5jaG9yVGFi
VHlwZSwgYW5jaG9yVGFiSW5kZXgsIGRpc3RhbmNlRnJvbUFuY2hvclRhYn07CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgYW5jaG9yIHRhYiBpcyBub3cgaGlk
ZGVuIHVwb24gcmVzdG9yaW5nLCBwbGFjZSB0aGUgZXh0ZW5zaW9uIGF0IHRoZSBlbmQuCisgICAg
ICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgc21hbGxlciBzZXQgb2YgdGFicyBhcmUgZW5h
YmxlZCBmb3IgdGhlIGluc3BlY3Rpb24gdGFyZ2V0LgorICAgICAgICBhbmNob3JUYWJJbmRleCA9
IHZpc2libGVUYWJCYXJJdGVtcy5sZW5ndGggLSAxOworICAgICAgICByZXR1cm4ge2FuY2hvclRh
YlR5cGUsIGFuY2hvclRhYkluZGV4LCBkaXN0YW5jZUZyb21BbmNob3JUYWJ9OworICAgIH0KKwog
ICAgIF9oYW5kbGVNYWluUmVzb3VyY2VEaWRDaGFuZ2UoZXZlbnQpCiAgICAgewogICAgICAgICBp
ZiAoIWV2ZW50LnRhcmdldC5pc01haW5GcmFtZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYklu
c3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGFiQmFyLmpzIGIvU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGFiQmFyLmpzCmluZGV4IDUzOWEyMzBiMmYyY2M5
MGNmMmQxNjUzNjc3NTkxYWJhYmY0MWFmMWEuLjZmMzVkNjE1ODE1YmFkOTcxZTE2OWQyNjQ1NDBl
MGM0YjkxNmNlOTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJm
YWNlL1ZpZXdzL1RhYkJhci5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9WaWV3cy9UYWJCYXIuanMKQEAgLTQwNyw2ICs0MDcsMTEgQEAgV0kuVGFiQmFyID0gY2xh
c3MgVGFiQmFyIGV4dGVuZHMgV0kuVmlldwogICAgICAgICByZXR1cm4gdGhpcy5fdGFiQmFySXRl
bXM7CiAgICAgfQogCisgICAgZ2V0IHZpc2libGVUYWJCYXJJdGVtcygpCisgICAgeworICAgICAg
ICAgcmV0dXJuIHRoaXMuX3RhYkJhckl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZGVu
ICYmICEoaXRlbSBpbnN0YW5jZW9mIFdJLlBpbm5lZFRhYkJhckl0ZW0pKTsKKyAgICB9CisKICAg
ICBnZXQgdGFiQ291bnQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXMuX3RhYkJhckl0ZW1z
LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5yZXByZXNlbnRlZE9iamVjdCBpbnN0YW5jZW9mIFdJLlRh
YkNvbnRlbnRWaWV3KS5sZW5ndGg7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5q
cyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1dlYkluc3BlY3Rv
ckV4dGVuc2lvblRhYkNvbnRlbnRWaWV3LmpzCmluZGV4IDQyZjhmMmE5YzkwNjFiMDE4NzkyMzFm
NjAxZDg4ZjU4NjU2NzI2M2YuLmI4YzczZDRhMTBlYzJiN2Y0YWU5OWFlMzA5YjRhZDRlOTZlMWFm
ODggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1dlYkluc3BlY3RvckV4dGVuc2lvblRhYkNvbnRlbnRWaWV3LmpzCisrKyBiL1NvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1dlYkluc3BlY3RvckV4dGVuc2lvblRhYkNv
bnRlbnRWaWV3LmpzCkBAIC03Myw2ICs3MywxMSBAQCBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25U
YWJDb250ZW50VmlldyA9IGNsYXNzIFdlYkluc3BlY3RvckV4dGVuc2lvblRhYkNvbnRlbnRWaQog
ICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBnZXQgc2F2ZWRUYWJQb3NpdGlvbktl
eSgpCisgICAgeworICAgICAgICByZXR1cm4gYEV4dGVuc2lvblRhYi0ke3RoaXMuX2V4dGVuc2lv
bi5leHRlbnNpb25CdW5kbGVJZGVudGlmaWVyfS0ke3RoaXMuX3RhYkluZm8uZGlzcGxheU5hbWV9
YDsKKyAgICB9CisKICAgICB3aGVuUGFnZUF2YWlsYWJsZSgpCiAgICAgewogICAgICAgICByZXR1
cm4gdGhpcy5fd2hlblBhZ2VBdmFpbGFibGVQcm9taXNlLnByb21pc2U7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>446834</attachid>
            <date>2021-12-10 15:56:54 -0800</date>
            <delta_ts>2021-12-10 16:31:49 -0800</delta_ts>
            <desc>Patch v1.2</desc>
            <filename>bug-234115-20211210155654.patch</filename>
            <type>text/plain</type>
            <size>14366</size>
            <attacher name="Blaze Burg">bburg</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2Nzk5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCA5
ZjlkZTg2MmY1ODZkZDhmYjA2YzgwZTEzMTQxNjA3YTc4ZjZjYjkyLi44ZDA1YmZiYzQwOTllNjNm
ZGRmNjRmODk5NjkxZmEwYTlmNDc4MDVjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw2NyBAQAorMjAyMS0xMi0xMCAgQkogQnVyZyAgPGJidXJnQGFwcGxlLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBzYXZlIGFuZCByZXN0b3JlIGV4dGVuc2lvbiB0YWIgcG9zaXRp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQx
MTUKKyAgICAgICAgPHJkYXI6Ly84NTU2MDYzNj4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGUgZXhpc3RpbmcgdGFiIHN0YXRlIHJlc3RvcmF0aW9u
IHN5c3RlbSB3b3JrcyBieSBzYXZpbmcgb3IgbG9hZGluZyB0YWIgcG9zaXRpb25zCisgICAgICAg
IGZyb20gcGVyc2lzdGVudCBzdG9yYWdlIGFuZCBzYXZpbmcgb3IgcmVzdG9yaW5nIGVhY2ggdGFi
J3Mgc3RhdGUgdXNpbmcgb25lIGNvb2tpZSBwZXIgdGFiIHR5cGUuCisKKyAgICAgICAgV2l0aCBl
eHRlbnNpb24gdGFicywgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSB0
YWIgcGVyIHRhYiB0eXBlLgorICAgICAgICBBZGRpdGlvbmFsbHksIGV4dGVuc2lvbiB0YWJzIGNh
biBiZSBhZGRlZCBhdCBhbnkgdGltZSB2aWEgSW5zcGVjdG9yRnJvbnRlbmRBUEkuCisgICAgICAg
IEdpdmVuIHRoZXNlIGNoYWxsZW5nZXMsIHdlIG5lZWQgYSBkaWZmZXJlbnQgc3lzdGVtIGZvciBz
YXZpbmcgYW5kIHJlc3RvcmluZyBleHRlbnNpb24gdGFicy4KKworICAgICAgICBFeHRlbnNpb24g
dGFiIHJlc3RvcmF0aW9uIGlzIG5vdyBoYW5kbGVkIGJ5IFdJLldlYkluc3BlY3RvckV4dGVuc2lv
bkNvbnRyb2xsZXIuCisgICAgICAgIFdlIGNvbnNpZGVyIGEgdGFiIHRvIGJlIGFuICdhbmNob3In
IHRhYiBpZiBpdCBpcyBzYXZlYWJsZSwgdmlzaWJsZSwgYW5kIG5vdCBwaW5uYWJsZS4KKyAgICAg
ICAgSW4gb3RoZXIgd29yZHMsIGFuIGFuY2hvciB0YWIgaXMgb25lIG9mIHRoZSBidWlsdC1pbiBz
aW5nbGV0b24gdGFicyBsaWtlIENvbnNvbGUsIEVsZW1lbnRzLCBldGMuCisKKyAgICAgICAgV2hl
biB0aGUgdGFiIGJhciBpdGVtIGxpc3QgaXMgbW9kaWZpZWQsIGZvciBlYWNoIGV4dGVuc2lvbiB0
YWIsIHdlIHNhdmUgdGhlIG9ic2VydmVkCisgICAgICAgICdhbmNob3InIHRhYidzIHR5cGUgYW5k
IGEgZGlzdGFuY2UgZnJvbSB0aGF0IGFuY2hvciB0YWIncyBpbnNlcnRpb24gaW5kZXguCisgICAg
ICAgIFVwZGF0ZXMgdG8gZXh0ZW5zaW9uIHRhYiBwb3NpdGlvbnMgYXJlIHNhdmVkIHRvIHBlcnNp
c3RlbnQgc3RvcmFnZSBhdCBtb3N0IGV2ZXJ5IDUgc2Vjb25kcy4KKworICAgICAgICBXaGVuIGl0
IGlzIHRpbWUgdG8gcGxhY2UgYW4gZXh0ZW5zaW9uIHRhYiB3aXRoIGNyZWF0ZVRhYkZvckV4dGVu
c2lvbigpIG9yIHNob3dFeHRlbnNpb25UYWIoKSwKKyAgICAgICAgcGVyZm9ybSB0aGUgcmV2ZXJz
ZSBvcGVyYXRpb24gb2YgY29tcHV0aW5nIGFuIGluc2VydGlvbiBpbmRleCBmcm9tIGEgYW5jaG9y
VGFiVHlwZSBhbmQgZGlzdGFuY2VGcm9tQW5jaG9yVGFiLgorCisgICAgICAgIFRoaXMgcGF0Y2gg
d2FzIHRlc3RlZCB3aXRoIG9uZSBleHRlbnNpb24sIG11bHRpcGxlIGV4dGVuc2lvbnMsIHNob3dp
bmcvaGlkaW5nIGV4dGVuc2lvbiB0YWJzLAorICAgICAgICByZW1vdGUgaW5zcGVjdGluZyBhIEpT
Q29udGV4dCwgYW5kIHJlbW90ZSBpbnNwZWN0aW5nIGEgV0tXZWJWaWV3LgorCisgICAgICAgICog
VXNlckludGVyZmFjZS9WaWV3cy9UYWJCYXIuanM6CisgICAgICAgIChXSS5UYWJCYXIucHJvdG90
eXBlLmdldCB2aXNpYmxlVGFiQmFySXRlbXNGcm9tTGVmdFRvUmlnaHQpOiBBZGRlZC4KKworICAg
ICAgICAqIFVzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29u
dHJvbGxlci5qczoKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIp
OgorICAgICAgICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5nZXQgZXh0ZW5z
aW9uVGFiUG9zaXRpb25zT2JqZWN0U3RvcmVLZXkpOiBBZGRlZC4KKworICAgICAgICAoV0kuV2Vi
SW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUucmVnaXN0ZXJFeHRlbnNpb24p
OgorICAgICAgICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUu
dW5yZWdpc3RlckV4dGVuc2lvbik6CisgICAgICAgIEFkZCBhbmQgcmVtb3ZlIFdJLlRhYkJhciBl
dmVudCBsaXN0ZW5lcnMgdGhhdCBub3RpZnkgdXMgb2YgY2hhbmdlcyB0byB0aGUgdGFiIGJhci4K
KworICAgICAgICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUu
Y3JlYXRlVGFiRm9yRXh0ZW5zaW9uKTogRGVsZXRlZC4KKyAgICAgICAgKFdJLldlYkluc3BlY3Rv
ckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLmFzeW5jIGNyZWF0ZVRhYkZvckV4dGVuc2lv
bik6IFJlbmFtZWQuCisgICAgICAgIExvYWQgc2F2ZWQgdGFiIHBvc2l0aW9ucyBmcm9tIHBlcnNp
c3RlbnQgc3RvcmFnZSBpZiBuZWVkZWQuIENvbXB1dGUgdGhlIGluc2VydGlvbiBpbmRleCBmb3Ig
dGhlIG5ldyB0YWIuCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGFscmVhZHkgZXhwZWN0ZWQgdG8g
cmV0dXJuIGEgcHJvbWlzZSwgc28gbWFrZSBpdCBgYXN5bmNgIHRvIGFsbG93IHVzaW5nIGBhd2Fp
dGAuCisKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90
eXBlLnNob3dFeHRlbnNpb25UYWIpOgorICAgICAgICBDb21wdXRlIHRoZSBpbnNlcnRpb24gaW5k
ZXggZm9yIHRoZSBuZXcgdGFiLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25D
b250cm9sbGVyLnByb3RvdHlwZS5hc3luYyBfbG9hZEV4dGVuc2lvblRhYlBvc2l0aW9ucyk6Cisg
ICAgICAgIExvYWQgc2F2ZWQgdGFiIHBvc2l0aW9ucyBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZSwg
YWxsb3dpbmcgZm9yIHRoZSBjYXNlIHdoZXJlIG5vdGhpbmcgaGFzIGJlZW4gc2F2ZWQgeWV0Lgor
CisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3RvdHlwZS5h
c3luYyBfc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucyk6CisgICAgICAgIFJlY29tcHV0ZSBhbmQg
c2F2ZSB0YWIgcG9zaXRpb25zIGZvciBhbGwgZXh0ZW5zaW9uIHRhYnMuIFRoZW4gd3JpdGUgdG8g
cGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgIGF0IG1vc3QgZXZlcnkgNSBzZWNvbmRzIHVzaW5n
IGEgV0kuRGVib3VuY2VyLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250
cm9sbGVyLnByb3RvdHlwZS5faW5zZXJ0aW9uSW5kZXhGb3JFeHRlbnNpb25UYWIpOiBBZGRlZCwg
d3JhcHBlciBtZXRob2QuCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9s
bGVyLnByb3RvdHlwZS5fY29tcHV0ZUluZGljZXNGb3JFeHRlbnNpb25UYWIpOgorICAgICAgICBD
b21wdXRlIHRoZSBhbmNob3JUYWJUeXBlLCBkaXN0YW5jZUZyb21BbmNob3JUYWIsIGFuZCBpbnNl
cnRpb25JbmRleCBmb3IgdGhlIGV4dGVuc2lvbiB0YWIuCisgICAgICAgIElmIHNhdmluZyB0YWIg
cG9zaXRpb25zLCBwYXNzIGBvcHRpb25zLnJlY29tcHV0ZVBvc2l0aW9uc2AgdG8gaWdub3JlIHNh
dmVkIHBvc2l0aW9ucworICAgICAgICBhbmQgcmVjb21wdXRlIHRoZXNlIGZpZWxkcyBiYXNlZCBv
biB3aGF0IGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB0YWIgYmFyLgorCisgICAgICAgICog
VXNlckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5q
czoKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvblRhYkNvbnRlbnRWaWV3LnByb3Rv
dHlwZS5nZXQgc2F2ZWRUYWJQb3NpdGlvbktleSk6IEFkZGVkLgorCiAyMDIxLTEyLTA4ICBCSiBC
dXJnICA8YmJ1cmdAYXBwbGUuY29tPgogCiAgICAgICAgIFtDb2NvYV0gV2ViIEluc3BlY3Rvcjog
cHJvdmlkZSBhIHdheSBmb3IgX1dLSW5zcGVjdG9yRXh0ZW5zaW9uIGNsaWVudHMgdG8gYmUgdG8g
bm90aWZpZWQgd2hlbiBhbiBleHRlbnNpb24gdGFiIG5hdmlnYXRlcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlci5qcyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJm
YWNlL0NvbnRyb2xsZXJzL1dlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuanMKaW5kZXgg
N2ZlYjQ1ZGM4N2M0NjNkZjNjZjk1ZGQ5M2QwMGJiODM0ZGUzYzRkNy4uZTIxY2M5NmFjZjIyNWQy
NmFlNjc5M2RmNzZjZDAwZWQ2NjI5ZTU0YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJv
bGxlci5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9s
bGVycy9XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLmpzCkBAIC0zNCw5ICszNCwxOSBA
QCBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlciBleHRlbgogICAgICAgICB0aGlzLl90YWJJRHNGb3JFeHRlbnNp
b25JRE1hcCA9IG5ldyBNdWx0aW1hcDsKICAgICAgICAgdGhpcy5fbmV4dEV4dGVuc2lvblRhYklE
ID0gMTsKIAorICAgICAgICB0aGlzLl9leHRlbnNpb25UYWJQb3NpdGlvbnMgPSBudWxsOworICAg
ICAgICB0aGlzLl9zYXZlVGFiUG9zaXRpb25zRGVib3VuY2VyID0gbnVsbDsKKwogICAgICAgICBX
SS5GcmFtZS5hZGRFdmVudExpc3RlbmVyKFdJLkZyYW1lLkV2ZW50Lk1haW5SZXNvdXJjZURpZENo
YW5nZSwgdGhpcy5faGFuZGxlTWFpblJlc291cmNlRGlkQ2hhbmdlLCB0aGlzKTsKICAgICB9CiAK
KyAgICAvLyBTdGF0aWMKKworICAgIHN0YXRpYyBnZXQgZXh0ZW5zaW9uVGFiUG9zaXRpb25zT2Jq
ZWN0U3RvcmVLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJleHRlbnNpb24tdGFiLXBvc2l0
aW9ucyI7CisgICAgfQorCiAgICAgLy8gUHVibGljCiAKICAgICBnZXQgcmVnaXN0ZXJlZEV4dGVu
c2lvbklEcygpCkBAIC01MSw2ICs2MSwxMiBAQCBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250
cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciBleHRlbgogICAg
ICAgICAgICAgcmV0dXJuIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbi5FcnJvckNvZGUuUmVnaXN0
cmF0aW9uRmFpbGVkOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCF0aGlzLl9leHRlbnNpb25G
b3JFeHRlbnNpb25JRE1hcC5zaXplKSB7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJh
ci5hZGRFdmVudExpc3RlbmVyKFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtQWRkZWQsIHRoaXMu
X3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICAgICAgV0kudGFiQnJv
d3Nlci50YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFySXRlbVJl
bW92ZWQsIHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICAg
ICAgV0kudGFiQnJvd3Nlci50YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQu
VGFiQmFySXRlbXNSZW9yZGVyZWQsIHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRo
aXMpOworICAgICAgICB9CisKICAgICAgICAgbGV0IGV4dGVuc2lvbiA9IG5ldyBXSS5XZWJJbnNw
ZWN0b3JFeHRlbnNpb24oZXh0ZW5zaW9uSUQsIGV4dGVuc2lvbkJ1bmRsZUlkZW50aWZpZXIsIGRp
c3BsYXlOYW1lKTsKICAgICAgICAgdGhpcy5fZXh0ZW5zaW9uRm9yRXh0ZW5zaW9uSURNYXAuc2V0
KGV4dGVuc2lvbklELCBleHRlbnNpb24pOwogCkBAIC02NSw2ICs4MSwxMiBAQCBXSS5XZWJJbnNw
ZWN0b3JFeHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29u
dHJvbGxlciBleHRlbgogICAgICAgICAgICAgcmV0dXJuIFdJLldlYkluc3BlY3RvckV4dGVuc2lv
bi5FcnJvckNvZGUuSW52YWxpZFJlcXVlc3Q7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIXRo
aXMuX2V4dGVuc2lvbkZvckV4dGVuc2lvbklETWFwLnNpemUpIHsKKyAgICAgICAgICAgIFdJLnRh
YkJyb3dzZXIudGFiQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoV0kuVGFiQmFyLkV2ZW50LlRhYkJh
ckl0ZW1BZGRlZCwgdGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAg
ICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5yZW1vdmVFdmVudExpc3RlbmVyKFdJLlRhYkJh
ci5FdmVudC5UYWJCYXJJdGVtUmVtb3ZlZCwgdGhpcy5fc2F2ZUV4dGVuc2lvblRhYlBvc2l0aW9u
cywgdGhpcyk7CisgICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5yZW1vdmVFdmVudExp
c3RlbmVyKFdJLlRhYkJhci5FdmVudC5UYWJCYXJJdGVtc1Jlb3JkZXJlZCwgdGhpcy5fc2F2ZUV4
dGVuc2lvblRhYlBvc2l0aW9ucywgdGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICBsZXQgZXh0
ZW5zaW9uVGFiSURzVG9SZW1vdmUgPSB0aGlzLl90YWJJRHNGb3JFeHRlbnNpb25JRE1hcC50YWtl
KGV4dGVuc2lvbklEKSB8fCBbXTsKICAgICAgICAgZm9yIChsZXQgZXh0ZW5zaW9uVGFiSUQgb2Yg
ZXh0ZW5zaW9uVGFiSURzVG9SZW1vdmUpIHsKICAgICAgICAgICAgIGxldCB0YWJDb250ZW50Vmll
dyA9IHRoaXMuX2V4dGVuc2lvblRhYkNvbnRlbnRWaWV3Rm9yRXh0ZW5zaW9uVGFiSURNYXAudGFr
ZShleHRlbnNpb25UYWJJRCk7CkBAIC03Nyw3ICs5OSw3IEBAIFdJLldlYkluc3BlY3RvckV4dGVu
c2lvbkNvbnRyb2xsZXIgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4
dGVuCiAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdJLldlYkluc3BlY3Rv
ckV4dGVuc2lvbkNvbnRyb2xsZXIuRXZlbnQuRXh0ZW5zaW9uUmVtb3ZlZCwge2V4dGVuc2lvbn0p
OwogICAgIH0KIAotICAgIGNyZWF0ZVRhYkZvckV4dGVuc2lvbihleHRlbnNpb25JRCwgdGFiTmFt
ZSwgdGFiSWNvblVSTCwgc291cmNlVVJMKQorICAgIGFzeW5jIGNyZWF0ZVRhYkZvckV4dGVuc2lv
bihleHRlbnNpb25JRCwgdGFiTmFtZSwgdGFiSWNvblVSTCwgc291cmNlVVJMKQogICAgIHsKICAg
ICAgICAgbGV0IGV4dGVuc2lvbiA9IHRoaXMuX2V4dGVuc2lvbkZvckV4dGVuc2lvbklETWFwLmdl
dChleHRlbnNpb25JRCk7CiAgICAgICAgIGlmICghZXh0ZW5zaW9uKSB7CkBAIC05MCw3ICsxMTIs
MTQgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3Bl
Y3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KIAogICAgICAgICB0aGlzLl90YWJJRHNGb3JF
eHRlbnNpb25JRE1hcC5hZGQoZXh0ZW5zaW9uSUQsIGV4dGVuc2lvblRhYklEKTsKICAgICAgICAg
dGhpcy5fZXh0ZW5zaW9uVGFiQ29udGVudFZpZXdGb3JFeHRlbnNpb25UYWJJRE1hcC5zZXQoZXh0
ZW5zaW9uVGFiSUQsIHRhYkNvbnRlbnRWaWV3KTsKLSAgICAgICAgV0kudGFiQnJvd3Nlci5hZGRU
YWJGb3JDb250ZW50Vmlldyh0YWJDb250ZW50Vmlldywge3N1cHByZXNzQW5pbWF0aW9uczogdHJ1
ZX0pOworCisgICAgICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zKQorICAgICAg
ICAgICAgYXdhaXQgdGhpcy5fbG9hZEV4dGVuc2lvblRhYlBvc2l0aW9ucygpOworCisgICAgICAg
IFdJLnRhYkJyb3dzZXIuYWRkVGFiRm9yQ29udGVudFZpZXcodGFiQ29udGVudFZpZXcsIHsKKyAg
ICAgICAgICAgIHN1cHByZXNzQW5pbWF0aW9uczogdHJ1ZSwKKyAgICAgICAgICAgIGluc2VydGlv
bkluZGV4OiB0aGlzLl9pbnNlcnRpb25JbmRleEZvckV4dGVuc2lvblRhYih0YWJDb250ZW50Vmll
dyksCisgICAgICAgIH0pOwogCiAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXMg
dG8gcmV0dXJuIGFuIGVycm9yIHN0cmluZyBvciBhIHJlc3VsdCBvYmplY3QuCiAgICAgICAgIHJl
dHVybiB7InJlc3VsdCI6IGV4dGVuc2lvblRhYklEfTsKQEAgLTE3NCw2ICsyMDMsNyBAQCBXSS5X
ZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5z
aW9uQ29udHJvbGxlciBleHRlbgogICAgICAgICB0YWJDb250ZW50Vmlldy52aXNpYmxlID0gdHJ1
ZTsKICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBXSS50YWJCcm93c2VyLnNob3dUYWJGb3JDb250ZW50
Vmlldyh0YWJDb250ZW50VmlldywgewogICAgICAgICAgICAgLi4ub3B0aW9ucywKKyAgICAgICAg
ICAgIGluc2VydGlvbkluZGV4OiB0aGlzLl9pbnNlcnRpb25JbmRleEZvckV4dGVuc2lvblRhYih0
YWJDb250ZW50VmlldyksCiAgICAgICAgICAgICBpbml0aWF0b3JIaW50OiBXSS5UYWJCcm93c2Vy
LlRhYk5hdmlnYXRpb25Jbml0aWF0b3IuRnJvbnRlbmRBUEksCiAgICAgICAgIH0pOwogCkBAIC0y
ODQsNiArMzE0LDg1IEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgPSBjbGFz
cyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAKICAgICAvLyBQcml2YXRl
CiAKKyAgICBhc3luYyBfbG9hZEV4dGVuc2lvblRhYlBvc2l0aW9ucygpCisgICAgeworICAgICAg
ICBsZXQgc2F2ZWRUYWJQb3NpdGlvbnMgPSBhd2FpdCBXSS5vYmplY3RTdG9yZXMuZ2VuZXJhbC5n
ZXQoV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5leHRlbnNpb25UYWJQb3NpdGlvbnNP
YmplY3RTdG9yZUtleSk7CisgICAgICAgIHRoaXMuX2V4dGVuc2lvblRhYlBvc2l0aW9ucyA9IHNh
dmVkVGFiUG9zaXRpb25zIHx8IHt9OworICAgIH0KKworICAgIF9zYXZlRXh0ZW5zaW9uVGFiUG9z
aXRpb25zKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25z
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuX3NhdmVUYWJQb3NpdGlvbnNE
ZWJvdW5jZXIgfHw9IG5ldyBEZWJvdW5jZXIoKCkgPT4geworICAgICAgICAgICAgZm9yIChsZXQg
dGFiQmFySXRlbSBvZiBXSS50YWJCcm93c2VyLnRhYkJhci52aXNpYmxlVGFiQmFySXRlbXNGcm9t
TGVmdFRvUmlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoISh0YWJCYXJJdGVtLnJlcHJlc2Vu
dGVkT2JqZWN0IGluc3RhbmNlb2YgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZp
ZXcpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGxl
dCB7YW5jaG9yVGFiVHlwZSwgYW5jaG9yVGFiSW5kZXgsIGRpc3RhbmNlRnJvbUFuY2hvclRhYn0g
PSB0aGlzLl9jb21wdXRlSW5kaWNlc0ZvckV4dGVuc2lvblRhYih0YWJCYXJJdGVtLnJlcHJlc2Vu
dGVkT2JqZWN0LCB7cmVjb21wdXRlUG9zaXRpb25zOiB0cnVlfSk7CisgICAgICAgICAgICAgICAg
dGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zW3RhYkJhckl0ZW0ucmVwcmVzZW50ZWRPYmplY3Qu
c2F2ZWRUYWJQb3NpdGlvbktleV0gPSB7YW5jaG9yVGFiVHlwZSwgZGlzdGFuY2VGcm9tQW5jaG9y
VGFifTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV0kub2JqZWN0U3RvcmVzLmdlbmVy
YWwucHV0KHRoaXMuX2V4dGVuc2lvblRhYlBvc2l0aW9ucywgV2ViSW5zcGVjdG9yRXh0ZW5zaW9u
Q29udHJvbGxlci5leHRlbnNpb25UYWJQb3NpdGlvbnNPYmplY3RTdG9yZUtleSk7CisgICAgICAg
IH0sIDUwMDApOworICAgICAgICB0aGlzLl9zYXZlVGFiUG9zaXRpb25zRGVib3VuY2VyLmRlbGF5
Rm9yVGltZSgzMDAwKTsKKyAgICB9CisKKyAgICBfaW5zZXJ0aW9uSW5kZXhGb3JFeHRlbnNpb25U
YWIodGFiQ29udGVudFZpZXcsIG9wdGlvbnMgPSB7fSkKKyAgICB7CisgICAgICAgIGxldCB7YW5j
aG9yVGFiVHlwZSwgYW5jaG9yVGFiSW5kZXgsIGRpc3RhbmNlRnJvbUFuY2hvclRhYn0gPSB0aGlz
Ll9jb21wdXRlSW5kaWNlc0ZvckV4dGVuc2lvblRhYih0YWJDb250ZW50Vmlldywgb3B0aW9ucyk7
CisgICAgICAgIHJldHVybiBhbmNob3JUYWJJbmRleCArIGRpc3RhbmNlRnJvbUFuY2hvclRhYiAr
IDE7CisgICAgfQorCisgICAgX2NvbXB1dGVJbmRpY2VzRm9yRXh0ZW5zaW9uVGFiKHRhYkNvbnRl
bnRWaWV3LCB7cmVjb21wdXRlUG9zaXRpb25zfSA9IHt9KQorICAgIHsKKyAgICAgICAgLy8gTm90
ZTogcGlubmVkIHRhYnMgYWx3YXlzIGFwcGVhciBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgc28gd2Ug
Y2FuIGlnbm9yZSB0aGVtCisgICAgICAgIC8vIGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5n
IGFuIGBpbnNlcnRpb25JbmRleGBgIGZvciBgdGFiQ29udGVudFZpZXdgLgorICAgICAgICBsZXQg
YW5jaG9yVGFiSW5kZXggPSAwOworICAgICAgICBsZXQgc2F2ZWRQb3NpdGlvbnMgPSB0aGlzLl9l
eHRlbnNpb25UYWJQb3NpdGlvbnNbdGFiQ29udGVudFZpZXcuc2F2ZWRUYWJQb3NpdGlvbktleV0g
fHwge307CisgICAgICAgIGxldCBhbmNob3JUYWJUeXBlID0gKHJlY29tcHV0ZVBvc2l0aW9ucyAm
JiBzYXZlZFBvc2l0aW9ucy5hbmNob3JUYWJUeXBlKSB8fCBudWxsOworICAgICAgICBsZXQgZGlz
dGFuY2VGcm9tQW5jaG9yVGFiID0gKHJlY29tcHV0ZVBvc2l0aW9ucyAmJiBzYXZlZFBvc2l0aW9u
cy5kaXN0YW5jZUZyb21BbmNob3JUYWIpIHx8IDA7CisKKyAgICAgICAgbGV0IHZpc2libGVUYWJC
YXJJdGVtcyA9IFdJLnRhYkJyb3dzZXIudGFiQmFyLnZpc2libGVUYWJCYXJJdGVtc0Zyb21MZWZ0
VG9SaWdodDsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlVGFiQmFySXRlbXMu
bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCB2aXNpYmxlVGFiID0gdmlzaWJsZVRhYkJh
ckl0ZW1zW2ldLnJlcHJlc2VudGVkT2JqZWN0OworICAgICAgICAgICAgaWYgKCFyZXByZXNlbnRl
ZE9iamVjdCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHZp
c2libGVUYWIgPT09IHRhYkNvbnRlbnRWaWV3KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICBpZiAodmlzaWJsZVRhYiBpbnN0YW5jZW9mIFdJLldlYkluc3BlY3RvckV4dGVu
c2lvblRhYkNvbnRlbnRWaWV3KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
ICAgICBpZiAocmVjb21wdXRlUG9zaXRpb25zKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVGFi
VHlwZSA9IHZpc2libGVUYWIudHlwZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZpc2libGVUYWIudHlwZSAhPT0gYW5jaG9yVGFi
VHlwZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYW5jaG9yVGFi
SW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBG
aW5kIHRoZSBjb3VudCBvZiBleHRlbnNpb24gdGFicyBhZnRlciB0aGUgYW5jaG9yIHRhYiB0byBj
b21wdXRlIHRoZSByZWFsIGRpc3RhbmNlRnJvbUFuY2hvclRhYi4KKyAgICAgICAgLy8gQWRkaW5n
IGBkaXN0YW5jZUZyb21BbmNob3JUYWJgIHRvIGBhbmNob3JUYWJJbmRleGAgc2hvdWxkIG5vdCBp
bnNlcnQgdGhlIHRhYiBhZnRlciBhIGRpZmZlcmVudCBhbmNob3IgdGFiLgorICAgICAgICBmb3Ig
KGxldCBpID0gMTsgaSA8IHZpc2libGVUYWJCYXJJdGVtcy5sZW5ndGggLSBhbmNob3JUYWJJbmRl
eDsgKytqKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZVRhYkJhckl0ZW1zW2FuY2hvclRhYklu
ZGV4ICsgaV0ucmVwcmVzZW50ZWRPYmplY3QuY29uc3RydWN0b3Iuc2hvdWxkU2F2ZVRhYigpKSB7
CisgICAgICAgICAgICAgICAgZGlzdGFuY2VGcm9tQW5jaG9yVGFiID0gTnVtYmVyLmNvbnN0cmFp
bihkaXN0YW5jZUZyb21BbmNob3JUYWIsIDAsIE1hdGgubWF4KDAsIGkgLSAxKSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHthbmNob3JUYWJUeXBlLCBhbmNob3JUYWJJbmRleCwgZGlzdGFuY2VG
cm9tQW5jaG9yVGFifTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElm
IHRoZSBhbmNob3IgdGFiIGlzIG5vdyBoaWRkZW4gdXBvbiByZXN0b3JpbmcsIHBsYWNlIHRoZSBl
eHRlbnNpb24gYXQgdGhlIGVuZC4KKyAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSBz
bWFsbGVyIHNldCBvZiB0YWJzIGFyZSBlbmFibGVkIGZvciB0aGUgaW5zcGVjdGlvbiB0YXJnZXQu
CisgICAgICAgIGFuY2hvclRhYkluZGV4ID0gdmlzaWJsZVRhYkJhckl0ZW1zLmxlbmd0aCAtIDE7
CisgICAgICAgIHJldHVybiB7YW5jaG9yVGFiVHlwZSwgYW5jaG9yVGFiSW5kZXgsIGRpc3RhbmNl
RnJvbUFuY2hvclRhYn07CisgICAgfQorCiAgICAgX2hhbmRsZU1haW5SZXNvdXJjZURpZENoYW5n
ZShldmVudCkKICAgICB7CiAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmlzTWFpbkZyYW1lKCkp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9U
YWJCYXIuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UYWJC
YXIuanMKaW5kZXggNTM5YTIzMGIyZjJjYzkwY2YyZDE2NTM2Nzc1OTFhYmFiZjQxYWYxYS4uNjg4
ZTc2OWFmYWU4ZWVlMTBmODk1MTcwNmU3ODU5ZGI0ZmJkNGE5OCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGFiQmFyLmpzCisrKyBiL1NvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RhYkJhci5qcwpAQCAtNDA3LDYg
KzQwNywxMSBAQCBXSS5UYWJCYXIgPSBjbGFzcyBUYWJCYXIgZXh0ZW5kcyBXSS5WaWV3CiAgICAg
ICAgIHJldHVybiB0aGlzLl90YWJCYXJJdGVtczsKICAgICB9CiAKKyAgICBnZXQgdmlzaWJsZVRh
YkJhckl0ZW1zRnJvbUxlZnRUb1JpZ2h0KCkKKyAgICB7CisgICAgICAgICByZXR1cm4gdGhpcy5f
dGFiQmFySXRlbXNGcm9tTGVmdFRvUmlnaHQoKS5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmhpZGRl
bik7CisgICAgfQorCiAgICAgZ2V0IHRhYkNvdW50KCkKICAgICB7CiAgICAgICAgIHJldHVybiB0
aGlzLl90YWJCYXJJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucmVwcmVzZW50ZWRPYmplY3Qg
aW5zdGFuY2VvZiBXSS5UYWJDb250ZW50VmlldykubGVuZ3RoOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvV2ViSW5zcGVjdG9yRXh0ZW5zaW9u
VGFiQ29udGVudFZpZXcuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5qcwppbmRleCA0MmY4ZjJh
OWM5MDYxYjAxODc5MjMxZjYwMWQ4OGY1ODY1NjcyNjNmLi5iOGM3M2Q0YTEwZWMyYjdmNGFlOTlh
ZTMwOWI0YWQ0ZTk2ZTFhZjg4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNl
ckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5qcwor
KysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0
b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5qcwpAQCAtNzMsNiArNzMsMTEgQEAgV0kuV2ViSW5z
cGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcgPSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNp
b25UYWJDb250ZW50VmkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgZ2V0IHNh
dmVkVGFiUG9zaXRpb25LZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGBFeHRlbnNpb25UYWIt
JHt0aGlzLl9leHRlbnNpb24uZXh0ZW5zaW9uQnVuZGxlSWRlbnRpZmllcn0tJHt0aGlzLl90YWJJ
bmZvLmRpc3BsYXlOYW1lfWA7CisgICAgfQorCiAgICAgd2hlblBhZ2VBdmFpbGFibGUoKQogICAg
IHsKICAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5QYWdlQXZhaWxhYmxlUHJvbWlzZS5wcm9taXNl
Owo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>446845</attachid>
            <date>2021-12-10 16:31:51 -0800</date>
            <delta_ts>2022-03-01 02:23:55 -0800</delta_ts>
            <desc>Patch v1.3</desc>
            <filename>bug-234115-20211210163150.patch</filename>
            <type>text/plain</type>
            <size>14381</size>
            <attacher name="Blaze Burg">bburg</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg2Nzk5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCA5
ZjlkZTg2MmY1ODZkZDhmYjA2YzgwZTEzMTQxNjA3YTc4ZjZjYjkyLi42YTQyZTg2MzhkNWUyMTM3
N2UxMjcwZjNkNjMyZWRlZDM3ZDg2ZjMxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw2NyBAQAorMjAyMS0xMi0xMCAgQkogQnVyZyAgPGJidXJnQGFwcGxlLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBzYXZlIGFuZCByZXN0b3JlIGV4dGVuc2lvbiB0YWIgcG9zaXRp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQx
MTUKKyAgICAgICAgPHJkYXI6Ly84NTU2MDYzNj4KKworICAgICAgICBSZXZpZXdlZCBieSBEZXZp
biBSb3Vzc28gYW5kIFBhdHJpY2sgQW5nbGUuCisKKyAgICAgICAgVGhlIGV4aXN0aW5nIHRhYiBz
dGF0ZSByZXN0b3JhdGlvbiBzeXN0ZW0gd29ya3MgYnkgc2F2aW5nIG9yIGxvYWRpbmcgdGFiIHBv
c2l0aW9ucworICAgICAgICBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQgc2F2aW5nIG9yIHJl
c3RvcmluZyBlYWNoIHRhYidzIHN0YXRlIHVzaW5nIG9uZSBjb29raWUgcGVyIHRhYiB0eXBlLgor
CisgICAgICAgIFdpdGggZXh0ZW5zaW9uIHRhYnMsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBoYXZl
IG1vcmUgdGhhbiBvbmUgdGFiIHBlciB0YWIgdHlwZS4KKyAgICAgICAgQWRkaXRpb25hbGx5LCBl
eHRlbnNpb24gdGFicyBjYW4gYmUgYWRkZWQgYXQgYW55IHRpbWUgdmlhIEluc3BlY3RvckZyb250
ZW5kQVBJLgorICAgICAgICBHaXZlbiB0aGVzZSBjaGFsbGVuZ2VzLCB3ZSBuZWVkIGEgZGlmZmVy
ZW50IHN5c3RlbSBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgZXh0ZW5zaW9uIHRhYnMuCisKKyAg
ICAgICAgRXh0ZW5zaW9uIHRhYiByZXN0b3JhdGlvbiBpcyBub3cgaGFuZGxlZCBieSBXSS5XZWJJ
bnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLgorICAgICAgICBXZSBjb25zaWRlciBhIHRhYiB0
byBiZSBhbiAnYW5jaG9yJyB0YWIgaWYgaXQgaXMgc2F2ZWFibGUsIHZpc2libGUsIGFuZCBub3Qg
cGlubmFibGUuCisgICAgICAgIEluIG90aGVyIHdvcmRzLCBhbiBhbmNob3IgdGFiIGlzIG9uZSBv
ZiB0aGUgYnVpbHQtaW4gc2luZ2xldG9uIHRhYnMgbGlrZSBDb25zb2xlLCBFbGVtZW50cywgZXRj
LgorCisgICAgICAgIFdoZW4gdGhlIHRhYiBiYXIgaXRlbSBsaXN0IGlzIG1vZGlmaWVkLCBmb3Ig
ZWFjaCBleHRlbnNpb24gdGFiLCB3ZSBzYXZlIHRoZSBvYnNlcnZlZAorICAgICAgICAnYW5jaG9y
JyB0YWIncyB0eXBlIGFuZCBhIGRpc3RhbmNlIGZyb20gdGhhdCBhbmNob3IgdGFiJ3MgaW5zZXJ0
aW9uIGluZGV4LgorICAgICAgICBVcGRhdGVzIHRvIGV4dGVuc2lvbiB0YWIgcG9zaXRpb25zIGFy
ZSBzYXZlZCB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgYXQgbW9zdCBldmVyeSA1IHNlY29uZHMuCisK
KyAgICAgICAgV2hlbiBpdCBpcyB0aW1lIHRvIHBsYWNlIGFuIGV4dGVuc2lvbiB0YWIgd2l0aCBj
cmVhdGVUYWJGb3JFeHRlbnNpb24oKSBvciBzaG93RXh0ZW5zaW9uVGFiKCksCisgICAgICAgIHBl
cmZvcm0gdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGNvbXB1dGluZyBhbiBpbnNlcnRpb24gaW5k
ZXggZnJvbSBhIGFuY2hvclRhYlR5cGUgYW5kIGRpc3RhbmNlRnJvbUFuY2hvclRhYi4KKworICAg
ICAgICBUaGlzIHBhdGNoIHdhcyB0ZXN0ZWQgd2l0aCBvbmUgZXh0ZW5zaW9uLCBtdWx0aXBsZSBl
eHRlbnNpb25zLCBzaG93aW5nL2hpZGluZyBleHRlbnNpb24gdGFicywKKyAgICAgICAgcmVtb3Rl
IGluc3BlY3RpbmcgYSBKU0NvbnRleHQsIGFuZCByZW1vdGUgaW5zcGVjdGluZyBhIFdLV2ViVmll
dy4KKworICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvVGFiQmFyLmpzOgorICAgICAgICAo
V0kuVGFiQmFyLnByb3RvdHlwZS5nZXQgdmlzaWJsZVRhYkJhckl0ZW1zRnJvbUxlZnRUb1JpZ2h0
KTogQWRkZWQuCisKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1dlYkluc3Bl
Y3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuanM6CisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRl
bnNpb25Db250cm9sbGVyKToKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRy
b2xsZXIuZ2V0IGV4dGVuc2lvblRhYlBvc2l0aW9uc09iamVjdFN0b3JlS2V5KTogQWRkZWQuCisK
KyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIucHJvdG90eXBlLnJl
Z2lzdGVyRXh0ZW5zaW9uKToKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRy
b2xsZXIucHJvdG90eXBlLnVucmVnaXN0ZXJFeHRlbnNpb24pOgorICAgICAgICBBZGQgYW5kIHJl
bW92ZSBXSS5UYWJCYXIgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbm90aWZ5IHVzIG9mIGNoYW5nZXMg
dG8gdGhlIHRhYiBiYXIuCisKKyAgICAgICAgKFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRy
b2xsZXIucHJvdG90eXBlLmNyZWF0ZVRhYkZvckV4dGVuc2lvbik6IERlbGV0ZWQuCisgICAgICAg
IChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLnByb3RvdHlwZS5hc3luYyBjcmVh
dGVUYWJGb3JFeHRlbnNpb24pOiBSZW5hbWVkLgorICAgICAgICBMb2FkIHNhdmVkIHRhYiBwb3Np
dGlvbnMgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UgaWYgbmVlZGVkLiBDb21wdXRlIHRoZSBpbnNl
cnRpb24gaW5kZXggZm9yIHRoZSBuZXcgdGFiLgorICAgICAgICBUaGlzIG1ldGhvZCBpcyBhbHJl
YWR5IGV4cGVjdGVkIHRvIHJldHVybiBhIHByb21pc2UsIHNvIG1ha2UgaXQgYGFzeW5jYCB0byBh
bGxvdyB1c2luZyBgYXdhaXRgLgorCisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25D
b250cm9sbGVyLnByb3RvdHlwZS5zaG93RXh0ZW5zaW9uVGFiKToKKyAgICAgICAgQ29tcHV0ZSB0
aGUgaW5zZXJ0aW9uIGluZGV4IGZvciB0aGUgbmV3IHRhYi4KKworICAgICAgICAoV0kuV2ViSW5z
cGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUuYXN5bmMgX2xvYWRFeHRlbnNpb25U
YWJQb3NpdGlvbnMpOgorICAgICAgICBMb2FkIHNhdmVkIHRhYiBwb3NpdGlvbnMgZnJvbSBwZXJz
aXN0ZW50IHN0b3JhZ2UsIGFsbG93aW5nIGZvciB0aGUgY2FzZSB3aGVyZSBub3RoaW5nIGhhcyBi
ZWVuIHNhdmVkIHlldC4KKworICAgICAgICAoV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJv
bGxlci5wcm90b3R5cGUuYXN5bmMgX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMpOgorICAgICAg
ICBSZWNvbXB1dGUgYW5kIHNhdmUgdGFiIHBvc2l0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbiB0YWJz
LiBUaGVuIHdyaXRlIHRvIHBlcnNpc3RlbnQgc3RvcmFnZQorICAgICAgICBhdCBtb3N0IGV2ZXJ5
IDUgc2Vjb25kcyB1c2luZyBhIFdJLkRlYm91bmNlci4KKworICAgICAgICAoV0kuV2ViSW5zcGVj
dG9yRXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUuX2luc2VydGlvbkluZGV4Rm9yRXh0ZW5z
aW9uVGFiKTogQWRkZWQsIHdyYXBwZXIgbWV0aG9kLgorICAgICAgICAoV0kuV2ViSW5zcGVjdG9y
RXh0ZW5zaW9uQ29udHJvbGxlci5wcm90b3R5cGUuX2NvbXB1dGVJbmRpY2VzRm9yRXh0ZW5zaW9u
VGFiKToKKyAgICAgICAgQ29tcHV0ZSB0aGUgYW5jaG9yVGFiVHlwZSwgZGlzdGFuY2VGcm9tQW5j
aG9yVGFiLCBhbmQgaW5zZXJ0aW9uSW5kZXggZm9yIHRoZSBleHRlbnNpb24gdGFiLgorICAgICAg
ICBJZiBzYXZpbmcgdGFiIHBvc2l0aW9ucywgcGFzcyBgb3B0aW9ucy5yZWNvbXB1dGVQb3NpdGlv
bnNgIHRvIGlnbm9yZSBzYXZlZCBwb3NpdGlvbnMKKyAgICAgICAgYW5kIHJlY29tcHV0ZSB0aGVz
ZSBmaWVsZHMgYmFzZWQgb24gd2hhdCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdGFiIGJh
ci4KKworICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvV2ViSW5zcGVjdG9yRXh0ZW5zaW9u
VGFiQ29udGVudFZpZXcuanM6CisgICAgICAgIChXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJD
b250ZW50Vmlldy5wcm90b3R5cGUuZ2V0IHNhdmVkVGFiUG9zaXRpb25LZXkpOiBBZGRlZC4KKwog
MjAyMS0xMi0wOCAgQkogQnVyZyAgPGJidXJnQGFwcGxlLmNvbT4KIAogICAgICAgICBbQ29jb2Fd
IFdlYiBJbnNwZWN0b3I6IHByb3ZpZGUgYSB3YXkgZm9yIF9XS0luc3BlY3RvckV4dGVuc2lvbiBj
bGllbnRzIHRvIGJlIHRvIG5vdGlmaWVkIHdoZW4gYW4gZXh0ZW5zaW9uIHRhYiBuYXZpZ2F0ZXMK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xs
ZXJzL1dlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuanMgYi9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250
cm9sbGVyLmpzCmluZGV4IDdmZWI0NWRjODdjNDYzZGYzY2Y5NWRkOTNkMDBiYjgzNGRlM2M0ZDcu
LmRiNTVmN2YwZWY3ZWYzYTRjNjliZDE2OGUzM2RiMWYxMjFhYWFjMzMgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1dlYkluc3BlY3Rv
ckV4dGVuc2lvbkNvbnRyb2xsZXIuanMKKysrIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvQ29udHJvbGxlcnMvV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlci5qcwpA
QCAtMzQsOSArMzQsMTkgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNs
YXNzIFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KICAgICAgICAgdGhpcy5f
dGFiSURzRm9yRXh0ZW5zaW9uSURNYXAgPSBuZXcgTXVsdGltYXA7CiAgICAgICAgIHRoaXMuX25l
eHRFeHRlbnNpb25UYWJJRCA9IDE7CiAKKyAgICAgICAgdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRp
b25zID0gbnVsbDsKKyAgICAgICAgdGhpcy5fc2F2ZVRhYlBvc2l0aW9uc0RlYm91bmNlciA9IG51
bGw7CisKICAgICAgICAgV0kuRnJhbWUuYWRkRXZlbnRMaXN0ZW5lcihXSS5GcmFtZS5FdmVudC5N
YWluUmVzb3VyY2VEaWRDaGFuZ2UsIHRoaXMuX2hhbmRsZU1haW5SZXNvdXJjZURpZENoYW5nZSwg
dGhpcyk7CiAgICAgfQogCisgICAgLy8gU3RhdGljCisKKyAgICBzdGF0aWMgZ2V0IGV4dGVuc2lv
blRhYlBvc2l0aW9uc09iamVjdFN0b3JlS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiZXh0
ZW5zaW9uLXRhYi1wb3NpdGlvbnMiOworICAgIH0KKwogICAgIC8vIFB1YmxpYwogCiAgICAgZ2V0
IHJlZ2lzdGVyZWRFeHRlbnNpb25JRHMoKQpAQCAtNTEsNiArNjEsMTIgQEAgV0kuV2ViSW5zcGVj
dG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRy
b2xsZXIgZXh0ZW4KICAgICAgICAgICAgIHJldHVybiBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb24u
RXJyb3JDb2RlLlJlZ2lzdHJhdGlvbkZhaWxlZDsKICAgICAgICAgfQogCisgICAgICAgIGlmICgh
dGhpcy5fZXh0ZW5zaW9uRm9yRXh0ZW5zaW9uSURNYXAuc2l6ZSkgeworICAgICAgICAgICAgV0ku
dGFiQnJvd3Nlci50YWJCYXIuYWRkRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFy
SXRlbUFkZGVkLCB0aGlzLl9zYXZlRXh0ZW5zaW9uVGFiUG9zaXRpb25zLCB0aGlzKTsKKyAgICAg
ICAgICAgIFdJLnRhYkJyb3dzZXIudGFiQmFyLmFkZEV2ZW50TGlzdGVuZXIoV0kuVGFiQmFyLkV2
ZW50LlRhYkJhckl0ZW1SZW1vdmVkLCB0aGlzLl9zYXZlRXh0ZW5zaW9uVGFiUG9zaXRpb25zLCB0
aGlzKTsKKyAgICAgICAgICAgIFdJLnRhYkJyb3dzZXIudGFiQmFyLmFkZEV2ZW50TGlzdGVuZXIo
V0kuVGFiQmFyLkV2ZW50LlRhYkJhckl0ZW1zUmVvcmRlcmVkLCB0aGlzLl9zYXZlRXh0ZW5zaW9u
VGFiUG9zaXRpb25zLCB0aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGxldCBleHRlbnNpb24g
PSBuZXcgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uKGV4dGVuc2lvbklELCBleHRlbnNpb25CdW5k
bGVJZGVudGlmaWVyLCBkaXNwbGF5TmFtZSk7CiAgICAgICAgIHRoaXMuX2V4dGVuc2lvbkZvckV4
dGVuc2lvbklETWFwLnNldChleHRlbnNpb25JRCwgZXh0ZW5zaW9uKTsKIApAQCAtNjUsNiArODEs
MTIgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdlYkluc3Bl
Y3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KICAgICAgICAgICAgIHJldHVybiBXSS5XZWJJ
bnNwZWN0b3JFeHRlbnNpb24uRXJyb3JDb2RlLkludmFsaWRSZXF1ZXN0OwogICAgICAgICB9CiAK
KyAgICAgICAgaWYgKCF0aGlzLl9leHRlbnNpb25Gb3JFeHRlbnNpb25JRE1hcC5zaXplKSB7Cisg
ICAgICAgICAgICBXSS50YWJCcm93c2VyLnRhYkJhci5yZW1vdmVFdmVudExpc3RlbmVyKFdJLlRh
YkJhci5FdmVudC5UYWJCYXJJdGVtQWRkZWQsIHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlv
bnMsIHRoaXMpOworICAgICAgICAgICAgV0kudGFiQnJvd3Nlci50YWJCYXIucmVtb3ZlRXZlbnRM
aXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFySXRlbVJlbW92ZWQsIHRoaXMuX3NhdmVFeHRl
bnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICAgICAgV0kudGFiQnJvd3Nlci50YWJC
YXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihXSS5UYWJCYXIuRXZlbnQuVGFiQmFySXRlbXNSZW9yZGVy
ZWQsIHRoaXMuX3NhdmVFeHRlbnNpb25UYWJQb3NpdGlvbnMsIHRoaXMpOworICAgICAgICB9CisK
ICAgICAgICAgbGV0IGV4dGVuc2lvblRhYklEc1RvUmVtb3ZlID0gdGhpcy5fdGFiSURzRm9yRXh0
ZW5zaW9uSURNYXAudGFrZShleHRlbnNpb25JRCkgfHwgW107CiAgICAgICAgIGZvciAobGV0IGV4
dGVuc2lvblRhYklEIG9mIGV4dGVuc2lvblRhYklEc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICBs
ZXQgdGFiQ29udGVudFZpZXcgPSB0aGlzLl9leHRlbnNpb25UYWJDb250ZW50Vmlld0ZvckV4dGVu
c2lvblRhYklETWFwLnRha2UoZXh0ZW5zaW9uVGFiSUQpOwpAQCAtNzcsNyArOTksNyBAQCBXSS5X
ZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5z
aW9uQ29udHJvbGxlciBleHRlbgogICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVy
cyhXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyLkV2ZW50LkV4dGVuc2lvblJlbW92
ZWQsIHtleHRlbnNpb259KTsKICAgICB9CiAKLSAgICBjcmVhdGVUYWJGb3JFeHRlbnNpb24oZXh0
ZW5zaW9uSUQsIHRhYk5hbWUsIHRhYkljb25VUkwsIHNvdXJjZVVSTCkKKyAgICBhc3luYyBjcmVh
dGVUYWJGb3JFeHRlbnNpb24oZXh0ZW5zaW9uSUQsIHRhYk5hbWUsIHRhYkljb25VUkwsIHNvdXJj
ZVVSTCkKICAgICB7CiAgICAgICAgIGxldCBleHRlbnNpb24gPSB0aGlzLl9leHRlbnNpb25Gb3JF
eHRlbnNpb25JRE1hcC5nZXQoZXh0ZW5zaW9uSUQpOwogICAgICAgICBpZiAoIWV4dGVuc2lvbikg
ewpAQCAtOTAsNyArMTEyLDE0IEBAIFdJLldlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIg
PSBjbGFzcyBXZWJJbnNwZWN0b3JFeHRlbnNpb25Db250cm9sbGVyIGV4dGVuCiAKICAgICAgICAg
dGhpcy5fdGFiSURzRm9yRXh0ZW5zaW9uSURNYXAuYWRkKGV4dGVuc2lvbklELCBleHRlbnNpb25U
YWJJRCk7CiAgICAgICAgIHRoaXMuX2V4dGVuc2lvblRhYkNvbnRlbnRWaWV3Rm9yRXh0ZW5zaW9u
VGFiSURNYXAuc2V0KGV4dGVuc2lvblRhYklELCB0YWJDb250ZW50Vmlldyk7Ci0gICAgICAgIFdJ
LnRhYkJyb3dzZXIuYWRkVGFiRm9yQ29udGVudFZpZXcodGFiQ29udGVudFZpZXcsIHtzdXBwcmVz
c0FuaW1hdGlvbnM6IHRydWV9KTsKKworICAgICAgICBpZiAoIXRoaXMuX2V4dGVuc2lvblRhYlBv
c2l0aW9ucykKKyAgICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRFeHRlbnNpb25UYWJQb3NpdGlv
bnMoKTsKKworICAgICAgICBXSS50YWJCcm93c2VyLmFkZFRhYkZvckNvbnRlbnRWaWV3KHRhYkNv
bnRlbnRWaWV3LCB7CisgICAgICAgICAgICBzdXBwcmVzc0FuaW1hdGlvbnM6IHRydWUsCisgICAg
ICAgICAgICBpbnNlcnRpb25JbmRleDogdGhpcy5faW5zZXJ0aW9uSW5kZXhGb3JFeHRlbnNpb25U
YWIodGFiQ29udGVudFZpZXcpLAorICAgICAgICB9KTsKIAogICAgICAgICAvLyBUaGUgY2FsbGlu
ZyBjb252ZW50aW9uIGlzIHRvIHJldHVybiBhbiBlcnJvciBzdHJpbmcgb3IgYSByZXN1bHQgb2Jq
ZWN0LgogICAgICAgICByZXR1cm4geyJyZXN1bHQiOiBleHRlbnNpb25UYWJJRH07CkBAIC0xNzQs
NiArMjAzLDcgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciA9IGNsYXNzIFdl
Ykluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIgZXh0ZW4KICAgICAgICAgdGFiQ29udGVudFZp
ZXcudmlzaWJsZSA9IHRydWU7CiAgICAgICAgIGxldCBzdWNjZXNzID0gV0kudGFiQnJvd3Nlci5z
aG93VGFiRm9yQ29udGVudFZpZXcodGFiQ29udGVudFZpZXcsIHsKICAgICAgICAgICAgIC4uLm9w
dGlvbnMsCisgICAgICAgICAgICBpbnNlcnRpb25JbmRleDogdGhpcy5faW5zZXJ0aW9uSW5kZXhG
b3JFeHRlbnNpb25UYWIodGFiQ29udGVudFZpZXcpLAogICAgICAgICAgICAgaW5pdGlhdG9ySGlu
dDogV0kuVGFiQnJvd3Nlci5UYWJOYXZpZ2F0aW9uSW5pdGlhdG9yLkZyb250ZW5kQVBJLAogICAg
ICAgICB9KTsKIApAQCAtMjg0LDYgKzMxNCw4NSBAQCBXSS5XZWJJbnNwZWN0b3JFeHRlbnNpb25D
b250cm9sbGVyID0gY2xhc3MgV2ViSW5zcGVjdG9yRXh0ZW5zaW9uQ29udHJvbGxlciBleHRlbgog
CiAgICAgLy8gUHJpdmF0ZQogCisgICAgYXN5bmMgX2xvYWRFeHRlbnNpb25UYWJQb3NpdGlvbnMo
KQorICAgIHsKKyAgICAgICAgbGV0IHNhdmVkVGFiUG9zaXRpb25zID0gYXdhaXQgV0kub2JqZWN0
U3RvcmVzLmdlbmVyYWwuZ2V0KFdlYkluc3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuZXh0ZW5z
aW9uVGFiUG9zaXRpb25zT2JqZWN0U3RvcmVLZXkpOworICAgICAgICB0aGlzLl9leHRlbnNpb25U
YWJQb3NpdGlvbnMgPSBzYXZlZFRhYlBvc2l0aW9ucyB8fCB7fTsKKyAgICB9CisKKyAgICBfc2F2
ZUV4dGVuc2lvblRhYlBvc2l0aW9ucygpCisgICAgeworICAgICAgICBpZiAoIXRoaXMuX2V4dGVu
c2lvblRhYlBvc2l0aW9ucykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0aGlzLl9z
YXZlVGFiUG9zaXRpb25zRGVib3VuY2VyIHx8PSBuZXcgRGVib3VuY2VyKCgpID0+IHsKKyAgICAg
ICAgICAgIGZvciAobGV0IHRhYkJhckl0ZW0gb2YgV0kudGFiQnJvd3Nlci50YWJCYXIudmlzaWJs
ZVRhYkJhckl0ZW1zRnJvbUxlZnRUb1JpZ2h0KSB7CisgICAgICAgICAgICAgICAgaWYgKCEodGFi
QmFySXRlbS5yZXByZXNlbnRlZE9iamVjdCBpbnN0YW5jZW9mIFdJLldlYkluc3BlY3RvckV4dGVu
c2lvblRhYkNvbnRlbnRWaWV3KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgICAgICAgICBsZXQge2FuY2hvclRhYlR5cGUsIGFuY2hvclRhYkluZGV4LCBkaXN0YW5j
ZUZyb21BbmNob3JUYWJ9ID0gdGhpcy5fY29tcHV0ZUluZGljZXNGb3JFeHRlbnNpb25UYWIodGFi
QmFySXRlbS5yZXByZXNlbnRlZE9iamVjdCwge3JlY29tcHV0ZVBvc2l0aW9uczogdHJ1ZX0pOwor
ICAgICAgICAgICAgICAgIHRoaXMuX2V4dGVuc2lvblRhYlBvc2l0aW9uc1t0YWJCYXJJdGVtLnJl
cHJlc2VudGVkT2JqZWN0LnNhdmVkVGFiUG9zaXRpb25LZXldID0ge2FuY2hvclRhYlR5cGUsIGRp
c3RhbmNlRnJvbUFuY2hvclRhYn07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdJLm9i
amVjdFN0b3Jlcy5nZW5lcmFsLnB1dCh0aGlzLl9leHRlbnNpb25UYWJQb3NpdGlvbnMsIFdlYklu
c3BlY3RvckV4dGVuc2lvbkNvbnRyb2xsZXIuZXh0ZW5zaW9uVGFiUG9zaXRpb25zT2JqZWN0U3Rv
cmVLZXkpOworICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5fc2F2ZVRhYlBvc2l0aW9uc0RlYm91
bmNlci5kZWxheUZvclRpbWUoNTAwMCk7CisgICAgfQorCisgICAgX2luc2VydGlvbkluZGV4Rm9y
RXh0ZW5zaW9uVGFiKHRhYkNvbnRlbnRWaWV3LCBvcHRpb25zID0ge30pCisgICAgeworICAgICAg
ICBsZXQge2FuY2hvclRhYlR5cGUsIGFuY2hvclRhYkluZGV4LCBkaXN0YW5jZUZyb21BbmNob3JU
YWJ9ID0gdGhpcy5fY29tcHV0ZUluZGljZXNGb3JFeHRlbnNpb25UYWIodGFiQ29udGVudFZpZXcs
IG9wdGlvbnMpOworICAgICAgICByZXR1cm4gYW5jaG9yVGFiSW5kZXggKyBkaXN0YW5jZUZyb21B
bmNob3JUYWIgKyAxOworICAgIH0KKworICAgIF9jb21wdXRlSW5kaWNlc0ZvckV4dGVuc2lvblRh
Yih0YWJDb250ZW50Vmlldywge3JlY29tcHV0ZVBvc2l0aW9uc30gPSB7fSkKKyAgICB7CisgICAg
ICAgIC8vIE5vdGU6IHBpbm5lZCB0YWJzIGFsd2F5cyBhcHBlYXIgb24gdGhlIHRyYWlsaW5nIGVk
Z2UsIHNvIHdlIGNhbiBpZ25vcmUgdGhlbQorICAgICAgICAvLyBmb3IgdGhlIHB1cnBvc2VzIG9m
IGNvbXB1dGluZyBhbiBgaW5zZXJ0aW9uSW5kZXhgYCBmb3IgYHRhYkNvbnRlbnRWaWV3YC4KKyAg
ICAgICAgbGV0IGFuY2hvclRhYkluZGV4ID0gMDsKKyAgICAgICAgbGV0IHNhdmVkUG9zaXRpb25z
ID0gdGhpcy5fZXh0ZW5zaW9uVGFiUG9zaXRpb25zW3RhYkNvbnRlbnRWaWV3LnNhdmVkVGFiUG9z
aXRpb25LZXldIHx8IHt9OworICAgICAgICBsZXQgYW5jaG9yVGFiVHlwZSA9IChyZWNvbXB1dGVQ
b3NpdGlvbnMgJiYgc2F2ZWRQb3NpdGlvbnMuYW5jaG9yVGFiVHlwZSkgfHwgbnVsbDsKKyAgICAg
ICAgbGV0IGRpc3RhbmNlRnJvbUFuY2hvclRhYiA9IChyZWNvbXB1dGVQb3NpdGlvbnMgJiYgc2F2
ZWRQb3NpdGlvbnMuZGlzdGFuY2VGcm9tQW5jaG9yVGFiKSB8fCAwOworCisgICAgICAgIGxldCB2
aXNpYmxlVGFiQmFySXRlbXMgPSBXSS50YWJCcm93c2VyLnRhYkJhci52aXNpYmxlVGFiQmFySXRl
bXNGcm9tTGVmdFRvUmlnaHQ7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVRh
YkJhckl0ZW1zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgdmlzaWJsZVRhYiA9IHZp
c2libGVUYWJCYXJJdGVtc1tpXS5yZXByZXNlbnRlZE9iamVjdDsKKyAgICAgICAgICAgIGlmICgh
dmlzaWJsZVRhYikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYg
KHZpc2libGVUYWIgPT09IHRhYkNvbnRlbnRWaWV3KQorICAgICAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgICAgICBpZiAodmlzaWJsZVRhYiBpbnN0YW5jZW9mIFdJLldlYkluc3BlY3RvckV4
dGVuc2lvblRhYkNvbnRlbnRWaWV3KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgICAgICBpZiAocmVjb21wdXRlUG9zaXRpb25zKSB7CisgICAgICAgICAgICAgICAgYW5jaG9y
VGFiVHlwZSA9IHZpc2libGVUYWIudHlwZSB8fCBudWxsOworICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlzaWJsZVRhYi50eXBlICE9
PSBhbmNob3JUYWJUeXBlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAg
ICBhbmNob3JUYWJJbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIEZpbmQgdGhlIGNvdW50IG9mIGV4dGVuc2lvbiB0YWJzIGFmdGVyIHRoZSBhbmNo
b3IgdGFiIHRvIGNvbXB1dGUgdGhlIHJlYWwgZGlzdGFuY2VGcm9tQW5jaG9yVGFiLgorICAgICAg
ICAvLyBBZGRpbmcgYGRpc3RhbmNlRnJvbUFuY2hvclRhYmAgdG8gYGFuY2hvclRhYkluZGV4YCBz
aG91bGQgbm90IGluc2VydCB0aGUgdGFiIGFmdGVyIGEgZGlmZmVyZW50IGFuY2hvciB0YWIuCisg
ICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmlzaWJsZVRhYkJhckl0ZW1zLmxlbmd0aCAtIGFu
Y2hvclRhYkluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiQmFySXRlbXNb
YW5jaG9yVGFiSW5kZXggKyBpXS5yZXByZXNlbnRlZE9iamVjdD8uY29uc3RydWN0b3I/LnNob3Vs
ZFNhdmVUYWI/LigpKSB7CisgICAgICAgICAgICAgICAgZGlzdGFuY2VGcm9tQW5jaG9yVGFiID0g
TnVtYmVyLmNvbnN0cmFpbihkaXN0YW5jZUZyb21BbmNob3JUYWIsIDAsIE1hdGgubWF4KDAsIGkg
LSAxKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHthbmNob3JUYWJUeXBlLCBhbmNob3JUYWJJ
bmRleCwgZGlzdGFuY2VGcm9tQW5jaG9yVGFifTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIElmIHRoZSBhbmNob3IgdGFiIGlzIG5vdyBoaWRkZW4gdXBvbiByZXN0b3Jp
bmcsIHBsYWNlIHRoZSBleHRlbnNpb24gYXQgdGhlIGVuZC4KKyAgICAgICAgLy8gVGhpcyBjb3Vs
ZCBoYXBwZW4gaWYgYSBzbWFsbGVyIHNldCBvZiB0YWJzIGFyZSBlbmFibGVkIGZvciB0aGUgaW5z
cGVjdGlvbiB0YXJnZXQuCisgICAgICAgIGFuY2hvclRhYkluZGV4ID0gdmlzaWJsZVRhYkJhckl0
ZW1zLmxlbmd0aCAtIDE7CisgICAgICAgIHJldHVybiB7YW5jaG9yVGFiVHlwZSwgYW5jaG9yVGFi
SW5kZXgsIGRpc3RhbmNlRnJvbUFuY2hvclRhYn07CisgICAgfQorCiAgICAgX2hhbmRsZU1haW5S
ZXNvdXJjZURpZENoYW5nZShldmVudCkKICAgICB7CiAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0
LmlzTWFpbkZyYW1lKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9WaWV3cy9UYWJCYXIuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9WaWV3cy9UYWJCYXIuanMKaW5kZXggNTM5YTIzMGIyZjJjYzkwY2YyZDE2NTM2Nzc1OTFh
YmFiZjQxYWYxYS4uNjg4ZTc2OWFmYWU4ZWVlMTBmODk1MTcwNmU3ODU5ZGI0ZmJkNGE5OCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGFiQmFy
LmpzCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RhYkJh
ci5qcwpAQCAtNDA3LDYgKzQwNywxMSBAQCBXSS5UYWJCYXIgPSBjbGFzcyBUYWJCYXIgZXh0ZW5k
cyBXSS5WaWV3CiAgICAgICAgIHJldHVybiB0aGlzLl90YWJCYXJJdGVtczsKICAgICB9CiAKKyAg
ICBnZXQgdmlzaWJsZVRhYkJhckl0ZW1zRnJvbUxlZnRUb1JpZ2h0KCkKKyAgICB7CisgICAgICAg
ICByZXR1cm4gdGhpcy5fdGFiQmFySXRlbXNGcm9tTGVmdFRvUmlnaHQoKS5maWx0ZXIoKGl0ZW0p
ID0+ICFpdGVtLmhpZGRlbik7CisgICAgfQorCiAgICAgZ2V0IHRhYkNvdW50KCkKICAgICB7CiAg
ICAgICAgIHJldHVybiB0aGlzLl90YWJCYXJJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ucmVw
cmVzZW50ZWRPYmplY3QgaW5zdGFuY2VvZiBXSS5UYWJDb250ZW50VmlldykubGVuZ3RoOwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvV2ViSW5z
cGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5q
cwppbmRleCA0MmY4ZjJhOWM5MDYxYjAxODc5MjMxZjYwMWQ4OGY1ODY1NjcyNjNmLi5iOGM3M2Q0
YTEwZWMyYjdmNGFlOTlhZTMwOWI0YWQ0ZTk2ZTFhZjg4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJD
b250ZW50Vmlldy5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9XZWJJbnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50Vmlldy5qcwpAQCAtNzMsNiArNzMs
MTEgQEAgV0kuV2ViSW5zcGVjdG9yRXh0ZW5zaW9uVGFiQ29udGVudFZpZXcgPSBjbGFzcyBXZWJJ
bnNwZWN0b3JFeHRlbnNpb25UYWJDb250ZW50VmkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
fQogCisgICAgZ2V0IHNhdmVkVGFiUG9zaXRpb25LZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGBFeHRlbnNpb25UYWItJHt0aGlzLl9leHRlbnNpb24uZXh0ZW5zaW9uQnVuZGxlSWRlbnRpZmll
cn0tJHt0aGlzLl90YWJJbmZvLmRpc3BsYXlOYW1lfWA7CisgICAgfQorCiAgICAgd2hlblBhZ2VB
dmFpbGFibGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5QYWdlQXZhaWxhYmxl
UHJvbWlzZS5wcm9taXNlOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>