<?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>98167</bug_id>
          
          <creation_ts>2012-10-02 09:11:41 -0700</creation_ts>
          <short_desc>AX:When aria-label is used, the text under an element is still appearing as the AXTitle</short_desc>
          <delta_ts>2012-10-24 14:49:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Accessibility</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="chris fleizach">cfleizach</reporter>
          <assigned_to name="chris fleizach">cfleizach</assigned_to>
          <cc>apinheiro</cc>
    
    <cc>bdakin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>feature-media-reviews</cc>
    
    <cc>gtk-ews</cc>
    
    <cc>gustavo</cc>
    
    <cc>jdiggs</cc>
    
    <cc>peter+ews</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>732692</commentid>
    <comment_count>0</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-02 09:11:41 -0700</bug_when>
    <thetext>The WAI-ARIA text computation states that if aria-label or aria-labelledby is used, then we should not be exposing the text under the element as its accessible name
http://www.w3.org/TR/wai-aria/roles#textalternativecomputation

However, we are exposing this information in the title() which causes VoiceOver to speak undesired things.

For example
&lt;a href=&quot;#&quot; aria-label=&quot;LINK&quot;&gt;test&lt;/a&gt;

Will expose

AXTitle: test
AXDescription: LINK

Whereas the correct behavior would be to

AXTitle: 
AXDescription: LINK</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732704</commentid>
    <comment_count>1</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-02 09:18:08 -0700</bug_when>
    <thetext>rdar://12379822</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732780</commentid>
    <comment_count>2</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-02 10:14:38 -0700</bug_when>
    <thetext>It&apos;d be great if we could comply with the text alternative computation.

Note that there&apos;s also this spec:
http://www.w3.org/TR/2012/WD-html-aapi-20120329/#calc

They&apos;re not mutually inconsistent, but they each contain slightly different details. Ideally we should support all of the suggestions of both.

My impression is that currently there&apos;s lots of historic logic in AccessibilityObject&apos;s title and description calculation that&apos;s there for historic reasons, or encodes platform-specific logic. For example:

* The help text (value of the &quot;title&quot; attribute) becomes the description if there&apos;s no description
* aria-labelledby and aria-describedby are supposed to be complementary, but they both affect the description
* Different behavior when an element&apos;s label is visible (titleUIElement) or hidden (it goes right into the description) - this interacts poorly with the logic that the help text becomes the description if the description is empty in the case where an element has both title and label.

Rather than trying to fix it incrementally and run the risk of regressions or lots of test churn, how about:

1. Implement new methods: textAlternativeName(), textAlternativeDescription(), and textAlternativeHelp() - these would implement the text alternative computations defined by the specs, starting from scratch with a clean, platform-independent implementation. Add support for testing these in a cross-platform way (add attributes to the accessible wrapper only to be used by DRT/WKTR). We could do this in a series of changes, no production code would be affected.

2. Rewrite most cross-platform tests that access the title or description (anything in LayoutTests/accessibility) to use these new methods.

3. Then deprecate AccessibilityObject::title() and AccessibilityObject::description() and reimplement the platform-specific text methods (AXTitle / AXDescription for Mac, etc.) in terms of these new cross-platform methods, and update the tests. This could be done separately for each platform, rather than trying to coordinate them all at once.

4. Finally, get rid of title() and description(), etc. from AccessibilityObject.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732794</commentid>
    <comment_count>3</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-02 10:27:55 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; It&apos;d be great if we could comply with the text alternative computation.
&gt; 
&gt; Note that there&apos;s also this spec:
&gt; http://www.w3.org/TR/2012/WD-html-aapi-20120329/#calc
&gt; 
&gt; They&apos;re not mutually inconsistent, but they each contain slightly different details. Ideally we should support all of the suggestions of both.

In this instance they are mutually exclusive. If a link has an aria-label, we shouldn&apos;t be exposing what&apos;s on the screen.

&gt; 
&gt; My impression is that currently there&apos;s lots of historic logic in AccessibilityObject&apos;s title and description calculation that&apos;s there for historic reasons, or encodes platform-specific logic. For example:
&gt; 
&gt; * The help text (value of the &quot;title&quot; attribute) becomes the description if there&apos;s no description

This is actually part of the WAI-ARIA text computation algorithm

&gt; * aria-labelledby and aria-describedby are supposed to be complementary, but they both affect the description

This is a tough one because there&apos;s no good place for aria-describedby without another field. Hence labelledby takes precedence, but really they should both be exposed

&gt; * Different behavior when an element&apos;s label is visible (titleUIElement) or hidden (it goes right into the description) - this interacts poorly with the logic that the help text becomes the description if the description is empty in the case where an element has both title and label.
&gt; 
&gt; Rather than trying to fix it incrementally and run the risk of regressions or lots of test churn, how about:
&gt; 
&gt; 1. Implement new methods: textAlternativeName(), textAlternativeDescription(), and textAlternativeHelp() - 

This is essentially what title(), accessibilityDescription(), and helpText() are, but your naming is better.

The problem that I&apos;ve had is what is the difference between name()/title() and description(). On the mac, the difference should be that title() is what&apos;s visible. description is an alternative name. Due to that, we have this mishmash between title and description

This is further complicated by the WAI-ARIA computation which specifies basically this order

1) aria-label*
2) visible text
3) alt text
4) text under element
5) title attribute

So even if we separate them between visible and non-visible, we can&apos;t return some of the values if other values are present (i.e. the bug described in this bug)


Then the platforms could decide how to mix and 
these would implement the text alternative computations defined by the specs, starting from scratch with a clean, platform-independent implementation. Add support for testing these in a cross-platform way (add attributes to the accessible wrapper only to be used by DRT/WKTR). We could do this in a series of changes, no production code would be affected.
&gt; 
&gt; 2. Rewrite most cross-platform tests that access the title or description (anything in LayoutTests/accessibility) to use these new methods.
&gt; 
&gt; 3. Then deprecate AccessibilityObject::title() and AccessibilityObject::description() and reimplement the platform-specific text methods (AXTitle / AXDescription for Mac, etc.) in terms of these new cross-platform methods, and update the tests. This could be done separately for each platform, rather than trying to coordinate them all at once.
&gt; 
&gt; 4. Finally, get rid of title() and description(), etc. from AccessibilityObject.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732848</commentid>
    <comment_count>4</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-02 11:16:27 -0700</bug_when>
    <thetext>Thanks, I think I better understand the Mac attributes.

How about this idea:

* Compute a prioritized list of text associated with an accessible object, and with each one include its source, indicating whether it&apos;s visible or not. The prioritization order would be identical on all platforms and would totally respect the alternative name calculation spec - but the mapping to various native attributes could vary. *

For example:

&lt;a href=&quot;#&quot; aria-label=&quot;LINK&quot;&gt;test&lt;/a&gt;

Returns this list:
[ { text = &quot;LINK&quot;, source = alternative },
  { text = &quot;test&quot;, source = visible } ]

Or for another example:

&lt;label&gt;
  Address
  &lt;input placeholder=&quot;123 Main St&quot; title=&quot;Street address only&quot;&gt;
&lt;/label&gt;

Returns this list:
[ { text = &quot;Address&quot;, source = visible },
  { text = &quot;123 Main St&quot;, source = alternative },
  { text = &quot;Street address only&quot;, source = alternative } ]

On Mac, the logic would be: If the first item in the list is visible, it becomes the title. Anything else in the list gets mapped to the description and help. If the first item in the list is not visible, the title is empty and the first item gets mapped to the description, and the next item gets mapped to the help.

On Windows, the logic is simpler: the first three items in the list get mapped to name, description, and help in that order.

The only thing I&apos;m not sure how to handle is titleUIElement.

How does VoiceOver handle titleUIElement? Specifically, what does VoiceOver do if there&apos;s a titleUIElement and also a title? What about a titleUIElement and also a description?

Perhaps the list could just link directly to the object, if one exists and if it&apos;s visible. This would be handy because on Windows there&apos;s an equivalent of titleUIElement for description - but on Mac there&apos;s only one for title.

So I&apos;m imagining something like this:

enum AccessibleTextSource {
    VISIBLE,
    ALTERNATIVE
};

struct AccessibleText {
    String text;
    AccessibilityObject* textObject; // Only 
    AccessibleTextSource source;
}

class AccessibilityObject {
    ...
    void accessibleText(Vector&lt;AccessibleText&gt;&amp;);
}

I made the source an enum rather than a bool because perhaps there are more platform differences. Maybe the source should include INNER_TEXT, PLACEHOLDER, IMG_ALT, LABEL_ELEMENT, ... - which would give platforms lots of flexibility. For example, suppose that on one platform there&apos;s an explicit way to expose placeholder - that would give us an easy way to skip over the placeholder but still use the same prioritized list.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732865</commentid>
    <comment_count>5</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-02 11:28:24 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Thanks, I think I better understand the Mac attributes.
&gt; 
&gt; How about this idea:
&gt; 
&gt; * Compute a prioritized list of text associated with an accessible object, and with each one include its source, indicating whether it&apos;s visible or not. The prioritization order would be identical on all platforms and would totally respect the alternative name calculation spec - but the mapping to various native attributes could vary. *
&gt; 
&gt; For example:
&gt; 
&gt; &lt;a href=&quot;#&quot; aria-label=&quot;LINK&quot;&gt;test&lt;/a&gt;
&gt; 
&gt; Returns this list:
&gt; [ { text = &quot;LINK&quot;, source = alternative },
&gt;   { text = &quot;test&quot;, source = visible } ]
&gt; 
&gt; Or for another example:
&gt; 
&gt; &lt;label&gt;
&gt;   Address
&gt;   &lt;input placeholder=&quot;123 Main St&quot; title=&quot;Street address only&quot;&gt;
&gt; &lt;/label&gt;
&gt; 
&gt; Returns this list:
&gt; [ { text = &quot;Address&quot;, source = visible },
&gt;   { text = &quot;123 Main St&quot;, source = alternative },
&gt;   { text = &quot;Street address only&quot;, source = alternative } ]
&gt; 

It gets more complicated. Placeholder is its own attribute on the Mac platform, so we want treat that separately sometimes.

&gt; On Mac, the logic would be: If the first item in the list is visible, it becomes the title. Anything else in the list gets mapped to the description and help. If the first item in the list is not visible, the title is empty and the first item gets mapped to the description, and the next item gets mapped to the help.
&gt; 

Another potential issue is dealing with help text. Does that get returned with this struct?

I think we might need to think of all the perverse cases before hand to ensure this system will work, but it seems doable.

&gt; On Windows, the logic is simpler: the first three items in the list get mapped to name, description, and help in that order.
&gt; 
&gt; The only thing I&apos;m not sure how to handle is titleUIElement.
&gt; 
&gt; How does VoiceOver handle titleUIElement? Specifically, what does VoiceOver do if there&apos;s a titleUIElement and also a title? What about a titleUIElement and also a description?
&gt; 

I think VO will speak a title and a title ui element if both are present, but that might change based on the element type as well.

It would be nice to remove the logic in titleUIElement() and title() that depend on each other and move that to platform logic.

&gt; Perhaps the list could just link directly to the object, if one exists and if it&apos;s visible. This would be handy because on Windows there&apos;s an equivalent of titleUIElement for description - but on Mac there&apos;s only one for title.
&gt; 
&gt; So I&apos;m imagining something like this:
&gt; 
&gt; enum AccessibleTextSource {
&gt;     VISIBLE,
&gt;     ALTERNATIVE
&gt; };
&gt; 
&gt; struct AccessibleText {
&gt;     String text;
&gt;     AccessibilityObject* textObject; // Only 
&gt;     AccessibleTextSource source;
&gt; }
&gt; 
&gt; class AccessibilityObject {
&gt;     ...
&gt;     void accessibleText(Vector&lt;AccessibleText&gt;&amp;);
&gt; }
&gt; 
&gt; I made the source an enum rather than a bool because perhaps there are more platform differences. Maybe the source should include INNER_TEXT, PLACEHOLDER, IMG_ALT, LABEL_ELEMENT, ... - which would give platforms lots of flexibility. For example, suppose that on one platform there&apos;s an explicit way to expose placeholder - that would give us an easy way to skip over the placeholder but still use the same prioritized list.

Yea I think an enum would be better here as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>732879</commentid>
    <comment_count>6</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-02 11:35:59 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; It gets more complicated. Placeholder is its own attribute on the Mac platform, so we want treat that separately sometimes.

If we go with the enum idea this might work well. On Mac, it could just skip over placeholder while going through the list.

&gt; Another potential issue is dealing with help text. Does that get returned with this struct?

Yes - but we could use the source enum to indicate the help text so a platform could ignore it.

&gt; I think we might need to think of all the perverse cases before hand to ensure this system will work, but it seems doable.

Agreed. I still think we should implement and test the cross-platform part first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>735449</commentid>
    <comment_count>7</comment_count>
      <attachid>167271</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-05 00:37:06 -0700</bug_when>
    <thetext>Created attachment 167271
potential solution

Here&apos;s what I was thinking. (This mostly works on the Mac, I only have 16/268 tests failing)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736827</commentid>
    <comment_count>8</comment_count>
      <attachid>167271</attachid>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-08 11:21:36 -0700</bug_when>
    <thetext>Comment on attachment 167271
potential solution

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

Some initial thoughts.

&gt; Source/WebCore/accessibility/AccessibilityObject.h:214
&gt; +struct AccessibilityText {

What do you think about including a reference to an AccessibilityObject here, similar to titleUIElement?

On win &amp; atk, there&apos;s something equivalent to titleUIElement for both labeled-by and described-by. That would make titleUIElement easy to implement on top of accessibleText.

&gt; Source/WebCore/accessibility/AccessibilityImageMapLink.cpp:106
&gt; +        textOrder.append(AccessibilityText(titleText, AlternativeText));

should be TitleTagText

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1094
&gt; +        if (webAreaText.isEmpty())

If not empty

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1097
&gt; +    else {

Put return inside if block, get rid of else

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1098
&gt; +        String ariaDescription = ariaAccessibilityDescription();

ariaAccessibilityDescription is confusing because it returns aria-label or aria-labelledby, not aria-describedby...

I&apos;d like ariaLabeledBy to return the reference to the element, similar to titleUIElement. Doesn&apos;t have to be done in this change, but that suggests that ariaAccessibilityDescription should maybe be folded into this method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736832</commentid>
    <comment_count>9</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-08 11:26:58 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 167271 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167271&amp;action=review
&gt; 
&gt; Some initial thoughts.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityObject.h:214
&gt; &gt; +struct AccessibilityText {
&gt; 
&gt; What do you think about including a reference to an AccessibilityObject here, similar to titleUIElement?
&gt; 
&gt; On win &amp; atk, there&apos;s something equivalent to titleUIElement for both labeled-by and described-by. That would make titleUIElement easy to implement on top of accessibleText.
&gt; 

I felt like titleUIElement() wasn&apos;t as necessary since there&apos;s an existing method which is fairly straightforward. So the platform could always look at that method and make further calculations. Then the text calculation wouldn&apos;t have to worry about mixing elements and text with AccessibilityText

Can you describe more what

&quot;On win &amp; atk, there&apos;s something equivalent to titleUIElement for both labeled-by and described-by.&quot;

means

&gt; &gt; Source/WebCore/accessibility/AccessibilityImageMapLink.cpp:106
&gt; &gt; +        textOrder.append(AccessibilityText(titleText, AlternativeText));
&gt; 
&gt; should be TitleTagText
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1094
&gt; &gt; +        if (webAreaText.isEmpty())
&gt; 
&gt; If not empty
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1097
&gt; &gt; +    else {
&gt; 
&gt; Put return inside if block, get rid of else
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1098
&gt; &gt; +        String ariaDescription = ariaAccessibilityDescription();
&gt; 
&gt; ariaAccessibilityDescription is confusing because it returns aria-label or aria-labelledby, not aria-describedby...
&gt; 
&gt; I&apos;d like ariaLabeledBy to return the reference to the element, similar to titleUIElement. Doesn&apos;t have to be done in this change, but that suggests that ariaAccessibilityDescription should maybe be folded into this method.

Right now labelled by just returns the text within the aria-labelledby attribute right? So would that buttress your desire to have an element within AccessibilityText? It almost seems like titleUIElement() and aria-labelledby are perhaps the same thing, and maybe titleUIElement() should first check labelled-by before other things</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736984</commentid>
    <comment_count>10</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-08 13:38:39 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; I felt like titleUIElement() wasn&apos;t as necessary since there&apos;s an existing method which is fairly straightforward.

We can leave it there, but make it a shortcut that just iterates over accessibleText and returns the linked element for the first item in the list.

&gt; Can you describe more what
&gt; 
&gt; &quot;On win &amp; atk, there&apos;s something equivalent to titleUIElement for both labeled-by and described-by.&quot;

For a native accessibility node, one of the APIs is to get all of the &quot;relations&quot; between that node and another node. That is supposed to include both nodes that &quot;label&quot; another element, and nodes that &quot;describe&quot; another element.

http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/group__grp_relations.html

I think the &quot;label&quot; relation is the equivalent of titleUIElement, but we need an equivalent for the &quot;described-by&quot; relation. That make sense?

My idea that at the time when we see a node has either an aria-labelledby, aria-describedby, or an associated label element, we should add both the text and the link to the other element to the accessibleText array once, rather than duplicating that code. Then titleUIElement is just a convenience function.

&gt; Right now labelled by just returns the text within the aria-labelledby attribute right? So would that buttress your desire to have an element within AccessibilityText? It almost seems like titleUIElement() and aria-labelledby are perhaps the same thing, and maybe titleUIElement() should first check labelled-by before other things

I think of aria-labelledby as the complement to label, so for that reason titleUIElement should return the node pointed to by aria-labelledby just as it would for the label element.

Aria-describedby is similar. On Mac, it just turns into description text, but on other platforms we have the option of returning the UI element it points to instead.

- Dominic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>736988</commentid>
    <comment_count>11</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-08 13:43:34 -0700</bug_when>
    <thetext>Only one other general comment: it&apos;d be great if we could test the new accessibilityText method directly from a layout test in a cross-platform manner, rather than having tests only get the platform-specific title, etc.

This is going to require multiple steps to complete. It might be better to get this to pass all tests now and check it in sooner, before changing any behavior. In other words, don&apos;t try to actually fix this bug (&quot;When aria-label is used...&quot;) - just refactor and achieve the same behavior we have currently.

Would that help in getting the 16 tests that fail now to pass?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737020</commentid>
    <comment_count>12</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-08 14:07:14 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; I felt like titleUIElement() wasn&apos;t as necessary since there&apos;s an existing method which is fairly straightforward.
&gt; 
&gt; We can leave it there, but make it a shortcut that just iterates over accessibleText and returns the linked element for the first item in the list.
&gt; 
&gt; &gt; Can you describe more what
&gt; &gt; 
&gt; &gt; &quot;On win &amp; atk, there&apos;s something equivalent to titleUIElement for both labeled-by and described-by.&quot;
&gt; 
&gt; For a native accessibility node, one of the APIs is to get all of the &quot;relations&quot; between that node and another node. That is supposed to include both nodes that &quot;label&quot; another element, and nodes that &quot;describe&quot; another element.
&gt; 
&gt; http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/group__grp_relations.html
&gt; 
&gt; I think the &quot;label&quot; relation is the equivalent of titleUIElement, but we need an equivalent for the &quot;described-by&quot; relation. That make sense?
&gt; 
&gt; My idea that at the time when we see a node has either an aria-labelledby, aria-describedby, or an associated label element, we should add both the text and the link to the other element to the accessibleText array once, rather than duplicating that code. Then titleUIElement is just a convenience function.
&gt; 

Ok, I&apos;m fine with that approach. I can see how it could be used in a cross-platform way.

&gt; &gt; Right now labelled by just returns the text within the aria-labelledby attribute right? So would that buttress your desire to have an element within AccessibilityText? It almost seems like titleUIElement() and aria-labelledby are perhaps the same thing, and maybe titleUIElement() should first check labelled-by before other things
&gt; 
&gt; I think of aria-labelledby as the complement to label, so for that reason titleUIElement should return the node pointed to by aria-labelledby just as it would for the label element.
&gt; 

That sounds like the right change and inline with what I was thinking.

&gt; Aria-describedby is similar. On Mac, it just turns into description text, but on other platforms we have the option of returning the UI element it points to instead.

Makes sense

&gt; 
&gt; - Dominic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737022</commentid>
    <comment_count>13</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-08 14:08:43 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Only one other general comment: it&apos;d be great if we could test the new accessibilityText method directly from a layout test in a cross-platform manner, rather than having tests only get the platform-specific title, etc.

Absolutely. Maybe that can come in the next patch in this sequence.

&gt; 
&gt; This is going to require multiple steps to complete. It might be better to get this to pass all tests now and check it in sooner, before changing any behavior. In other words, don&apos;t try to actually fix this bug (&quot;When aria-label is used...&quot;) - just refactor and achieve the same behavior we have currently.
&gt; 

I agree with that sentiment. 

&gt; Would that help in getting the 16 tests that fail now to pass?

THose 16 tests are probably just minor bugs. you already found a few in your first review. Now that we think the approach is good, I can resolve those pretty quick</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737426</commentid>
    <comment_count>14</comment_count>
      <attachid>167271</attachid>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-08 22:45:00 -0700</bug_when>
    <thetext>Comment on attachment 167271
potential solution

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

Took another full pass, here are a few more detailed comments.

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1822
&gt; +// If there&apos;s alternative text, that can override the title.

The first time I read this, it sounded like you could return something here but VoiceOver would let the description override - but actually this method needs to return nothing if there&apos;s alt text. To be more clear, maybe say &quot;if there&apos;s alternative text that&apos;s meant to override the visible text, this will return the empty string so the alternative text can override the visible text.&quot;

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1830
&gt; +        AccessibilityText text = textOrder[k];

const AccessibilityText&amp; text = textOrder[k]; - and similarly in every other method, so you don&apos;t do an unnecessary copy.

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1845
&gt; +- (NSString *)accessibilityDescription

How about a complementary comment here, indicating this is gathered from alternative text.

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1854
&gt; +        // If we encounter alternative text, then do not expose the title.

Comment is wrong

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1863
&gt; +        if (text.textSource == TitleTagText)

Just curious, why does &quot;title&quot; get promoted to description but not &quot;summary&quot;?

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1891
&gt; +    return [NSString string];

I wonder if it might be more readable to combine these into one method that takes one pass over the string array and computes all three at once:

accessibilityTextMac(const Vector&lt;AccessibilityText&gt;&amp; textOrder, String* title, String* description, String* help)
{
    *title = 0;
    *description = 0;
    *help = 0;

    unsigned length = textOrder.size();
    for (unsigned k = 0; k &lt; length; k++) {
        const AccessibilityText&amp; text = textOrder[k];

        if (text.textSource == VisibleText &amp;&amp; !description)
            title = &amp;text.text;
        else if (text.textSource == AlternativeText)
            description = &amp;text.text;
        ...
    }
}

It would only update pointers when it finds each one, so it&apos;s not actually not less efficient than what you have. And it&apos;d keep all of the logic in one place rather than the logic of accessibilityDescription heavily depending on the logic of accessibilityTitle and so on.

Just an idea. If that looks uglier then I&apos;ll keep thinking about how else we could avoid duplicating the logic.

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1138
&gt; +        const AtomicString&amp; ariaLabel = documentElement-&gt;getAttribute(aria_labelAttr);

Why not call ariaAccessibilityDescription here?

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1231
&gt; +    String describedBy = ariaDescribedByAttribute();

I think aria-describedby should come ahead of aria-help.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737791</commentid>
    <comment_count>15</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-09 08:14:26 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 167271 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=167271&amp;action=review
&gt; 
&gt; Took another full pass, here are a few more detailed comments.
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1822
&gt; &gt; +// If there&apos;s alternative text, that can override the title.
&gt; 
&gt; The first time I read this, it sounded like you could return something here but VoiceOver would let the description override - but actually this method needs to return nothing if there&apos;s alt text. To be more clear, maybe say &quot;if there&apos;s alternative text that&apos;s meant to override the visible text, this will return the empty string so the alternative text can override the visible text.&quot;
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1830
&gt; &gt; +        AccessibilityText text = textOrder[k];
&gt; 
&gt; const AccessibilityText&amp; text = textOrder[k]; - and similarly in every other method, so you don&apos;t do an unnecessary copy.
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1845
&gt; &gt; +- (NSString *)accessibilityDescription
&gt; 
&gt; How about a complementary comment here, indicating this is gathered from alternative text.
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1854
&gt; &gt; +        // If we encounter alternative text, then do not expose the title.
&gt; 
&gt; Comment is wrong
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1863
&gt; &gt; +        if (text.textSource == TitleTagText)
&gt; 
&gt; Just curious, why does &quot;title&quot; get promoted to description but not &quot;summary&quot;?
&gt; 

Developers *frequently* confuse title as a means to &quot;label&quot; an element. Hence WAI-ARIA says as a last resort, use the title to describe the element. They don&apos;t say that for summary

&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm:1891
&gt; &gt; +    return [NSString string];
&gt; 
&gt; I wonder if it might be more readable to combine these into one method that takes one pass over the string array and computes all three at once:
&gt; 
&gt; accessibilityTextMac(const Vector&lt;AccessibilityText&gt;&amp; textOrder, String* title, String* description, String* help)
&gt; {
&gt;     *title = 0;
&gt;     *description = 0;
&gt;     *help = 0;
&gt; 
&gt;     unsigned length = textOrder.size();
&gt;     for (unsigned k = 0; k &lt; length; k++) {
&gt;         const AccessibilityText&amp; text = textOrder[k];
&gt; 
&gt;         if (text.textSource == VisibleText &amp;&amp; !description)
&gt;             title = &amp;text.text;
&gt;         else if (text.textSource == AlternativeText)
&gt;             description = &amp;text.text;
&gt;         ...
&gt;     }
&gt; }

I thought about this, but as you noted it gets messy. I&apos;m not sure which is the best way to go, but I feel separate methods is at least clean

&gt; 
&gt; It would only update pointers when it finds each one, so it&apos;s not actually not less efficient than what you have. And it&apos;d keep all of the logic in one place rather than the logic of accessibilityDescription heavily depending on the logic of accessibilityTitle and so on.
&gt; 
&gt; Just an idea. If that looks uglier then I&apos;ll keep thinking about how else we could avoid duplicating the logic.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1138
&gt; &gt; +        const AtomicString&amp; ariaLabel = documentElement-&gt;getAttribute(aria_labelAttr);
&gt; 
&gt; Why not call ariaAccessibilityDescription here?

The thought that an HTML document could be labelled by an element within itself had not occurred to me. I suppose we could also to labeled-by in another patch

&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1231
&gt; &gt; +    String describedBy = ariaDescribedByAttribute();
&gt; 
&gt; I think aria-describedby should come ahead of aria-help.

I would disagree here. I guess it gets to the heart of what is &quot;help&quot; text. Aria-describedby is not necessarily just &quot;help&quot; text. The fact that it points to something else on screen means that it really is just a relationship to other information on the screen. Aria-help allows you to specifically craft a message designed just to &quot;help&quot; the user understand what to do, or what will happen in regards to this element.

That&apos;s the reason I gave aria-describedby the SummaryTextTag instead of HelpText tag, so a platform could decide what to do with both if need be.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737814</commentid>
    <comment_count>16</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-09 08:46:40 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Developers *frequently* confuse title as a means to &quot;label&quot; an element. Hence WAI-ARIA says as a last resort, use the title to describe the element. They don&apos;t say that for summary

You&apos;re right. Agreed.

&gt; &gt; Why not call ariaAccessibilityDescription here?
&gt; 
&gt; The thought that an HTML document could be labelled by an element within itself had not occurred to me. I suppose we could also to labeled-by in another patch

I&apos;m still in favor of this just for symmetry - I think the rules for a document should be as similar as possible to the rules for any other element. It&apos;s the least confusing for developers and users.

&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1231
&gt; &gt; &gt; +    String describedBy = ariaDescribedByAttribute();
&gt; &gt; 
&gt; &gt; I think aria-describedby should come ahead of aria-help.
&gt; 
&gt; I would disagree here. I guess it gets to the heart of what is &quot;help&quot; text. Aria-describedby is not necessarily just &quot;help&quot; text. The fact that it points to something else on screen means that it really is just a relationship to other information on the screen. Aria-help allows you to specifically craft a message designed just to &quot;help&quot; the user understand what to do, or what will happen in regards to this element.
&gt; 
&gt; That&apos;s the reason I gave aria-describedby the SummaryTextTag instead of HelpText tag, so a platform could decide what to do with both if need be.

Good point.  Since aria-help isn&apos;t actually specified in the spec yet, we can let platforms decide.

- Dominic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>737841</commentid>
    <comment_count>17</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-09 09:07:15 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; Developers *frequently* confuse title as a means to &quot;label&quot; an element. Hence WAI-ARIA says as a last resort, use the title to describe the element. They don&apos;t say that for summary
&gt; 
&gt; You&apos;re right. Agreed.
&gt; 
&gt; &gt; &gt; Why not call ariaAccessibilityDescription here?
&gt; &gt; 
&gt; &gt; The thought that an HTML document could be labelled by an element within itself had not occurred to me. I suppose we could also to labeled-by in another patch
&gt; 
&gt; I&apos;m still in favor of this just for symmetry - I think the rules for a document should be as similar as possible to the rules for any other element. It&apos;s the least confusing for developers and users.

https://bugs.webkit.org/show_bug.cgi?id=98784

&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1231
&gt; &gt; &gt; &gt; +    String describedBy = ariaDescribedByAttribute();
&gt; &gt; &gt; 
&gt; &gt; &gt; I think aria-describedby should come ahead of aria-help.
&gt; &gt; 
&gt; &gt; I would disagree here. I guess it gets to the heart of what is &quot;help&quot; text. Aria-describedby is not necessarily just &quot;help&quot; text. The fact that it points to something else on screen means that it really is just a relationship to other information on the screen. Aria-help allows you to specifically craft a message designed just to &quot;help&quot; the user understand what to do, or what will happen in regards to this element.
&gt; &gt; 
&gt; &gt; That&apos;s the reason I gave aria-describedby the SummaryTextTag instead of HelpText tag, so a platform could decide what to do with both if need be.
&gt; 
&gt; Good point.  Since aria-help isn&apos;t actually specified in the spec yet, we can let platforms decide.
&gt; 
&gt; - Dominic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743308</commentid>
    <comment_count>18</comment_count>
      <attachid>168977</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-16 11:00:20 -0700</bug_when>
    <thetext>Created attachment 168977
patch

This patch passes all mac tests with a minor adjustment to one test
Doing this exercise definitely exposed some weirdness and inconsistency with how various tags and attributes are applied for different elements.
it will be good to fix those after this gets in</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743312</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-16 11:03:34 -0700</bug_when>
    <thetext>Attachment 168977 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;LayoutTests/ChangeLog&apos;, u&apos;LayoutTests/plat...&quot; exit_code: 1
Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1232:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Total errors found: 1 in 12 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743333</commentid>
    <comment_count>20</comment_count>
      <attachid>168977</attachid>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2012-10-16 11:18:40 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/14395204</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743340</commentid>
    <comment_count>21</comment_count>
      <attachid>168977</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-16 11:24:34 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/14397227</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743357</commentid>
    <comment_count>22</comment_count>
      <attachid>168977</attachid>
    <who name="kov&apos;s GTK+ EWS bot">gtk-ews</who>
    <bug_when>2012-10-16 11:38:23 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/14384264</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743367</commentid>
    <comment_count>23</comment_count>
      <attachid>168977</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-10-16 11:44:47 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/14384267</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743385</commentid>
    <comment_count>24</comment_count>
      <attachid>168977</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-10-16 11:57:03 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass qt-wk2-ews (qt):
Output: http://queues.webkit.org/results/14384274</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743402</commentid>
    <comment_count>25</comment_count>
      <attachid>168977</attachid>
    <who name="Peter Beverloo (cr-android ews)">peter+ews</who>
    <bug_when>2012-10-16 12:12:18 -0700</bug_when>
    <thetext>Comment on attachment 168977
patch

Attachment 168977 did not pass cr-android-ews (chromium-android):
Output: http://queues.webkit.org/results/14392234</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>749354</commentid>
    <comment_count>26</comment_count>
      <attachid>170316</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-23 22:34:02 -0700</bug_when>
    <thetext>Created attachment 170316
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>749355</commentid>
    <comment_count>27</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-23 22:34:51 -0700</bug_when>
    <thetext>this patch addresses the original problem now that we&apos;ve refactored how text is determined.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>749414</commentid>
    <comment_count>28</comment_count>
      <attachid>170316</attachid>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-24 00:06:23 -0700</bug_when>
    <thetext>Comment on attachment 170316
patch

Unofficial review, looks great. Thanks for doing the refactoring work,
it makes this fix so easy and clean now. Just one small idea.

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

&gt; LayoutTests/platform/mac/accessibility/aria-label-overrides-visible-text.html:6
&gt; +&lt;a tabindex=&quot;0&quot; id=&quot;link&quot; href=&quot;#&quot; aria-label=&quot;LINK&quot;&gt;test1&lt;/a&gt;

It would be even more clear if you had two links here to test - the first one just has text, the second one overrides it with aria-label.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>750068</commentid>
    <comment_count>29</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-24 14:49:17 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/132404

Also added extra test scenario as Dominic suggested</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>167271</attachid>
            <date>2012-10-05 00:37:06 -0700</date>
            <delta_ts>2012-10-16 11:00:20 -0700</delta_ts>
            <desc>potential solution</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>21994</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFw
TGluay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eUltYWdlTWFwTGluay5oCShyZXZpc2lvbiAxMzAxODQpCisrKyBTb3VyY2UvV2ViQ29y
ZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuaAkod29ya2luZyBjb3B5
KQpAQCAtNzMsNiArNzMsNyBAQAogICAgIFJlZlB0cjxIVE1MQXJlYUVsZW1lbnQ+IG1fYXJlYUVs
ZW1lbnQ7CiAgICAgUmVmUHRyPEhUTUxNYXBFbGVtZW50PiBtX21hcEVsZW1lbnQ7CiAgICAgCisg
ICAgdmlydHVhbCB2b2lkIGFjY2Vzc2liaWxpdHlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4mIHRleHRPcmRlcik7CiAgICAgdmlydHVhbCBib29sIGlzSW1hZ2VNYXBMaW5rKCkgY29uc3Qg
eyByZXR1cm4gdHJ1ZTsgfQogfTsKICAgICAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2li
aWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RX
cmFwcGVyLm1tCShyZXZpc2lvbiAxMzAxODQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbQkod29ya2luZyBjb3B5KQpA
QCAtMTgxOCw2ICsxODE4LDc5IEBACiAgICAgcmV0dXJuIFtzZWxmIHJlbW90ZUFjY2Vzc2liaWxp
dHlQYXJlbnRPYmplY3RdOwogfQogCisvLyBUaGlzIHNob3VsZCBiZSB0aGUgInZpc2libGUiIHRl
eHQgdGhhdCdzIGFjdHVhbGx5IG9uIHRoZSBzY3JlZW4gaWYgcG9zc2libGUuCisvLyBJZiB0aGVy
ZSdzIGFsdGVybmF0aXZlIHRleHQsIHRoYXQgY2FuIG92ZXJyaWRlIHRoZSB0aXRsZS4KKy0gKE5T
U3RyaW5nICopYWNjZXNzaWJpbGl0eVRpdGxlCit7CisgICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlU
ZXh0PiB0ZXh0T3JkZXI7CisgICAgbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlUZXh0KHRleHRPcmRl
cik7CisgICAgCisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE9yZGVyLnNpemUoKTsKKyAgICBm
b3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgQWNjZXNzaWJp
bGl0eVRleHQgdGV4dCA9IHRleHRPcmRlcltrXTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHdl
IGVuY291bnRlciBhbHRlcm5hdGl2ZSB0ZXh0LCB0aGVuIGRvIG5vdCBleHBvc2UgdGhlIHRpdGxl
LgorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IEFsdGVybmF0aXZlVGV4dCkKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLy8gT25jZSB3ZSBlbmNvdW50ZXIgdmlz
aWJsZSB0ZXh0LCBvciB0aGUgdGV4dCBmcm9tIG91ciBjaGlsZHJlbiwKKyAgICAgICAgLy8gdGhh
dCBzaG91bGQgYmUgdXNlZAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IFZpc2libGVU
ZXh0IHx8IHRleHQudGV4dFNvdXJjZSA9PSBDaGlsZHJlblRleHQpCisgICAgICAgICAgICByZXR1
cm4gdGV4dC50ZXh0OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107
Cit9CisKKy0gKE5TU3RyaW5nICopYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uCit7CisgICAgVmVj
dG9yPEFjY2Vzc2liaWxpdHlUZXh0PiB0ZXh0T3JkZXI7CisgICAgbV9vYmplY3QtPmFjY2Vzc2li
aWxpdHlUZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE9y
ZGVyLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsK
KyAgICAgICAgQWNjZXNzaWJpbGl0eVRleHQgdGV4dCA9IHRleHRPcmRlcltrXTsKKyAgICAgICAg
CisgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhbHRlcm5hdGl2ZSB0ZXh0LCB0aGVuIGRvIG5v
dCBleHBvc2UgdGhlIHRpdGxlLgorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IEFsdGVy
bmF0aXZlVGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnRleHQ7CisgICAgICAgIAorICAg
ICAgICAvLyBJZiB3ZSBoYXZlIHZpc2libGUgdGV4dCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJl
bHkgb24gYSB0aXRsZSB0YWcuCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gVmlzaWJs
ZVRleHQgfHwgdGV4dC50ZXh0U291cmNlID09IENoaWxkcmVuVGV4dCkKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB2aXNpYmxlIG9yIGFs
dGVybmF0aXZlIHRleHQsIHRoZW4gdXNlIHRoZSB0aXRsZSB0YWcuCisgICAgICAgIGlmICh0ZXh0
LnRleHRTb3VyY2UgPT0gVGl0bGVUYWdUZXh0KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4
dDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmddOworfQorCistIChO
U1N0cmluZyAqKWFjY2Vzc2liaWxpdHlIZWxwVGV4dAoreworICAgIFZlY3RvcjxBY2Nlc3NpYmls
aXR5VGV4dD4gdGV4dE9yZGVyOworICAgIG1fb2JqZWN0LT5hY2Nlc3NpYmlsaXR5VGV4dCh0ZXh0
T3JkZXIpOworICAgIAorICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHRPcmRlci5zaXplKCk7Cisg
ICAgYm9vbCB1c2VUaXRsZVRhZyA9IHRydWU7CisgICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8
IGxlbmd0aDsgaysrKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlUZXh0IHRleHQgPSB0ZXh0T3Jk
ZXJba107CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IEhlbHBUZXh0
IHx8IHRleHQudGV4dFNvdXJjZSA9PSBTdW1tYXJ5VGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0
ZXh0LnRleHQ7CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IEFsdGVy
bmF0aXZlVGV4dCB8fCB0ZXh0LnRleHRTb3VyY2UgPT0gVmlzaWJsZVRleHQKKyAgICAgICAgICAg
IHx8IHRleHQudGV4dFNvdXJjZSA9PSBDaGlsZHJlblRleHQpCisgICAgICAgICAgICB1c2VUaXRs
ZVRhZyA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKHRleHQudGV4dFNvdXJjZSA9PSBU
aXRsZVRhZ1RleHQgJiYgdXNlVGl0bGVUYWcpCisgICAgICAgICAgICByZXR1cm4gdGV4dC50ZXh0
OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107Cit9CisKIC8vIEZJ
WE1FOiBzcGxpdCB1cCB0aGlzIGZ1bmN0aW9uIGluIGEgYmV0dGVyIHdheS4gIAogLy8gc3VnZ2Vz
dGlvbnM6IFVzZSBhIGhhc2ggdGFibGUgdGhhdCBtYXBzIGF0dHJpYnV0ZSBuYW1lcyB0byBmdW5j
dGlvbiBjYWxscywKIC8vIG9yIG1heWJlIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMKQEAg
LTE5ODQsNyArMjA1Nyw4IEBACiAgICAgICAgICAgICBpZiAoW1tbc2VsZiBhdHRhY2htZW50Vmll
d10gYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZU5hbWVzXSBjb250YWluc09iamVjdDpOU0FjY2Vzc2li
aWxpdHlUaXRsZUF0dHJpYnV0ZV0pIAogICAgICAgICAgICAgICAgIHJldHVybiBbW3NlbGYgYXR0
YWNobWVudFZpZXddIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTpOU0FjY2Vzc2liaWxpdHlU
aXRsZUF0dHJpYnV0ZV07CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fb2JqZWN0LT50aXRs
ZSgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFtzZWxmIGFjY2Vzc2liaWxpdHlUaXRsZV07
CiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlTmFtZSBpc0VxdWFsVG9TdHJpbmc6IE5T
QWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uQXR0cmlidXRlXSkgewpAQCAtMTk5Miw3ICsyMDY2LDcg
QEAKICAgICAgICAgICAgIGlmIChbW1tzZWxmIGF0dGFjaG1lbnRWaWV3XSBhY2Nlc3NpYmlsaXR5
QXR0cmlidXRlTmFtZXNdIGNvbnRhaW5zT2JqZWN0Ok5TQWNjZXNzaWJpbGl0eURlc2NyaXB0aW9u
QXR0cmlidXRlXSkKICAgICAgICAgICAgICAgICByZXR1cm4gW1tzZWxmIGF0dGFjaG1lbnRWaWV3
XSBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6TlNBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25B
dHRyaWJ1dGVdOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX29iamVjdC0+YWNjZXNzaWJp
bGl0eURlc2NyaXB0aW9uKCk7CisgICAgICAgIHJldHVybiBbc2VsZiBhY2Nlc3NpYmlsaXR5RGVz
Y3JpcHRpb25dOwogICAgIH0KIAogICAgIGlmIChbYXR0cmlidXRlTmFtZSBpc0VxdWFsVG9TdHJp
bmc6IE5TQWNjZXNzaWJpbGl0eVZhbHVlQXR0cmlidXRlXSkgewpAQCAtMjA0Niw3ICsyMTIwLDcg
QEAKICAgICAgICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6bV9vYmplY3QtPm1h
eFZhbHVlRm9yUmFuZ2UoKV07CiAKICAgICBpZiAoW2F0dHJpYnV0ZU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOiBOU0FjY2Vzc2liaWxpdHlIZWxwQXR0cmlidXRlXSkKLSAgICAgICAgcmV0dXJuIG1fb2Jq
ZWN0LT5oZWxwVGV4dCgpOworICAgICAgICByZXR1cm4gW3NlbGYgYWNjZXNzaWJpbGl0eUhlbHBU
ZXh0XTsKIAogICAgIGlmIChbYXR0cmlidXRlTmFtZSBpc0VxdWFsVG9TdHJpbmc6IE5TQWNjZXNz
aWJpbGl0eUZvY3VzZWRBdHRyaWJ1dGVdKQogICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJl
cldpdGhCb29sOiBtX29iamVjdC0+aXNGb2N1c2VkKCldOwpJbmRleDogU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmgJ
KHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNDMsOCArMTQzLDYgQEAK
ICAgICB2aXJ0dWFsIFBsYWluVGV4dFJhbmdlIHNlbGVjdGVkVGV4dFJhbmdlKCkgY29uc3Q7CiAg
ICAgdmlydHVhbCBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbigpIGNvbnN0OwogICAgIHZpcnR1
YWwgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBTdHJpbmcgYXJpYURl
c2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBTdHJpbmcgYWNjZXNzaWJp
bGl0eURlc2NyaXB0aW9uKCkgY29uc3Q7CiAgICAgdmlydHVhbCBTdHJpbmcgaGVscFRleHQoKSBj
b25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0VW5kZXJFbGVtZW50KCkgY29uc3Q7CiAgICAg
dmlydHVhbCBTdHJpbmcgdGV4dCgpIGNvbnN0OwpAQCAtMjYxLDggKzI1OSw2IEBACiAgICAgYm9v
bCBlbGVtZW50QXR0cmlidXRlVmFsdWUoY29uc3QgUXVhbGlmaWVkTmFtZSYpIGNvbnN0OwogICAg
IHZvaWQgc2V0RWxlbWVudEF0dHJpYnV0ZVZhbHVlKGNvbnN0IFF1YWxpZmllZE5hbWUmLCBib29s
KTsKICAgICAKLSAgICBTdHJpbmcgd2ViQXJlYUFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNv
bnN0OwotCiAgICAgdmlydHVhbCBFU3BlYWsgc3BlYWtQcm9wZXJ0eSgpIGNvbnN0OwogICAgIAog
ICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBhcmlhTGl2ZVJlZ2lvblN0YXR1cygpIGNv
bnN0OwpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2Jq
ZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5T2JqZWN0LmgJKHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMDEsNiAr
MjAxLDI2IEBACiAgICAgV2luZG93Um9sZSwKIH07CiAKK2VudW0gQWNjZXNzaWJpbGl0eVRleHRT
b3VyY2UgeworICAgIEFsdGVybmF0aXZlVGV4dCwKKyAgICBDaGlsZHJlblRleHQsCisgICAgU3Vt
bWFyeVRleHQsCisgICAgSGVscFRleHQsCisgICAgVmlzaWJsZVRleHQsCisgICAgVGl0bGVUYWdU
ZXh0LAorICAgIFBsYWNlaG9sZGVyVGV4dCwKK307CisgICAgCitzdHJ1Y3QgQWNjZXNzaWJpbGl0
eVRleHQgeworICAgIFN0cmluZyB0ZXh0OworICAgIEFjY2Vzc2liaWxpdHlUZXh0U291cmNlIHRl
eHRTb3VyY2U7CisgICAgCisgICAgQWNjZXNzaWJpbGl0eVRleHQoY29uc3QgU3RyaW5nJiB0LCBj
b25zdCBBY2Nlc3NpYmlsaXR5VGV4dFNvdXJjZSYgcykKKyAgICA6IHRleHQodCkKKyAgICAsIHRl
eHRTb3VyY2UocykKKyAgICB7IH0KK307CisgICAgCiBlbnVtIEFjY2Vzc2liaWxpdHlPcmllbnRh
dGlvbiB7CiAgICAgQWNjZXNzaWJpbGl0eU9yaWVudGF0aW9uVmVydGljYWwsCiAgICAgQWNjZXNz
aWJpbGl0eU9yaWVudGF0aW9uSG9yaXpvbnRhbCwKQEAgLTQzMCw5ICs0NTAsNiBAQAogICAgIHZp
cnR1YWwgYm9vbCBjYW5TZXRTZWxlY3RlZENoaWxkcmVuQXR0cmlidXRlKCkgY29uc3QgeyByZXR1
cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgY2FuU2V0RXhwYW5kZWRBdHRyaWJ1dGUoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIAotICAgIC8vIEEgcHJvZ3JhbW1hdGljIHdheSB0
byBzZXQgYSBuYW1lIG9uIGFuIEFjY2Vzc2libGVPYmplY3QuCi0gICAgdmlydHVhbCB2b2lkIHNl
dEFjY2Vzc2libGVOYW1lKGNvbnN0IEF0b21pY1N0cmluZyYpIHsgfQotICAgIAogICAgIHZpcnR1
YWwgTm9kZSogbm9kZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIFJlbmRlck9i
amVjdCogcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBib29sIGFj
Y2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdCAgeyByZXR1cm4gdHJ1ZTsgfQpAQCAtNTAxLDEy
ICs1MTgsMjkgQEAKICAgICB2aXJ0dWFsIGJvb2wgaXNQcmVzZW50YXRpb25hbENoaWxkT2ZBcmlh
Um9sZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGFyaWFSb2xl
SGFzUHJlc2VudGF0aW9uYWxDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAg
ICB2b2lkIHNldFJvbGVWYWx1ZShBY2Nlc3NpYmlsaXR5Um9sZSByb2xlKSB7IG1fcm9sZSA9IHJv
bGU7IH0KLSAgICB2aXJ0dWFsIEFjY2Vzc2liaWxpdHlSb2xlIHJvbGVWYWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcm9sZTsgfQorICAgIC8vIEFjY2Vzc2liaWxpdHkgVGV4dAorICAgIHZpcnR1YWwg
dm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JikgeyB9Owor
CisgICAgLy8gQSBwcm9ncmFtbWF0aWMgd2F5IHRvIHNldCBhIG5hbWUgb24gYW4gQWNjZXNzaWJs
ZU9iamVjdC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0QWNjZXNzaWJsZU5hbWUoY29uc3QgQXRvbWlj
U3RyaW5nJikgeyB9CisKKyAgICAvLyBBY2Nlc3NpYmlsaXR5IFRleHQgLSAoVG8gYmUgZGVwcmVj
YXRlZCkuCisgICAgdmlydHVhbCBTdHJpbmcgYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCkgY29u
c3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB0aXRsZSgpIGNvbnN0
IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBTdHJpbmcgaGVscFRleHQoKSBjb25z
dCB7IHJldHVybiBTdHJpbmcoKTsgfQorCisgICAgLy8gTWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcg
YWNjZXNzaWJpbGl0eSB0ZXh0LgorICAgIHZpcnR1YWwgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0VW5kZXJFbGVt
ZW50KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0
KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIGludCB0ZXh0TGVuZ3Ro
KCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgU3RyaW5nIGFyaWFMYWJlbGVkQnlB
dHRyaWJ1dGUoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQogICAgIHZpcnR1YWwgU3RyaW5n
IGFyaWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9Ci0g
ICAgdmlydHVhbCBTdHJpbmcgYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1
cm4gU3RyaW5nKCk7IH0KKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHBsYWNlaG9sZGVyVmFsdWUo
KSBjb25zdDsKIAorICAgIHZvaWQgc2V0Um9sZVZhbHVlKEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUp
IHsgbV9yb2xlID0gcm9sZTsgfQorICAgIHZpcnR1YWwgQWNjZXNzaWJpbGl0eVJvbGUgcm9sZVZh
bHVlKCkgY29uc3QgeyByZXR1cm4gbV9yb2xlOyB9CisKICAgICB2aXJ0dWFsIEFYT2JqZWN0Q2Fj
aGUqIGF4T2JqZWN0Q2FjaGUoKSBjb25zdDsKICAgICBBWElEIGF4T2JqZWN0SUQoKSBjb25zdCB7
IHJldHVybiBtX2lkOyB9CiAgICAgdm9pZCBzZXRBWE9iamVjdElEKEFYSUQgYXhPYmplY3RJRCkg
eyBtX2lkID0gYXhPYmplY3RJRDsgfQpAQCAtNTI5LDEyICs1NjMsNiBAQAogICAgIAogICAgIHZp
cnR1YWwgS1VSTCB1cmwoKSBjb25zdCB7IHJldHVybiBLVVJMKCk7IH0KICAgICB2aXJ0dWFsIFZp
c2libGVTZWxlY3Rpb24gc2VsZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVmlzaWJsZVNlbGVjdGlv
bigpOyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgc3RyaW5nVmFsdWUoKSBjb25zdCB7IHJldHVybiBT
dHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHRpdGxlKCkgY29uc3QgeyByZXR1cm4gU3Ry
aW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyBoZWxwVGV4dCgpIGNvbnN0IHsgcmV0dXJuIFN0
cmluZygpOyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgdGV4dFVuZGVyRWxlbWVudCgpIGNvbnN0IHsg
cmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgdGV4dCgpIGNvbnN0IHsgcmV0
dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBpbnQgdGV4dExlbmd0aCgpIGNvbnN0IHsgcmV0
dXJuIDA7IH0KICAgICB2aXJ0dWFsIFN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25zdCB7IHJldHVy
biBTdHJpbmcoKTsgfQogICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBhY2Nlc3NLZXko
KSBjb25zdCB7IHJldHVybiBudWxsQXRvbTsgfQogICAgIGNvbnN0IFN0cmluZyYgYWN0aW9uVmVy
YigpIGNvbnN0OwpAQCAtNTQ2LDcgKzU3NCw2IEBACiAgICAgdmlydHVhbCBGcmFtZVZpZXcqIGRv
Y3VtZW50RnJhbWVWaWV3KCkgY29uc3Q7CiAgICAgU3RyaW5nIGxhbmd1YWdlKCkgY29uc3Q7CiAg
ICAgdmlydHVhbCB1bnNpZ25lZCBoaWVyYXJjaGljYWxMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHBsYWNlaG9sZGVyVmFsdWUoKSBjb25zdDsKICAg
ICAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXNlZChib29sKSB7IH0KICAgICB2aXJ0dWFsIHZv
aWQgc2V0U2VsZWN0ZWRUZXh0KGNvbnN0IFN0cmluZyYpIHsgfQpJbmRleDogU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuaAko
cmV2aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5Tm9kZU9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNzQsMTMgKzE3NCwyMCBAQAog
ICAgIHZvaWQgYXJpYUxhYmVsZWRCeUVsZW1lbnRzKFZlY3RvcjxFbGVtZW50Kj4mIGVsZW1lbnRz
KSBjb25zdDsKICAgICBTdHJpbmcgYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uRm9yRWxlbWVudHMo
VmVjdG9yPEVsZW1lbnQqPiAmZWxlbWVudHMpIGNvbnN0OwogICAgIHZvaWQgZWxlbWVudHNGcm9t
QXR0cmlidXRlKFZlY3RvcjxFbGVtZW50Kj4mIGVsZW1lbnRzLCBjb25zdCBRdWFsaWZpZWROYW1l
JikgY29uc3Q7Ci0KKyAgICBTdHJpbmcgYXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3Q7
CisgICAgCiAgICAgRWxlbWVudCogbWVudUVsZW1lbnRGb3JNZW51QnV0dG9uKCkgY29uc3Q7CiAg
ICAgRWxlbWVudCogbWVudUl0ZW1FbGVtZW50Rm9yTWVudSgpIGNvbnN0OwogICAgIEFjY2Vzc2li
aWxpdHlPYmplY3QqIG1lbnVCdXR0b25Gb3JNZW51KCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAg
Tm9kZSogbV9ub2RlOworCisgICAgdmlydHVhbCB2b2lkIGFjY2Vzc2liaWxpdHlUZXh0KFZlY3Rv
cjxBY2Nlc3NpYmlsaXR5VGV4dD4mKTsKKyAgICB2b2lkIGFsdGVybmF0aXZlVGV4dChWZWN0b3I8
QWNjZXNzaWJpbGl0eVRleHQ+JikgY29uc3Q7CisgICAgdm9pZCB2aXNpYmxlVGV4dChWZWN0b3I8
QWNjZXNzaWJpbGl0eVRleHQ+JikgY29uc3Q7CisgICAgdm9pZCBoZWxwVGV4dChWZWN0b3I8QWNj
ZXNzaWJpbGl0eVRleHQ+JikgY29uc3Q7CisgICAgU3RyaW5nIGFsdGVybmF0aXZlVGV4dEZvcldl
YkFyZWEoKSBjb25zdDsKIH07CiAKIGlubGluZSBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdCogdG9B
Y2Nlc3NpYmlsaXR5Tm9kZU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QpCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eUltYWdlTWFwTGluay5jcHAJKHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3Jl
L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluay5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTk0LDYgKzk0LDE3IEBACiAgICAgCiAgICAgcmV0dXJuIG1fYXJlYUVsZW1lbnQtPmhy
ZWYoKTsKIH0KKwordm9pZCBBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rOjphY2Nlc3NpYmlsaXR5
VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7CisgICAgU3RyaW5n
IGRlc2NyaXB0aW9uID0gYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCk7CisgICAgaWYgKCFkZXNj
cmlwdGlvbi5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0
eVRleHQoZGVzY3JpcHRpb24sIEFsdGVybmF0aXZlVGV4dCkpOworCisgICAgU3RyaW5nIHRpdGxl
VGV4dCA9IHRpdGxlKCk7CisgICAgaWYgKCF0aXRsZVRleHQuaXNFbXB0eSgpKQorICAgICAgICB0
ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KHRpdGxlVGV4dCwgQWx0ZXJuYXRpdmVU
ZXh0KSk7Cit9CiAgICAgCiBTdHJpbmcgQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluazo6YWNjZXNz
aWJpbGl0eURlc2NyaXB0aW9uKCkgY29uc3QKIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
cmV2aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5UmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzI1LDcyICs3MjUsNiBA
QAogICAgIHJldHVybiAwOwogfQogCi1TdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
YXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3QKLXsKLSAgICBWZWN0b3I8RWxlbWVudCo+
IGVsZW1lbnRzOwotICAgIGVsZW1lbnRzRnJvbUF0dHJpYnV0ZShlbGVtZW50cywgYXJpYV9kZXNj
cmliZWRieUF0dHIpOwotICAgIAotICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25G
b3JFbGVtZW50cyhlbGVtZW50cyk7Ci19Ci0gICAgCi1TdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6d2ViQXJlYUFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0Ci17Ci0gICAg
Ly8gVGhlIFdlYkFyZWEgZGVzY3JpcHRpb24gc2hvdWxkIGZvbGxvdyB0aGlzIG9yZGVyOgotICAg
IC8vICAgICBhcmlhLWxhYmVsIG9uIHRoZSA8aHRtbD4KLSAgICAvLyAgICAgdGl0bGUgb24gdGhl
IDxodG1sPgotICAgIC8vICAgICA8dGl0bGU+IGluc2lkZSB0aGUgPGhlYWQ+IChvZiBpdCB3YXMg
c2V0IHRocm91Z2ggSlMpCi0gICAgLy8gICAgIG5hbWUgb24gdGhlIDxodG1sPgotICAgIC8vIEZv
ciBpZnJhbWVzOgotICAgIC8vICAgICBhcmlhLWxhYmVsIG9uIHRoZSA8aWZyYW1lPgotICAgIC8v
ICAgICB0aXRsZSBvbiB0aGUgPGlmcmFtZT4KLSAgICAvLyAgICAgbmFtZSBvbiB0aGUgPGlmcmFt
ZT4KLSAgICAKLSAgICBpZiAoIW1fcmVuZGVyZXIpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsK
LSAgICAKLSAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBtX3JlbmRlcmVyLT5kb2N1bWVudCgpOwot
ICAgIAotICAgIC8vIENoZWNrIGlmIHRoZSBIVE1MIGVsZW1lbnQgaGFzIGFuIGFyaWEtbGFiZWwg
Zm9yIHRoZSB3ZWJwYWdlLgotICAgIGlmIChFbGVtZW50KiBkb2N1bWVudEVsZW1lbnQgPSBkb2N1
bWVudC0+ZG9jdW1lbnRFbGVtZW50KCkpIHsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBh
cmlhTGFiZWwgPSBkb2N1bWVudEVsZW1lbnQtPmdldEF0dHJpYnV0ZShhcmlhX2xhYmVsQXR0cik7
Ci0gICAgICAgIGlmICghYXJpYUxhYmVsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBh
cmlhTGFiZWw7Ci0gICAgfQotICAgIAotICAgIE5vZGUqIG93bmVyID0gZG9jdW1lbnQtPm93bmVy
RWxlbWVudCgpOwotICAgIGlmIChvd25lcikgewotICAgICAgICBpZiAob3duZXItPmhhc1RhZ05h
bWUoZnJhbWVUYWcpIHx8IG93bmVyLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpIHsKLSAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdGl0bGUgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVt
ZW50QmFzZSo+KG93bmVyKS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAgICAgICBp
ZiAoIXRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudEJhc2UqPihvd25lcikt
PmdldE5hbWVBdHRyaWJ1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3duZXItPmlzSFRN
TEVsZW1lbnQoKSkKLSAgICAgICAgICAgIHJldHVybiB0b0hUTUxFbGVtZW50KG93bmVyKS0+Z2V0
TmFtZUF0dHJpYnV0ZSgpOwotICAgIH0KLQotICAgIFN0cmluZyBkb2N1bWVudFRpdGxlID0gZG9j
dW1lbnQtPnRpdGxlKCk7Ci0gICAgaWYgKCFkb2N1bWVudFRpdGxlLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuIGRvY3VtZW50VGl0bGU7Ci0gICAgCi0gICAgb3duZXIgPSBkb2N1bWVudC0+Ym9k
eSgpOwotICAgIGlmIChvd25lciAmJiBvd25lci0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICBy
ZXR1cm4gdG9IVE1MRWxlbWVudChvd25lciktPmdldE5hbWVBdHRyaWJ1dGUoKTsKLSAgICAKLSAg
ICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0gICAgCi1TdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6YWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVu
ZGVyZXIpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIGlmIChpc1dlYkFyZWEoKSkK
LSAgICAgICAgcmV0dXJuIHdlYkFyZWFBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKTsKLQotICAg
IHJldHVybiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWNjZXNzaWJpbGl0eURlc2NyaXB0aW9u
KCk7Ci19Ci0KIExheW91dFJlY3QgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Ym91bmRpbmdC
b3hSZWN0KCkgY29uc3QKIHsKICAgICBSZW5kZXJPYmplY3QqIG9iaiA9IG1fcmVuZGVyZXI7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2li
aWxpdHlOb2RlT2JqZWN0LmNwcAkocmV2aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEwNzMsNyArMTA3MywxODggQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CisgICAgCit2
b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNj
ZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7CisgICAgYWx0ZXJuYXRpdmVUZXh0KHRleHRP
cmRlcik7CisgICAgCisgICAgdmlzaWJsZVRleHQodGV4dE9yZGVyKTsKKyAgICAKKyAgICBoZWxw
VGV4dCh0ZXh0T3JkZXIpOworICAgIAorICAgIFN0cmluZyBwbGFjZWhvbGRlciA9IHBsYWNlaG9s
ZGVyVmFsdWUoKTsKKyAgICBpZiAoIXBsYWNlaG9sZGVyLmlzRW1wdHkoKSkKKyAgICAgICAgdGV4
dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChwbGFjZWhvbGRlciwgUGxhY2Vob2xkZXJU
ZXh0KSk7Cit9CisgICAgCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphbHRlcm5hdGl2
ZVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKSBjb25zdAoreworICAg
IGlmIChpc1dlYkFyZWEoKSkgeworICAgICAgICBTdHJpbmcgd2ViQXJlYVRleHQgPSBhbHRlcm5h
dGl2ZVRleHRGb3JXZWJBcmVhKCk7CisgICAgICAgIGlmICh3ZWJBcmVhVGV4dC5pc0VtcHR5KCkp
CisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KHdlYkFyZWFU
ZXh0LCBBbHRlcm5hdGl2ZVRleHQpKTsgICAgICAgIAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAg
ICAgU3RyaW5nIGFyaWFEZXNjcmlwdGlvbiA9IGFyaWFBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24o
KTsKKyAgICAgICAgaWYgKCFhcmlhRGVzY3JpcHRpb24uaXNFbXB0eSgpKQorICAgICAgICAgICAg
dGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChhcmlhRGVzY3JpcHRpb24sIEFsdGVy
bmF0aXZlVGV4dCkpOworICAgICAgICAKKyAgICAgICAgaWYgKGlzSW1hZ2UoKSB8fCBpc0lucHV0
SW1hZ2UoKSB8fCBpc05hdGl2ZUltYWdlKCkgfHwgaXNDYW52YXMoKSkgeworICAgICAgICAgICAg
Ly8gSW1hZ2VzIHNob3VsZCB1c2UgYWx0IGFzIGxvbmcgYXMgdGhlIGF0dHJpYnV0ZSBpcyBwcmVz
ZW50LCBldmVuIGlmIGVtcHR5LgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBzaG91bGQg
ZmFsbGJhY2sgdG8gb3RoZXIgbWV0aG9kcywgbGlrZSB0aGUgdGl0bGUgYXR0cmlidXRlLgorICAg
ICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBhbHQgPSBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7
CisgICAgICAgICAgICBpZiAoIWFsdC5pc051bGwoKSkKKyAgICAgICAgICAgICAgICB0ZXh0T3Jk
ZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGFsdCwgQWx0ZXJuYXRpdmVUZXh0KSk7CisgICAg
ICAgIH0KKyAgICAgICAgCisjaWYgRU5BQkxFKE1BVEhNTCkKKyAgICAgICAgTm9kZSogbm9kZSA9
IHRoaXMtPm5vZGUoKTsKKyAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS0+aXNFbGVtZW50Tm9kZSgp
ICYmIHRvRWxlbWVudChub2RlKS0+aXNNYXRoTUxFbGVtZW50KCkpCisgICAgICAgICAgICB0ZXh0
T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGdldEF0dHJpYnV0ZShNYXRoTUxOYW1lczo6
YWx0dGV4dEF0dHIpLCBBbHRlcm5hdGl2ZVRleHQpKTsKKyNlbmRpZgorICAgIH0KK30KKyAgICAK
K1N0cmluZyBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWx0ZXJuYXRpdmVUZXh0Rm9yV2ViQXJl
YSgpIGNvbnN0Cit7CisgICAgLy8gVGhlIFdlYkFyZWEgZGVzY3JpcHRpb24gc2hvdWxkIGZvbGxv
dyB0aGlzIG9yZGVyOgorICAgIC8vICAgICBhcmlhLWxhYmVsIG9uIHRoZSA8aHRtbD4KKyAgICAv
LyAgICAgdGl0bGUgb24gdGhlIDxodG1sPgorICAgIC8vICAgICA8dGl0bGU+IGluc2lkZSB0aGUg
PGhlYWQ+IChvZiBpdCB3YXMgc2V0IHRocm91Z2ggSlMpCisgICAgLy8gICAgIG5hbWUgb24gdGhl
IDxodG1sPgorICAgIC8vIEZvciBpZnJhbWVzOgorICAgIC8vICAgICBhcmlhLWxhYmVsIG9uIHRo
ZSA8aWZyYW1lPgorICAgIC8vICAgICB0aXRsZSBvbiB0aGUgPGlmcmFtZT4KKyAgICAvLyAgICAg
bmFtZSBvbiB0aGUgPGlmcmFtZT4KKyAgICAKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
dGhpcy0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7CisgICAgCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gcmVuZGVyZXItPmRvY3VtZW50
KCk7CisgICAgCisgICAgLy8gQ2hlY2sgaWYgdGhlIEhUTUwgZWxlbWVudCBoYXMgYW4gYXJpYS1s
YWJlbCBmb3IgdGhlIHdlYnBhZ2UuCisgICAgaWYgKEVsZW1lbnQqIGRvY3VtZW50RWxlbWVudCA9
IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICBjb25zdCBBdG9taWNTdHJp
bmcmIGFyaWFMYWJlbCA9IGRvY3VtZW50RWxlbWVudC0+Z2V0QXR0cmlidXRlKGFyaWFfbGFiZWxB
dHRyKTsKKyAgICAgICAgaWYgKCFhcmlhTGFiZWwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0
dXJuIGFyaWFMYWJlbDsKKyAgICB9CisgICAgCisgICAgTm9kZSogb3duZXIgPSBkb2N1bWVudC0+
b3duZXJFbGVtZW50KCk7CisgICAgaWYgKG93bmVyKSB7CisgICAgICAgIGlmIChvd25lci0+aGFz
VGFnTmFtZShmcmFtZVRhZykgfHwgb3duZXItPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSkgeworICAg
ICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB0aXRsZSA9IHN0YXRpY19jYXN0PEhUTUxGcmFt
ZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAg
ICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZTsK
KyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50QmFzZSo+KG93
bmVyKS0+Z2V0TmFtZUF0dHJpYnV0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChvd25lci0+
aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQob3duZXIp
LT5nZXROYW1lQXR0cmlidXRlKCk7CisgICAgfQorICAgIAorICAgIFN0cmluZyBkb2N1bWVudFRp
dGxlID0gZG9jdW1lbnQtPnRpdGxlKCk7CisgICAgaWYgKCFkb2N1bWVudFRpdGxlLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50VGl0bGU7CisgICAgCisgICAgb3duZXIgPSBkb2N1
bWVudC0+Ym9keSgpOworICAgIGlmIChvd25lciAmJiBvd25lci0+aXNIVE1MRWxlbWVudCgpKQor
ICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChvd25lciktPmdldE5hbWVBdHRyaWJ1dGUoKTsK
KyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CiAKK3ZvaWQgQWNjZXNzaWJpbGl0eU5vZGVP
YmplY3Q6OnZpc2libGVUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mIHRleHRPcmRlcikg
Y29uc3QKK3sKKyAgICBOb2RlKiBub2RlID0gdGhpcy0+bm9kZSgpOworICAgIGlmICghbm9kZSkK
KyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGJvb2wgaXNJbnB1dFRhZyA9IG5vZGUtPmhhc1Rh
Z05hbWUoaW5wdXRUYWcpOworICAgIGlmIChpc0lucHV0VGFnKSB7CisgICAgICAgIEhUTUxJbnB1
dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUpOwor
ICAgICAgICBpZiAoaW5wdXQtPmlzVGV4dEJ1dHRvbigpKSB7CisgICAgICAgICAgICB0ZXh0T3Jk
ZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGlucHV0LT52YWx1ZVdpdGhEZWZhdWx0KCksIFZp
c2libGVUZXh0KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvKiBVbmRvIG1lCisgICAgaWYgKGlzSW5wdXRUYWcgfHwgQWNjZXNzaWJpbGl0eU9iamVjdDo6
aXNBUklBSW5wdXQoYXJpYVJvbGVBdHRyaWJ1dGUoKSkgfHwgaXNDb250cm9sKCkpIHsKKyAgICAg
ICAgSFRNTExhYmVsRWxlbWVudCogbGFiZWwgPSBsYWJlbEZvckVsZW1lbnQodG9FbGVtZW50KG5v
ZGUpKTsKKyAgICAgICAgaWYgKGxhYmVsICYmICFleHBvc2VzVGl0bGVVSUVsZW1lbnQoKSkgewor
ICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChsYWJlbC0+aW5u
ZXJUZXh0KCksIFZpc2libGVUZXh0KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICB9Ki8KKyAgICAKKyAgICAvLyBJZiB0aGlzIG5vZGUgaXNuJ3QgcmVuZGVyZWQsIHRoZXJl
J3Mgbm8gaW5uZXIgdGV4dCB3ZSBjYW4gZXh0cmFjdCBmcm9tIGEgc2VsZWN0IGVsZW1lbnQuCisg
ICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSAmJiBub2RlLT5oYXNUYWdOYW1l
KHNlbGVjdFRhZykpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29sIHVzZVRleHRVbmRl
ckVsZW1lbnQgPSBmYWxzZTsKKyAgICAKKyAgICBzd2l0Y2ggKHJvbGVWYWx1ZSgpKSB7CisgICAg
ICAgIGNhc2UgUG9wVXBCdXR0b25Sb2xlOgorICAgICAgICBjYXNlIEJ1dHRvblJvbGU6CisgICAg
ICAgIGNhc2UgVG9nZ2xlQnV0dG9uUm9sZToKKyAgICAgICAgY2FzZSBDaGVja0JveFJvbGU6Cisg
ICAgICAgIGNhc2UgTGlzdEJveE9wdGlvblJvbGU6CisgICAgICAgIGNhc2UgTWVudUJ1dHRvblJv
bGU6CisgICAgICAgIGNhc2UgTWVudUl0ZW1Sb2xlOgorICAgICAgICBjYXNlIFJhZGlvQnV0dG9u
Um9sZToKKyAgICAgICAgY2FzZSBUYWJSb2xlOgorICAgICAgICAgICAgdXNlVGV4dFVuZGVyRWxl
bWVudCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoaXNIZWFkaW5nKCkgfHwgaXNMaW5r
KCkpCisgICAgICAgIHVzZVRleHRVbmRlckVsZW1lbnQgPSB0cnVlOworICAgIAorICAgIC8vIElm
IGl0J3MgZm9jdXNhYmxlIGJ1dCBpdCdzIG5vdCBjb250ZW50IGVkaXRhYmxlIG9yIGEga25vd24g
Y29udHJvbCB0eXBlLCB0aGVuIGl0IHdpbGwgYXBwZWFyIHRvCisgICAgLy8gdGhlIHVzZXIgYXMg
YSBzaW5nbGUgYXRvbWljIG9iamVjdCwgc28gd2Ugc2hvdWxkIHVzZSBpdHMgdGV4dCBhcyB0aGUg
ZGVmYXVsdCB0aXRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoaXNH
ZW5lcmljRm9jdXNhYmxlRWxlbWVudCgpKQorICAgICAgICB1c2VUZXh0VW5kZXJFbGVtZW50ID0g
dHJ1ZTsKKyAgICAKKyAgICBpZiAodXNlVGV4dFVuZGVyRWxlbWVudCkKKyAgICAgICAgdGV4dE9y
ZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dCh0ZXh0VW5kZXJFbGVtZW50KCksIENoaWxkcmVu
VGV4dCkpOworCit9CisgICAgCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjpoZWxwVGV4
dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpIGNvbnN0Cit7CisgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBhcmlhSGVscCA9IGdldEF0dHJpYnV0ZShhcmlhX2hlbHBBdHRyKTsK
KyAgICBpZiAoIWFyaWFIZWxwLmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChB
Y2Nlc3NpYmlsaXR5VGV4dChhcmlhSGVscCwgSGVscFRleHQpKTsKKyAgICAKKyAgICBTdHJpbmcg
ZGVzY3JpYmVkQnkgPSBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWRlc2Ny
aWJlZEJ5LmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5
VGV4dChkZXNjcmliZWRCeSwgU3VtbWFyeVRleHQpKTsKKyAgICAKKyAgICAvLyBBZGQgaGVscCB0
eXBlIHRleHQgdGhhdCBpcyBkZXJpdmVkIGZyb20gYW5jZXN0b3JzLgorICAgIGZvciAoTm9kZSog
Y3VyciA9IG5vZGUoKTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudE5vZGUoKSkgeworICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIHN1bW1hcnkgPSBnZXRBdHRyaWJ1dGUoc3VtbWFyeUF0dHIp
OworICAgICAgICBpZiAoIXN1bW1hcnkuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGV4dE9yZGVy
LmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBTdW1tYXJ5VGV4dCkpOworICAgICAg
ICAKKyAgICAgICAgLy8gVGhlIHRpdGxlIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZCBhcyBoZWxw
IHRleHQgdW5sZXNzIGl0IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBhcyBkZXNjcmlwdGl2ZSB0ZXh0
LgorICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0gZ2V0QXR0cmlidXRlKHRpdGxl
QXR0cik7CisgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGV4dE9y
ZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBUaXRsZVRhZ1RleHQpKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIE9ubHkgdGFrZSBoZWxwIHRleHQgZnJvbSBhbiBhbmNlc3RvciBl
bGVtZW50IGlmIGl0cyBhIGdyb3VwIG9yIGFuIHVua25vd24gcm9sZS4gSWYgaGVscCB3YXMKKyAg
ICAgICAgLy8gYWRkZWQgdG8gdGhvc2Uga2luZHMgb2YgZWxlbWVudHMsIGl0IGlzIGxpa2VseSBp
dCB3YXMgbWVhbnQgZm9yIGEgY2hpbGQgZWxlbWVudC4KKyAgICAgICAgQWNjZXNzaWJpbGl0eU9i
amVjdCogYXhPYmogPSBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKGN1cnIpOworICAgICAg
ICBpZiAoIWF4T2JqKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgQWNj
ZXNzaWJpbGl0eVJvbGUgcm9sZSA9IGF4T2JqLT5yb2xlVmFsdWUoKTsKKyAgICAgICAgaWYgKHJv
bGUgIT0gR3JvdXBSb2xlICYmIHJvbGUgIT0gVW5rbm93blJvbGUpCisgICAgICAgICAgICBicmVh
azsKKyAgICB9Cit9CisgICAgCiBTdHJpbmcgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vz
c2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0CiB7CiAgICAgLy8gU3RhdGljIHRleHQgc2hvdWxk
IG5vdCBoYXZlIGEgZGVzY3JpcHRpb24sIGl0IHNob3VsZCBvbmx5IGhhdmUgYSBzdHJpbmdWYWx1
ZS4KQEAgLTEzNDEsNiArMTUyMiwxNCBAQAogICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7
CiB9CiAKK1N0cmluZyBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YXJpYURlc2NyaWJlZEJ5QXR0
cmlidXRlKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8RWxlbWVudCo+IGVsZW1lbnRzOworICAgIGVs
ZW1lbnRzRnJvbUF0dHJpYnV0ZShlbGVtZW50cywgYXJpYV9kZXNjcmliZWRieUF0dHIpOworICAg
IAorICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25Gb3JFbGVtZW50cyhlbGVtZW50
cyk7Cit9CisKIHZvaWQgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmVsZW1lbnRzRnJvbUF0dHJp
YnV0ZShWZWN0b3I8RWxlbWVudCo+JiBlbGVtZW50cywgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
cmlidXRlKSBjb25zdAogewogICAgIE5vZGUqIG5vZGUgPSB0aGlzLT5ub2RlKCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>168977</attachid>
            <date>2012-10-16 11:00:20 -0700</date>
            <delta_ts>2012-10-23 22:34:02 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>33353</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMTQ3MykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY5IEBACisyMDEyLTEwLTE2ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6V2hlbiBhcmlhLWxh
YmVsIGlzIHVzZWQsIHRoZSB0ZXh0IHVuZGVyIGFuIGVsZW1lbnQgaXMgc3RpbGwgYXBwZWFyaW5n
IGFzIHRoZSBBWFRpdGxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD05ODE2NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgdGhlIGNoYW5nZSBzdWNoIGFzIGFwcHJv
YWNoLCByYXRpb25hbGUuIFBsZWFzZSBhZGQgcGVyLWZ1bmN0aW9uIGRlc2NyaXB0aW9ucyBiZWxv
dyAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyAoT09QUyEpLgorCisgICAgICAgICog
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rLmNwcDoKKyAgICAgICAgKFdl
YkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eUltYWdlTWFwTGluazo6YWNj
ZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUlt
YWdlTWFwTGluay5oOgorICAgICAgICAoQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluayk6CisgICAg
ICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9scy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9sOjphY2Nlc3NpYmlsaXR5VGV4
dCk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2li
aWxpdHlNZWRpYUNvbnRyb2xzLmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9s
KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlNZWRpYVRpbWVEaXNwbGF5Ojppc01l
ZGlhQ29udHJvbExhYmVsKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlO
b2RlT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0
Ojp0aXRsZUVsZW1lbnRUZXh0KToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29y
ZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vzc2liaWxpdHlUZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphcmlhTGFiZWxlZEJ5VGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWx0ZXJuYXRpdmVUZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphbHRlcm5hdGl2
ZVRleHRGb3JXZWJBcmVhKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2Jq
ZWN0Ojp2aXNpYmxlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5Tm9kZU9i
amVjdDo6aGVscFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmpl
Y3Q6OmFyaWFEZXNjcmliZWRCeUF0dHJpYnV0ZSk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9B
Y2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5oOgorICAgICAgICAoQWNjZXNzaWJpbGl0eU5vZGVPYmpl
Y3QpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oOgorICAg
ICAgICAoQWNjZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eVRleHQ6OkFjY2Vzc2liaWxpdHlUZXh0KToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAo
V2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6aXNNZWRpYUNvbnRyb2xMYWJlbCk6CisgICAg
ICAgIChBY2Nlc3NpYmlsaXR5T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OmFjY2Vzc2liaWxpdHlUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2li
aWxpdHlPYmplY3Q6OnNldEFjY2Vzc2libGVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojp0aXRsZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nl
c3NpYmlsaXR5T2JqZWN0OjpoZWxwVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmls
aXR5T2JqZWN0OjpzdHJpbmdWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
T2JqZWN0Ojp0ZXh0VW5kZXJFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6
dGV4dExlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZXRS
b2xlVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6cm9sZVZh
bHVlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnNlbGVjdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpoaWVyYXJjaGljYWxMZXZl
bCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5oOgorICAgICAgICAoQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCk6
CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBw
ZXIubW06CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIHRpdGxlVGFn
U2hvdWxkQmVVc2VkSW5EZXNjcmlwdGlvbkZpZWxkXSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyIGFjY2Vzc2liaWxpdHlUaXRsZV0pOgorICAgICAgICAoLVtXZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25dKToKKyAg
ICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgYWNjZXNzaWJpbGl0eUhlbHBU
ZXh0XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIGFjY2Vzc2li
aWxpdHlBdHRyaWJ1dGVWYWx1ZTpdKToKKyAgICAgICAgKiBwbGF0Zm9ybS9Mb2NhbGl6ZWRTdHJp
bmdzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmxvY2FsaXplZE1lZGlhQ29udHJvbEVsZW1lbnRI
ZWxwVGV4dCk6CisKIDIwMTItMTAtMTYgIFJvYiBCdWlzICA8cmJ1aXNAcmltLmNvbT4KIAogICAg
ICAgICBbQmxhY2tCZXJyeV0gcmVwbGFjZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKCkgd2l0
aCBCQkxPRygpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9Mb2NhbGl6ZWRTdHJpbmdz
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9Mb2NhbGl6ZWRTdHJp
bmdzLmNwcAkocmV2aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTG9j
YWxpemVkU3RyaW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg4Miw2ICs4ODIsMTAgQEAKICAg
ICBpZiAobmFtZSA9PSAiSGlkZUNsb3NlZENhcHRpb25zQnV0dG9uIikKICAgICAgICAgcmV0dXJu
IFdFQl9VSV9TVFJJTkcoInN0b3AgZGlzcGxheWluZyBjbG9zZWQgY2FwdGlvbnMiLCAiYWNjZXNz
aWJpbGl0eSBoZWxwIHRleHQgZm9yIGhpZGUgY2xvc2VkIGNhcHRpb25zIGJ1dHRvbiIpOwogCisg
ICAgLy8gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYnV0dG9uIGlzIGRlc2NyaXB0aXZlIGVub3Vn
aCB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBoZWxwIHRleHQuCisgICAgaWYgKG5hbWUgPT0gIkVu
dGVyRnVsbHNjcmVlbkJ1dHRvbiIpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICAKICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJ
bWFnZU1hcExpbmsuaAkocmV2aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rLmgJKHdvcmtpbmcgY29weSkKQEAgLTcz
LDYgKzczLDcgQEAKICAgICBSZWZQdHI8SFRNTEFyZWFFbGVtZW50PiBtX2FyZWFFbGVtZW50Owog
ICAgIFJlZlB0cjxIVE1MTWFwRWxlbWVudD4gbV9tYXBFbGVtZW50OwogICAgIAorICAgIHZpcnR1
YWwgdm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+Jik7CiAg
ICAgdmlydHVhbCBib29sIGlzSW1hZ2VNYXBMaW5rKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQog
fTsKICAgICAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vz
c2liaWxpdHlPYmplY3RXcmFwcGVyLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1tCShyZXZpc2lv
biAxMzAxODQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3Np
YmlsaXR5T2JqZWN0V3JhcHBlci5tbQkod29ya2luZyBjb3B5KQpAQCAtMTgxOCw2ICsxODE4LDEw
MyBAQAogICAgIHJldHVybiBbc2VsZiByZW1vdGVBY2Nlc3NpYmlsaXR5UGFyZW50T2JqZWN0XTsK
IH0KIAorLy8gRklYTUU6IERpZmZlcmVudCBraW5kcyBvZiBlbGVtZW50cyBhcmUgcHV0dGluZyB0
aGUgdGl0bGUgdGFnIHRvIHVzZSBpbiBkaWZmZXJlbnQKKy8vIEFYIGZpZWxkcy4gVGhpcyBzaG91
bGQgYmUgcmVjdGlmaWVkLCBidXQgaW4gdGhlIGluaXRpYWwgcGF0Y2ggSSB3YW50IHRvIGFjaGll
dmUKKy8vIHBhcml0eSB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLgorLSAoQk9PTCl0aXRsZVRhZ1No
b3VsZEJlVXNlZEluRGVzY3JpcHRpb25GaWVsZAoreworICAgIHJldHVybiAobV9vYmplY3QtPmlz
TGluaygpICYmICFtX29iamVjdC0+aXNJbWFnZU1hcExpbmsoKSkgfHwgbV9vYmplY3QtPmlzSW1h
Z2UoKTsKK30KKworLy8gVGhpcyBzaG91bGQgYmUgdGhlICJ2aXNpYmxlIiB0ZXh0IHRoYXQncyBh
Y3R1YWxseSBvbiB0aGUgc2NyZWVuIGlmIHBvc3NpYmxlLgorLy8gSWYgdGhlcmUncyBhbHRlcm5h
dGl2ZSB0ZXh0LCB0aGF0IGNhbiBvdmVycmlkZSB0aGUgdGl0bGUuCistIChOU1N0cmluZyAqKWFj
Y2Vzc2liaWxpdHlUaXRsZQoreworICAgIC8vIFN0YXRpYyB0ZXh0IG9iamVjdHMgc2hvdWxkIG5v
dCBoYXZlIGEgdGl0bGUuIEl0cyBjb250ZW50IGlzIGNvbW11bmljYXRlZCBpbiBpdHMgQVhWYWx1
ZS4KKyAgICBpZiAobV9vYmplY3QtPnJvbGVWYWx1ZSgpID09IFN0YXRpY1RleHRSb2xlKQorICAg
ICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107CisKKyAgICBWZWN0b3I8QWNjZXNzaWJpbGl0
eVRleHQ+IHRleHRPcmRlcjsKKyAgICBtX29iamVjdC0+YWNjZXNzaWJpbGl0eVRleHQodGV4dE9y
ZGVyKTsKKyAgICAKKyAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0T3JkZXIuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAgICBjb25zdCBB
Y2Nlc3NpYmlsaXR5VGV4dCYgdGV4dCA9IHRleHRPcmRlcltrXTsKKyAgICAgICAgCisgICAgICAg
IC8vIE9uY2Ugd2UgZW5jb3VudGVyIHZpc2libGUgdGV4dCwgb3IgdGhlIHRleHQgZnJvbSBvdXIg
Y2hpbGRyZW4gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3JlbW9zdC4KKyAgICAgICAgaWYgKHRleHQu
dGV4dFNvdXJjZSA9PSBWaXNpYmxlVGV4dCB8fCB0ZXh0LnRleHRTb3VyY2UgPT0gQ2hpbGRyZW5U
ZXh0KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICAgICAgCisgICAgICAgIC8v
IElmIHRoZXJlJ3MgYW4gZWxlbWVudCB0aGF0IGxhYmVscyB0aGlzIG9iamVjdCBhbmQgaXQncyBu
b3QgZXhwb3NlZCwgdGhlbiB3ZSBzaG91bGQgdXNlCisgICAgICAgIC8vIHRoYXQgdGV4dCBhcyBv
dXIgdGl0bGUuCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gTGFiZWxCeUVsZW1lbnRU
ZXh0ICYmICFtX29iamVjdC0+ZXhwb3Nlc1RpdGxlVUlFbGVtZW50KCkpCisgICAgICAgICAgICBy
ZXR1cm4gdGV4dC50ZXh0OworICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IFRoZSB0aXRsZSB0
YWcgaXMgdXNlZCBpbiBjZXJ0YWluIGNhc2VzIGZvciB0aGUgdGl0bGUuIFRoaXMgdXNhZ2Ugc2hv
dWxkCisgICAgICAgIC8vIHByb2JhYmx5IGJlIGluIHRoZSBkZXNjcmlwdGlvbiBmaWVsZCBzaW5j
ZSBpdCdzIG5vdCAidmlzaWJsZSIuCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gVGl0
bGVUYWdUZXh0ICYmICFbc2VsZiB0aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3JpcHRpb25GaWVs
ZF0pCisgICAgICAgICAgICByZXR1cm4gdGV4dC50ZXh0OworICAgIH0KKyAgICAKKyAgICByZXR1
cm4gW05TU3RyaW5nIHN0cmluZ107Cit9CisKKy0gKE5TU3RyaW5nICopYWNjZXNzaWJpbGl0eURl
c2NyaXB0aW9uCit7CisgICAgLy8gU3RhdGljIHRleHQgb2JqZWN0cyBzaG91bGQgbm90IGhhdmUg
YSBkZXNjcmlwdGlvbi4gSXRzIGNvbnRlbnQgaXMgY29tbXVuaWNhdGVkIGluIGl0cyBBWFZhbHVl
LgorICAgIC8vIE9uZSBleGNlcHRpb24gaXMgdGhlIG1lZGlhIGNvbnRyb2wgbGFiZWxzIHRoYXQg
aGF2ZSBhIHZhbHVlIGFuZCBhIGRlc2NyaXB0aW9uLiBUaG9zZSBhcmUgc2V0IHByb2dyYW1hdGlj
YWxseS4KKyAgICBpZiAobV9vYmplY3QtPnJvbGVWYWx1ZSgpID09IFN0YXRpY1RleHRSb2xlICYm
ICFtX29iamVjdC0+aXNNZWRpYUNvbnRyb2xMYWJlbCgpKQorICAgICAgICByZXR1cm4gW05TU3Ry
aW5nIHN0cmluZ107CisgICAgCisgICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiB0ZXh0T3Jk
ZXI7CisgICAgbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlUZXh0KHRleHRPcmRlcik7CisgICAgCisg
ICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE9yZGVyLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVk
IGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgY29uc3QgQWNjZXNzaWJpbGl0eVRl
eHQmIHRleHQgPSB0ZXh0T3JkZXJba107CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0
U291cmNlID09IEFsdGVybmF0aXZlVGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnRleHQ7
CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IFRpdGxlVGFnVGV4dCAm
JiBbc2VsZiB0aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3JpcHRpb25GaWVsZF0pCisgICAgICAg
ICAgICByZXR1cm4gdGV4dC50ZXh0OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gW05TU3RyaW5n
IHN0cmluZ107Cit9CisKKy0gKE5TU3RyaW5nICopYWNjZXNzaWJpbGl0eUhlbHBUZXh0Cit7Cisg
ICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiB0ZXh0T3JkZXI7CisgICAgbV9vYmplY3QtPmFj
Y2Vzc2liaWxpdHlUZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgdW5zaWduZWQgbGVuZ3RoID0g
dGV4dE9yZGVyLnNpemUoKTsKKyAgICBib29sIGRlc2NyaXB0aXZlVGV4dEF2YWlsYWJsZSA9IGZh
bHNlOworICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAg
ICBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dCYgdGV4dCA9IHRleHRPcmRlcltrXTsKKyAgICAgICAg
CisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gSGVscFRleHQgfHwgdGV4dC50ZXh0U291
cmNlID09IFN1bW1hcnlUZXh0KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICAg
ICAgCisgICAgICAgIC8vIElmIGFuIGVsZW1lbnQgZG9lcyBOT1QgaGF2ZSBvdGhlciBkZXNjcmlw
dGl2ZSB0ZXh0IHRoZSB0aXRsZSB0YWcgc2hvdWxkIGJlIHVzZWQgYXMgaXRzIGRlc2NyaXB0aXZl
IHRleHQuCisgICAgICAgIC8vIEJ1dCwgaWYgdGhvc2UgQVJFIGF2YWlsYWJsZSwgdGhlbiB0aGUg
dGl0bGUgdGFnIHNob3VsZCBiZSB1c2VkIGZvciBoZWxwIHRleHQgaW5zdGVhZC4KKyAgICAgICAg
c3dpdGNoICh0ZXh0LnRleHRTb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBbHRlcm5hdGl2ZVRleHQ6
CisgICAgICAgIGNhc2UgVmlzaWJsZVRleHQ6CisgICAgICAgIGNhc2UgQ2hpbGRyZW5UZXh0Ogor
ICAgICAgICBjYXNlIExhYmVsQnlFbGVtZW50VGV4dDoKKyAgICAgICAgICAgIGRlc2NyaXB0aXZl
VGV4dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRleHQudGV4dFNvdXJjZSA9PSBU
aXRsZVRhZ1RleHQgJiYgZGVzY3JpcHRpdmVUZXh0QXZhaWxhYmxlKQorICAgICAgICAgICAgcmV0
dXJuIHRleHQudGV4dDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdd
OworfQorCiAvLyBGSVhNRTogc3BsaXQgdXAgdGhpcyBmdW5jdGlvbiBpbiBhIGJldHRlciB3YXku
ICAKIC8vIHN1Z2dlc3Rpb25zOiBVc2UgYSBoYXNoIHRhYmxlIHRoYXQgbWFwcyBhdHRyaWJ1dGUg
bmFtZXMgdG8gZnVuY3Rpb24gY2FsbHMsCiAvLyBvciBtYXliZSBwb2ludGVycyB0byBtZW1iZXIg
ZnVuY3Rpb25zCkBAIC0xOTg0LDcgKzIwODEsOCBAQAogICAgICAgICAgICAgaWYgKFtbW3NlbGYg
YXR0YWNobWVudFZpZXddIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVOYW1lc10gY29udGFpbnNPYmpl
Y3Q6TlNBY2Nlc3NpYmlsaXR5VGl0bGVBdHRyaWJ1dGVdKSAKICAgICAgICAgICAgICAgICByZXR1
cm4gW1tzZWxmIGF0dGFjaG1lbnRWaWV3XSBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6TlNB
Y2Nlc3NpYmlsaXR5VGl0bGVBdHRyaWJ1dGVdOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBt
X29iamVjdC0+dGl0bGUoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBbc2VsZiBhY2Nlc3Np
YmlsaXR5VGl0bGVdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZU5hbWUgaXNFcXVh
bFRvU3RyaW5nOiBOU0FjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbkF0dHJpYnV0ZV0pIHsKQEAgLTE5
OTIsNyArMjA5MCw3IEBACiAgICAgICAgICAgICBpZiAoW1tbc2VsZiBhdHRhY2htZW50Vmlld10g
YWNjZXNzaWJpbGl0eUF0dHJpYnV0ZU5hbWVzXSBjb250YWluc09iamVjdDpOU0FjY2Vzc2liaWxp
dHlEZXNjcmlwdGlvbkF0dHJpYnV0ZV0pCiAgICAgICAgICAgICAgICAgcmV0dXJuIFtbc2VsZiBh
dHRhY2htZW50Vmlld10gYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOk5TQWNjZXNzaWJpbGl0
eURlc2NyaXB0aW9uQXR0cmlidXRlXTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9vYmpl
Y3QtPmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOworICAgICAgICByZXR1cm4gW3NlbGYgYWNj
ZXNzaWJpbGl0eURlc2NyaXB0aW9uXTsKICAgICB9CiAKICAgICBpZiAoW2F0dHJpYnV0ZU5hbWUg
aXNFcXVhbFRvU3RyaW5nOiBOU0FjY2Vzc2liaWxpdHlWYWx1ZUF0dHJpYnV0ZV0pIHsKQEAgLTIw
NDYsNyArMjE0NCw3IEBACiAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEZsb2F0
Om1fb2JqZWN0LT5tYXhWYWx1ZUZvclJhbmdlKCldOwogCiAgICAgaWYgKFthdHRyaWJ1dGVOYW1l
IGlzRXF1YWxUb1N0cmluZzogTlNBY2Nlc3NpYmlsaXR5SGVscEF0dHJpYnV0ZV0pCi0gICAgICAg
IHJldHVybiBtX29iamVjdC0+aGVscFRleHQoKTsKKyAgICAgICAgcmV0dXJuIFtzZWxmIGFjY2Vz
c2liaWxpdHlIZWxwVGV4dF07CiAKICAgICBpZiAoW2F0dHJpYnV0ZU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOiBOU0FjY2Vzc2liaWxpdHlGb2N1c2VkQXR0cmlidXRlXSkKICAgICAgICAgcmV0dXJuIFtO
U051bWJlciBudW1iZXJXaXRoQm9vbDogbV9vYmplY3QtPmlzRm9jdXNlZCgpXTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbHMuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlN
ZWRpYUNvbnRyb2xzLmgJKHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbHMuaAkod29ya2luZyBjb3B5KQpAQCAt
NTQsNiArNTQsNyBAQAogICAgIGV4cGxpY2l0IEFjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2woUmVu
ZGVyT2JqZWN0Kik7CiAgICAgTWVkaWFDb250cm9sRWxlbWVudFR5cGUgY29udHJvbFR5cGUoKSBj
b25zdDsKICAgICBTdHJpbmcgY29udHJvbFR5cGVOYW1lKCkgY29uc3Q7CisgICAgdmlydHVhbCB2
b2lkIGFjY2Vzc2liaWxpdHlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mKTsKIH07CiAK
IApAQCAtMTA3LDYgKzEwOCw3IEBACiAKIHByaXZhdGU6CiAgICAgZXhwbGljaXQgQWNjZXNzaWJp
bGl0eU1lZGlhVGltZURpc3BsYXkoUmVuZGVyT2JqZWN0Kik7CisgICAgdmlydHVhbCBib29sIGlz
TWVkaWFDb250cm9sTGFiZWwoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiB9OwogCiAKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eVJlbmRlck9iamVjdC5oCShyZXZpc2lvbiAxMzAxODQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MTQzLDggKzE0Myw2IEBACiAgICAgdmlydHVhbCBQbGFpblRleHRSYW5nZSBzZWxlY3RlZFRleHRS
YW5nZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24oKSBj
b25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyBzdHJpbmdWYWx1ZSgpIGNvbnN0OwotICAgIHZpcnR1
YWwgU3RyaW5nIGFyaWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwg
U3RyaW5nIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0OwogICAgIHZpcnR1YWwgU3Ry
aW5nIGhlbHBUZXh0KCkgY29uc3Q7CiAgICAgdmlydHVhbCBTdHJpbmcgdGV4dFVuZGVyRWxlbWVu
dCgpIGNvbnN0OwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHQoKSBjb25zdDsKQEAgLTI2MSw4ICsy
NTksNiBAQAogICAgIGJvb2wgZWxlbWVudEF0dHJpYnV0ZVZhbHVlKGNvbnN0IFF1YWxpZmllZE5h
bWUmKSBjb25zdDsKICAgICB2b2lkIHNldEVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShjb25zdCBRdWFs
aWZpZWROYW1lJiwgYm9vbCk7CiAgICAgCi0gICAgU3RyaW5nIHdlYkFyZWFBY2Nlc3NpYmlsaXR5
RGVzY3JpcHRpb24oKSBjb25zdDsKLQogICAgIHZpcnR1YWwgRVNwZWFrIHNwZWFrUHJvcGVydHko
KSBjb25zdDsKICAgICAKICAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgYXJpYUxpdmVS
ZWdpb25TdGF0dXMoKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCShyZXZpc2lvbiAxMzAxODQpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaAkod29ya2luZyBj
b3B5KQpAQCAtMjAxLDYgKzIwMSw0MSBAQAogICAgIFdpbmRvd1JvbGUsCiB9OwogCitlbnVtIEFj
Y2Vzc2liaWxpdHlUZXh0U291cmNlIHsKKyAgICBBbHRlcm5hdGl2ZVRleHQsCisgICAgQ2hpbGRy
ZW5UZXh0LAorICAgIFN1bW1hcnlUZXh0LAorICAgIEhlbHBUZXh0LAorICAgIFZpc2libGVUZXh0
LAorICAgIFRpdGxlVGFnVGV4dCwKKyAgICBQbGFjZWhvbGRlclRleHQsCisgICAgTGFiZWxCeUVs
ZW1lbnRUZXh0LAorfTsKKyAgICAKK3N0cnVjdCBBY2Nlc3NpYmlsaXR5VGV4dCB7CisgICAgU3Ry
aW5nIHRleHQ7CisgICAgQWNjZXNzaWJpbGl0eVRleHRTb3VyY2UgdGV4dFNvdXJjZTsKKyAgICBW
ZWN0b3I8UmVmUHRyPEFjY2Vzc2liaWxpdHlPYmplY3Q+ID4gdGV4dEVsZW1lbnRzOworICAgIAor
ICAgIEFjY2Vzc2liaWxpdHlUZXh0KGNvbnN0IFN0cmluZyYgdCwgY29uc3QgQWNjZXNzaWJpbGl0
eVRleHRTb3VyY2UmIHMpCisgICAgOiB0ZXh0KHQpCisgICAgLCB0ZXh0U291cmNlKHMpCisgICAg
eyB9CisKKyAgICBBY2Nlc3NpYmlsaXR5VGV4dChjb25zdCBTdHJpbmcmIHQsIGNvbnN0IEFjY2Vz
c2liaWxpdHlUZXh0U291cmNlJiBzLCBjb25zdCBWZWN0b3I8UmVmUHRyPEFjY2Vzc2liaWxpdHlP
YmplY3Q+ID4gZWxlbWVudHMpCisgICAgOiB0ZXh0KHQpCisgICAgLCB0ZXh0U291cmNlKHMpCisg
ICAgLCB0ZXh0RWxlbWVudHMoZWxlbWVudHMpCisgICAgeyB9CisKKyAgICBBY2Nlc3NpYmlsaXR5
VGV4dChjb25zdCBTdHJpbmcmIHQsIGNvbnN0IEFjY2Vzc2liaWxpdHlUZXh0U291cmNlJiBzLCBj
b25zdCBSZWZQdHI8QWNjZXNzaWJpbGl0eU9iamVjdD4gZWxlbWVudCkKKyAgICA6IHRleHQodCkK
KyAgICAsIHRleHRTb3VyY2UocykKKyAgICB7CisgICAgICAgIHRleHRFbGVtZW50cy5hcHBlbmQo
ZWxlbWVudCk7CisgICAgfQorfTsKKyAgICAKIGVudW0gQWNjZXNzaWJpbGl0eU9yaWVudGF0aW9u
IHsKICAgICBBY2Nlc3NpYmlsaXR5T3JpZW50YXRpb25WZXJ0aWNhbCwKICAgICBBY2Nlc3NpYmls
aXR5T3JpZW50YXRpb25Ib3Jpem9udGFsLApAQCAtMzcxLDYgKzQwNiw3IEBACiAgICAgdmlydHVh
bCBib29sIGlzU3BpbkJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIHJvbGVWYWx1ZSgpID09IFNwaW5C
dXR0b25Sb2xlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU3BpbkJ1dHRvblBhcnQoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc01vY2tPYmplY3QoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc01lZGlhQ29udHJvbExhYmVsKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICBib29sIGlzVGV4dENvbnRyb2woKSBjb25zdCB7
IHJldHVybiByb2xlVmFsdWUoKSA9PSBUZXh0QXJlYVJvbGUgfHwgcm9sZVZhbHVlKCkgPT0gVGV4
dEZpZWxkUm9sZTsgfQogICAgIGJvb2wgaXNBUklBVGV4dENvbnRyb2woKSBjb25zdDsKICAgICBi
b29sIGlzVGFiTGlzdCgpIGNvbnN0IHsgcmV0dXJuIHJvbGVWYWx1ZSgpID09IFRhYkxpc3RSb2xl
OyB9CkBAIC00MzAsOSArNDY2LDYgQEAKICAgICB2aXJ0dWFsIGJvb2wgY2FuU2V0U2VsZWN0ZWRD
aGlsZHJlbkF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBi
b29sIGNhblNldEV4cGFuZGVkQXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAg
ICAKLSAgICAvLyBBIHByb2dyYW1tYXRpYyB3YXkgdG8gc2V0IGEgbmFtZSBvbiBhbiBBY2Nlc3Np
YmxlT2JqZWN0LgotICAgIHZpcnR1YWwgdm9pZCBzZXRBY2Nlc3NpYmxlTmFtZShjb25zdCBBdG9t
aWNTdHJpbmcmKSB7IH0KLSAgICAKICAgICB2aXJ0dWFsIE5vZGUqIG5vZGUoKSBjb25zdCB7IHJl
dHVybiAwOyB9CiAgICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkgY29uc3QgeyBy
ZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBhY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgY29u
c3QgIHsgcmV0dXJuIHRydWU7IH0KQEAgLTUwMSwxMiArNTM0LDI5IEBACiAgICAgdmlydHVhbCBi
b29sIGlzUHJlc2VudGF0aW9uYWxDaGlsZE9mQXJpYVJvbGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQogICAgIHZpcnR1YWwgYm9vbCBhcmlhUm9sZUhhc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW4o
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdm9pZCBzZXRSb2xlVmFsdWUoQWNjZXNz
aWJpbGl0eVJvbGUgcm9sZSkgeyBtX3JvbGUgPSByb2xlOyB9Ci0gICAgdmlydHVhbCBBY2Nlc3Np
YmlsaXR5Um9sZSByb2xlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3JvbGU7IH0KKyAgICAvLyBB
Y2Nlc3NpYmlsaXR5IFRleHQKKyAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzaWJpbGl0eVRleHQoVmVj
dG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYpIHsgfTsKKworICAgIC8vIEEgcHJvZ3JhbW1hdGljIHdh
eSB0byBzZXQgYSBuYW1lIG9uIGFuIEFjY2Vzc2libGVPYmplY3QuCisgICAgdmlydHVhbCB2b2lk
IHNldEFjY2Vzc2libGVOYW1lKGNvbnN0IEF0b21pY1N0cmluZyYpIHsgfQorCisgICAgLy8gQWNj
ZXNzaWJpbGl0eSBUZXh0IC0gKFRvIGJlIGRlcHJlY2F0ZWQpLgorICAgIHZpcnR1YWwgU3RyaW5n
IGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9Cisg
ICAgdmlydHVhbCBTdHJpbmcgdGl0bGUoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAg
IHZpcnR1YWwgU3RyaW5nIGhlbHBUZXh0KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKwor
ICAgIC8vIE1ldGhvZHMgZm9yIGRldGVybWluaW5nIGFjY2Vzc2liaWxpdHkgdGV4dC4KKyAgICB2
aXJ0dWFsIFN0cmluZyBzdHJpbmdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9Cisg
ICAgdmlydHVhbCBTdHJpbmcgdGV4dFVuZGVyRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0cmlu
ZygpOyB9CisgICAgdmlydHVhbCBTdHJpbmcgdGV4dCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygp
OyB9CisgICAgdmlydHVhbCBpbnQgdGV4dExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAg
ICB2aXJ0dWFsIFN0cmluZyBhcmlhTGFiZWxlZEJ5QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4g
U3RyaW5nKCk7IH0KICAgICB2aXJ0dWFsIFN0cmluZyBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUo
KSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIGFjY2Vzc2li
aWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgY29uc3Qg
QXRvbWljU3RyaW5nJiBwbGFjZWhvbGRlclZhbHVlKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFJv
bGVWYWx1ZShBY2Nlc3NpYmlsaXR5Um9sZSByb2xlKSB7IG1fcm9sZSA9IHJvbGU7IH0KKyAgICB2
aXJ0dWFsIEFjY2Vzc2liaWxpdHlSb2xlIHJvbGVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9s
ZTsgfQorCiAgICAgdmlydHVhbCBBWE9iamVjdENhY2hlKiBheE9iamVjdENhY2hlKCkgY29uc3Q7
CiAgICAgQVhJRCBheE9iamVjdElEKCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQogICAgIHZvaWQg
c2V0QVhPYmplY3RJRChBWElEIGF4T2JqZWN0SUQpIHsgbV9pZCA9IGF4T2JqZWN0SUQ7IH0KQEAg
LTUyOSwxMiArNTc5LDYgQEAKICAgICAKICAgICB2aXJ0dWFsIEtVUkwgdXJsKCkgY29uc3QgeyBy
ZXR1cm4gS1VSTCgpOyB9CiAgICAgdmlydHVhbCBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbigp
IGNvbnN0IHsgcmV0dXJuIFZpc2libGVTZWxlY3Rpb24oKTsgfQotICAgIHZpcnR1YWwgU3RyaW5n
IHN0cmluZ1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0
cmluZyB0aXRsZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBTdHJp
bmcgaGVscFRleHQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3Ry
aW5nIHRleHRVbmRlckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZp
cnR1YWwgU3RyaW5nIHRleHQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1
YWwgaW50IHRleHRMZW5ndGgoKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBTdHJp
bmcgc2VsZWN0ZWRUZXh0KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KICAgICB2aXJ0dWFs
IGNvbnN0IEF0b21pY1N0cmluZyYgYWNjZXNzS2V5KCkgY29uc3QgeyByZXR1cm4gbnVsbEF0b207
IH0KICAgICBjb25zdCBTdHJpbmcmIGFjdGlvblZlcmIoKSBjb25zdDsKQEAgLTU0Niw3ICs1OTAs
NiBAQAogICAgIHZpcnR1YWwgRnJhbWVWaWV3KiBkb2N1bWVudEZyYW1lVmlldygpIGNvbnN0Owog
ICAgIFN0cmluZyBsYW5ndWFnZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdW5zaWduZWQgaGllcmFy
Y2hpY2FsTGV2ZWwoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgY29uc3QgQXRvbWljU3RyaW5n
JiBwbGFjZWhvbGRlclZhbHVlKCkgY29uc3Q7CiAgICAgCiAgICAgdmlydHVhbCB2b2lkIHNldEZv
Y3VzZWQoYm9vbCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkVGV4dChjb25zdCBT
dHJpbmcmKSB7IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU5vZGVPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0LmgJKHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMTc0LDEzICsxNzQsMjIgQEAKICAgICB2b2lkIGFyaWFMYWJlbGVkQnlFbGVt
ZW50cyhWZWN0b3I8RWxlbWVudCo+JiBlbGVtZW50cykgY29uc3Q7CiAgICAgU3RyaW5nIGFjY2Vz
c2liaWxpdHlEZXNjcmlwdGlvbkZvckVsZW1lbnRzKFZlY3RvcjxFbGVtZW50Kj4gJmVsZW1lbnRz
KSBjb25zdDsKICAgICB2b2lkIGVsZW1lbnRzRnJvbUF0dHJpYnV0ZShWZWN0b3I8RWxlbWVudCo+
JiBlbGVtZW50cywgY29uc3QgUXVhbGlmaWVkTmFtZSYpIGNvbnN0OwotCisgICAgU3RyaW5nIGFy
aWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0OworICAgIAogICAgIEVsZW1lbnQqIG1lbnVF
bGVtZW50Rm9yTWVudUJ1dHRvbigpIGNvbnN0OwogICAgIEVsZW1lbnQqIG1lbnVJdGVtRWxlbWVu
dEZvck1lbnUoKSBjb25zdDsKICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBtZW51QnV0dG9uRm9y
TWVudSgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIE5vZGUqIG1fbm9kZTsKKworICAgIHZpcnR1
YWwgdm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+Jik7Cisg
ICAgdm9pZCBhbHRlcm5hdGl2ZVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYpIGNvbnN0
OworICAgIHZvaWQgdmlzaWJsZVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYpIGNvbnN0
OworICAgIHZvaWQgdGl0bGVFbGVtZW50VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+Jik7
CisgICAgdm9pZCBoZWxwVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JikgY29uc3Q7Cisg
ICAgU3RyaW5nIGFsdGVybmF0aXZlVGV4dEZvcldlYkFyZWEoKSBjb25zdDsKKyAgICB2b2lkIGFy
aWFMYWJlbGVkQnlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mKSBjb25zdDsKIH07CiAK
IGlubGluZSBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdCogdG9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVj
dChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluay5jcHAJ
KHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eUltYWdlTWFwTGluay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk0LDYgKzk0LDIxIEBA
CiAgICAgCiAgICAgcmV0dXJuIG1fYXJlYUVsZW1lbnQtPmhyZWYoKTsKIH0KKwordm9pZCBBY2Nl
c3NpYmlsaXR5SW1hZ2VNYXBMaW5rOjphY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJp
bGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYWNjZXNz
aWJpbGl0eURlc2NyaXB0aW9uKCk7CisgICAgaWYgKCFkZXNjcmlwdGlvbi5pc0VtcHR5KCkpCisg
ICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQoZGVzY3JpcHRpb24sIEFs
dGVybmF0aXZlVGV4dCkpOworCisgICAgY29uc3QgQXRvbWljU3RyaW5nJiB0aXRsZVRleHQgPSBn
ZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICBpZiAoIXRpdGxlVGV4dC5pc0VtcHR5KCkpCisg
ICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQodGl0bGVUZXh0LCBUaXRs
ZVRhZ1RleHQpKTsKKworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3VtbWFyeSA9IGdldEF0dHJp
YnV0ZShzdW1tYXJ5QXR0cik7CisgICAgaWYgKCFzdW1tYXJ5LmlzRW1wdHkoKSkKKyAgICAgICAg
dGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBTdW1tYXJ5VGV4dCkp
OworfQogICAgIAogU3RyaW5nIEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms6OmFjY2Vzc2liaWxp
dHlEZXNjcmlwdGlvbigpIGNvbnN0CiB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xzLmNwcAkocmV2
aXNpb24gMTMwMTg0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmls
aXR5TWVkaWFDb250cm9scy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0MCw2ICsxNDAsMjIgQEAK
ICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQWNjZXNzaWJpbGl0eU1lZGlhQ29udHJv
bDo6YWNjZXNzaWJpbGl0eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVy
KQoreworICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigp
OworICAgIGlmICghZGVzY3JpcHRpb24uaXNFbXB0eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBw
ZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGRlc2NyaXB0aW9uLCBBbHRlcm5hdGl2ZVRleHQpKTsKKwor
ICAgIFN0cmluZyB0aXRsZSA9IHRoaXMtPnRpdGxlKCk7CisgICAgaWYgKCF0aXRsZS5pc0VtcHR5
KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQodGl0bGUsIEFs
dGVybmF0aXZlVGV4dCkpOworCisgICAgU3RyaW5nIGhlbHB0ZXh0ID0gaGVscFRleHQoKTsKKyAg
ICBpZiAoIWhlbHB0ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nl
c3NpYmlsaXR5VGV4dChoZWxwdGV4dCwgSGVscFRleHQpKTsKK30KKyAgICAKKwogU3RyaW5nIEFj
Y2Vzc2liaWxpdHlNZWRpYUNvbnRyb2w6OnRpdGxlKCkgY29uc3QKIHsKICAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKGNvbnN0IFN0cmluZywgY29udHJvbHNQYW5lbCwgKEFTQ0lJTGl0ZXJhbCgiQ29u
dHJvbHNQYW5lbCIpKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vz
c2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDEzMDE4
NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcyNSw3MiArNzI1LDYgQEAKICAgICByZXR1cm4g
MDsKIH0KIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFyaWFEZXNjcmliZWRC
eUF0dHJpYnV0ZSgpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsKLSAg
ICBlbGVtZW50c0Zyb21BdHRyaWJ1dGUoZWxlbWVudHMsIGFyaWFfZGVzY3JpYmVkYnlBdHRyKTsK
LSAgICAKLSAgICByZXR1cm4gYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uRm9yRWxlbWVudHMoZWxl
bWVudHMpOwotfQotICAgIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OndlYkFy
ZWFBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdAotewotICAgIC8vIFRoZSBXZWJBcmVh
IGRlc2NyaXB0aW9uIHNob3VsZCBmb2xsb3cgdGhpcyBvcmRlcjoKLSAgICAvLyAgICAgYXJpYS1s
YWJlbCBvbiB0aGUgPGh0bWw+Ci0gICAgLy8gICAgIHRpdGxlIG9uIHRoZSA8aHRtbD4KLSAgICAv
LyAgICAgPHRpdGxlPiBpbnNpZGUgdGhlIDxoZWFkPiAob2YgaXQgd2FzIHNldCB0aHJvdWdoIEpT
KQotICAgIC8vICAgICBuYW1lIG9uIHRoZSA8aHRtbD4KLSAgICAvLyBGb3IgaWZyYW1lczoKLSAg
ICAvLyAgICAgYXJpYS1sYWJlbCBvbiB0aGUgPGlmcmFtZT4KLSAgICAvLyAgICAgdGl0bGUgb24g
dGhlIDxpZnJhbWU+Ci0gICAgLy8gICAgIG5hbWUgb24gdGhlIDxpZnJhbWU+Ci0gICAgCi0gICAg
aWYgKCFtX3JlbmRlcmVyKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0gICAgCi0gICAgRG9j
dW1lbnQqIGRvY3VtZW50ID0gbV9yZW5kZXJlci0+ZG9jdW1lbnQoKTsKLSAgICAKLSAgICAvLyBD
aGVjayBpZiB0aGUgSFRNTCBlbGVtZW50IGhhcyBhbiBhcmlhLWxhYmVsIGZvciB0aGUgd2VicGFn
ZS4KLSAgICBpZiAoRWxlbWVudCogZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50
RWxlbWVudCgpKSB7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgYXJpYUxhYmVsID0gZG9j
dW1lbnRFbGVtZW50LT5nZXRBdHRyaWJ1dGUoYXJpYV9sYWJlbEF0dHIpOwotICAgICAgICBpZiAo
IWFyaWFMYWJlbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gYXJpYUxhYmVsOwotICAg
IH0KLSAgICAKLSAgICBOb2RlKiBvd25lciA9IGRvY3VtZW50LT5vd25lckVsZW1lbnQoKTsKLSAg
ICBpZiAob3duZXIpIHsKLSAgICAgICAgaWYgKG93bmVyLT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8
fCBvd25lci0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIHRpdGxlID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudEJhc2UqPihvd25l
ciktPmdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpOwotICAgICAgICAgICAgaWYgKCF0aXRsZS5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXROYW1lQXR0cmli
dXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG93bmVyLT5pc0hUTUxFbGVtZW50KCkpCi0g
ICAgICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChvd25lciktPmdldE5hbWVBdHRyaWJ1dGUo
KTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZG9jdW1lbnRUaXRsZSA9IGRvY3VtZW50LT50aXRsZSgp
OwotICAgIGlmICghZG9jdW1lbnRUaXRsZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBkb2N1
bWVudFRpdGxlOwotICAgIAotICAgIG93bmVyID0gZG9jdW1lbnQtPmJvZHkoKTsKLSAgICBpZiAo
b3duZXIgJiYgb3duZXItPmlzSFRNTEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIHRvSFRNTEVs
ZW1lbnQob3duZXIpLT5nZXROYW1lQXR0cmlidXRlKCk7Ci0gICAgCi0gICAgcmV0dXJuIFN0cmlu
ZygpOwotfQotICAgIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFjY2Vzc2li
aWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3JlbmRlcmVyKQotICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBpZiAoaXNXZWJBcmVhKCkpCi0gICAgICAgIHJldHVy
biB3ZWJBcmVhQWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCk7Ci0KLSAgICByZXR1cm4gQWNjZXNz
aWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOwotfQotCiBMYXlv
dXRSZWN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmJvdW5kaW5nQm94UmVjdCgpIGNvbnN0
CiB7CiAgICAgUmVuZGVyT2JqZWN0KiBvYmogPSBtX3JlbmRlcmVyOwpJbmRleDogU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVj
dC5jcHAJKHJldmlzaW9uIDEzMDE4NCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDc0LDYgKzEw
NzQsMjI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgQWNjZXNzaWJpbGl0eU5vZGVPYmpl
Y3Q6OnRpdGxlRWxlbWVudFRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVy
KQoreworICAgIE5vZGUqIG5vZGUgPSB0aGlzLT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgYm9vbCBpc0lucHV0VGFnID0gbm9kZS0+aGFzVGFnTmFt
ZShpbnB1dFRhZyk7CisgICAgaWYgKGlzSW5wdXRUYWcgfHwgQWNjZXNzaWJpbGl0eU9iamVjdDo6
aXNBUklBSW5wdXQoYXJpYVJvbGVBdHRyaWJ1dGUoKSkgfHwgaXNDb250cm9sKCkpIHsKKyAgICAg
ICAgSFRNTExhYmVsRWxlbWVudCogbGFiZWwgPSBsYWJlbEZvckVsZW1lbnQodG9FbGVtZW50KG5v
ZGUpKTsKKyAgICAgICAgaWYgKGxhYmVsKSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBsYWJlbE9iamVjdCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUobGFiZWwpOwor
ICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChsYWJlbC0+aW5u
ZXJUZXh0KCksIExhYmVsQnlFbGVtZW50VGV4dCwgbGFiZWxPYmplY3QpKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0
KiB0aXRsZVVJRWxlbWVudCA9IHRoaXMtPnRpdGxlVUlFbGVtZW50KCk7CisgICAgaWYgKHRpdGxl
VUlFbGVtZW50KQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KFN0
cmluZygpLCBMYWJlbEJ5RWxlbWVudFRleHQsIHRpdGxlVUlFbGVtZW50KSk7CisgICAgCit9Cisg
ICAgCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphY2Nlc3NpYmlsaXR5VGV4dChWZWN0
b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7CisgICAgdGl0bGVFbGVtZW50VGV4
dCh0ZXh0T3JkZXIpOworICAgIAorICAgIGFsdGVybmF0aXZlVGV4dCh0ZXh0T3JkZXIpOworICAg
IAorICAgIHZpc2libGVUZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgaGVscFRleHQodGV4dE9y
ZGVyKTsKKyAgICAKKyAgICBTdHJpbmcgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclZhbHVlKCk7
CisgICAgaWYgKCFwbGFjZWhvbGRlci5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBl
bmQoQWNjZXNzaWJpbGl0eVRleHQocGxhY2Vob2xkZXIsIFBsYWNlaG9sZGVyVGV4dCkpOworfQor
ICAgIAordm9pZCBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YXJpYUxhYmVsZWRCeVRleHQoVmVj
dG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKSBjb25zdAoreworICAgIFN0cmluZyBh
cmlhTGFiZWxlZEJ5ID0gYXJpYUxhYmVsZWRCeUF0dHJpYnV0ZSgpOworICAgIGlmICghYXJpYUxh
YmVsZWRCeS5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsK
KyAgICAgICAgYXJpYUxhYmVsZWRCeUVsZW1lbnRzKGVsZW1lbnRzKTsKKyAgICAgICAgCisgICAg
ICAgIFZlY3RvcjxSZWZQdHI8QWNjZXNzaWJpbGl0eU9iamVjdD4gPiBheEVsZW1lbnRzOworICAg
ICAgICB1bnNpZ25lZCBsZW5ndGggPSBlbGVtZW50cy5zaXplKCk7CisgICAgICAgIGZvciAodW5z
aWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAgICAgICAgUmVmUHRyPEFjY2Vz
c2liaWxpdHlPYmplY3Q+IGF4RWxlbWVudCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUo
ZWxlbWVudHNba10pOworICAgICAgICAgICAgYXhFbGVtZW50cy5hcHBlbmQoYXhFbGVtZW50KTsK
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmls
aXR5VGV4dChhcmlhTGFiZWxlZEJ5LCBBbHRlcm5hdGl2ZVRleHQsIGF4RWxlbWVudHMpKTsKKyAg
ICB9Cit9CisgICAgCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphbHRlcm5hdGl2ZVRl
eHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKSBjb25zdAoreworICAgIGlm
IChpc1dlYkFyZWEoKSkgeworICAgICAgICBTdHJpbmcgd2ViQXJlYVRleHQgPSBhbHRlcm5hdGl2
ZVRleHRGb3JXZWJBcmVhKCk7CisgICAgICAgIGlmICghd2ViQXJlYVRleHQuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dCh3ZWJBcmVhVGV4
dCwgQWx0ZXJuYXRpdmVUZXh0KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhcmlh
TGFiZWxlZEJ5VGV4dCh0ZXh0T3JkZXIpOworICAgIAorICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
YXJpYUxhYmVsID0gZ2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICBpZiAoIWFyaWFM
YWJlbC5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRl
eHQoYXJpYUxhYmVsLCBBbHRlcm5hdGl2ZVRleHQpKTsKKyAgICAKKyAgICBpZiAoaXNJbWFnZSgp
IHx8IGlzSW5wdXRJbWFnZSgpIHx8IGlzTmF0aXZlSW1hZ2UoKSB8fCBpc0NhbnZhcygpKSB7Cisg
ICAgICAgIC8vIEltYWdlcyBzaG91bGQgdXNlIGFsdCBhcyBsb25nIGFzIHRoZSBhdHRyaWJ1dGUg
aXMgcHJlc2VudCwgZXZlbiBpZiBlbXB0eS4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBzaG91
bGQgZmFsbGJhY2sgdG8gb3RoZXIgbWV0aG9kcywgbGlrZSB0aGUgdGl0bGUgYXR0cmlidXRlLgor
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsK
KyAgICAgICAgaWYgKCFhbHQuaXNOdWxsKCkpCisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5k
KEFjY2Vzc2liaWxpdHlUZXh0KGFsdCwgQWx0ZXJuYXRpdmVUZXh0KSk7CisgICAgfQorICAgIAor
I2lmIEVOQUJMRShNQVRITUwpCisgICAgTm9kZSogbm9kZSA9IHRoaXMtPm5vZGUoKTsKKyAgICBp
ZiAobm9kZSAmJiBub2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgdG9FbGVtZW50KG5vZGUpLT5pc01h
dGhNTEVsZW1lbnQoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4
dChnZXRBdHRyaWJ1dGUoTWF0aE1MTmFtZXM6OmFsdHRleHRBdHRyKSwgQWx0ZXJuYXRpdmVUZXh0
KSk7CisjZW5kaWYKK30KKyAgICAKK1N0cmluZyBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWx0
ZXJuYXRpdmVUZXh0Rm9yV2ViQXJlYSgpIGNvbnN0Cit7CisgICAgLy8gVGhlIFdlYkFyZWEgZGVz
Y3JpcHRpb24gc2hvdWxkIGZvbGxvdyB0aGlzIG9yZGVyOgorICAgIC8vICAgICBhcmlhLWxhYmVs
IG9uIHRoZSA8aHRtbD4KKyAgICAvLyAgICAgdGl0bGUgb24gdGhlIDxodG1sPgorICAgIC8vICAg
ICA8dGl0bGU+IGluc2lkZSB0aGUgPGhlYWQ+IChvZiBpdCB3YXMgc2V0IHRocm91Z2ggSlMpCisg
ICAgLy8gICAgIG5hbWUgb24gdGhlIDxodG1sPgorICAgIC8vIEZvciBpZnJhbWVzOgorICAgIC8v
ICAgICBhcmlhLWxhYmVsIG9uIHRoZSA8aWZyYW1lPgorICAgIC8vICAgICB0aXRsZSBvbiB0aGUg
PGlmcmFtZT4KKyAgICAvLyAgICAgbmFtZSBvbiB0aGUgPGlmcmFtZT4KKyAgICAKKyAgICBSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyID0gdGhpcy0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVy
KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgCisgICAgRG9jdW1lbnQqIGRvY3VtZW50
ID0gcmVuZGVyZXItPmRvY3VtZW50KCk7CisgICAgCisgICAgLy8gQ2hlY2sgaWYgdGhlIEhUTUwg
ZWxlbWVudCBoYXMgYW4gYXJpYS1sYWJlbCBmb3IgdGhlIHdlYnBhZ2UuCisgICAgaWYgKEVsZW1l
bnQqIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAg
ICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFyaWFMYWJlbCA9IGRvY3VtZW50RWxlbWVudC0+Z2V0
QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICAgICAgaWYgKCFhcmlhTGFiZWwuaXNFbXB0
eSgpKQorICAgICAgICAgICAgcmV0dXJuIGFyaWFMYWJlbDsKKyAgICB9CisgICAgCisgICAgTm9k
ZSogb3duZXIgPSBkb2N1bWVudC0+b3duZXJFbGVtZW50KCk7CisgICAgaWYgKG93bmVyKSB7Cisg
ICAgICAgIGlmIChvd25lci0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgb3duZXItPmhhc1RhZ05h
bWUoaWZyYW1lVGFnKSkgeworICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB0aXRsZSA9
IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXRBdHRyaWJ1dGUo
dGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1M
RnJhbWVFbGVtZW50QmFzZSo+KG93bmVyKS0+Z2V0TmFtZUF0dHJpYnV0ZSgpOworICAgICAgICB9
CisgICAgICAgIGlmIChvd25lci0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAgICAgcmV0dXJu
IHRvSFRNTEVsZW1lbnQob3duZXIpLT5nZXROYW1lQXR0cmlidXRlKCk7CisgICAgfQorICAgIAor
ICAgIFN0cmluZyBkb2N1bWVudFRpdGxlID0gZG9jdW1lbnQtPnRpdGxlKCk7CisgICAgaWYgKCFk
b2N1bWVudFRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50VGl0bGU7Cisg
ICAgCisgICAgb3duZXIgPSBkb2N1bWVudC0+Ym9keSgpOworICAgIGlmIChvd25lciAmJiBvd25l
ci0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChvd25lcikt
PmdldE5hbWVBdHRyaWJ1dGUoKTsKKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK3Zv
aWQgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OnZpc2libGVUZXh0KFZlY3RvcjxBY2Nlc3NpYmls
aXR5VGV4dD4mIHRleHRPcmRlcikgY29uc3QKK3sKKyAgICBOb2RlKiBub2RlID0gdGhpcy0+bm9k
ZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGJvb2wgaXNJ
bnB1dFRhZyA9IG5vZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpOworICAgIGlmIChpc0lucHV0VGFn
KSB7CisgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG5vZGUpOworICAgICAgICBpZiAoaW5wdXQtPmlzVGV4dEJ1dHRvbigpKSB7
CisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGlucHV0LT52
YWx1ZVdpdGhEZWZhdWx0KCksIFZpc2libGVUZXh0KSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIG5vZGUgaXNuJ3QgcmVuZGVyZWQsIHRo
ZXJlJ3Mgbm8gaW5uZXIgdGV4dCB3ZSBjYW4gZXh0cmFjdCBmcm9tIGEgc2VsZWN0IGVsZW1lbnQu
CisgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSAmJiBub2RlLT5oYXNUYWdO
YW1lKHNlbGVjdFRhZykpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29sIHVzZVRleHRV
bmRlckVsZW1lbnQgPSBmYWxzZTsKKyAgICAKKyAgICBzd2l0Y2ggKHJvbGVWYWx1ZSgpKSB7Cisg
ICAgICAgIGNhc2UgUG9wVXBCdXR0b25Sb2xlOgorICAgICAgICBjYXNlIEJ1dHRvblJvbGU6Cisg
ICAgICAgIGNhc2UgVG9nZ2xlQnV0dG9uUm9sZToKKyAgICAgICAgY2FzZSBDaGVja0JveFJvbGU6
CisgICAgICAgIGNhc2UgTGlzdEJveE9wdGlvblJvbGU6CisgICAgICAgIGNhc2UgTWVudUJ1dHRv
blJvbGU6CisgICAgICAgIGNhc2UgTWVudUl0ZW1Sb2xlOgorICAgICAgICBjYXNlIFJhZGlvQnV0
dG9uUm9sZToKKyAgICAgICAgY2FzZSBUYWJSb2xlOgorICAgICAgICAgICAgdXNlVGV4dFVuZGVy
RWxlbWVudCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAoaXNIZWFkaW5nKCkgfHwgaXNM
aW5rKCkpCisgICAgICAgIHVzZVRleHRVbmRlckVsZW1lbnQgPSB0cnVlOworICAgIAorICAgIC8v
IElmIGl0J3MgZm9jdXNhYmxlIGJ1dCBpdCdzIG5vdCBjb250ZW50IGVkaXRhYmxlIG9yIGEga25v
d24gY29udHJvbCB0eXBlLCB0aGVuIGl0IHdpbGwgYXBwZWFyIHRvCisgICAgLy8gdGhlIHVzZXIg
YXMgYSBzaW5nbGUgYXRvbWljIG9iamVjdCwgc28gd2Ugc2hvdWxkIHVzZSBpdHMgdGV4dCBhcyB0
aGUgZGVmYXVsdCB0aXRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAo
aXNHZW5lcmljRm9jdXNhYmxlRWxlbWVudCgpKQorICAgICAgICB1c2VUZXh0VW5kZXJFbGVtZW50
ID0gdHJ1ZTsKKyAgICAKKyAgICBpZiAodXNlVGV4dFVuZGVyRWxlbWVudCkgeworICAgICAgICBT
dHJpbmcgdGV4dCA9IHRleHRVbmRlckVsZW1lbnQoKTsKKyAgICAgICAgaWYgKCF0ZXh0LmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQodGV4
dCwgQ2hpbGRyZW5UZXh0KSk7CisgICAgfQorCit9CisgICAgCit2b2lkIEFjY2Vzc2liaWxpdHlO
b2RlT2JqZWN0OjpoZWxwVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIp
IGNvbnN0Cit7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBhcmlhSGVscCA9IGdldEF0dHJpYnV0
ZShhcmlhX2hlbHBBdHRyKTsKKyAgICBpZiAoIWFyaWFIZWxwLmlzRW1wdHkoKSkKKyAgICAgICAg
dGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChhcmlhSGVscCwgSGVscFRleHQpKTsK
KyAgICAKKyAgICBTdHJpbmcgZGVzY3JpYmVkQnkgPSBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUo
KTsKKyAgICBpZiAoIWRlc2NyaWJlZEJ5LmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFw
cGVuZChBY2Nlc3NpYmlsaXR5VGV4dChkZXNjcmliZWRCeSwgU3VtbWFyeVRleHQpKTsKKyAgICAK
KyAgICAvLyBBZGQgaGVscCB0eXBlIHRleHQgdGhhdCBpcyBkZXJpdmVkIGZyb20gYW5jZXN0b3Jz
LgorICAgIGZvciAoTm9kZSogY3VyciA9IG5vZGUoKTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVu
dE5vZGUoKSkgeworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN1bW1hcnkgPSBnZXRBdHRy
aWJ1dGUoc3VtbWFyeUF0dHIpOworICAgICAgICBpZiAoIXN1bW1hcnkuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBTdW1t
YXJ5VGV4dCkpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRpdGxlIGF0dHJpYnV0ZSBzaG91
bGQgYmUgdXNlZCBhcyBoZWxwIHRleHQgdW5sZXNzIGl0IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBh
cyBkZXNjcmlwdGl2ZSB0ZXh0LgorICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0g
Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7CisgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dCh0aXRsZSwgVGl0
bGVUYWdUZXh0KSk7CisgICAgICAgIAorICAgICAgICAvLyBPbmx5IHRha2UgaGVscCB0ZXh0IGZy
b20gYW4gYW5jZXN0b3IgZWxlbWVudCBpZiBpdHMgYSBncm91cCBvciBhbiB1bmtub3duIHJvbGUu
IElmIGhlbHAgd2FzCisgICAgICAgIC8vIGFkZGVkIHRvIHRob3NlIGtpbmRzIG9mIGVsZW1lbnRz
LCBpdCBpcyBsaWtlbHkgaXQgd2FzIG1lYW50IGZvciBhIGNoaWxkIGVsZW1lbnQuCisgICAgICAg
IEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4T2JqID0gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0
ZShjdXJyKTsKKyAgICAgICAgaWYgKCFheE9iaikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgCisgICAgICAgIEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUgPSBheE9iai0+cm9sZVZhbHVlKCk7
CisgICAgICAgIGlmIChyb2xlICE9IEdyb3VwUm9sZSAmJiByb2xlICE9IFVua25vd25Sb2xlKQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorICAgIAogU3RyaW5nIEFjY2Vzc2liaWxpdHlO
b2RlT2JqZWN0OjphY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdAogewogICAgIC8vIFN0
YXRpYyB0ZXh0IHNob3VsZCBub3QgaGF2ZSBhIGRlc2NyaXB0aW9uLCBpdCBzaG91bGQgb25seSBo
YXZlIGEgc3RyaW5nVmFsdWUuCkBAIC0xMzQxLDYgKzE1NjAsMTQgQEAKICAgICByZXR1cm4gYnVp
bGRlci50b1N0cmluZygpOwogfQogCitTdHJpbmcgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFy
aWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0Cit7CisgICAgVmVjdG9yPEVsZW1lbnQqPiBl
bGVtZW50czsKKyAgICBlbGVtZW50c0Zyb21BdHRyaWJ1dGUoZWxlbWVudHMsIGFyaWFfZGVzY3Jp
YmVkYnlBdHRyKTsKKyAgICAKKyAgICByZXR1cm4gYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uRm9y
RWxlbWVudHMoZWxlbWVudHMpOworfQorCiB2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Ojpl
bGVtZW50c0Zyb21BdHRyaWJ1dGUoVmVjdG9yPEVsZW1lbnQqPiYgZWxlbWVudHMsIGNvbnN0IFF1
YWxpZmllZE5hbWUmIGF0dHJpYnV0ZSkgY29uc3QKIHsKICAgICBOb2RlKiBub2RlID0gdGhpcy0+
bm9kZSgpOwpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJp
YS1yYWRpb2J1dHRvbi10ZXh0Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZv
cm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1yYWRpb2J1dHRvbi10ZXh0Lmh0bWwJKHJldmlzaW9u
IDEzMDE4NCkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9hY2Nlc3NpYmlsaXR5L2FyaWEt
cmFkaW9idXR0b24tdGV4dC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw5IEBACiAg
ICAgICAgICAgdmFyIHN1Y2NlZWRlZCA9IG9iai5jaGlsZEF0SW5kZXgoMSkudGl0bGUgPT0gIkFY
VGl0bGU6IFR3byI7CiAgICAgICAgICAgc2hvdWxkQmUoInN1Y2NlZWRlZCIsICJ0cnVlIik7CiAK
LSAgICAgICAgICB2YXIgc3VjY2VlZGVkID0gb2JqLmNoaWxkQXRJbmRleCgyKS50aXRsZSA9PSAi
QVhUaXRsZTogVGhyZWUiOworICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIHRoaXJkIGJ1dHRvbiB1
c2VzIGFyaWEtbGFiZWxsZWRieSwgdGhlIGFjY2Vzc2libGUgbmFtZQorICAgICAgICAgIC8vIHdp
bGwgYmUgaW5zaWRlIHRoZSBkZXNjcmlwdGlvbiBmaWVsZC4KKyAgICAgICAgICB2YXIgc3VjY2Vl
ZGVkID0gb2JqLmNoaWxkQXRJbmRleCgyKS5kZXNjcmlwdGlvbiA9PSAiQVhEZXNjcmlwdGlvbjog
VGhyZWUiOwogICAgICAgICAgIHNob3VsZEJlKCJzdWNjZWVkZWQiLCAidHJ1ZSIpOwogICAgIH0K
IApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkocmV2aXNpb24gMTMxNDczKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTItMTAtMTYgIENocmlzIEZsZWl6YWNo
ICA8Y2ZsZWl6YWNoQGFwcGxlLmNvbT4KKworICAgICAgICBBWDpXaGVuIGFyaWEtbGFiZWwgaXMg
dXNlZCwgdGhlIHRleHQgdW5kZXIgYW4gZWxlbWVudCBpcyBzdGlsbCBhcHBlYXJpbmcgYXMgdGhl
IEFYVGl0bGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTk4MTY3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiB0aGUgY2hhbmdlIHN1Y2ggYXMgYXBwcm9hY2gsIHJh
dGlvbmFsZS4gUGxlYXNlIGFkZCBwZXItZnVuY3Rpb24gZGVzY3JpcHRpb25zIGJlbG93IChPT1BT
ISkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLXJhZGlvYnV0
dG9uLXRleHQuaHRtbDoKKwogMjAxMi0xMC0xNiAgTWlrZSBSZWVkICA8cmVlZEBnb29nbGUuY29t
PgogCiAgICAgICAgIHVwZGF0ZSBleHBlY3RhdGlvbnMgcHJlcGFyaW5nIGZvciBza2lhIG9wdGlt
aXphdGlvbgo=
</data>
<flag name="review"
          id="182108"
          type_id="1"
          status="-"
          setter="cfleizach"
    />
    <flag name="commit-queue"
          id="182116"
          type_id="3"
          status="-"
          setter="gyuyoung.kim"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>170316</attachid>
            <date>2012-10-23 22:34:02 -0700</date>
            <delta_ts>2012-10-24 10:16:30 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>5322</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMjMxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDEyLTEwLTIzICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6V2hlbiBhcmlhLWxh
YmVsIGlzIHVzZWQsIHRoZSB0ZXh0IHVuZGVyIGFuIGVsZW1lbnQgaXMgc3RpbGwgYXBwZWFyaW5n
IGFzIHRoZSBBWFRpdGxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD05ODE2NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFjY29yZGluZyB0byBXQUktQVJJQSB0ZXh0IGNvbXB1dGF0aW9uLCB0aGUgcHJlc2Vu
Y2Ugb2YgYXJpYS1sYWJlbCBhbmQgYWx0ZXJuYXRpdmUgdGV4dAorICAgICAgICBzaG91bGQgb3Zl
cnJpZGUgdGhlIHZpc2libGUgdGV4dCB3aXRoaW4gYW4gZWxlbWVudC4KKworICAgICAgICBUZXN0
OiBwbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLWxhYmVsLW92ZXJyaWRlcy12aXNpYmxl
LXRleHQuaHRtbAorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0
eU9iamVjdFdyYXBwZXIubW06CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVyIGFjY2Vzc2liaWxpdHlUaXRsZV0pOgorCiAyMDEyLTEwLTIzICBBbmRyZWFzIEtsaW5nICA8
a2xpbmdAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZW1vdmUgc3BlY2lhbGl6ZWQgaGFzaCB0cmFp
dHMgZm9yIEdseXBoUGFnZXMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21h
Yy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5t
bQkocmV2aXNpb24gMTMyMjI4KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9tYWMv
V2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIubW0JKHdvcmtpbmcgY29weSkKQEAgLTE4NDks
NiArMTg0OSwxMCBAQAogICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykg
ewogICAgICAgICBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dCYgdGV4dCA9IHRleHRPcmRlcltrXTsK
ICAgICAgICAgCisgICAgICAgIC8vIElmIHdlIGhhdmUgYWx0ZXJuYXRpdmUgdGV4dCwgdGhlbiB3
ZSBzaG91bGQgbm90IGV4cG9zZSBhIHRpdGxlLgorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNl
ID09IEFsdGVybmF0aXZlVGV4dCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKICAgICAg
ICAgLy8gT25jZSB3ZSBlbmNvdW50ZXIgdmlzaWJsZSB0ZXh0LCBvciB0aGUgdGV4dCBmcm9tIG91
ciBjaGlsZHJlbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcmVtb3N0LgogICAgICAgICBpZiAodGV4
dC50ZXh0U291cmNlID09IFZpc2libGVUZXh0IHx8IHRleHQudGV4dFNvdXJjZSA9PSBDaGlsZHJl
blRleHQpCiAgICAgICAgICAgICByZXR1cm4gdGV4dC50ZXh0OwpJbmRleDogTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24g
MTMyMzExKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMTcgQEAKKzIwMTItMTAtMjMgIENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFwcGxlLmNv
bT4KKworICAgICAgICBBWDpXaGVuIGFyaWEtbGFiZWwgaXMgdXNlZCwgdGhlIHRleHQgdW5kZXIg
YW4gZWxlbWVudCBpcyBzdGlsbCBhcHBlYXJpbmcgYXMgdGhlIEFYVGl0bGUKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk4MTY3CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIGEgbmV3IHRlc3QsIGFuZCBm
aXggYW4gb2xkIHRlc3Qgd2hpY2ggd2FzIGluY29ycmVjdGx5IGV4cG9zaW5nIHZpc2libGUgdGV4
dCAKKyAgICAgICAgYXMgdGhlIEFYVGl0bGUuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvYWNj
ZXNzaWJpbGl0eS9hcmlhLWxhYmVsLW92ZXJyaWRlcy12aXNpYmxlLXRleHQtZXhwZWN0ZWQudHh0
OiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLWxhYmVs
LW92ZXJyaWRlcy12aXNpYmxlLXRleHQuaHRtbDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0v
bWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1sYWJlbGxlZGJ5LW92ZXJyaWRlcy1hcmlhLWxhYmVsLWV4
cGVjdGVkLnR4dDoKKwogMjAxMi0xMC0yMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgTXVsdGlwbGUgZmllbGRzIGlucHV0IFVJOiBEb24ndCB1c2UgQ1NTIHBy
b3BlcnRpZXMgZm9yIHBoeXNpY2FsIGRpcmVjdGlvbgpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZv
cm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1sYWJlbC1vdmVycmlkZXMtdmlzaWJsZS10ZXh0LWV4
cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvYWNjZXNz
aWJpbGl0eS9hcmlhLWxhYmVsLW92ZXJyaWRlcy12aXNpYmxlLXRleHQtZXhwZWN0ZWQudHh0CShy
ZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJp
YS1sYWJlbC1vdmVycmlkZXMtdmlzaWJsZS10ZXh0LWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMiBAQAordGVzdDEKK1RoaXMgdGVzdHMgZW5zdXJlcyB0aGF0IGlmIGFyaWEt
bGFiZWwgaXMgdXNlZCwgdGhlIEFYVGl0bGUgd2lsbCBub3QgZXhwb3NlIGl0cyBjaGlsZHJlbiBv
biBNYWMuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVz
c2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIGxpbmsuZGVzY3Jp
cHRpb24gaXMgJ0FYRGVzY3JpcHRpb246IExJTksnCitQQVNTIGxpbmsudGl0bGUgaXMgJ0FYVGl0
bGU6ICcKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQor
CkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLWxhYmVs
bGVkYnktb3ZlcnJpZGVzLWFyaWEtbGFiZWwtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL3BsYXRmb3JtL21hYy9hY2Nlc3NpYmlsaXR5L2FyaWEtbGFiZWxsZWRieS1vdmVy
cmlkZXMtYXJpYS1sYWJlbC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDEzMTkwNCkKKysrIExheW91
dFRlc3RzL3BsYXRmb3JtL21hYy9hY2Nlc3NpYmlsaXR5L2FyaWEtbGFiZWxsZWRieS1vdmVycmlk
ZXMtYXJpYS1sYWJlbC1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTMsMTAgKzMsMTAg
QEAKIEFscGhhIEJldGEgRGVsdGEgRXRhIEVwc2lsb24gVGhldGEKIHVzaW5nTm9uZS50aXRsZTog
W0FYVGl0bGU6IEFscGhhXQogdXNpbmdOb25lLmRlc2NyaXB0aW9uOiBbQVhEZXNjcmlwdGlvbjog
XQotdXNpbmdMYWJlbC50aXRsZTogW0FYVGl0bGU6IEJldGFdCit1c2luZ0xhYmVsLnRpdGxlOiBb
QVhUaXRsZTogXQogdXNpbmdMYWJlbC5kZXNjcmlwdGlvbjogW0FYRGVzY3JpcHRpb246IEdhbW1h
XQotdXNpbmdMYWJlbGxlZGJ5LnRpdGxlOiBbQVhUaXRsZTogRGVsdGFdCit1c2luZ0xhYmVsbGVk
YnkudGl0bGU6IFtBWFRpdGxlOiBdCiB1c2luZ0xhYmVsbGVkYnkuZGVzY3JpcHRpb246IFtBWERl
c2NyaXB0aW9uOiBFcHNpbG9uXQotdXNpbmdMYWJlbGVkYnkudGl0bGU6IFtBWFRpdGxlOiBFdGFd
Cit1c2luZ0xhYmVsZWRieS50aXRsZTogW0FYVGl0bGU6IF0KIHVzaW5nTGFiZWxlZGJ5LmRlc2Ny
aXB0aW9uOiBbQVhEZXNjcmlwdGlvbjogVGhldGFdCiAKSW5kZXg6IExheW91dFRlc3RzL3BsYXRm
b3JtL21hYy9hY2Nlc3NpYmlsaXR5L2FyaWEtbGFiZWwtb3ZlcnJpZGVzLXZpc2libGUtdGV4dC5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9hY2Nlc3NpYmlsaXR5
L2FyaWEtbGFiZWwtb3ZlcnJpZGVzLXZpc2libGUtdGV4dC5odG1sCShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1sYWJlbC1vdmVycmlk
ZXMtdmlzaWJsZS10ZXh0Lmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9D
VFlQRSBIVE1MPgorPGh0bWw+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIuLi8uLi8uLi9mYXN0L2pz
L3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+CisKKzxhIHRhYmluZGV4PSIwIiBp
ZD0ibGluayIgaHJlZj0iIyIgYXJpYS1sYWJlbD0iTElOSyI+dGVzdDE8L2E+CisKKzxkaXYgaWQ9
ImNvbnNvbGUiPjwvZGl2PgorPHNjcmlwdD4KK2Rlc2NyaXB0aW9uKCJUaGlzIHRlc3RzIGVuc3Vy
ZXMgdGhhdCBpZiBhcmlhLWxhYmVsIGlzIHVzZWQsIHRoZSBBWFRpdGxlIHdpbGwgbm90IGV4cG9z
ZSBpdHMgY2hpbGRyZW4gb24gTWFjLiIpCisKK2lmICh3aW5kb3cudGVzdFJ1bm5lciAmJiB3aW5k
b3cuYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIpIHsKKyAgIHZhciBsaW5rID0gYWNjZXNzaWJpbGl0
eUNvbnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJsaW5rIik7CisgICBzaG91bGRCZSgi
bGluay5kZXNjcmlwdGlvbiIsICInQVhEZXNjcmlwdGlvbjogTElOSyciKTsKKyAgIHNob3VsZEJl
KCJsaW5rLnRpdGxlIiwgIidBWFRpdGxlOiAnIik7Cit9CisKKzwvc2NyaXB0PgorCis8c2NyaXB0
IHNyYz0iLi4vLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3Njcmlw
dD4KKzwvYm9keT4KKzwvaHRtbD4K
</data>
<flag name="review"
          id="183886"
          type_id="1"
          status="+"
          setter="bdakin"
    />
          </attachment>
      

    </bug>

</bugzilla>