<?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>33785</bug_id>
          
          <creation_ts>2010-01-17 23:57:23 -0800</creation_ts>
          <short_desc>[Gtk] AtkHyperlink needs to be implemented</short_desc>
          <delta_ts>2010-11-01 08:08:09 -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>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>25531</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Joanmarie Diggs">jdiggs</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apinheiro</cc>
    
    <cc>diegoe</cc>
    
    <cc>mario</cc>
    
    <cc>walker.willie</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>181755</commentid>
    <comment_count>0</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-01-17 23:57:23 -0800</bug_when>
    <thetext>WebKitGtk does not implement AtkHyperlink (http://library.gnome.org/devel/atk/unstable/AtkHyperlink.html)

Impact: ATs cannot identify anything about a link other than the fact that it is a link.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181757</commentid>
    <comment_count>1</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-01-18 00:03:43 -0800</bug_when>
    <thetext>Sorry to be spammy. It&apos;s 3 AM....

This is especially true and needed for image map links. 

What&apos;s mainly missing (and needed) w.r.t. text links is the associated URI (We know the state, etc. of the link). We should, however, also implement the start and end indices at the very least....</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194925</commentid>
    <comment_count>2</comment_count>
    <who name="Diego Escalante Urrelo">diegoe</who>
    <bug_when>2010-03-01 20:46:42 -0800</bug_when>
    <thetext>Hi Joanie, I was wondering how precisely to do this. So far I can see that different AtkInterfaces are implemented/enabled depending on the role detected on object creation time. But I wonder what to do with the AtkHyperlink *object*. I&apos;m a bit clueless of where or what other objects -not interfaces- are implemented or where would I fit this.
I&apos;m wondering if it should be in accesibility/ as a new file or if it&apos;s something only relevant for gtk/.

I&apos;m discovering a new world.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194939</commentid>
    <comment_count>3</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-03-01 21:55:44 -0800</bug_when>
    <thetext>Hi Diego.

I&apos;m afraid I didn&apos;t leave much detail. I just assumed I was doing this one. It would be nice to have edit bug privs so that we could assign bugs to ourselves.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274029</commentid>
    <comment_count>4</comment_count>
      <attachid>66519</attachid>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-09-03 10:49:54 -0700</bug_when>
    <thetext>Created attachment 66519
test case

(Apologies for just now getting back to this.)

This may need to be split this into multiple bugs, but I think having a test case in one location might help. So....

Steps to reproduce:

1. Open the attached test case and Accerciser.

2. Within Accerciser&apos;s object tree, locate the paragraph in the test case. With that paragraph selected:

Expected results from Accerciser&apos;s iPython console:

In [1]: ht = acc.queryHypertext()
In [2]: nLinks = ht.getNLinks()
In [3]: links = [ht.getLink(n) for n in range(nLinks)]
In [4]: nLinks
Out[4]: 2
In [5]: links
Out[5]: 
[&lt;CORBA.Object &apos;IDL:Accessibility/Hyperlink:1.0&apos; at 0x96686e8&gt;,
 &lt;CORBA.Object &apos;IDL:Accessibility/Hyperlink:1.0&apos; at 0x96a43d0&gt;]
In [6]: [(l.startIndex, l.endIndex, l.getURI(0)) for l in links]
Out[6]: [(10, 14, &apos;http://www.google.com&apos;), (25, 36, &apos;http://live.gnome.org/&apos;)]

In terms of Orca + Epiphany and Yelp 3.0, the above is what I must have. Having the rest of the implementation of AtkHypertext [1] and AtkHyperlink [2] is strongly desired, but much lower priority -- at least as far as I am concerned.

Thanks!

[1] http://library.gnome.org/devel/atk/unstable/AtkHypertext.html
[2] http://library.gnome.org/devel/atk/unstable/AtkHyperlink.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285516</commentid>
    <comment_count>5</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-09-27 09:56:22 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Hi Joanie, I was wondering how precisely to do this. So far I can see that different 
&gt; AtkInterfaces are implemented/enabled depending on the role detected on object
&gt; creation time. But I wonder what to do with the AtkHyperlink *object*. 

Same doubts here. As long as I could figure it out so far, it looks to me that a new class would be needed to be implemented as a subclass of AtkHyperLink, which would hold references to WebKitAccessible objects implementing the AtkHyperlinkImpl *interface*, so calling to the methods like atk_hyperlink_get_uri(int index) would actually return the desired value.

&gt; I&apos;m a bit clueless of where or what other objects -not interfaces- are implemented 
&gt; or where would I fit this.

If possible, I think the way to go here would be to somehow implement it inside the wrapper file as well, or in another one inside the gtk/ directory, but that would &quot;break&quot; the common layout for all the ports (platform specific versions of AXObjectCache, AccessibilityObject and AccessibilityObjectWrapper only).

&gt; I&apos;m wondering if it should be in accesibility/ as a new file or if it&apos;s something only
&gt; relevant for gtk/.

I don&apos;t see anything in cross-platform code similar to the structure we need in here (HyperText - HyperLink - link) so I guess going for gtk specific code would be the way to go at this moment.
 
&gt; I&apos;m discovering a new world.

Me too :-O</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286122</commentid>
    <comment_count>6</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-09-28 01:16:00 -0700</bug_when>
    <thetext>Just sharing a link that I think could be helpful for this stuff:

http://www.mozilla.org/access/unix/new-atk.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>286166</commentid>
    <comment_count>7</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-09-28 04:11:36 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Just sharing a link that I think could be helpful for this stuff:
&gt; 
&gt; http://www.mozilla.org/access/unix/new-atk.html

Yet another one:
http://accessibility.linuxfoundation.org/~gk4/a11y/ddc06/guide/atkguideddc06.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288318</commentid>
    <comment_count>8</comment_count>
      <attachid>69480</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-01 10:12:48 -0700</bug_when>
    <thetext>Created attachment 69480
WIP: Initial version of the patch

After working for these past days on this stuff and trying to figure out how all this stuff works I currently have an initial version of the patch that could one day become the fix for this bug, not only for the use cases mentioned by Joanmarie as &quot;a must&quot; but perhaps even also for the rest of the needs derived of the implementation of this AtkHypetext/AtkHyperlink thing.

Hence, attaching the patch to allow others check it, propose ideas, changes, corrections... and *try it out*, so I could get some feedback that most likely could lead me to change it everything, but that&apos;s how software is made, isn&apos;t it? :-)

Brief description of the patch, as written in the commit log message:


    Implementing the AtkHypertext/AtkHyperlink stuff in the GTK port
    
    Done:
    
     - Implemented AtkHypertext and AtkHyperlinkImpl interfaces in the ATK
       accessibility wrapper (WebKitAccessible).
    
     - Added new GObject in accessibility/gtk to implement instances of the
       AtkHyperlink abstract class. Called it WebKitAccessibleHyperlink.
    
     - Added a basic method to provide a lazy mechanism to &apos;get or create&apos;
       instances of WebKitAccessibleHyperlink for a given AtkObject
       implementing the AtkHyperlinkImpl interface. It&apos;s basic, but works
       fine (just a global hashtable and proper methods to deal with it).
    
     - Implemented all the functions of the AtkHypertext interface and the
       AtkHyperlink abstract class *but* considering only one anchor per
       instance of the AtkHyperlink class for the time being. It should be
       enough at this moment but will need changes for sure if we want to
       support image maps the same way firefox does it, for instance.
    
     - AtkAction interface not implemented in the WebKitAccessibleHyperlink
       class yet (it should be possible) Pending to check how to do it.
    
    TODO:
    
     - Check how to allow more than one anchor per AtkHyperlink
    
     - Check how to implement AtkAction interface in WebKitAccessibleHyperlink
    
     - Implement a LayoutTest and/or unit tests to check all this new code
    
     - Improve the code :-)


Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291597</commentid>
    <comment_count>9</comment_count>
      <attachid>70236</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-08 06:12:51 -0700</bug_when>
    <thetext>Created attachment 70236
WIP: Patch proposal (unit test pending)

WebKit/gtk/ChangeLogUploading  a new patch with some new stuff from the previous TODO list done.

(In reply to comment #8)
&gt; [...]
&gt;     TODO:
&gt;      - Check how to allow more than one anchor per AtkHyperlink

I talked to Joanie and it seems that, in terms of the screen reader, just having one anchor per AtkHyperlink is enough and correct so, I didn&apos;t change this by now as I think the right thing to do would be to ship this patch with this limitation/feature in and, if needed, improve it later on in this aspect as a new bug or something.

&gt;      - Check how to implement AtkAction interface in WebKitAccessibleHyperlink

Implemented AtkAction interface for those WebKitAccessibleHyperlink&apos;s where the wrapped AtkObject implements the AtkAction interface, that is, all of them :-) (but a check was added)

&gt;      - Implement a LayoutTest and/or unit tests to check all this new code

Written an unit test to check all the new stuff coming from the AtkHypertext/AtkHyperlink thing. Still pending to add some code to testatk.c to check the correctness of the AtkAction implementation (couldn&apos;t do it this week since my devel environment is kind of broken and the unit tests are not working properly now).

&gt;      - Improve the code :-)

Fixed some things here and there, such as how it&apos;s made the decision of implement the AtkHyperlinkImpl interface for a AtkObject or how to deal with the special case of list items.

*Not* asking for review yet. Still need to finish some things, such as the unit test for the AtkAction interface</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296846</commentid>
    <comment_count>10</comment_count>
      <attachid>71301</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-20 09:44:21 -0700</bug_when>
    <thetext>Created attachment 71301
Patch proposal + unit test

(In reply to comment #9)
&gt; [...] 
&gt; *Not* asking for review yet. Still need to finish some things, such as the unit test for the AtkAction interface

After two weeks of first getting my devel environment broken and then see how my laptop&apos;s motherboard died, I&apos;m finally back at work... :-)

Attaching now a new patch with some minor issues fixed and adding the pending unit test to check the implementation of the AtkAction interface in the new class added as subclass of AtkHyperlink.

Hence, finally asking for review now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297221</commentid>
    <comment_count>11</comment_count>
      <attachid>71301</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-20 21:07:57 -0700</bug_when>
    <thetext>Comment on attachment 71301
Patch proposal + unit test

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

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1940
&gt; +static AtkHyperlink* webkitAccessibleHypertextGetLink(AtkHypertext* hypertext, gint index)

I think you can change the index parameter type to size_t and avoid the cast below.

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1943
&gt; +    AccessibilityObject::AccessibilityChildrenVector children = coreObject-&gt;children();

Could this just core(hypertext-&gt;children();

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1966
&gt; +static gint webkitAccessibleHypertextGetNLinks(AtkHypertext* hypertext)

Avoid abbreviations here. webkitAccessibleHypertextGetLinkCount or webkitAccessibleHypertextGetNumberOfLinks. The method could also return a size_t.

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1972
&gt; +    for (unsigned i = 0; i &lt; children.size(); i++) {

I think you should use size_t here instead of unsigned.

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1985
&gt; +    gint nLinks = webkitAccessibleHypertextGetNLinks(hypertext);
&gt; +    if (!nLinks)
&gt; +        return -1;

Should be numberOfLinks or perhaps linksCount. Avoid abbreviations. The type should also probably be size_t.

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1987
&gt; +    for (gint i = 0; i &lt; nLinks; i++) {

size_t again.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:102
&gt; +static gint webkitAccessibleHyperlinkActionGetNActions(AtkAction* action)

Avoid the abbreviation here as well.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:165
&gt; +static gchar* webkitAccessibleHyperlinkGetUri(AtkHyperlink* link, gint index)

Should be webkitAccessibleHyperlinkGetURI

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:168
&gt; +    // FIXME Do NOT support more than one instance of an AtkObject

Very small nit! FIXME -&gt; FIXME:

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:303
&gt; +GType
&gt; +webkitAccessibleHyperlinkGetType(void)

Don&apos;t use a newline after GType here, if it can be avoided remove the void.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:342
&gt; +    g_hash_table_remove(hashTable, (void*)linkImpl);

I could be wrong, but I don&apos;t think you need to cast to void*. If you do, you should use a static_cast&lt;void*&gt;().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297294</commentid>
    <comment_count>12</comment_count>
      <attachid>71406</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-21 01:55:20 -0700</bug_when>
    <thetext>Created attachment 71406
Patch proposal + unit test

Attaching a new patch addressing some of these issues. Others couldn&apos;t be changed due to the reasons explained below...

(In reply to comment #11)
&gt; (From update of attachment 71301 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=71301&amp;action=review
&gt; 
&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1940
&gt; &gt; +static AtkHyperlink* webkitAccessibleHypertextGetLink(AtkHypertext* hypertext, gint index)
&gt; 
&gt; I think you can change the index parameter type to size_t and avoid the cast below.

As discussed by IRC, I can&apos;t change that since it must be compliant with the signature of the atk_hypertext_get_link() method, from the ATK interface. So the cast must stay as well :-(
 
&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1943
&gt; &gt; +    AccessibilityObject::AccessibilityChildrenVector children = coreObject-&gt;children();
&gt; 
&gt; Could this just core(hypertext-&gt;children();

Sure! Done.

&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1966
&gt; &gt; +static gint webkitAccessibleHypertextGetNLinks(AtkHypertext* hypertext)
&gt; 
&gt; Avoid abbreviations here. webkitAccessibleHypertextGetLinkCount or webkitAccessibleHypertextGetNumberOfLinks. The method could also return a size_t.

As discussed in IRC, in this case it&apos;s better to leave it that way so (1) it matches better the method it&apos;s implementing from the ATK interface and (2) because it&apos;s the way it&apos;s done all around in the ATK wrapper, so changing that in this case would lead to confusion in further readings of the code.
Hence, left as it was in the new patch.

&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1972
&gt; &gt; +    for (unsigned i = 0; i &lt; children.size(); i++) {
&gt; 
&gt; I think you should use size_t here instead of unsigned.

Done.

&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1985
&gt; &gt; +    gint nLinks = webkitAccessibleHypertextGetNLinks(hypertext);
&gt; &gt; +    if (!nLinks)
&gt; &gt; +        return -1;
&gt; 
&gt; Should be numberOfLinks or perhaps linksCount. Avoid abbreviations. The type should also probably be size_t.

Agreed to both points. Done.

&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1987
&gt; &gt; +    for (gint i = 0; i &lt; nLinks; i++) {
&gt; 
&gt; size_t again.

Done.

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:102
&gt; &gt; +static gint webkitAccessibleHyperlinkActionGetNActions(AtkAction* action)
&gt; 
&gt; Avoid the abbreviation here as well.

Can&apos;t do it, same reasons as explained above (match method from ATK interface)

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:165
&gt; &gt; +static gchar* webkitAccessibleHyperlinkGetUri(AtkHyperlink* link, gint index)
&gt; 
&gt; Should be webkitAccessibleHyperlinkGetURI

Can&apos;t do it, same reasons as explained above (match method from ATK interface)
 
&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:168
&gt; &gt; +    // FIXME Do NOT support more than one instance of an AtkObject
&gt; 
&gt; Very small nit! FIXME -&gt; FIXME:

Done.
 
&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:303
&gt; &gt; +GType
&gt; &gt; +webkitAccessibleHyperlinkGetType(void)
&gt; 
&gt; Don&apos;t use a newline after GType here, if it can be avoided remove the void.

Opps! I missed that one, sorry. Fixed.

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:342
&gt; &gt; +    g_hash_table_remove(hashTable, (void*)linkImpl);
&gt; 
&gt; I could be wrong, but I don&apos;t think you need to cast to void*. If you do, you should use a static_cast&lt;void*&gt;().

Actually you&apos;re right and I&apos;m wrong :-). Fixed

Thanks for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>298963</commentid>
    <comment_count>13</comment_count>
      <attachid>71406</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-25 10:50:32 -0700</bug_when>
    <thetext>Comment on attachment 71406
Patch proposal + unit test

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

Looks great, but r- pending further investigation and some small cleanup.

&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1969
&gt; +    if (!children.size())
&gt; +      return 0;

The indentation looks wrong here.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:44
&gt; +// Use this hash table to help reusing instances of the
&gt; +// WebKitAccessibleHyperlink class throughout the
&gt; +// webkitAccessibleHyperlinkGetOrCreate method
&gt; +static GHashTable* hashTable = 0;

I offered a suggestion via Jabber about how this might be avoided.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:151
&gt; +    if (!ATK_IS_ACTION(WEBKIT_ACCESSIBLE_HYPERLINK(action)-&gt;linkImpl))
&gt; +        return FALSE;
&gt; +
&gt; +    AccessibilityObject* coreObject = core(action);
&gt; +    if (!coreObject)
&gt; +        return FALSE;

The return type of this method is gchar*. I don&apos;t think FALSE is correct here.

&gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:194
&gt; +    gint baseLength = TextIterator::rangeLength(range);

I think when not exposed to the API, we prefer to use C types. So int.

&gt; WebKit/gtk/tests/testatk.c:979
&gt; +    g_idle_add((GSourceFunc)bail_out, loop);
&gt; +    g_main_loop_run(loop);

Do we need this extra main loop or can we just spin the main main loop?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300944</commentid>
    <comment_count>14</comment_count>
      <attachid>72159</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-28 01:32:39 -0700</bug_when>
    <thetext>Created attachment 72159
Patch proposal + unit test

(In reply to comment #13)
&gt; (From update of attachment 71406 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=71406&amp;action=review
&gt; 
&gt; Looks great, but r- pending further investigation and some small cleanup.

Attaching a new patch now, and I honestly think it&apos;s way better thank to your feedback. Thanks!

&gt; &gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1969
&gt; &gt; +    if (!children.size())
&gt; &gt; +      return 0;
&gt; 
&gt; The indentation looks wrong here.

Fixed.

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:44
&gt; &gt; +// Use this hash table to help reusing instances of the
&gt; &gt; +// WebKitAccessibleHyperlink class throughout the
&gt; &gt; +// webkitAccessibleHyperlinkGetOrCreate method
&gt; &gt; +static GHashTable* hashTable = 0;
&gt; 
&gt; I offered a suggestion via Jabber about how this might be avoided.

True, and I finally implemented it as it&apos;s way better than using this global hashtable:

It basically consists of just having a property in the WebKitAccessible instance implementing the AtkHyperlinkImpl interface to keep a reference to the WebKitAccessibleHyperlink instance, so we can just create and assign that property the first time it&apos;s required to create the AtkHyperlink, and reuse it later. Also, from the side of the WebKitAccessibleHyperlink instance, a weak reference is kept to the WebKitAccessible instance, so we can safely unref that AtkHyperlink when the AtkObject is destroyed too.

It&apos;s cleaner, safer and IMHO better, and it works like a charm. Thanks a lot for the suggestion

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:151
&gt; &gt; +    if (!ATK_IS_ACTION(WEBKIT_ACCESSIBLE_HYPERLINK(action)-&gt;linkImpl))
&gt; &gt; +        return FALSE;
&gt; &gt; +
&gt; &gt; +    AccessibilityObject* coreObject = core(action);
&gt; &gt; +    if (!coreObject)
&gt; &gt; +        return FALSE;
&gt; 
&gt; The return type of this method is gchar*. I don&apos;t think FALSE is correct here.

Ooops! Fixed.

&gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:194
&gt; &gt; +    gint baseLength = TextIterator::rangeLength(range);
&gt; 
&gt; I think when not exposed to the API, we prefer to use C types. So int.

Got it. Fixed.

&gt; &gt; WebKit/gtk/tests/testatk.c:979
&gt; &gt; +    g_idle_add((GSourceFunc)bail_out, loop);
&gt; &gt; +    g_main_loop_run(loop);
&gt; 
&gt; Do we need this extra main loop or can we just spin the main main loop?

No, we actually don&apos;t need it, just spinning the main loop would be enough. Fixed (in fashion with the new trend :-))

Asking for review again then...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300972</commentid>
    <comment_count>15</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-10-28 03:31:45 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; [...]
&gt; &gt; &gt; WebCore/accessibility/gtk/WebKitAccessibleHyperlink.cpp:44
&gt; &gt; &gt; +// Use this hash table to help reusing instances of the
&gt; &gt; &gt; +// WebKitAccessibleHyperlink class throughout the
&gt; &gt; &gt; +// webkitAccessibleHyperlinkGetOrCreate method
&gt; &gt; &gt; +static GHashTable* hashTable = 0;
&gt; &gt; 
&gt; &gt; I offered a suggestion via Jabber about how this might be avoided.
&gt; 
&gt; True, and I finally implemented it as it&apos;s way better than using this global hashtable:
&gt; 
&gt; It basically consists of just having a property in the WebKitAccessible instance implementing the 
&gt; AtkHyperlinkImpl interface to keep a reference to the WebKitAccessibleHyperlink instance, so we can just 
&gt; create and assign that property the first time it&apos;s required to create the AtkHyperlink, and reuse it later. 
&gt; Also, from the side of the WebKitAccessibleHyperlink instance, a weak reference is kept to the 
&gt; WebKitAccessible instance, so we can safely unref that AtkHyperlink when the AtkObject is destroyed too.

Sorry, I didn&apos;t give the right explanation here:

I did not use a property in the WebKitAccessible class to hold a pointer to WebKitAccessibleHyperlinkg, basically because that would affect to all the subclasses of WebKitAccessible, no matter what interface they implemented, and so that would require some dirty code to only actually use it in those instances of classes implementing the AtkHyperlinkImpl interface (which are dinamically generated, btw).

Besides, as the classes actually being used are dinamically defined and registered (depending on the interfaces being implemented) I couldn&apos;t install such a property in any of them either...

So, the final solution was basically to use the g_object_set_data() / g_object_get_data() mechanism to make sure the &apos;property&apos; is used only when needed, from webkitAccessibleHyperlinkImplGetHyperlink():

  static AtkHyperlink* webkitAccessibleHyperlinkImplGetHyperlink(AtkHyperlinkImpl* hyperlink)
  {
      AtkHyperlink* hyperlinkObject = ATK_HYPERLINK(g_object_get_data(G_OBJECT(hyperlink), &quot;hyperlink-object&quot;));
      if (!hyperlinkObject) {
          hyperlinkObject = ATK_HYPERLINK(webkitAccessibleHyperlinkNew(hyperlink));
          g_object_set_data(G_OBJECT(hyperlink), &quot;hyperlink-object&quot;, hyperlinkObject);
      }
      return hyperlinkObject;
  }

Sorry for the wrong explanation before, I was thinking of the orignal proposal (a property) not in the actual final implementation :/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302135</commentid>
    <comment_count>16</comment_count>
      <attachid>72159</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-29 15:27:23 -0700</bug_when>
    <thetext>Comment on attachment 72159
Patch proposal + unit test

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302692</commentid>
    <comment_count>17</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-11-01 08:08:09 -0700</bug_when>
    <thetext>Committed r71026: &lt;http://trac.webkit.org/changeset/71026&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>66519</attachid>
            <date>2010-09-03 10:49:54 -0700</date>
            <delta_ts>2010-09-03 10:49:54 -0700</delta_ts>
            <desc>test case</desc>
            <filename>link-example.html</filename>
            <type>text/html</type>
            <size>195</size>
            <attacher name="Joanmarie Diggs">jdiggs</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPjx0aXRsZT5MaW5rIEV4YW1wbGU8L3RpdGxlPjwvaGVhZD4KPGJvZHk+Cjxw
PkhlcmUgaXMgYSA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20iPmxpbmU8L2E+IHdpdGgg
c29tZSA8YSBocmVmPSJodHRwOi8vbGl2ZS5nbm9tZS5vcmcvIj5saW5rZWQgdGV4dDwvYT4gaW4g
aXQuPC9wPgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69480</attachid>
            <date>2010-10-01 10:12:48 -0700</date>
            <delta_ts>2010-10-08 06:12:51 -0700</delta_ts>
            <desc>WIP: Initial version of the patch</desc>
            <filename>0001-Implementing-the-AtkHypertext-AtkHyperlink-stuff-in-.patch</filename>
            <type>text/plain</type>
            <size>21449</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA4Nzc2Y2E0NzZkNDcyZjhkNGY3MDQ5YjlkZjY5MmNhYzhiNzcxMDRkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDI3IFNlcCAyMDEwIDE5OjI4OjU4ICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gSW1wbGVtZW50aW5nIHRoZSBBdGtIeXBlcnRleHQvQXRrSHlwZXJsaW5rIHN0dWZmIGluIHRo
ZSBHVEsgcG9ydAoKRG9uZToKCiAtIEltcGxlbWVudGVkIEF0a0h5cGVydGV4dCBhbmQgQXRrSHlw
ZXJsaW5rSW1wbCBpbnRlcmZhY2VzIGluIHRoZSBBVEsKICAgYWNjZXNzaWJpbGl0eSB3cmFwcGVy
IChXZWJLaXRBY2Nlc3NpYmxlKS4KCiAtIEFkZGVkIG5ldyBHT2JqZWN0IGluIGFjY2Vzc2liaWxp
dHkvZ3RrIHRvIGltcGxlbWVudCBpbnN0YW5jZXMgb2YgdGhlCiAgIEF0a0h5cGVybGluayBhYnN0
cmFjdCBjbGFzcy4gQ2FsbGVkIGl0IFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuCgogLSBBZGRl
ZCBhIGJhc2ljIG1ldGhvZCB0byBwcm92aWRlIGEgbGF6eSBtZWNoYW5pc20gdG8gJ2dldCBvciBj
cmVhdGUnCiAgIGluc3RhbmNlcyBvZiBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGZvciBhIGdp
dmVuIEF0a09iamVjdAogICBpbXBsZW1lbnRpbmcgdGhlIEF0a0h5cGVybGlua0ltcGwgaW50ZXJm
YWNlLiBJdCdzIGJhc2ljLCBidXQgd29ya3MKICAgZmluZSAoanVzdCBhIGdsb2JhbCBoYXNodGFi
bGUgYW5kIHByb3BlciBtZXRob2RzIHRvIGRlYWwgd2l0aCBpdCkuCgogLSBJbXBsZW1lbnRlZCBh
bGwgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZSBhbmQgdGhlCiAg
IEF0a0h5cGVybGluayBhYnN0cmFjdCBjbGFzcyAqYnV0KiBjb25zaWRlcmluZyBvbmx5IG9uZSBh
bmNob3IgcGVyCiAgIGluc3RhbmNlIG9mIHRoZSBBdGtIeXBlcmxpbmsgY2xhc3MgZm9yIHRoZSB0
aW1lIGJlaW5nLiBJdCBzaG91bGQgYmUKICAgZW5vdWdoIGF0IHRoaXMgbW9tZW50IGJ1dCB3aWxs
IG5lZWQgY2hhbmdlcyBmb3Igc3VyZSBpZiB3ZSB3YW50IHRvCiAgIHN1cHBvcnQgaW1hZ2UgbWFw
cyB0aGUgc2FtZSB3YXkgZmlyZWZveCBkb2VzIGl0LCBmb3IgaW5zdGFuY2UuCgogLSBBdGtBY3Rp
b24gaW50ZXJmYWNlIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgV2ViS2l0QWNjZXNzaWJsZUh5cGVy
bGluawogICBjbGFzcyB5ZXQgKGl0IHNob3VsZCBiZSBwb3NzaWJsZSkgUGVuZGluZyB0byBjaGVj
ayBob3cgdG8gZG8gaXQuCgpUT0RPOgoKIC0gQ2hlY2sgaG93IHRvIGFsbG93IG1vcmUgdGhhbiBv
bmUgYW5jaG9yIHBlciBBdGtIeXBlcmxpbmsKCiAtIENoZWNrIGhvdyB0byBpbXBsZW1lbnQgQXRr
QWN0aW9uIGludGVyZmFjZSBpbiBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rCgogLSBJbXBsZW1l
bnQgYSBMYXlvdXRUZXN0IGFuZC9vciB1bml0IHRlc3RzIHRvIGNoZWNrIGFsbCB0aGlzIG5ldyBj
b2RlCgogLSBJbXByb3ZlIHRoZSBjb2RlIDotKQotLS0KIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArCiAuLi4vZ3RrL0FjY2Vzc2liaWxp
dHlPYmplY3RXcmFwcGVyQXRrLmNwcCAgICAgICAgICB8ICAxNjcgKysrKysrKysrKysrLS0tCiAu
Li4vZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuY3BwICAgICAgICAgICAgICB8ICAyMjIg
KysrKysrKysrKysrKysrKysrKysKIC4uLi9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3Np
YmxlSHlwZXJsaW5rLmggIHwgICA1OCArKysrKwogNCBmaWxlcyBjaGFuZ2VkLCA0MTggaW5zZXJ0
aW9ucygrKSwgMzEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcAogY3JlYXRlIG1vZGUg
MTAwNjQ0IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlu
ay5oCgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFr
ZWZpbGUuYW0KaW5kZXggYzQ5M2MyMy4uYmQwMTgyZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVt
YWtlZmlsZS5hbQorKysgYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0zNDEzLDYgKzM0MTMs
OCBAQCB3ZWJjb3JlZ3RrX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsv
QWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwIFwKIAlXZWJDb3JlL2FjY2Vzc2liaWxp
dHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmggXAogCVdlYkNvcmUvYWNjZXNz
aWJpbGl0eS9ndGsvQVhPYmplY3RDYWNoZUF0ay5jcHAgXAorCVdlYkNvcmUvYWNjZXNzaWJpbGl0
eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oIFwKKwlXZWJDb3JlL2FjY2Vzc2liaWxp
dHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuY3BwIFwKIAlXZWJDb3JlL2JpbmRpbmdz
L2pzL1NjcmlwdENvbnRyb2xsZXJHdGsuY3BwIFwKIAlXZWJDb3JlL3BhZ2UvZ3RrL0RyYWdDb250
cm9sbGVyR3RrLmNwcCBcCiAJV2ViQ29yZS9wYWdlL2d0ay9FdmVudEhhbmRsZXJHdGsuY3BwIFwK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVj
dFdyYXBwZXJBdGsuY3BwIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5
T2JqZWN0V3JhcHBlckF0ay5jcHAKaW5kZXggYzlkMTNjYy4uNGE3ODU5MCAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5j
cHAKKysrIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3Jh
cHBlckF0ay5jcHAKQEAgLTYwLDE0ICs2MCwxNSBAQAogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIK
ICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKLSNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3Ry
aW5nLmg+CisjaW5jbHVkZSAiV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oIgogCiAjaW5jbHVk
ZSA8YXRrL2F0ay5oPgogI2luY2x1ZGUgPGdsaWIuaD4KICNpbmNsdWRlIDxnbGliL2dwcmludGYu
aD4KICNpbmNsdWRlIDxsaWJnYWlsLXV0aWwvZ2FpbC11dGlsLmg+CiAjaW5jbHVkZSA8cGFuZ28v
cGFuZ28uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmcuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCkBAIC0xNDMs
NiArMTQ0LDExIEBAIHN0YXRpYyBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlKEF0a1RhYmxlKiB0
YWJsZSkKICAgICByZXR1cm4gY29yZShBVEtfT0JKRUNUKHRhYmxlKSk7CiB9CiAKK3N0YXRpYyBB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlKEF0a0h5cGVydGV4dCogaHlwZXJ0ZXh0KQoreworICAg
IHJldHVybiBjb3JlKEFUS19PQkpFQ1QoaHlwZXJ0ZXh0KSk7Cit9CisKIHN0YXRpYyBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBjb3JlKEF0a0RvY3VtZW50KiBkb2N1bWVudCkKIHsKICAgICByZXR1cm4g
Y29yZShBVEtfT0JKRUNUKGRvY3VtZW50KSk7CkBAIC0xOTIyLDYgKzE5MjgsODQgQEAgc3RhdGlj
IHZvaWQgYXRrX3RhYmxlX2ludGVyZmFjZV9pbml0KEF0a1RhYmxlSWZhY2UqIGlmYWNlKQogICAg
IGlmYWNlLT5nZXRfcm93X2Rlc2NyaXB0aW9uID0gd2Via2l0X2FjY2Vzc2libGVfdGFibGVfZ2V0
X3Jvd19kZXNjcmlwdGlvbjsKIH0KIAorc3RhdGljIEF0a0h5cGVybGluayogd2Via2l0QWNjZXNz
aWJsZUh5cGVydGV4dEdldExpbmsoQXRrSHlwZXJ0ZXh0KiBoeXBlcnRleHQsIGdpbnQgaW5kZXgp
Cit7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUoaHlwZXJ0ZXh0
KTsKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpBY2Nlc3NpYmlsaXR5Q2hpbGRyZW5WZWN0b3Ig
Y2hpbGRyZW4gPSBjb3JlT2JqZWN0LT5jaGlsZHJlbigpOworICAgIGlmIChpbmRleCA8IDAgfHwg
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGluZGV4KSA+PSBjaGlsZHJlbi5zaXplKCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgZ2ludCBjdXJyZW50TGluayA9IC0xOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjb3JlQ2hpbGQgPSBjaGlsZHJlbi5hdChpKS5nZXQoKTsKKyAgICAgICAgaWYg
KCFjb3JlQ2hpbGQtPmFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSAmJiBjb3JlQ2hpbGQtPmlzTGlu
aygpKSB7CisgICAgICAgICAgICBjdXJyZW50TGluaysrOworICAgICAgICAgICAgaWYgKGluZGV4
ICE9IGN1cnJlbnRMaW5rKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAg
ICBBdGtPYmplY3QqIGF4T2JqZWN0ID0gY29yZUNoaWxkLT53cmFwcGVyKCk7CisgICAgICAgICAg
ICBpZiAoIWF4T2JqZWN0IHx8ICFBVEtfSVNfSFlQRVJMSU5LX0lNUEwoYXhPYmplY3QpKQorICAg
ICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gYXRrX2h5cGVybGlu
a19pbXBsX2dldF9oeXBlcmxpbmsoQVRLX0hZUEVSTElOS19JTVBMKGF4T2JqZWN0KSk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGdpbnQgd2Via2l0QWNj
ZXNzaWJsZUh5cGVydGV4dEdldE5MaW5rcyhBdGtIeXBlcnRleHQqIGh5cGVydGV4dCkKK3sKKyAg
ICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZShoeXBlcnRleHQpOworICAg
IEFjY2Vzc2liaWxpdHlPYmplY3Q6OkFjY2Vzc2liaWxpdHlDaGlsZHJlblZlY3RvciBjaGlsZHJl
biA9IGNvcmVPYmplY3QtPmNoaWxkcmVuKCk7CisKKyAgICBnaW50IGxpbmtzRm91bmQgPSAwOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAg
ICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlQ2hpbGQgPSBjaGlsZHJlbi5hdChpKS5nZXQo
KTsKKyAgICAgICAgaWYgKCFjb3JlQ2hpbGQtPmFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSAmJiBj
b3JlQ2hpbGQtPmlzTGluaygpKQorICAgICAgICAgICAgbGlua3NGb3VuZCsrOworICAgIH0KKwor
ICAgIHJldHVybiBsaW5rc0ZvdW5kOworfQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJ0ZXh0R2V0TGlua0luZGV4KEF0a0h5cGVydGV4dCogaHlwZXJ0ZXh0LCBnaW50IGNoYXJJ
bmRleCkKK3sKKyAgICBnaW50IG5MaW5rcyA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXRO
TGlua3MoaHlwZXJ0ZXh0KTsKKyAgICBpZiAoIW5MaW5rcykKKyAgICAgICAgcmV0dXJuIC0xOwor
CisgICAgZm9yIChnaW50IGkgPSAwOyBpIDwgbkxpbmtzOyBpKyspIHsKKyAgICAgICAgQXRrSHlw
ZXJsaW5rKiBoeXBlcmxpbmsgPSBBVEtfSFlQRVJMSU5LKHdlYmtpdEFjY2Vzc2libGVIeXBlcnRl
eHRHZXRMaW5rKGh5cGVydGV4dCwgaSkpOworICAgICAgICBnaW50IHN0YXJ0SW5kZXggPSBhdGtf
aHlwZXJsaW5rX2dldF9zdGFydF9pbmRleChoeXBlcmxpbmspOworICAgICAgICBnaW50IGVuZElu
ZGV4ID0gYXRrX2h5cGVybGlua19nZXRfZW5kX2luZGV4KGh5cGVybGluayk7CisKKyAgICAgICAg
Ly8gQ2hlY2sgaWYgdGhlIGNoYXIgaW5kZXggaW4gdGhlIGxpbmsncyBvZmZzZXQgcmFuZ2UKKyAg
ICAgICAgaWYgKHN0YXJ0SW5kZXggPD0gY2hhckluZGV4ICYmIGNoYXJJbmRleCA8IGVuZEluZGV4
KQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgLy8gTm90IGZvdW5kIGlmIHJl
YWNoZWQKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGF0a0h5cGVydGV4dEludGVy
ZmFjZUluaXQoQXRrSHlwZXJ0ZXh0SWZhY2UqIGlmYWNlKQoreworICAgIGlmYWNlLT5nZXRfbGlu
ayA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXRMaW5rOworICAgIGlmYWNlLT5nZXRfbl9s
aW5rcyA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXROTGlua3M7CisgICAgaWZhY2UtPmdl
dF9saW5rX2luZGV4ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldExpbmtJbmRleDsKK30K
Kworc3RhdGljIEF0a0h5cGVybGluayogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ltcGxHZXRI
eXBlcmxpbmsoQXRrSHlwZXJsaW5rSW1wbCogaHlwZXJsaW5rKQoreworICAgIHJldHVybiBBVEtf
SFlQRVJMSU5LKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNyZWF0ZShoeXBlcmxpbmsp
KTsKK30KKworc3RhdGljIHZvaWQgYXRrSHlwZXJsaW5rSW1wbEludGVyZmFjZUluaXQoQXRrSHlw
ZXJsaW5rSW1wbElmYWNlKiBpZmFjZSkKK3sKKyAgICBpZmFjZS0+Z2V0X2h5cGVybGluayA9IHdl
YmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbXBsR2V0SHlwZXJsaW5rOworfQorCiBzdGF0aWMgY29u
c3QgZ2NoYXIqIGRvY3VtZW50QXR0cmlidXRlVmFsdWUoQXRrRG9jdW1lbnQqIGRvY3VtZW50LCBj
b25zdCBnY2hhciogYXR0cmlidXRlKQogewogICAgIERvY3VtZW50KiBjb3JlRG9jdW1lbnQgPSBj
b3JlKGRvY3VtZW50KS0+ZG9jdW1lbnQoKTsKQEAgLTE5OTMsNiArMjA3NywxMCBAQCBzdGF0aWMg
Y29uc3QgR0ludGVyZmFjZUluZm8gQXRrSW50ZXJmYWNlc0luaXRGdW5jdGlvbnNbXSA9IHsKICAg
ICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpIDAsIDB9LAogICAgIHsoR0ludGVyZmFjZUluaXRG
dW5jKWF0a190YWJsZV9pbnRlcmZhY2VfaW5pdCwKICAgICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1
bmMpIDAsIDB9LAorICAgIHsoR0ludGVyZmFjZUluaXRGdW5jKWF0a0h5cGVydGV4dEludGVyZmFj
ZUluaXQsCisgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwfSwKKyAgICB7KEdJbnRl
cmZhY2VJbml0RnVuYylhdGtIeXBlcmxpbmtJbXBsSW50ZXJmYWNlSW5pdCwKKyAgICAgKEdJbnRl
cmZhY2VGaW5hbGl6ZUZ1bmMpIDAsIDB9LAogICAgIHsoR0ludGVyZmFjZUluaXRGdW5jKWF0a19k
b2N1bWVudF9pbnRlcmZhY2VfaW5pdCwKICAgICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpIDAs
IDB9CiB9OwpAQCAtMjAwNSwzMSArMjA5MywzNyBAQCBlbnVtIFdBSVR5cGUgewogICAgIFdBSV9D
T01QT05FTlQsCiAgICAgV0FJX0lNQUdFLAogICAgIFdBSV9UQUJMRSwKKyAgICBXQUlfSFlQRVJU
RVhULAorICAgIFdBSV9IWVBFUkxJTkssCiAgICAgV0FJX0RPQ1VNRU5UCiB9OwogCiBzdGF0aWMg
R1R5cGUgR2V0QXRrSW50ZXJmYWNlVHlwZUZyb21XQUlUeXBlKFdBSVR5cGUgdHlwZSkKIHsKLSAg
c3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgV0FJX0FDVElPTjoKLSAgICAgIHJldHVybiBBVEtfVFlQ
RV9BQ1RJT047Ci0gIGNhc2UgV0FJX1NFTEVDVElPTjoKLSAgICAgIHJldHVybiBBVEtfVFlQRV9T
RUxFQ1RJT047Ci0gIGNhc2UgV0FJX0VESVRBQkxFX1RFWFQ6Ci0gICAgICByZXR1cm4gQVRLX1RZ
UEVfRURJVEFCTEVfVEVYVDsKLSAgY2FzZSBXQUlfVEVYVDoKLSAgICAgIHJldHVybiBBVEtfVFlQ
RV9URVhUOwotICBjYXNlIFdBSV9DT01QT05FTlQ6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfQ09N
UE9ORU5UOwotICBjYXNlIFdBSV9JTUFHRToKLSAgICAgIHJldHVybiBBVEtfVFlQRV9JTUFHRTsK
LSAgY2FzZSBXQUlfVEFCTEU6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfVEFCTEU7Ci0gIGNhc2Ug
V0FJX0RPQ1VNRU5UOgotICAgICAgcmV0dXJuIEFUS19UWVBFX0RPQ1VNRU5UOwotICB9Ci0KLSAg
cmV0dXJuIEdfVFlQRV9JTlZBTElEOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV0FJ
X0FDVElPTjoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0FDVElPTjsKKyAgICBjYXNlIFdBSV9T
RUxFQ1RJT046CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9TRUxFQ1RJT047CisgICAgY2FzZSBX
QUlfRURJVEFCTEVfVEVYVDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0VESVRBQkxFX1RFWFQ7
CisgICAgY2FzZSBXQUlfVEVYVDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX1RFWFQ7CisgICAg
Y2FzZSBXQUlfQ09NUE9ORU5UOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfQ09NUE9ORU5UOwor
ICAgIGNhc2UgV0FJX0lNQUdFOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfSU1BR0U7CisgICAg
Y2FzZSBXQUlfVEFCTEU6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9UQUJMRTsKKyAgICBjYXNl
IFdBSV9IWVBFUlRFWFQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9IWVBFUlRFWFQ7CisgICAg
Y2FzZSBXQUlfSFlQRVJMSU5LOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfSFlQRVJMSU5LX0lN
UEw7CisgICAgY2FzZSBXQUlfRE9DVU1FTlQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9ET0NV
TUVOVDsKKyAgICB9CisKKyAgICByZXR1cm4gR19UWVBFX0lOVkFMSUQ7CiB9CiAKIHN0YXRpYyBn
dWludDE2IGdldEludGVyZmFjZU1hc2tGcm9tT2JqZWN0KEFjY2Vzc2liaWxpdHlPYmplY3QqIGNv
cmVPYmplY3QpCkBAIC0yMDM5LDIwICsyMTMzLDI1IEBAIHN0YXRpYyBndWludDE2IGdldEludGVy
ZmFjZU1hc2tGcm9tT2JqZWN0KEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QpCiAgICAg
Ly8gQ29tcG9uZW50IGludGVyZmFjZSBpcyBhbHdheXMgc3VwcG9ydGVkCiAgICAgaW50ZXJmYWNl
TWFzayB8PSAxIDw8IFdBSV9DT01QT05FTlQ7CiAKKyAgICBBY2Nlc3NpYmlsaXR5Um9sZSByb2xl
ID0gY29yZU9iamVjdC0+cm9sZVZhbHVlKCk7CisKICAgICAvLyBBY3Rpb24KLSAgICBpZiAoIWNv
cmVPYmplY3QtPmFjdGlvblZlcmIoKS5pc0VtcHR5KCkpCisgICAgaWYgKCFjb3JlT2JqZWN0LT5h
Y3Rpb25WZXJiKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBX
QUlfQUNUSU9OOwogCisgICAgICAgIC8vIEF2b2lkIHRhYmxlIGNlbGxzIGZyb20gYmVpbmcgZXhw
b3NlZCBhcyBoeXBlcmxpbmtzCisgICAgICAgIGlmIChyb2xlICE9IENlbGxSb2xlICYmIHJvbGUg
IT0gQ29sdW1uSGVhZGVyUm9sZSAmJiByb2xlICE9IFJvd0hlYWRlclJvbGUpCisgICAgICAgICAg
ICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0hZUEVSTElOSzsKKyAgICB9CisKICAgICAvLyBT
ZWxlY3Rpb24KICAgICBpZiAoY29yZU9iamVjdC0+aXNMaXN0Qm94KCkpCiAgICAgICAgIGludGVy
ZmFjZU1hc2sgfD0gMSA8PCBXQUlfU0VMRUNUSU9OOwogCiAgICAgLy8gVGV4dCAmIEVkaXRhYmxl
IFRleHQKLSAgICBBY2Nlc3NpYmlsaXR5Um9sZSByb2xlID0gY29yZU9iamVjdC0+cm9sZVZhbHVl
KCk7Ci0KICAgICBpZiAocm9sZSA9PSBTdGF0aWNUZXh0Um9sZSkKICAgICAgICAgaW50ZXJmYWNl
TWFzayB8PSAxIDw8IFdBSV9URVhUOwotICAgIGVsc2UgaWYgKGNvcmVPYmplY3QtPmlzQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdCgpKQorICAgIGVsc2UgaWYgKGNvcmVPYmplY3QtPmlzQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdCgpKSB7CiAgICAgICAgIGlmIChjb3JlT2JqZWN0LT5pc1RleHRD
b250cm9sKCkpIHsKICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfVEVYVDsK
ICAgICAgICAgICAgIGlmICghY29yZU9iamVjdC0+aXNSZWFkT25seSgpKQpAQCAtMjA2MCwxOCAr
MjE1OSwyNCBAQCBzdGF0aWMgZ3VpbnQxNiBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVjdChBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0KQogICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCogYXhSZW5kZXJPYmplY3QgPSBzdGF0aWNfY2Fz
dDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Kj4oY29yZU9iamVjdCk7CiAgICAgICAgICAgICBS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gYXhSZW5kZXJPYmplY3QtPnJlbmRlcmVyKCk7Ci0gICAg
ICAgICAgICBpZiAocm9sZSAhPSBUYWJsZVJvbGUgJiYgcmVuZGVyZXIgJiYgcmVuZGVyZXItPmNo
aWxkcmVuSW5saW5lKCkpCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdB
SV9URVhUOwotICAgICAgICAgICAgZWxzZSBpZiAocm9sZSA9PSBMaXN0SXRlbVJvbGUpIHsKLSAg
ICAgICAgICAgICAgICAvLyBBZGQgdGhlIFRFWFQgaW50ZXJmYWNlIGZvciBsaXN0IGl0ZW1zIHdo
b3NlCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGlsZCBoYXMgYSB0ZXh0
IHJlbmRlcmVyCisgICAgICAgICAgICBpZiAocm9sZSAhPSBUYWJsZVJvbGUpIHsKKyAgICAgICAg
ICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0hZUEVSVEVYVDsKKyAgICAgICAgICAg
ICAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmNoaWxkcmVuSW5saW5lKCkpCisgICAgICAg
ICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfVEVYVDsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gQWRkIHRoZSBURVhUIGludGVyZmFjZSBmb3IgbGlzdCBpdGVt
cyB3aG9zZQorICAgICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGlsZCBoYXMgYSB0ZXh0
IHJlbmRlcmVyCisgICAgICAgICAgICBpZiAocm9sZSA9PSBMaXN0SXRlbVJvbGUpIHsKICAgICAg
ICAgICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpBY2Nlc3NpYmlsaXR5Q2hpbGRyZW5WZWN0
b3IgY2hpbGRyZW4gPSBheFJlbmRlck9iamVjdC0+Y2hpbGRyZW4oKTsKICAgICAgICAgICAgICAg
ICBpZiAoY2hpbGRyZW4uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxp
dHlPYmplY3QqIGF4UmVuZGVyQ2hpbGQgPSBjaGlsZHJlbi5hdCgwKS5nZXQoKTsKICAgICAgICAg
ICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVjdChh
eFJlbmRlckNoaWxkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAg
ICAgfQorICAgIH0KIAogICAgIC8vIEltYWdlCiAgICAgaWYgKGNvcmVPYmplY3QtPmlzSW1hZ2Uo
KSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJs
ZUh5cGVybGluay5jcHAgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDhh
YWEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFj
Y2Vzc2libGVIeXBlcmxpbmsuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgiCisKKyNpZiBIQVZFKEFDQ0VTU0lCSUxJVFkpCisKKyNp
bmNsdWRlICJBWE9iamVjdENhY2hlLmgiCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXJBdGsuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBvc2l0
aW9uLmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKKwor
I2luY2x1ZGUgPGF0ay9hdGsuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKK3VzaW5nIG5hbWVzcGFj
ZSBXZWJDb3JlOworCisvLyBVc2UgdGhpcyBoYXNoIHRhYmxlIHRvIGhlbHAgcmV1c2luZyBpbnN0
YW5jZXMgb2YgdGhlCisvLyBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGNsYXNzIHRocm91Z2hv
dXQgdGhlCisvLyB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUgbWV0aG9kCitz
dGF0aWMgR0hhc2hUYWJsZSogaGFzaFRhYmxlID0gMDsKKworc3RhdGljIGdwb2ludGVyIHdlYmtp
dEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRDbGFzcyA9IDA7CisKK3N0YXRpYyBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjb3JlKEF0a0h5cGVybGlua0ltcGwqIGxpbmtJbXBsKQoreworICAgIGlmICgh
bGlua0ltcGwgfHwgIVdFQktJVF9JU19BQ0NFU1NJQkxFKGxpbmtJbXBsKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gd2Via2l0X2FjY2Vzc2libGVfZ2V0X2FjY2Vzc2liaWxpdHlf
b2JqZWN0KFdFQktJVF9BQ0NFU1NJQkxFKGxpbmtJbXBsKSk7Cit9CisKK3N0YXRpYyBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBjb3JlKFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxpbmspCit7Cisg
ICAgaWYgKCFsaW5rKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjb3JlKGxpbmst
PmxpbmtJbXBsKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrSHlw
ZXJsaW5rKiBsaW5rKQoreworICAgIGlmICghV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5L
KGxpbmspKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjb3JlKFdFQktJVF9BQ0NF
U1NJQkxFX0hZUEVSTElOSyhsaW5rKSk7Cit9CisKK3N0YXRpYyBnY2hhciogd2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0dldFVyaShBdGtIeXBlcmxpbmsqIGxpbmssIGdpbnQgaSkKK3sKKyAgICAv
LyBGSVhNRSBEbyBOT1Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIGFuIEF0a09i
amVjdAorICAgIC8vIGltcGxlbWVudGluZyBBdGtIeXBlcmxpbmtJbXBsIGluIGV2ZXJ5IGluc3Rh
bmNlIG9mIEF0a0h5cGVyTGluaworICAgIGlmIChpID4gMCkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZShsaW5rKTsKKyAgICBp
ZiAoY29yZU9iamVjdC0+dXJsKCkuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
cmV0dXJuIGdfc3RyZHVwKGNvcmVPYmplY3QtPnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkp
OworfQorCitzdGF0aWMgQXRrT2JqZWN0KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2Jq
ZWN0KEF0a0h5cGVybGluayogbGluaywgZ2ludCBpKQoreworICAgIC8vIEZJWE1FIERvIE5PVCBz
dXBwb3J0IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgYW4gQXRrT2JqZWN0CisgICAgLy8gaW1w
bGVtZW50aW5nIEF0a0h5cGVybGlua0ltcGwgaW4gZXZlcnkgaW5zdGFuY2Ugb2YgQXRrSHlwZXJM
aW5rCisgICAgaWYgKGkgPiAwIHx8ICFXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluaykt
PmxpbmtJbXBsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVEtfT0JKRUNUKFdF
QktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+bGlua0ltcGwpOworfQorCitzdGF0aWMg
Z2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0RW5kSW5kZXgoQXRrSHlwZXJsaW5rKiBs
aW5rKQoreworICAgIE5vZGUqIG5vZGUgPSBjb3JlKGxpbmspLT5ub2RlKCk7CisgICAgUmVmUHRy
PFJhbmdlPiByYW5nZSA9IFJhbmdlOjpjcmVhdGUobm9kZS0+ZG9jdW1lbnQoKSwgIGZpcnN0UG9z
aXRpb25Jbk5vZGUobm9kZS0+cGFyZW50Tm9kZSgpKSwgbGFzdFBvc2l0aW9uSW5Ob2RlKG5vZGUp
KTsKKyAgICByZXR1cm4gVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChyYW5nZS5nZXQoKSk7Cit9
CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRTdGFydEluZGV4KEF0
a0h5cGVybGluayogbGluaykKK3sKKyAgICBOb2RlKiBub2RlID0gY29yZShsaW5rKS0+bm9kZSgp
OworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKG5vZGUtPmRvY3VtZW50
KCksICBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5vZGUtPnBhcmVudE5vZGUoKSksIGZpcnN0UG9zaXRp
b25Jbk5vZGUobm9kZSkpOworICAgIHJldHVybiBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHJh
bmdlLmdldCgpKTsKK30KKworc3RhdGljIGdib29sZWFuIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxp
bmtJc1ZhbGlkKEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICAvLyBUaGUgbGluayB3aWxsIGJl
IGFsd2F5cyB2YWxpZCBmb3IgdGhpcyBvYmplY3QncyBsaWZldGltZQorICAgIHJldHVybiBUUlVF
OworfQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0TkFuY2hvcnMo
QXRrSHlwZXJsaW5rKiBsaW5rKQoreworICAgIC8vIEZJWE1FIERvIE5PVCBzdXBwb3J0IG1vcmUg
dGhhbiBvbmUgaW5zdGFuY2Ugb2YgYW4gQXRrT2JqZWN0CisgICAgLy8gaW1wbGVtZW50aW5nIEF0
a0h5cGVybGlua0ltcGwgaW4gZXZlcnkgaW5zdGFuY2Ugb2YgQXRrSHlwZXJMaW5rCisgICAgaWYg
KCFXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayktPmxpbmtJbXBsKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0lzU2VsZWN0ZWRMaW5rKEF0a0h5cGVybGluayogbGluaykKK3sKKyAg
ICAvLyBOb3QgaW1wbGVtZW50ZWQ6IHRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBpbiBBVEsg
bm93CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRp
YyB2b2lkIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbml0KEF0a0h5cGVybGluayogbGluaykK
K3sKKyAgICBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayktPmxpbmtJbXBsID0gMDsK
K30KKworc3RhdGljIHZvaWQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplKEdPYmpl
Y3QqIG9iamVjdCkKK3sKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rUGFyZW50Q2xhc3MpLT5maW5hbGl6ZShvYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3NJbml0KEF0a0h5cGVybGlua0NsYXNzKiBrbGFzcykK
K3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNz
KTsKKworICAgIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRDbGFzcyA9IGdfdHlwZV9j
bGFzc19wZWVrX3BhcmVudChrbGFzcyk7CisKKyAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0g
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplOworCisgICAga2xhc3MtPmdldF91cmkg
PSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VXJpOworICAgIGtsYXNzLT5nZXRfb2JqZWN0
ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE9iamVjdDsKKyAgICBrbGFzcy0+Z2V0X2Vu
ZF9pbmRleCA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRFbmRJbmRleDsKKyAgICBrbGFz
cy0+Z2V0X3N0YXJ0X2luZGV4ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFN0YXJ0SW5k
ZXg7CisgICAga2xhc3MtPmlzX3ZhbGlkID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lzVmFs
aWQ7CisgICAga2xhc3MtPmdldF9uX2FuY2hvcnMgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
R2V0TkFuY2hvcnM7CisgICAga2xhc3MtPmlzX3NlbGVjdGVkX2xpbmsgPSB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rSXNTZWxlY3RlZExpbms7Cit9CisKK0dUeXBlCit3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rR2V0VHlwZSh2b2lkKQoreworICAgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSB0eXBl
Vm9sYXRpbGUgPSAwOworCisgICAgaWYgKGdfb25jZV9pbml0X2VudGVyKCZ0eXBlVm9sYXRpbGUp
KSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdGluZm8gPSB7CisgICAgICAgICAg
ICBzaXplb2YoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua0NsYXNzKSwKKyAgICAgICAgICAgIChH
QmFzZUluaXRGdW5jKSAwLAorICAgICAgICAgICAgKEdCYXNlRmluYWxpemVGdW5jKSAwLAorICAg
ICAgICAgICAgKEdDbGFzc0luaXRGdW5jKSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3NJ
bml0LAorICAgICAgICAgICAgKEdDbGFzc0ZpbmFsaXplRnVuYykgMCwKKyAgICAgICAgICAgIDAs
IC8qIGNsYXNzIGRhdGEgKi8KKyAgICAgICAgICAgIHNpemVvZihXZWJLaXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rKSwgLyogaW5zdGFuY2Ugc2l6ZSAqLworICAgICAgICAgICAgMCwgLyogbmIgcHJlYWxs
b2NzICovCisgICAgICAgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtJbml0LAorICAgICAgICAgICAgMCAvKiB2YWx1ZSB0YWJsZSAqLworICAgICAgICB9
OworCisgICAgICAgIEdUeXBlIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljKEFUS19UWVBF
X0hZUEVSTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IldlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsiLCAmdGluZm8sIEdUeXBlRmxhZ3MoMCkpOworCisg
ICAgICAgIGdfb25jZV9pbml0X2xlYXZlKCZ0eXBlVm9sYXRpbGUsIHR5cGUpOworICAgIH0KKwor
ICAgIHJldHVybiB0eXBlVm9sYXRpbGU7Cit9CisKK3N0YXRpYyB2b2lkIGh5cGVybGlua0ltcGxG
aW5hbGl6ZWQoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGluaywgQXRrSHlwZXJsaW5rSW1w
bCogbGlua0ltcGwpCit7CisgICAgLy8gT2JqZWN0IG5vIGxvbmdlciBhbGl2ZSwgcmVtb3ZlIGl0
IGZyb20gdGhlIGhhc2ggdGFibGUgYW5kCisgICAgLy8gZGVzdHJveSB0aGUgQXRrSHlwZXJsaW5r
IG9iamVjdAorICAgIEFTU0VSVChoYXNoVGFibGUpOworICAgIGdfaGFzaF90YWJsZV9yZW1vdmUo
aGFzaFRhYmxlLCAodm9pZCopbGlua0ltcGwpOworICAgIGdfb2JqZWN0X3VucmVmKGxpbmspOwor
fQorCitXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
R2V0T3JDcmVhdGUoQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGwpCit7CisgICAgaWYgKCFsaW5r
SW1wbCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIGZv
ciB0aGUgaGFzaCB0YWJsZQorICAgIGlmICghaGFzaFRhYmxlKQorICAgICAgICBoYXNoVGFibGUg
PSBnX2hhc2hfdGFibGVfbmV3KGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsKTsKKworICAg
IFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxpbmsgPSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBF
UkxJTksoZ19oYXNoX3RhYmxlX2xvb2t1cChoYXNoVGFibGUsIChjb25zdCB2b2lkKilsaW5rSW1w
bCkpOworICAgIGlmICghbGluaykgeworICAgICAgICBsaW5rID0gc3RhdGljX2Nhc3Q8V2ViS2l0
QWNjZXNzaWJsZUh5cGVybGluayo+KGdfb2JqZWN0X25ldyhXRUJLSVRfVFlQRV9BQ0NFU1NJQkxF
X0hZUEVSTElOSywgMCkpOworICAgICAgICBsaW5rLT5saW5rSW1wbCA9IGxpbmtJbXBsOworCisg
ICAgICAgIGdfb2JqZWN0X3dlYWtfcmVmKEdfT0JKRUNUKGxpbmtJbXBsKSwgKEdXZWFrTm90aWZ5
KWh5cGVybGlua0ltcGxGaW5hbGl6ZWQsIGxpbmspOworICAgICAgICBnX2hhc2hfdGFibGVfaW5z
ZXJ0KGhhc2hUYWJsZSwgKHZvaWQqKWxpbmtJbXBsLCBsaW5rKTsKKyAgICB9CisKKyAgICByZXR1
cm4gbGluazsKK30KKworV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdCogd2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0dldEFjY2Vzc2liaWxpdHlPYmplY3QoV2ViS2l0QWNjZXNzaWJsZUh5cGVy
bGluayogbGluaykKK3sKKyAgICBpZiAoIWxpbmstPmxpbmtJbXBsKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIHJldHVybiBjb3JlKGxpbmspOworfQorCisjZW5kaWYgLy8gSEFWRShBQ0NFU1NJ
QklMSVRZKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rLmggYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vz
c2libGVIeXBlcmxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhl
Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtfaAor
I2RlZmluZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rX2gKKworI2luY2x1ZGUgPGF0ay9hdGsu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQWNjZXNzaWJpbGl0eU9iamVjdDsKK30K
KworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJM
SU5LICAgICAgICAgICAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRUeXBlICgp
KQorI2RlZmluZSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksob2JqKSAgICAgICAgICAgICAg
ICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFdFQktJVF9UWVBFX0FDQ0VT
U0lCTEVfSFlQRVJMSU5LLCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKSkKKyNkZWZpbmUgV0VC
S0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0NMQVNTKGtsYXNzKSAgICAgICAgICAoR19UWVBFX0NI
RUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJMSU5L
LCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MpKQorI2RlZmluZSBXRUJLSVRfSVNfQUND
RVNTSUJMRV9IWVBFUkxJTksob2JqKSAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFO
Q0VfVFlQRSAoKG9iaiksIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKSkKKyNkZWZp
bmUgV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0NMQVNTKGtsYXNzKSAgICAgICAoR19U
WVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQ
RVJMSU5LKSkKKyNkZWZpbmUgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0dFVF9DTEFTUyhv
YmopICAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFdFQktJVF9UWVBF
X0FDQ0VTU0lCTEVfSFlQRVJMSU5LLCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MpKQor
Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayAgICAgICAgICAgICAg
ICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rOwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdEFjY2Vz
c2libGVIeXBlcmxpbmtDbGFzcyAgICAgICAgICAgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua0Ns
YXNzOworCitzdHJ1Y3QgX1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgeworICAgIEF0a0h5cGVy
bGluayBwYXJlbnQ7CisgICAgQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGw7Cit9OworCitzdHJ1
Y3QgX1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcyB7CisgICAgQXRrT2JqZWN0Q2xhc3Mg
cGFyZW50Q2xhc3M7Cit9OworCitHVHlwZSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VHlw
ZSh2b2lkKSBHX0dOVUNfQ09OU1Q7CisKK1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIHdlYmtp
dEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNyZWF0ZShBdGtIeXBlcmxpbmtJbXBsKiBsaW5rSW1w
bCk7CisKK1dlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3QqIHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxp
bmspOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLy8gV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlu
a19oCi0tIAoxLjcuMC40Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70236</attachid>
            <date>2010-10-08 06:12:51 -0700</date>
            <delta_ts>2010-10-20 09:44:21 -0700</delta_ts>
            <desc>WIP: Patch proposal (unit test pending)</desc>
            <filename>0001-Implementing-the-AtkHypertext-AtkHyperlink-stuff-in-.patch</filename>
            <type>text/plain</type>
            <size>32010</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAyZWNmM2NlNmFlNjVkM2U5ZDhjMDdkZDk2YmEyNWE1ZmVhNTliMTUzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDI3IFNlcCAyMDEwIDE5OjI4OjU4ICswMjAwClN1YmplY3Q6IFtQQVRD
SCAxLzJdIEltcGxlbWVudGluZyB0aGUgQXRrSHlwZXJ0ZXh0L0F0a0h5cGVybGluayBzdHVmZiBp
biB0aGUgR1RLIHBvcnQKCi0tLQogV2ViQ29yZS9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfCAgICA2ICsKIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHwgICAgMiArCiAuLi4vZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RX
cmFwcGVyQXRrLmNwcCAgICAgICAgICB8ICAxNjYgKysrKysrKy0tCiAuLi4vZ3RrL1dlYktpdEFj
Y2Vzc2libGVIeXBlcmxpbmsuY3BwICAgICAgICAgICAgICB8ICAzODAgKysrKysrKysrKysrKysr
KysrKysKIC4uLi9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgg
IHwgICA1OCArKysKIFdlYktpdC9ndGsvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAgNiArCiBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYyAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgNzMgKysrKwogNyBmaWxlcyBjaGFuZ2VkLCA2NjAgaW5zZXJ0aW9ucygr
KSwgMzEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0
IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAy
MzMxODMyLi4zNTY1MDRhIDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJD
b3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkgQEAKKzIwMTAtMTAtMDggIE1hcmlvIFNhbmNoZXog
UHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEltcGxlbWVudGluZyB0aGUgQXRrSHlwZXJ0ZXh0L0F0a0h5
cGVybGluayBzdHVmZiBpbiB0aGUgR1RLIHBvcnQKKwogMjAxMC0wOS0zMCAgSm9jaGVuIEVpc2lu
Z2VyICA8am9jaGVuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKZXJlbXkg
T3Jsb3cuCmRpZmYgLS1naXQgYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvV2ViQ29yZS9HTlVt
YWtlZmlsZS5hbQppbmRleCBjNDkzYzIzLi5iZDAxODJmIDEwMDY0NAotLS0gYS9XZWJDb3JlL0dO
VW1ha2VmaWxlLmFtCisrKyBiL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTM0MTMsNiArMzQx
Myw4IEBAIHdlYmNvcmVndGtfc291cmNlcyArPSBcCiAJV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0
ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAgXAogCVdlYkNvcmUvYWNjZXNzaWJp
bGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuaCBcCiAJV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L2d0ay9BWE9iamVjdENhY2hlQXRrLmNwcCBcCisJV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmggXAorCVdlYkNvcmUvYWNjZXNzaWJp
bGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAgXAogCVdlYkNvcmUvYmluZGlu
Z3MvanMvU2NyaXB0Q29udHJvbGxlckd0ay5jcHAgXAogCVdlYkNvcmUvcGFnZS9ndGsvRHJhZ0Nv
bnRyb2xsZXJHdGsuY3BwIFwKIAlXZWJDb3JlL3BhZ2UvZ3RrL0V2ZW50SGFuZGxlckd0ay5jcHAg
XApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2Jq
ZWN0V3JhcHBlckF0ay5jcHAgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxp
dHlPYmplY3RXcmFwcGVyQXRrLmNwcAppbmRleCBjOWQxM2NjLi4xMTgyZjZkIDEwMDY0NAotLS0g
YS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRr
LmNwcAorKysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RX
cmFwcGVyQXRrLmNwcApAQCAtNjAsMTQgKzYwLDE1IEBACiAjaW5jbHVkZSAiUmVuZGVyVGV4dC5o
IgogI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgogI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgot
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNT
dHJpbmcuaD4KKyNpbmNsdWRlICJXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgiCiAKICNpbmNs
dWRlIDxhdGsvYXRrLmg+CiAjaW5jbHVkZSA8Z2xpYi5oPgogI2luY2x1ZGUgPGdsaWIvZ3ByaW50
Zi5oPgogI2luY2x1ZGUgPGxpYmdhaWwtdXRpbC9nYWlsLXV0aWwuaD4KICNpbmNsdWRlIDxwYW5n
by9wYW5nby5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZy5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTE0
Myw2ICsxNDQsMTEgQEAgc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrVGFibGUq
IHRhYmxlKQogICAgIHJldHVybiBjb3JlKEFUS19PQkpFQ1QodGFibGUpKTsKIH0KIAorc3RhdGlj
IEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrSHlwZXJ0ZXh0KiBoeXBlcnRleHQpCit7Cisg
ICAgcmV0dXJuIGNvcmUoQVRLX09CSkVDVChoeXBlcnRleHQpKTsKK30KKwogc3RhdGljIEFjY2Vz
c2liaWxpdHlPYmplY3QqIGNvcmUoQXRrRG9jdW1lbnQqIGRvY3VtZW50KQogewogICAgIHJldHVy
biBjb3JlKEFUS19PQkpFQ1QoZG9jdW1lbnQpKTsKQEAgLTE5MjIsNiArMTkyOCw4NCBAQCBzdGF0
aWMgdm9pZCBhdGtfdGFibGVfaW50ZXJmYWNlX2luaXQoQXRrVGFibGVJZmFjZSogaWZhY2UpCiAg
ICAgaWZhY2UtPmdldF9yb3dfZGVzY3JpcHRpb24gPSB3ZWJraXRfYWNjZXNzaWJsZV90YWJsZV9n
ZXRfcm93X2Rlc2NyaXB0aW9uOwogfQogCitzdGF0aWMgQXRrSHlwZXJsaW5rKiB3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJ0ZXh0R2V0TGluayhBdGtIeXBlcnRleHQqIGh5cGVydGV4dCwgZ2ludCBpbmRl
eCkKK3sKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZShoeXBlcnRl
eHQpOworICAgIEFjY2Vzc2liaWxpdHlPYmplY3Q6OkFjY2Vzc2liaWxpdHlDaGlsZHJlblZlY3Rv
ciBjaGlsZHJlbiA9IGNvcmVPYmplY3QtPmNoaWxkcmVuKCk7CisgICAgaWYgKGluZGV4IDwgMCB8
fCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oaW5kZXgpID49IGNoaWxkcmVuLnNpemUoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBnaW50IGN1cnJlbnRMaW5rID0gLTE7CisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFjY2Vzc2li
aWxpdHlPYmplY3QqIGNvcmVDaGlsZCA9IGNoaWxkcmVuLmF0KGkpLmdldCgpOworICAgICAgICBp
ZiAoIWNvcmVDaGlsZC0+YWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpICYmIGNvcmVDaGlsZC0+aXNM
aW5rKCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnRMaW5rKys7CisgICAgICAgICAgICBpZiAoaW5k
ZXggIT0gY3VycmVudExpbmspCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgIEF0a09iamVjdCogYXhPYmplY3QgPSBjb3JlQ2hpbGQtPndyYXBwZXIoKTsKKyAgICAgICAg
ICAgIGlmICghYXhPYmplY3QgfHwgIUFUS19JU19IWVBFUkxJTktfSU1QTChheE9iamVjdCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHJldHVybiBhdGtfaHlwZXJs
aW5rX2ltcGxfZ2V0X2h5cGVybGluayhBVEtfSFlQRVJMSU5LX0lNUEwoYXhPYmplY3QpKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZ2ludCB3ZWJraXRB
Y2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TkxpbmtzKEF0a0h5cGVydGV4dCogaHlwZXJ0ZXh0KQorewor
ICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGh5cGVydGV4dCk7Cisg
ICAgQWNjZXNzaWJpbGl0eU9iamVjdDo6QWNjZXNzaWJpbGl0eUNoaWxkcmVuVmVjdG9yIGNoaWxk
cmVuID0gY29yZU9iamVjdC0+Y2hpbGRyZW4oKTsKKworICAgIGdpbnQgbGlua3NGb3VuZCA9IDA7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Cisg
ICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVDaGlsZCA9IGNoaWxkcmVuLmF0KGkpLmdl
dCgpOworICAgICAgICBpZiAoIWNvcmVDaGlsZC0+YWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpICYm
IGNvcmVDaGlsZC0+aXNMaW5rKCkpCisgICAgICAgICAgICBsaW5rc0ZvdW5kKys7CisgICAgfQor
CisgICAgcmV0dXJuIGxpbmtzRm91bmQ7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2li
bGVIeXBlcnRleHRHZXRMaW5rSW5kZXgoQXRrSHlwZXJ0ZXh0KiBoeXBlcnRleHQsIGdpbnQgY2hh
ckluZGV4KQoreworICAgIGdpbnQgbkxpbmtzID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdl
dE5MaW5rcyhoeXBlcnRleHQpOworICAgIGlmICghbkxpbmtzKQorICAgICAgICByZXR1cm4gLTE7
CisKKyAgICBmb3IgKGdpbnQgaSA9IDA7IGkgPCBuTGlua3M7IGkrKykgeworICAgICAgICBBdGtI
eXBlcmxpbmsqIGh5cGVybGluayA9IEFUS19IWVBFUkxJTksod2Via2l0QWNjZXNzaWJsZUh5cGVy
dGV4dEdldExpbmsoaHlwZXJ0ZXh0LCBpKSk7CisgICAgICAgIGdpbnQgc3RhcnRJbmRleCA9IGF0
a19oeXBlcmxpbmtfZ2V0X3N0YXJ0X2luZGV4KGh5cGVybGluayk7CisgICAgICAgIGdpbnQgZW5k
SW5kZXggPSBhdGtfaHlwZXJsaW5rX2dldF9lbmRfaW5kZXgoaHlwZXJsaW5rKTsKKworICAgICAg
ICAvLyBDaGVjayBpZiB0aGUgY2hhciBpbmRleCBpbiB0aGUgbGluaydzIG9mZnNldCByYW5nZQor
ICAgICAgICBpZiAoc3RhcnRJbmRleCA8PSBjaGFySW5kZXggJiYgY2hhckluZGV4IDwgZW5kSW5k
ZXgpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICAvLyBOb3QgZm91bmQgaWYg
cmVhY2hlZAorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYXRrSHlwZXJ0ZXh0SW50
ZXJmYWNlSW5pdChBdGtIeXBlcnRleHRJZmFjZSogaWZhY2UpCit7CisgICAgaWZhY2UtPmdldF9s
aW5rID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldExpbms7CisgICAgaWZhY2UtPmdldF9u
X2xpbmtzID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldE5MaW5rczsKKyAgICBpZmFjZS0+
Z2V0X2xpbmtfaW5kZXggPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGlua0luZGV4Owor
fQorCitzdGF0aWMgQXRrSHlwZXJsaW5rKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW1wbEdl
dEh5cGVybGluayhBdGtIeXBlcmxpbmtJbXBsKiBoeXBlcmxpbmspCit7CisgICAgcmV0dXJuIEFU
S19IWVBFUkxJTksod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE9yQ3JlYXRlKGh5cGVybGlu
aykpOworfQorCitzdGF0aWMgdm9pZCBhdGtIeXBlcmxpbmtJbXBsSW50ZXJmYWNlSW5pdChBdGtI
eXBlcmxpbmtJbXBsSWZhY2UqIGlmYWNlKQoreworICAgIGlmYWNlLT5nZXRfaHlwZXJsaW5rID0g
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ltcGxHZXRIeXBlcmxpbms7Cit9CisKIHN0YXRpYyBj
b25zdCBnY2hhciogZG9jdW1lbnRBdHRyaWJ1dGVWYWx1ZShBdGtEb2N1bWVudCogZG9jdW1lbnQs
IGNvbnN0IGdjaGFyKiBhdHRyaWJ1dGUpCiB7CiAgICAgRG9jdW1lbnQqIGNvcmVEb2N1bWVudCA9
IGNvcmUoZG9jdW1lbnQpLT5kb2N1bWVudCgpOwpAQCAtMTk5Myw2ICsyMDc3LDEwIEBAIHN0YXRp
YyBjb25zdCBHSW50ZXJmYWNlSW5mbyBBdGtJbnRlcmZhY2VzSW5pdEZ1bmN0aW9uc1tdID0gewog
ICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCiAgICAgeyhHSW50ZXJmYWNlSW5p
dEZ1bmMpYXRrX3RhYmxlX2ludGVyZmFjZV9pbml0LAogICAgICAoR0ludGVyZmFjZUZpbmFsaXpl
RnVuYykgMCwgMH0sCisgICAgeyhHSW50ZXJmYWNlSW5pdEZ1bmMpYXRrSHlwZXJ0ZXh0SW50ZXJm
YWNlSW5pdCwKKyAgICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpIDAsIDB9LAorICAgIHsoR0lu
dGVyZmFjZUluaXRGdW5jKWF0a0h5cGVybGlua0ltcGxJbnRlcmZhY2VJbml0LAorICAgICAoR0lu
dGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCiAgICAgeyhHSW50ZXJmYWNlSW5pdEZ1bmMpYXRr
X2RvY3VtZW50X2ludGVyZmFjZV9pbml0LAogICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykg
MCwgMH0KIH07CkBAIC0yMDA1LDMxICsyMDkzLDM3IEBAIGVudW0gV0FJVHlwZSB7CiAgICAgV0FJ
X0NPTVBPTkVOVCwKICAgICBXQUlfSU1BR0UsCiAgICAgV0FJX1RBQkxFLAorICAgIFdBSV9IWVBF
UlRFWFQsCisgICAgV0FJX0hZUEVSTElOSywKICAgICBXQUlfRE9DVU1FTlQKIH07CiAKIHN0YXRp
YyBHVHlwZSBHZXRBdGtJbnRlcmZhY2VUeXBlRnJvbVdBSVR5cGUoV0FJVHlwZSB0eXBlKQogewot
ICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBXQUlfQUNUSU9OOgotICAgICAgcmV0dXJuIEFUS19U
WVBFX0FDVElPTjsKLSAgY2FzZSBXQUlfU0VMRUNUSU9OOgotICAgICAgcmV0dXJuIEFUS19UWVBF
X1NFTEVDVElPTjsKLSAgY2FzZSBXQUlfRURJVEFCTEVfVEVYVDoKLSAgICAgIHJldHVybiBBVEtf
VFlQRV9FRElUQUJMRV9URVhUOwotICBjYXNlIFdBSV9URVhUOgotICAgICAgcmV0dXJuIEFUS19U
WVBFX1RFWFQ7Ci0gIGNhc2UgV0FJX0NPTVBPTkVOVDoKLSAgICAgIHJldHVybiBBVEtfVFlQRV9D
T01QT05FTlQ7Ci0gIGNhc2UgV0FJX0lNQUdFOgotICAgICAgcmV0dXJuIEFUS19UWVBFX0lNQUdF
OwotICBjYXNlIFdBSV9UQUJMRToKLSAgICAgIHJldHVybiBBVEtfVFlQRV9UQUJMRTsKLSAgY2Fz
ZSBXQUlfRE9DVU1FTlQ6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfRE9DVU1FTlQ7Ci0gIH0KLQot
ICByZXR1cm4gR19UWVBFX0lOVkFMSUQ7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBX
QUlfQUNUSU9OOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfQUNUSU9OOworICAgIGNhc2UgV0FJ
X1NFTEVDVElPTjoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX1NFTEVDVElPTjsKKyAgICBjYXNl
IFdBSV9FRElUQUJMRV9URVhUOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfRURJVEFCTEVfVEVY
VDsKKyAgICBjYXNlIFdBSV9URVhUOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfVEVYVDsKKyAg
ICBjYXNlIFdBSV9DT01QT05FTlQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9DT01QT05FTlQ7
CisgICAgY2FzZSBXQUlfSU1BR0U6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9JTUFHRTsKKyAg
ICBjYXNlIFdBSV9UQUJMRToKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX1RBQkxFOworICAgIGNh
c2UgV0FJX0hZUEVSVEVYVDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0hZUEVSVEVYVDsKKyAg
ICBjYXNlIFdBSV9IWVBFUkxJTks6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9IWVBFUkxJTktf
SU1QTDsKKyAgICBjYXNlIFdBSV9ET0NVTUVOVDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0RP
Q1VNRU5UOworICAgIH0KKworICAgIHJldHVybiBHX1RZUEVfSU5WQUxJRDsKIH0KIAogc3RhdGlj
IGd1aW50MTYgZ2V0SW50ZXJmYWNlTWFza0Zyb21PYmplY3QoQWNjZXNzaWJpbGl0eU9iamVjdCog
Y29yZU9iamVjdCkKQEAgLTIwMzksMjAgKzIxMzMsMjQgQEAgc3RhdGljIGd1aW50MTYgZ2V0SW50
ZXJmYWNlTWFza0Zyb21PYmplY3QoQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCkKICAg
ICAvLyBDb21wb25lbnQgaW50ZXJmYWNlIGlzIGFsd2F5cyBzdXBwb3J0ZWQKICAgICBpbnRlcmZh
Y2VNYXNrIHw9IDEgPDwgV0FJX0NPTVBPTkVOVDsKIAorICAgIEFjY2Vzc2liaWxpdHlSb2xlIHJv
bGUgPSBjb3JlT2JqZWN0LT5yb2xlVmFsdWUoKTsKKwogICAgIC8vIEFjdGlvbgotICAgIGlmICgh
Y29yZU9iamVjdC0+YWN0aW9uVmVyYigpLmlzRW1wdHkoKSkKKyAgICBpZiAoIWNvcmVPYmplY3Qt
PmFjdGlvblZlcmIoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8
IFdBSV9BQ1RJT047CiAKKyAgICAgICAgaWYgKCFjb3JlT2JqZWN0LT5hY2Nlc3NpYmlsaXR5SXNJ
Z25vcmVkKCkgJiYgY29yZU9iamVjdC0+aXNMaW5rKCkpCisgICAgICAgICAgICBpbnRlcmZhY2VN
YXNrIHw9IDEgPDwgV0FJX0hZUEVSTElOSzsKKyAgICB9CisKICAgICAvLyBTZWxlY3Rpb24KICAg
ICBpZiAoY29yZU9iamVjdC0+aXNMaXN0Qm94KCkpCiAgICAgICAgIGludGVyZmFjZU1hc2sgfD0g
MSA8PCBXQUlfU0VMRUNUSU9OOwogCiAgICAgLy8gVGV4dCAmIEVkaXRhYmxlIFRleHQKLSAgICBB
Y2Nlc3NpYmlsaXR5Um9sZSByb2xlID0gY29yZU9iamVjdC0+cm9sZVZhbHVlKCk7Ci0KICAgICBp
ZiAocm9sZSA9PSBTdGF0aWNUZXh0Um9sZSkKICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8
IFdBSV9URVhUOwotICAgIGVsc2UgaWYgKGNvcmVPYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdCgpKQorICAgIGVsc2UgaWYgKGNvcmVPYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdCgpKSB7CiAgICAgICAgIGlmIChjb3JlT2JqZWN0LT5pc1RleHRDb250cm9sKCkpIHsK
ICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfVEVYVDsKICAgICAgICAgICAg
IGlmICghY29yZU9iamVjdC0+aXNSZWFkT25seSgpKQpAQCAtMjA2MCwxOCArMjE1OCwyNCBAQCBz
dGF0aWMgZ3VpbnQxNiBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVjdChBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBjb3JlT2JqZWN0KQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdCogYXhSZW5kZXJPYmplY3QgPSBzdGF0aWNfY2FzdDxBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0Kj4oY29yZU9iamVjdCk7CiAgICAgICAgICAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gYXhSZW5kZXJPYmplY3QtPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBpZiAo
cm9sZSAhPSBUYWJsZVJvbGUgJiYgcmVuZGVyZXIgJiYgcmVuZGVyZXItPmNoaWxkcmVuSW5saW5l
KCkpCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9URVhUOwotICAg
ICAgICAgICAgZWxzZSBpZiAocm9sZSA9PSBMaXN0SXRlbVJvbGUpIHsKLSAgICAgICAgICAgICAg
ICAvLyBBZGQgdGhlIFRFWFQgaW50ZXJmYWNlIGZvciBsaXN0IGl0ZW1zIHdob3NlCi0gICAgICAg
ICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGlsZCBoYXMgYSB0ZXh0IHJlbmRlcmVyCisg
ICAgICAgICAgICBpZiAocm9sZSAhPSBUYWJsZVJvbGUpIHsKKyAgICAgICAgICAgICAgICBpbnRl
cmZhY2VNYXNrIHw9IDEgPDwgV0FJX0hZUEVSVEVYVDsKKyAgICAgICAgICAgICAgICBpZiAocmVu
ZGVyZXIgJiYgcmVuZGVyZXItPmNoaWxkcmVuSW5saW5lKCkpCisgICAgICAgICAgICAgICAgICAg
IGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfVEVYVDsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gQWRkIHRoZSBURVhUIGludGVyZmFjZSBmb3IgbGlzdCBpdGVtcyB3aG9zZQorICAg
ICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGlsZCBoYXMgYSB0ZXh0IHJlbmRlcmVyCisg
ICAgICAgICAgICBpZiAocm9sZSA9PSBMaXN0SXRlbVJvbGUpIHsKICAgICAgICAgICAgICAgICBB
Y2Nlc3NpYmlsaXR5T2JqZWN0OjpBY2Nlc3NpYmlsaXR5Q2hpbGRyZW5WZWN0b3IgY2hpbGRyZW4g
PSBheFJlbmRlck9iamVjdC0+Y2hpbGRyZW4oKTsKICAgICAgICAgICAgICAgICBpZiAoY2hpbGRy
ZW4uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4
UmVuZGVyQ2hpbGQgPSBjaGlsZHJlbi5hdCgwKS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAg
aW50ZXJmYWNlTWFzayB8PSBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVjdChheFJlbmRlckNoaWxk
KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAgICAgfQorICAgIH0K
IAogICAgIC8vIEltYWdlCiAgICAgaWYgKGNvcmVPYmplY3QtPmlzSW1hZ2UoKSkKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5j
cHAgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzY3ZDkKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBl
cmxpbmsuY3BwCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEln
YWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJLaXRBY2Nlc3NpYmxl
SHlwZXJsaW5rLmgiCisKKyNpZiBIQVZFKEFDQ0VTU0lCSUxJVFkpCisKKyNpbmNsdWRlICJBWE9i
amVjdENhY2hlLmgiCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU9iamVjdC5oIgorI2luY2x1ZGUg
IkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmgiCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0
eVJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAi
UG9zaXRpb24uaCIKKyNpbmNsdWRlICJSYW5nZS5oIgorI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJr
ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3Iu
aCIKKworI2luY2x1ZGUgPGF0ay9hdGsuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOworCisvLyBVc2UgdGhpcyBoYXNoIHRhYmxlIHRvIGhlbHAgcmV1c2lu
ZyBpbnN0YW5jZXMgb2YgdGhlCisvLyBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGNsYXNzIHRo
cm91Z2hvdXQgdGhlCisvLyB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUgbWV0
aG9kCitzdGF0aWMgR0hhc2hUYWJsZSogaGFzaFRhYmxlID0gMDsKKworc3RhdGljIGdwb2ludGVy
IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRDbGFzcyA9IDA7CisKKy8vIFVzZWQgdG8g
cHJvdmlkZSBjb25zdCBjaGFyKiByZXR1cm5zLgorc3RhdGljIGNvbnN0IGNoYXIqIHJldHVyblN0
cmluZyhjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBzdGF0aWMgQ1N0cmluZyByZXR1cm5lZFN0
cmluZzsKKyAgICByZXR1cm5lZFN0cmluZyA9IHN0ci51dGY4KCk7CisgICAgcmV0dXJuIHJldHVy
bmVkU3RyaW5nLmRhdGEoKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUo
QXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGwpCit7CisgICAgaWYgKCFsaW5rSW1wbCB8fCAhV0VC
S0lUX0lTX0FDQ0VTU0lCTEUobGlua0ltcGwpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJl
dHVybiB3ZWJraXRfYWNjZXNzaWJsZV9nZXRfYWNjZXNzaWJpbGl0eV9vYmplY3QoV0VCS0lUX0FD
Q0VTU0lCTEUobGlua0ltcGwpKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNv
cmUoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGluaykKK3sKKyAgICBpZiAoIWxpbmspCisg
ICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNvcmUobGluay0+bGlua0ltcGwpOworfQor
CitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtIeXBlcmxpbmsqIGxpbmspCit7
CisgICAgaWYgKCFXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluaykpCisgICAgICAg
IHJldHVybiAwOworCisgICAgcmV0dXJuIGNvcmUoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5L
KGxpbmspKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrT2JqZWN0
KiBvYmplY3QpCit7CisgICAgaWYgKCFXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksob2Jq
ZWN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY29yZShXRUJLSVRfQUNDRVNT
SUJMRV9IWVBFUkxJTksob2JqZWN0KSk7Cit9CisKK3N0YXRpYyBBY2Nlc3NpYmlsaXR5T2JqZWN0
KiBjb3JlKEF0a0FjdGlvbiogYWN0aW9uKQoreworICAgIHJldHVybiBjb3JlKEFUS19PQkpFQ1Qo
YWN0aW9uKSk7Cit9CisKKworc3RhdGljIGdib29sZWFuIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxp
bmtBY3Rpb25Eb0FjdGlvbihBdGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sKKyAgICBn
X3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9u
KSwgRkFMU0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZ
UEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCwgRkFMU0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9m
YWlsKCFpbmRleCwgRkFMU0UpOworCisgICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NF
U1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiBGQUxT
RTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGFjdGlvbik7
CisgICAgaWYgKCFjb3JlT2JqZWN0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1
cm4gY29yZU9iamVjdC0+cGVyZm9ybURlZmF1bHRBY3Rpb24oKTsKK30KKworc3RhdGljIGdpbnQg
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5BY3Rpb25zKEF0a0FjdGlvbiogYWN0
aW9uKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZ
UEVSTElOSyhhY3Rpb24pLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfQUND
RVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0ltcGwsIDApOworCisgICAgaWYgKCFBVEtf
SVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBn
Y2hhciogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldERlc2NyaXB0aW9uKEF0a0Fj
dGlvbiogYWN0aW9uLCBnaW50IGluZGV4KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdF
QktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLCAwKTsKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0ltcGws
IDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgMCk7CisKKyAgICAvLyBUT0RP
OiBOZWVkIGEgd2F5IHRvIHByb3ZpZGUvbG9jYWxpemUgYWN0aW9uIGRlc2NyaXB0aW9ucy4KKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGdj
aGFyKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZyhBdGtBY3Rp
b24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJL
SVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKSwgMCk7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiktPmxpbmtJbXBsLCAw
KTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisgICAgaWYgKCFBVEtf
SVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkp
CisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVP
YmplY3QgPSBjb3JlKGFjdGlvbik7CisgICAgaWYgKCFjb3JlT2JqZWN0KQorICAgICAgICByZXR1
cm4gRkFMU0U7CisKKyAgICByZXR1cm4gcmV0dXJuU3RyaW5nKGNvcmVPYmplY3QtPmFjY2Vzc0tl
eSgpLnN0cmluZygpKTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyKiB3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rQWN0aW9uR2V0TmFtZShBdGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTkso
YWN0aW9uKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVf
SFlQRVJMSU5LKGFjdGlvbiktPmxpbmtJbXBsLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bCghaW5kZXgsIDApOworCisgICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxF
X0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKwor
ICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGFjdGlvbik7CisgICAg
aWYgKCFjb3JlT2JqZWN0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gcmV0
dXJuU3RyaW5nKGNvcmVPYmplY3QtPmFjdGlvblZlcmIoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0
a0FjdGlvbkludGVyZmFjZUluaXQoQXRrQWN0aW9uSWZhY2UqIGlmYWNlKQoreworICAgIGlmYWNl
LT5kb19hY3Rpb24gPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uRG9BY3Rpb247Cisg
ICAgaWZhY2UtPmdldF9uX2FjdGlvbnMgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9u
R2V0TkFjdGlvbnM7CisgICAgaWZhY2UtPmdldF9kZXNjcmlwdGlvbiA9IHdlYmtpdEFjY2Vzc2li
bGVIeXBlcmxpbmtBY3Rpb25HZXREZXNjcmlwdGlvbjsKKyAgICBpZmFjZS0+Z2V0X2tleWJpbmRp
bmcgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZzsKKyAgICBp
ZmFjZS0+Z2V0X25hbWUgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TmFtZTsK
K30KKworc3RhdGljIGdjaGFyKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VXJpKEF0a0h5
cGVybGluayogbGluaywgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChX
RUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOworICAgIC8vIEZJWE1FIERv
IE5PVCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgYW4gQXRrT2JqZWN0CisgICAg
Ly8gaW1wbGVtZW50aW5nIEF0a0h5cGVybGlua0ltcGwgaW4gZXZlcnkgaW5zdGFuY2Ugb2YgQXRr
SHlwZXJMaW5rCisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWluZGV4LCAwKTsKKworICAgIEFj
Y2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGxpbmspOworICAgIGlmICghY29y
ZU9iamVjdCB8fCBjb3JlT2JqZWN0LT51cmwoKS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICByZXR1cm4gZ19zdHJkdXAocmV0dXJuU3RyaW5nKGNvcmVPYmplY3QtPnVybCgpLnN0
cmluZygpKSk7Cit9CisKK3N0YXRpYyBBdGtPYmplY3QqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxp
bmtHZXRPYmplY3QoQXRrSHlwZXJsaW5rKiBsaW5rLCBnaW50IGluZGV4KQoreworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKSwgMCk7
CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxp
bmspLT5saW5rSW1wbCwgMCk7CisKKyAgICAvLyBGSVhNRSBEbyBOT1Qgc3VwcG9ydCBtb3JlIHRo
YW4gb25lIGluc3RhbmNlIG9mIGFuIEF0a09iamVjdAorICAgIC8vIGltcGxlbWVudGluZyBBdGtI
eXBlcmxpbmtJbXBsIGluIGV2ZXJ5IGluc3RhbmNlIG9mIEF0a0h5cGVyTGluaworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgMCk7CisKKyAgICByZXR1cm4gQVRLX09CSkVDVChXRUJL
SVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayktPmxpbmtJbXBsKTsKK30KKworc3RhdGljIGdp
bnQgZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QoQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqLCBSYW5n
ZSogcmFuZ2UpCit7CisgICAgLy8gVGhpcyBpcyBnb2luZyB0byBiZSB0aGUgYWN0dWFsIGxlbmd0
aCBpbiBtb3N0IG9mIHRoZSBjYXNlcworICAgIGdpbnQgYmFzZUxlbmd0aCA9IFRleHRJdGVyYXRv
cjo6cmFuZ2VMZW5ndGgocmFuZ2UpOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY3VycmVu
dCBoeXBlcmxpbmsgYmVsb25ncyB0byBhIGxpc3QgaXRlbS4KKyAgICAvLyBJZiBzbywgd2UgbmVl
ZCB0byBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVtJ3MgbWFya2VyCisgICAgQWNjZXNz
aWJpbGl0eU9iamVjdCogcGFyZW50ID0gb2JqLT5wYXJlbnRPYmplY3RVbmlnbm9yZWQoKTsKKyAg
ICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSB8
fCAhcGFyZW50LT5pc0xpc3RJdGVtKCkpCisgICAgICAgIHJldHVybiBiYXNlTGVuZ3RoOworCisg
ICAgLy8gRXZlbiBpZiB3ZSBkb24ndCBleHBvc2UgbGlzdCBtYXJrZXJzIHRvIEFzc2lzdGl2ZQor
ICAgIC8vIFRlY2hub2xvZ2llcywgd2UgbmVlZCB0byBoYXZlIGEgd2F5IHRvIG1lYXN1cmUgdGhl
aXIgbGVuZ3RoCisgICAgLy8gZm9yIHRob3NlIGNhc2VzIHdoZW4gaXQncyBuZWVkZWQgdG8gdGFr
ZSBpdCBpbnRvIGFjY291bnQKKyAgICAvLyBzZXBhcmF0ZWx5IChhcyBpbiBnZXRBY2Nlc3NpYmls
aXR5T2JqZWN0Rm9yT2Zmc2V0KQorICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIG1hcmtlck9iaiA9
IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworICAgIGlmICghbWFya2VyT2JqKQorICAgICAgICByZXR1
cm4gYmFzZUxlbmd0aDsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBzdGF0aWNfY2Fz
dDxjb25zdCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Kj4obWFya2VyT2JqKS0+cmVuZGVyZXIo
KTsKKyAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+aXNMaXN0TWFya2VyKCkpCisgICAg
ICAgIHJldHVybiBiYXNlTGVuZ3RoOworCisgICAgUmVuZGVyTGlzdE1hcmtlciogbWFya2VyID0g
dG9SZW5kZXJMaXN0TWFya2VyKHJlbmRlcmVyKTsKKyAgICByZXR1cm4gYmFzZUxlbmd0aCArIG1h
cmtlci0+dGV4dCgpLmxlbmd0aCgpICsgbWFya2VyLT5zdWZmaXgoKS5sZW5ndGgoKTsKK30KKwor
c3RhdGljIGdpbnQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFN0YXJ0SW5kZXgoQXRrSHlw
ZXJsaW5rKiBsaW5rKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NF
U1NJQkxFX0hZUEVSTElOSyhsaW5rKSwgMCk7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBj
b3JlT2JqZWN0ID0gY29yZShsaW5rKTsKKyAgICBpZiAoIWNvcmVPYmplY3QpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgTm9kZSogbm9kZSA9IGNvcmVPYmplY3QtPm5vZGUoKTsKKyAgICBpZiAo
IW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFJh
bmdlOjpjcmVhdGUobm9kZS0+ZG9jdW1lbnQoKSwgZmlyc3RQb3NpdGlvbkluTm9kZShub2RlLT5w
YXJlbnROb2RlKCkpLCBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5vZGUpKTsKKyAgICByZXR1cm4gZ2V0
UmFuZ2VMZW5ndGhGb3JPYmplY3QoY29yZU9iamVjdCwgcmFuZ2UuZ2V0KCkpOworfQorCitzdGF0
aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0RW5kSW5kZXgoQXRrSHlwZXJsaW5r
KiBsaW5rKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxF
X0hZUEVSTElOSyhsaW5rKSwgMCk7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2Jq
ZWN0ID0gY29yZShsaW5rKTsKKyAgICBpZiAoIWNvcmVPYmplY3QpCisgICAgICAgIHJldHVybiAw
OworCisgICAgTm9kZSogbm9kZSA9IGNvcmVPYmplY3QtPm5vZGUoKTsKKyAgICBpZiAoIW5vZGUp
CisgICAgICAgIHJldHVybiAwOworCisgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFJhbmdlOjpj
cmVhdGUobm9kZS0+ZG9jdW1lbnQoKSwgZmlyc3RQb3NpdGlvbkluTm9kZShub2RlLT5wYXJlbnRO
b2RlKCkpLCBsYXN0UG9zaXRpb25Jbk5vZGUobm9kZSkpOworICAgIHJldHVybiBnZXRSYW5nZUxl
bmd0aEZvck9iamVjdChjb3JlT2JqZWN0LCByYW5nZS5nZXQoKSk7Cit9CisKK3N0YXRpYyBnYm9v
bGVhbiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNWYWxpZChBdGtIeXBlcmxpbmsqIGxpbmsp
Cit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJM
SU5LKGxpbmspLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfQUNDRVNTSUJM
RV9IWVBFUkxJTksobGluayktPmxpbmtJbXBsLCBGQUxTRSk7CisKKyAgICAvLyBMaW5rIGlzIHZh
bGlkIGZvciB0aGUgd2hvbGUgb2JqZWN0J3MgbGlmZXRpbWUKKyAgICByZXR1cm4gVFJVRTsKK30K
Kworc3RhdGljIGdpbnQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE5BbmNob3JzKEF0a0h5
cGVybGluayogbGluaykKK3sKKyAgICAvLyBGSVhNRSBEbyBOT1Qgc3VwcG9ydCBtb3JlIHRoYW4g
b25lIGluc3RhbmNlIG9mIGFuIEF0a09iamVjdAorICAgIC8vIGltcGxlbWVudGluZyBBdGtIeXBl
cmxpbmtJbXBsIGluIGV2ZXJ5IGluc3RhbmNlIG9mIEF0a0h5cGVyTGluaworICAgIGdfcmV0dXJu
X3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKSwgMCk7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmsp
LT5saW5rSW1wbCwgMCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNTZWxlY3RlZExpbmsoQXRrSHlwZXJsaW5rKiBsaW5rKQor
eworICAgIC8vIE5vdCBpbXBsZW1lbnRlZDogdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGlu
IEFUSyBub3cKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBGQUxTRTsKK30KKwor
c3RhdGljIHZvaWQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0luaXQoQXRrSHlwZXJsaW5rKiBs
aW5rKQoreworICAgIFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+bGlua0ltcGwg
PSAwOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rRmluYWxpemUo
R09iamVjdCogb2JqZWN0KQoreworICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtQYXJlbnRDbGFzcyktPmZpbmFsaXplKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lk
IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzc0luaXQoQXRrSHlwZXJsaW5rQ2xhc3MqIGts
YXNzKQoreworICAgIEdPYmplY3RDbGFzcyogZ29iamVjdENsYXNzID0gR19PQkpFQ1RfQ0xBU1Mo
a2xhc3MpOworCisgICAgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua1BhcmVudENsYXNzID0gZ190
eXBlX2NsYXNzX3BlZWtfcGFyZW50KGtsYXNzKTsKKworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxp
emUgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rRmluYWxpemU7CisKKyAgICBrbGFzcy0+Z2V0
X3VyaSA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRVcmk7CisgICAga2xhc3MtPmdldF9v
YmplY3QgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2JqZWN0OworICAgIGtsYXNzLT5n
ZXRfc3RhcnRfaW5kZXggPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0U3RhcnRJbmRleDsK
KyAgICBrbGFzcy0+Z2V0X2VuZF9pbmRleCA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRF
bmRJbmRleDsKKyAgICBrbGFzcy0+aXNfdmFsaWQgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
SXNWYWxpZDsKKyAgICBrbGFzcy0+Z2V0X25fYW5jaG9ycyA9IHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtHZXROQW5jaG9yczsKKyAgICBrbGFzcy0+aXNfc2VsZWN0ZWRfbGluayA9IHdlYmtpdEFj
Y2Vzc2libGVIeXBlcmxpbmtJc1NlbGVjdGVkTGluazsKK30KKworR1R5cGUKK3dlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtHZXRUeXBlKHZvaWQpCit7CisgICAgc3RhdGljIHZvbGF0aWxlIGdzaXpl
IHR5cGVWb2xhdGlsZSA9IDA7CisKKyAgICBpZiAoZ19vbmNlX2luaXRfZW50ZXIoJnR5cGVWb2xh
dGlsZSkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0aW5mbyA9IHsKKyAgICAg
ICAgICAgIHNpemVvZihXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MpLAorICAgICAgICAg
ICAgKEdCYXNlSW5pdEZ1bmMpIDAsCisgICAgICAgICAgICAoR0Jhc2VGaW5hbGl6ZUZ1bmMpIDAs
CisgICAgICAgICAgICAoR0NsYXNzSW5pdEZ1bmMpIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtD
bGFzc0luaXQsCisgICAgICAgICAgICAoR0NsYXNzRmluYWxpemVGdW5jKSAwLAorICAgICAgICAg
ICAgMCwgLyogY2xhc3MgZGF0YSAqLworICAgICAgICAgICAgc2l6ZW9mKFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmspLCAvKiBpbnN0YW5jZSBzaXplICovCisgICAgICAgICAgICAwLCAvKiBuYiBw
cmVhbGxvY3MgKi8KKyAgICAgICAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgd2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0luaXQsCisgICAgICAgICAgICAwIC8qIHZhbHVlIHRhYmxlICovCisgICAg
ICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIGFjdGlvbkluZm8g
PQorICAgICAgICAgIHsKKyAgICAgICAgICAgIChHSW50ZXJmYWNlSW5pdEZ1bmMpKEdJbnRlcmZh
Y2VJbml0RnVuYylhdGtBY3Rpb25JbnRlcmZhY2VJbml0LAorICAgICAgICAgICAgKEdJbnRlcmZh
Y2VGaW5hbGl6ZUZ1bmMpIDAsIDAKKyAgICAgICAgICB9OworCisgICAgICAgIEdUeXBlIHR5cGUg
PSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljKEFUS19UWVBFX0hZUEVSTElOSywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlYktpdEFjY2Vzc2libGVIeXBlcmxp
bmsiLCAmdGluZm8sIEdUeXBlRmxhZ3MoMCkpOworICAgICAgICBnX3R5cGVfYWRkX2ludGVyZmFj
ZV9zdGF0aWModHlwZSwgQVRLX1RZUEVfQUNUSU9OLCAmYWN0aW9uSW5mbyk7CisKKyAgICAgICAg
Z19vbmNlX2luaXRfbGVhdmUoJnR5cGVWb2xhdGlsZSwgdHlwZSk7CisgICAgfQorCisgICAgcmV0
dXJuIHR5cGVWb2xhdGlsZTsKK30KKworc3RhdGljIHZvaWQgaHlwZXJsaW5rSW1wbEZpbmFsaXpl
ZChXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKiBsaW5rLCBBdGtIeXBlcmxpbmtJbXBsKiBsaW5r
SW1wbCkKK3sKKyAgICAvLyBPYmplY3Qgbm8gbG9uZ2VyIGFsaXZlLCByZW1vdmUgaXQgZnJvbSB0
aGUgaGFzaCB0YWJsZSBhbmQKKyAgICAvLyBkZXN0cm95IHRoZSBBdGtIeXBlcmxpbmsgb2JqZWN0
CisgICAgQVNTRVJUKGhhc2hUYWJsZSk7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZShoYXNoVGFi
bGUsICh2b2lkKilsaW5rSW1wbCk7CisgICAgZ19vYmplY3RfdW5yZWYobGluayk7Cit9CisKK1dl
YktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNy
ZWF0ZShBdGtIeXBlcmxpbmtJbXBsKiBsaW5rSW1wbCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChBVEtfSVNfSFlQRVJMSU5LX0lNUEwobGlua0ltcGwpLCAwKTsKKworICAgIC8vIExhenkg
aW5pdGlhbGl6YXRpb24gZm9yIHRoZSBoYXNoIHRhYmxlCisgICAgaWYgKCFoYXNoVGFibGUpCisg
ICAgICAgIGhhc2hUYWJsZSA9IGdfaGFzaF90YWJsZV9uZXcoZ19kaXJlY3RfaGFzaCwgZ19kaXJl
Y3RfZXF1YWwpOworCisgICAgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGluayA9IFdFQktJ
VF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhnX2hhc2hfdGFibGVfbG9va3VwKGhhc2hUYWJsZSwgKGNv
bnN0IHZvaWQqKWxpbmtJbXBsKSk7CisgICAgaWYgKCFsaW5rKSB7CisgICAgICAgIGxpbmsgPSBz
dGF0aWNfY2FzdDxXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKj4oZ19vYmplY3RfbmV3KFdFQktJ
VF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJMSU5LLCAwKSk7CisgICAgICAgIGxpbmstPmxpbmtJbXBs
ID0gbGlua0ltcGw7CisKKyAgICAgICAgZ19vYmplY3Rfd2Vha19yZWYoR19PQkpFQ1QobGlua0lt
cGwpLCAoR1dlYWtOb3RpZnkpaHlwZXJsaW5rSW1wbEZpbmFsaXplZCwgbGluayk7CisgICAgICAg
IGdfaGFzaF90YWJsZV9pbnNlcnQoaGFzaFRhYmxlLCAodm9pZCopbGlua0ltcGwsIGxpbmspOwor
ICAgIH0KKworICAgIHJldHVybiBsaW5rOworfQorCitXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0QWNjZXNzaWJpbGl0eU9iamVjdChXZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rKiBsaW5rKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWls
KFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKSwgMCk7CisgICAgcmV0dXJuIGNv
cmUobGluayk7Cit9CisKKyNlbmRpZiAvLyBIQVZFKEFDQ0VTU0lCSUxJVFkpCmRpZmYgLS1naXQg
YS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCBi
L1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGVjYTkKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsu
aApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpZm5kZWYgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua19oCisjZGVmaW5lIFdlYktpdEFjY2Vz
c2libGVIeXBlcmxpbmtfaAorCisjaW5jbHVkZSA8YXRrL2F0ay5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CitjbGFzcyBBY2Nlc3NpYmlsaXR5T2JqZWN0OworfQorCitHX0JFR0lOX0RFQ0xTCisK
KyNkZWZpbmUgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTksgICAgICAgICAgICAgICAg
ICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFR5cGUgKCkpCisjZGVmaW5lIFdFQktJVF9B
Q0NFU1NJQkxFX0hZUEVSTElOSyhvYmopICAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19J
TlNUQU5DRV9DQVNUICgob2JqKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkssIFdl
YktpdEFjY2Vzc2libGVIeXBlcmxpbmspKQorI2RlZmluZSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBF
UkxJTktfQ0xBU1Moa2xhc3MpICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGts
YXNzKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkssIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmtDbGFzcykpCisjZGVmaW5lIFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhv
YmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgV0VC
S0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkspKQorI2RlZmluZSBXRUJLSVRfSVNfQUNDRVNT
SUJMRV9IWVBFUkxJTktfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQ
RSAoKGtsYXNzKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkspKQorI2RlZmluZSBX
RUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTktfR0VUX0NMQVNTKG9iaikgICAgICAgIChHX1RZUEVf
SU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJ
TkssIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9X
ZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rICAgICAgICAgICAgICAgIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbms7Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua0NsYXNz
ICAgICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3M7CisKK3N0cnVjdCBfV2Vi
S2l0QWNjZXNzaWJsZUh5cGVybGluayB7CisgICAgQXRrSHlwZXJsaW5rIHBhcmVudDsKKyAgICBB
dGtIeXBlcmxpbmtJbXBsKiBsaW5rSW1wbDsKK307CisKK3N0cnVjdCBfV2ViS2l0QWNjZXNzaWJs
ZUh5cGVybGlua0NsYXNzIHsKKyAgICBBdGtPYmplY3RDbGFzcyBwYXJlbnRDbGFzczsKK307CisK
K0dUeXBlIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRUeXBlKHZvaWQpIEdfR05VQ19DT05T
VDsKKworV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldE9yQ3JlYXRlKEF0a0h5cGVybGlua0ltcGwqIGxpbmtJbXBsKTsKKworV2ViQ29yZTo6QWNj
ZXNzaWJpbGl0eU9iamVjdCogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldEFjY2Vzc2liaWxp
dHlPYmplY3QoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGluayk7CisKK0dfRU5EX0RFQ0xT
CisKKyNlbmRpZiAvLyBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rX2gKZGlmZiAtLWdpdCBhL1dl
YktpdC9ndGsvQ2hhbmdlTG9nIGIvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKaW5kZXggYzYwMmFjMS4u
ZGQwOTI2NyAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L2d0
ay9DaGFuZ2VMb2cKQEAgLTEsMyArMSw5IEBACisyMDEwLTEwLTA4ICBNYXJpbyBTYW5jaGV6IFBy
YWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnRpbmcgdGhlIEF0a0h5cGVydGV4dC9BdGtIeXBl
cmxpbmsgc3R1ZmYgaW4gdGhlIEdUSyBwb3J0CisKIDIwMTAtMDktMjggIEplbm4gQnJhaXRod2Fp
dGUgIDxqZW5uYkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRG1pdHJ5IFRp
dG92LgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMgYi9XZWJLaXQvZ3Rr
L3Rlc3RzL3Rlc3RhdGsuYwppbmRleCBjOGRmNGVmLi4yZmU2MzZmIDEwMDY0NAotLS0gYS9XZWJL
aXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYworKysgYi9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwpA
QCAtNDYsNiArNDYsOCBAQCBzdGF0aWMgY29uc3QgY2hhciogY29udGVudHNJblRhYmxlV2l0aEhl
YWRlcnMgPSAiPGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGg+Zm9vPAogCiBzdGF0aWMgY29uc3Qg
Y2hhciogZm9ybVdpdGhUZXh0SW5wdXRzID0gIjxodG1sPjxib2R5Pjxmb3JtPjxpbnB1dCB0eXBl
PSd0ZXh0JyBuYW1lPSdlbnRyeScgLz48L2Zvcm0+PC9ib2R5PjwvaHRtbD4iOwogCitzdGF0aWMg
Y29uc3QgY2hhciogaHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyA9ICI8aHRtbD48Ym9keT48cD5BIHBh
cmFncmFwaCB3aXRoIG5vIGxpbmtzIGF0IGFsbDwvcD48cD48YSBocmVmPSdodHRwOi8vZm9vLmJh
ci5iYXovJz5BIGxpbmU8L2E+IHdpdGggPGEgaHJlZj0naHR0cDovL2Jhci5iYXouZm9vLyc+YSBs
aW5rIGluIHRoZSBtaWRkbGU8L2E+IGFzIHdlbGwgYXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgPGEg
aHJlZj0naHR0cDovL2Jhei5mb28uYmFyLyc+YXQgdGhlIGVuZDwvYT48L3A+PC9ib2R5PjwvaHRt
bD4iOworCiBzdGF0aWMgY29uc3QgY2hhciogbGlzdHNPZkl0ZW1zID0gIjxodG1sPjxib2R5Pjx1
bD48bGk+dGV4dCBvbmx5PC9saT48bGk+PGEgaHJlZj0nZm9vJz5saW5rIG9ubHk8L2E+PC9saT48
bGk+dGV4dCBhbmQgYSA8YSBocmVmPSdiYXInPmxpbms8L2E+PC9saT48L3VsPjxvbD48bGk+dGV4
dCBvbmx5PC9saT48bGk+PGEgaHJlZj0nZm9vJz5saW5rIG9ubHk8L2E+PC9saT48bGk+dGV4dCBh
bmQgYSA8YSBocmVmPSdiYXInPmxpbms8L2E+PC9saT48L29sPjwvYm9keT48L2h0bWw+IjsKIAog
c3RhdGljIGNvbnN0IGNoYXIqIHRleHRGb3JTZWxlY3Rpb25zID0gIjxodG1sPjxib2R5PjxwPkEg
cGFyYWdyYXBoIHdpdGggcGxhaW4gdGV4dDwvcD48cD5BIHBhcmFncmFwaCB3aXRoIDxhIGhyZWY9
J2h0dHA6Ly93ZWJraXQub3JnJz5hIGxpbms8L2E+IGluIHRoZSBtaWRkbGU8L3A+PC9ib2R5Pjwv
aHRtbD4iOwpAQCAtOTY0LDYgKzk2Niw3NiBAQCBzdGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrR2V0
RXh0ZW50cyh2b2lkKQogICAgIGdfb2JqZWN0X3VucmVmKHdlYlZpZXcpOwogfQogCisvLyBUT0RP
OiBUbyBiZSBpbXBsZW1lbnRlZAorc3RhdGljIHZvaWQgdGVzdFdlYmtpdEF0a0h5cGVydGV4dEFu
ZEh5cGVybGlua3Modm9pZCkKK3sKKyAgICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3ID0gV0VCS0lU
X1dFQl9WSUVXKHdlYmtpdF93ZWJfdmlld19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3Npbmso
d2ViVmlldyk7CisgICAgR3RrQWxsb2NhdGlvbiBhbGxvYyA9IHsgMCwgMCwgODAwLCA2MDAgfTsK
KyAgICBndGtfd2lkZ2V0X3NpemVfYWxsb2NhdGUoR1RLX1dJREdFVCh3ZWJWaWV3KSwgJmFsbG9j
KTsKKyAgICB3ZWJraXRfd2ViX3ZpZXdfbG9hZF9zdHJpbmcod2ViVmlldywgaHlwZXJ0ZXh0QW5k
SHlwZXJsaW5rcywgMCwgMCwgMCk7CisgICAgR01haW5Mb29wKiBsb29wID0gZ19tYWluX2xvb3Bf
bmV3KDAsIFRSVUUpOworCisgICAgZ19pZGxlX2FkZCgoR1NvdXJjZUZ1bmMpYmFpbF9vdXQsIGxv
b3ApOworICAgIGdfbWFpbl9sb29wX3J1bihsb29wKTsKKworICAgIEF0a09iamVjdCogb2JqID0g
Z3RrX3dpZGdldF9nZXRfYWNjZXNzaWJsZShHVEtfV0lER0VUKHdlYlZpZXcpKTsKKyAgICBnX2Fz
c2VydChvYmopOworCisgICAgQXRrT2JqZWN0KiBwYXJhZ3JhcGgxID0gYXRrX29iamVjdF9yZWZf
YWNjZXNzaWJsZV9jaGlsZChvYmosIDApOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QocGFyYWdy
YXBoMSkpOworICAgIGdfYXNzZXJ0KGF0a19vYmplY3RfZ2V0X3JvbGUocGFyYWdyYXBoMSkgPT0g
QVRLX1JPTEVfUEFSQUdSQVBIKTsKKyAgICBnX2Fzc2VydChBVEtfSVNfSFlQRVJURVhUKHBhcmFn
cmFwaDEpKTsKKworICAgIC8vIE5vIGxpbmtzIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGgKKyAgICBn
aW50IG5MaW5rcyA9IGF0a19oeXBlcnRleHRfZ2V0X25fbGlua3MoQVRLX0hZUEVSVEVYVChwYXJh
Z3JhcGgxKSk7CisgICAgZ19hc3NlcnRfY21waW50KG5MaW5rcywgPT0sIDApOworCisgICAgQXRr
T2JqZWN0KiBwYXJhZ3JhcGgyID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChvYmos
IDEpOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QocGFyYWdyYXBoMikpOworICAgIGdfYXNzZXJ0
KGF0a19vYmplY3RfZ2V0X3JvbGUocGFyYWdyYXBoMikgPT0gQVRLX1JPTEVfUEFSQUdSQVBIKTsK
KyAgICBnX2Fzc2VydChBVEtfSVNfSFlQRVJURVhUKHBhcmFncmFwaDIpKTsKKworICAgIC8vIENo
ZWNrIGxpbmtzIGluIHRoZSBzZWNvbmQgcGFyYWdyYXBoCisgICAgbkxpbmtzID0gYXRrX2h5cGVy
dGV4dF9nZXRfbl9saW5rcyhBVEtfSFlQRVJURVhUKHBhcmFncmFwaDIpKTsKKyAgICBnX2Fzc2Vy
dF9jbXBpbnQobkxpbmtzLCA9PSwgMyk7CisKKyAgICBBdGtIeXBlcmxpbmsqIGhMaW5rMSA9IGF0
a19oeXBlcnRleHRfZ2V0X2xpbmsoQVRLX0hZUEVSVEVYVChwYXJhZ3JhcGgyKSwgMCk7CisgICAg
Z19hc3NlcnQoQVRLX0hZUEVSTElOSyhoTGluazEpKTsKKyAgICBBdGtPYmplY3QqIGhMaW5rT2Jq
ZWN0MSA9IGF0a19oeXBlcmxpbmtfZ2V0X29iamVjdChoTGluazEsIDApOworICAgIGdfYXNzZXJ0
KEFUS19PQkpFQ1QoaExpbmtPYmplY3QxKSk7CisgICAgZ19hc3NlcnQoYXRrX29iamVjdF9nZXRf
cm9sZShoTGlua09iamVjdDEpID09IEFUS19ST0xFX0xJTkspOworICAgIGdfYXNzZXJ0X2NtcGlu
dChhdGtfaHlwZXJsaW5rX2dldF9zdGFydF9pbmRleChoTGluazEpLCA9PSwgMCk7CisgICAgZ19h
c3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoTGluazEpLCA9PSwgNik7
CisgICAgZ19hc3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X25fYW5jaG9ycyhoTGluazEp
LCA9PSwgMSk7CisgICAgZ19hc3NlcnRfY21wc3RyKGF0a19oeXBlcmxpbmtfZ2V0X3VyaShoTGlu
azEsIDApLCA9PSwgImh0dHA6Ly9mb28uYmFyLmJhei8iKTsKKworICAgIEF0a0h5cGVybGluayog
aExpbmsyID0gYXRrX2h5cGVydGV4dF9nZXRfbGluayhBVEtfSFlQRVJURVhUKHBhcmFncmFwaDIp
LCAxKTsKKyAgICBnX2Fzc2VydChBVEtfSFlQRVJMSU5LKGhMaW5rMikpOworICAgIEF0a09iamVj
dCogaExpbmtPYmplY3QyID0gYXRrX2h5cGVybGlua19nZXRfb2JqZWN0KGhMaW5rMiwgMCk7Cisg
ICAgZ19hc3NlcnQoQVRLX09CSkVDVChoTGlua09iamVjdDIpKTsKKyAgICBnX2Fzc2VydChhdGtf
b2JqZWN0X2dldF9yb2xlKGhMaW5rT2JqZWN0MikgPT0gQVRLX1JPTEVfTElOSyk7CisgICAgZ19h
c3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X3N0YXJ0X2luZGV4KGhMaW5rMiksID09LCAx
Mik7CisgICAgZ19hc3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoTGlu
azIpLCA9PSwgMzIpOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9uX2Fu
Y2hvcnMoaExpbmsyKSwgPT0sIDEpOworICAgIGdfYXNzZXJ0X2NtcHN0cihhdGtfaHlwZXJsaW5r
X2dldF91cmkoaExpbmsyLCAwKSwgPT0sICJodHRwOi8vYmFyLmJhei5mb28vIik7CisKKyAgICBB
dGtIeXBlcmxpbmsqIGhMaW5rMyA9IGF0a19oeXBlcnRleHRfZ2V0X2xpbmsoQVRLX0hZUEVSVEVY
VChwYXJhZ3JhcGgyKSwgMik7CisgICAgZ19hc3NlcnQoQVRLX0hZUEVSTElOSyhoTGluazMpKTsK
KyAgICBBdGtPYmplY3QqIGhMaW5rT2JqZWN0MyA9IGF0a19oeXBlcmxpbmtfZ2V0X29iamVjdCho
TGluazMsIDApOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QoaExpbmtPYmplY3QzKSk7CisgICAg
Z19hc3NlcnQoYXRrX29iamVjdF9nZXRfcm9sZShoTGlua09iamVjdDMpID09IEFUS19ST0xFX0xJ
TkspOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9zdGFydF9pbmRleCho
TGluazMpLCA9PSwgNjUpOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9l
bmRfaW5kZXgoaExpbmszKSwgPT0sIDc1KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVy
bGlua19nZXRfbl9hbmNob3JzKGhMaW5rMyksID09LCAxKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIo
YXRrX2h5cGVybGlua19nZXRfdXJpKGhMaW5rMywgMCksID09LCAiaHR0cDovL2Jhei5mb28uYmFy
LyIpOworCisgICAgZ19vYmplY3RfdW5yZWYocGFyYWdyYXBoMSk7CisgICAgZ19vYmplY3RfdW5y
ZWYocGFyYWdyYXBoMik7CisgICAgZ19vYmplY3RfdW5yZWYod2ViVmlldyk7Cit9CisKKwogc3Rh
dGljIHZvaWQgdGVzdFdlYmtpdEF0a0xpc3RzT2ZJdGVtcyh2b2lkKQogewogICAgIFdlYktpdFdl
YlZpZXcqIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsK
QEAgLTExMTYsNiArMTE4OCw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKICAg
ICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL3RleHRBdHRyaWJ1dGVzIiwgdGVzdFdlYmtp
dEF0a1RleHRBdHRyaWJ1dGVzKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL3Rl
eHRTZWxlY3Rpb25zIiwgdGVzdFdla2l0QXRrVGV4dFNlbGVjdGlvbnMpOwogICAgIGdfdGVzdF9h
ZGRfZnVuYygiL3dlYmtpdC9hdGsvZ2V0RXh0ZW50cyIsIHRlc3RXZWJraXRBdGtHZXRFeHRlbnRz
KTsKKyAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL2h5cGVydGV4dEFuZEh5cGVybGlu
a3MiLCB0ZXN0V2Via2l0QXRrSHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyk7CiAgICAgZ190ZXN0X2Fk
ZF9mdW5jKCIvd2Via2l0L2F0ay9saXN0c09mSXRlbXMiLCB0ZXN0V2Via2l0QXRrTGlzdHNPZkl0
ZW1zKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL3RleHRDaGFuZ2VkTm90aWZp
Y2F0aW9ucyIsIHRlc3RXZWJraXRBdGtUZXh0Q2hhbmdlZE5vdGlmaWNhdGlvbnMpOwogICAgIHJl
dHVybiBnX3Rlc3RfcnVuICgpOwotLSAKMS43LjAuNAoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71301</attachid>
            <date>2010-10-20 09:44:21 -0700</date>
            <delta_ts>2010-10-21 01:55:20 -0700</delta_ts>
            <desc>Patch proposal + unit test</desc>
            <filename>0001-2010-10-20-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>43163</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAzZmIzNzBhMDg4NTI4Njk5ZDcyOTRhMWJkMjBmY2VlZTZiMmNiNmNiIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBXZWQsIDIwIE9jdCAyMDEwIDE4OjM0OjA5ICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gMjAxMC0xMC0yMCAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+
CgogICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3RrXSBBdGtI
eXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODUKCiAgICAgICAgSW1wbGVtZW50ZWQgdGhlIEF0
a0h5cGVybGluay9BdGtIeXBlcnRleHQgc3R1ZmYgaW4gdGhlIEdUSyBwb3J0LgoKICAgICAgICBF
dmVuIHRob3VnaHQgdGhlc2Uga2luZCBvZiB0YXNrcyBhcmUgdXN1YWxseSBhYm91dCBpbXBsZW1l
bnRpbmcgYW4KICAgICAgICBpbnRlcmZhY2UsIGluIHRoaXMgY2FzZSBpdCB3YXMgbmVlZGVkIHRv
IGltcGxlbWVudCBzb21lIG1vcmUKICAgICAgICB0aGluZ3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQg
QXRrSHlwZXJsaW5rIGlzIG5laXRoZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgbm9yIGFuIEF0a09i
amVjdCwgYnV0IGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MgY2hpbGQgb2YgR09iamVjdCB0aGF0CiAg
ICAgICAgbmVlZHMgdG8gYmUgcmVkZWZpbmVkIGluIGEgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgdGhh
dCBvbmUuIE9uIHRvcAogICAgICAgIG9mIHRoYXQsIGl0IHdhcyBuZWVkZWQgdG8gaW1wbGVtZW50
IHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlIGFzCiAgICAgICAgd2VsbCBmb3IgdGhhdCBuZXcgY2xh
c3MsIHNvIGV4cG9zZWQgaHlwZXJsaW5rcyBjYW4gd29yayBhcwogICAgICAgIGV4cGVjdGVkIHdp
dGggQXNzaXN0aXZlIFRlY2hub2xvZ2llcyBiYXNlZCBvbiBBVEsuCgogICAgICAgIEZ1cnRoZXJt
b3JlLCBhcyB0aGVyZSdzIG5vIG1lY2hhbmlzbSB0byBnZXQgYSBpbnN0YW5jZSBvZiB0aGF0CiAg
ICAgICAgQXRrSHlwZXJsaW5rIG90aGVyIHRoYW4gZG9pbmcgaXQgdGhyb3VnaCBhbiBBdGtPYmpl
Y3QgaW1wbGVtZW50aW5nCiAgICAgICAgdGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UsIGl0IHdh
cyBuZWVkZWQgdG8gYWxzbyBhZGQgdGhlIGNvZGUgdG8KICAgICAgICBpbXBsZW1lbnQgdGhhdCBv
bmUsIHNvIGl0IG1ha2VzIHBvc3NpYmxlIHRvIGFzayBmb3IgdGhlCiAgICAgICAgJ2h5cGVybGlu
a3MnIHVuZGVyIGFuICdoeXBlcnRleHQnIGFjY2Vzc2libGUgb2JqZWN0LgoKICAgICAgICBGaW5h
bGx5LCB0byBjb21wbGV0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIHRoaXMgc3R1ZmYgYW5k
IG1ha2UKICAgICAgICBpdCBhbGwgY29uc2lzdGVudCwgaXQgd2FzIG5lZWRlZCBhcyB3ZWxsIHRv
IGltcGxlbWVudCB0aGUKICAgICAgICBBdGtIeXBlcmxpbmtJbXBsIGludGVyZmFjZSAocHJvdmlk
aW5nIGp1c3Qgb25lIG1ldGhvZCBvbmx5KSBzbwogICAgICAgIHRoYXQgYWxsb3dzIHJldHJpZXZp
bmcgdGhlIEF0a0h5cGVybGluayBvYmplY3QgYXNzb2NpYXRlZCB0byBhbgogICAgICAgIEF0a09i
amVjdCBpbXBsZW1lbnRpbmcgc3VjaCBhbiBpbnRlcmZhY2UuCgogICAgICAgICogR05VbWFrZWZp
bGUuYW06IEFkZCB0aGUgbmV3IFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuW2h8Y3BwXQogICAg
ICAgIGZpbGVzIHRvIHRoZSBzb3VyY2VzIGxpc3QgZm9yIHRoZSBHVEsgcG9ydC4KCiAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHA6CiAg
ICAgICAgKGNvcmUpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjb3JlIGFjY2Vzc2liaWxp
dHkgb2JqZWN0CiAgICAgICAgcmVsYXRlZCB0byBhbiBBdGtPYmplY3QgaW1wbGVtZW50aW5nIHRo
ZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0
ZXh0R2V0TGluayk6IE5ldywgcGFydCBvZiB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0
aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZS4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVy
dGV4dEdldE5MaW5rcyk6IE5ldywgbGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVI
eXBlcnRleHRHZXRMaW5rSW5kZXgpOiBOZXcsIGxpa2V3aXNlLgogICAgICAgIChhdGtIeXBlcnRl
eHRJbnRlcmZhY2VJbml0KTogTmV3LCBpbml0aWFsaXplIHRoZSBBdGtIeXBlcnRleHQKICAgICAg
ICBpbnRlcmZhY2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbXBsR2V0SHlw
ZXJsaW5rKTogTmV3LCBwYXJ0IG9mIHRoZQogICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBB
dGtIeXBlcmxpbmtJbXBsIGludGVyZmFjZS4KICAgICAgICAoYXRrSHlwZXJsaW5rSW1wbEludGVy
ZmFjZUluaXQpOiBOZXcsIGluaXRpYWxpemUgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rSW1wbCBp
bnRlcmZhY2UuCiAgICAgICAgKEdldEF0a0ludGVyZmFjZVR5cGVGcm9tV0FJVHlwZSk6IEFkZCBB
VEtfVFlQRV9IWVBFUlRFWFQgYW5kCiAgICAgICAgQVRLX1RZUEVfSFlQRVJMSU5LX0lNUEwgdG8g
dGhlIGxpc3Qgb2YgcmVjb2duaXplZCB0eXBlcy4KICAgICAgICAoZ2V0SW50ZXJmYWNlTWFza0Zy
b21PYmplY3QpOiBEZWNpZGUgd2hlbiBpdCdzIG5lZWRlZCB0byBhZGQKICAgICAgICBXQUlfSFlQ
RVJURVhUIGFuZCBXQUlfSFlQRVJMSU5LIHRvIHRoZSBpbnRlcmZhY2UgbWFzay4KCiAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmg6IEFkZGVkLgog
ICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHA6
IEFkZGVkLgogICAgICAgIChyZXR1cm5TdHJpbmcpOiBSZXR1cm4gKGNvbnN0IGNoYXIqKSBmcm9t
IFN0cmluZyB2YXJpYWJsZXMuCiAgICAgICAgKGNvcmUpOiBSZXR1cm4gdGhlIGFzc29jaWF0ZWQg
QWNjZXNzaWJpbGl0eU9iamVjdC4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkRvQWN0aW9uKTogUGFydCBvZiB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUg
QXRrQWN0aW9uIGludGVyZmFjZS4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkdldE5BY3Rpb25zKTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtBY3Rpb25HZXREZXNjcmlwdGlvbik6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZyk6IExpa2V3aXNlLgogICAgICAgICh3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TmFtZSk6IExpa2V3aXNlLgogICAgICAg
IChhdGtBY3Rpb25JbnRlcmZhY2VJbml0KTogSW5pdGlhbGl6ZSB0aGUgQXRrQWN0aW9uIGludGVy
ZmFjZS4KICAgICAgICAoZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QpOiBSZXR1cm5zIHRoZSBsZW5n
dGggZm9yIGEgZ2l2ZW4gUmFuZ2UsCiAgICAgICAgY29uc2lkZXJpbmcgc3BlY2lhbCBjYXNlcyAo
ZS5nLiBMaXN0IGl0ZW0gbWFya2VycykKICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldFVyaSk6ICBJbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlCiAgICAgICAgbWV0aG9kcyBp
biB0aGUgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLgogICAgICAgICh3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0T2JqZWN0KTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2li
bGVIeXBlcmxpbmtHZXRTdGFydEluZGV4KTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtHZXRFbmRJbmRleCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rSXNWYWxpZCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0TkFuY2hvcnMpOiBMaWtld2lzZS4KICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0lzU2VsZWN0ZWRMaW5rKTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFj
Y2Vzc2libGVIeXBlcmxpbmtJbml0KTogSW5pdGlhbGl6ZSB0aGUKICAgICAgICBXZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rIGluc3RhbmNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rRmluYWxpemUpOiBGaW5hbGl6ZSBtZXRob2QuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtDbGFzc0luaXQpOiBJbml0aWFsaXplIHRoZQogICAgICAgIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsgY2xhc3MuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRU
eXBlKTogSW1wbGVtZW50YXRpb24gb2YgdGhlCiAgICAgICAgZ2V0X3R5cGUoKSBmdW5jdGlvbiBm
b3IgdGhlIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCiAgICAgICAgKGh5cGVybGlu
a0ltcGxGaW5hbGl6ZWQpOiBVbnJlZiB0aGUgQXRrSHlwZXJsaW5rSW1wbCBvYmplY3QKICAgICAg
ICBhc3NvY2lhdGVkIHRvIHRoZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIG9iamVjdCB3aGVu
IHRoaXMgaXMgbm8KICAgICAgICBsb25nZXIgYWxpdmUsIHJlbW92aW5nIGl0IGZyb20gdGhlIGlu
dGVybmFsIGhhc2ggbWFwLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JD
cmVhdGUpOiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZQogICAgICAgIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsgY2xhc3MgYXNzb2NpYXRlZCB0byBhIGdpdmVuCiAgICAgICAgQXRrSHlwZXJs
aW5rSW1wbCBvYmplY3QsIHJldHVybmluZyBhbiBhbHJlYWR5IGNyZWF0ZWQgaW5zdGFuY2UsIGlm
CiAgICAgICAgcHJlc2VudCAoaW50ZXJuYWxseSBzdG9yZWQgaW4gYSBoYXNoIG1hcCkuCiAgICAg
ICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KTogUHVi
bGljIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJuaW5nIHRoZSBBY2Nlc3NpYmlsaXR5T2JqZWN0IGFz
c29jaWF0ZWQgdG8gdGhlIGluc3RhbmNlIG9mCiAgICAgICAgdGhlIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmsgY2xhc3MuCgoyMDEwLTEwLTIwICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNo
ZXpAaWdhbGlhLmNvbT4KCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCgogICAg
ICAgIFtHdGtdIEF0a0h5cGVybGluayBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAogICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzc4NQoKICAgICAgICBOZXcg
dGVzdCB0byBlbnN1cmUgdGhlIEF0a0h5cGVydGV4dC9BdGtIeXBlcmxpbmsgc3R1ZmYgd29ya3Mu
CgogICAgICAgICogdGVzdHMvdGVzdGF0ay5jOgogICAgICAgICh0ZXN0V2Via2l0QXRrSHlwZXJ0
ZXh0QW5kSHlwZXJsaW5rcyk6IE5ldyB0ZXN0LCBjaGVja2luZyBib3RoIHRoZQogICAgICAgIGlt
cGxlbWVudGF0aW9uIG9mIHRoZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNlLCB0aGUgc3ViY2xhc3Mg
b2YgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLCBhbmQgdGhlIGltcGxl
bWVudGF0aW9uIG9mIHRoZQogICAgICAgIEF0a0FjdGlvbiBpbnRlcmZhY2UgaW4gdGhhdCBzdWJj
bGFzcy4KICAgICAgICAobWFpbik6IEFkZGVkIHRoZSBuZXcgdW5pdCB0ZXN0LgotLS0KIFdlYkNv
cmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5MCArKysr
KwogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg
ICAyICsKIC4uLi9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwICAgICAgICAg
IHwgIDE2NiArKysrKysrLS0KIC4uLi9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAg
ICAgICAgICAgICAgIHwgIDM3MiArKysrKysrKysrKysrKysrKysrKwogLi4uL2FjY2Vzc2liaWxp
dHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCAgfCAgIDU4ICsrKwogV2ViS2l0L2d0
ay9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2ICsKIFdlYktp
dC9ndGsvdGVzdHMvdGVzdGF0ay5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3OSArKysr
CiA3IGZpbGVzIGNoYW5nZWQsIDc1MiBpbnNlcnRpb25zKCspLCAzMSBkZWxldGlvbnMoLSkKIGNy
ZWF0ZSBtb2RlIDEwMDY0NCBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsuY3BwCiBjcmVhdGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgKCmRpZmYgLS1naXQgYS9XZWJDb3JlL0No
YW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDNiNjZmODMuLjVkY2M2ZGIgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsOTMgQEAKKzIwMTAtMTAtMjAgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2Fs
aWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtHdGtdIEF0a0h5cGVybGluayBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODUKKworICAgICAgICBJbXBs
ZW1lbnRlZCB0aGUgQXRrSHlwZXJsaW5rL0F0a0h5cGVydGV4dCBzdHVmZiBpbiB0aGUgR1RLIHBv
cnQuCisKKyAgICAgICAgRXZlbiB0aG91Z2h0IHRoZXNlIGtpbmQgb2YgdGFza3MgYXJlIHVzdWFs
bHkgYWJvdXQgaW1wbGVtZW50aW5nIGFuCisgICAgICAgIGludGVyZmFjZSwgaW4gdGhpcyBjYXNl
IGl0IHdhcyBuZWVkZWQgdG8gaW1wbGVtZW50IHNvbWUgbW9yZQorICAgICAgICB0aGluZ3MgZHVl
IHRvIHRoZSBmYWN0IHRoYXQgQXRrSHlwZXJsaW5rIGlzIG5laXRoZXIgYW4gaW50ZXJmYWNlCisg
ICAgICAgIG5vciBhbiBBdGtPYmplY3QsIGJ1dCBqdXN0IGFuIGFic3RyYWN0IGNsYXNzIGNoaWxk
IG9mIEdPYmplY3QgdGhhdAorICAgICAgICBuZWVkcyB0byBiZSByZWRlZmluZWQgaW4gYSBzcGVj
aWZpYyBzdWJjbGFzcyBvZiB0aGF0IG9uZS4gT24gdG9wCisgICAgICAgIG9mIHRoYXQsIGl0IHdh
cyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlIGFzCisgICAgICAg
IHdlbGwgZm9yIHRoYXQgbmV3IGNsYXNzLCBzbyBleHBvc2VkIGh5cGVybGlua3MgY2FuIHdvcmsg
YXMKKyAgICAgICAgZXhwZWN0ZWQgd2l0aCBBc3Npc3RpdmUgVGVjaG5vbG9naWVzIGJhc2VkIG9u
IEFUSy4KKworICAgICAgICBGdXJ0aGVybW9yZSwgYXMgdGhlcmUncyBubyBtZWNoYW5pc20gdG8g
Z2V0IGEgaW5zdGFuY2Ugb2YgdGhhdAorICAgICAgICBBdGtIeXBlcmxpbmsgb3RoZXIgdGhhbiBk
b2luZyBpdCB0aHJvdWdoIGFuIEF0a09iamVjdCBpbXBsZW1lbnRpbmcKKyAgICAgICAgdGhlIEF0
a0h5cGVydGV4dCBpbnRlcmZhY2UsIGl0IHdhcyBuZWVkZWQgdG8gYWxzbyBhZGQgdGhlIGNvZGUg
dG8KKyAgICAgICAgaW1wbGVtZW50IHRoYXQgb25lLCBzbyBpdCBtYWtlcyBwb3NzaWJsZSB0byBh
c2sgZm9yIHRoZQorICAgICAgICAnaHlwZXJsaW5rcycgdW5kZXIgYW4gJ2h5cGVydGV4dCcgYWNj
ZXNzaWJsZSBvYmplY3QuCisKKyAgICAgICAgRmluYWxseSwgdG8gY29tcGxldGUgdGhlIGltcGxl
bWVudGF0aW9uIG9mIGFsbCB0aGlzIHN0dWZmIGFuZCBtYWtlCisgICAgICAgIGl0IGFsbCBjb25z
aXN0ZW50LCBpdCB3YXMgbmVlZGVkIGFzIHdlbGwgdG8gaW1wbGVtZW50IHRoZQorICAgICAgICBB
dGtIeXBlcmxpbmtJbXBsIGludGVyZmFjZSAocHJvdmlkaW5nIGp1c3Qgb25lIG1ldGhvZCBvbmx5
KSBzbworICAgICAgICB0aGF0IGFsbG93cyByZXRyaWV2aW5nIHRoZSBBdGtIeXBlcmxpbmsgb2Jq
ZWN0IGFzc29jaWF0ZWQgdG8gYW4KKyAgICAgICAgQXRrT2JqZWN0IGltcGxlbWVudGluZyBzdWNo
IGFuIGludGVyZmFjZS4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOiBBZGQgdGhlIG5ldyBX
ZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLltofGNwcF0KKyAgICAgICAgZmlsZXMgdG8gdGhlIHNv
dXJjZXMgbGlzdCBmb3IgdGhlIEdUSyBwb3J0LgorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9n
dGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgorICAgICAgICAoY29yZSk6IE5l
dyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGNvcmUgYWNjZXNzaWJpbGl0eSBvYmplY3QKKyAgICAg
ICAgcmVsYXRlZCB0byBhbiBBdGtPYmplY3QgaW1wbGVtZW50aW5nIHRoZSBBdGtIeXBlcnRleHQg
aW50ZXJmYWNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldExpbmspOiBO
ZXcsIHBhcnQgb2YgdGhlCisgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdGtIeXBlcnRl
eHQgaW50ZXJmYWNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldE5MaW5r
cyk6IE5ldywgbGlrZXdpc2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0
TGlua0luZGV4KTogTmV3LCBsaWtld2lzZS4KKyAgICAgICAgKGF0a0h5cGVydGV4dEludGVyZmFj
ZUluaXQpOiBOZXcsIGluaXRpYWxpemUgdGhlIEF0a0h5cGVydGV4dAorICAgICAgICBpbnRlcmZh
Y2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW1wbEdldEh5cGVybGluayk6
IE5ldywgcGFydCBvZiB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIEF0a0h5cGVy
bGlua0ltcGwgaW50ZXJmYWNlLgorICAgICAgICAoYXRrSHlwZXJsaW5rSW1wbEludGVyZmFjZUlu
aXQpOiBOZXcsIGluaXRpYWxpemUgdGhlCisgICAgICAgIEF0a0h5cGVybGlua0ltcGwgaW50ZXJm
YWNlLgorICAgICAgICAoR2V0QXRrSW50ZXJmYWNlVHlwZUZyb21XQUlUeXBlKTogQWRkIEFUS19U
WVBFX0hZUEVSVEVYVCBhbmQKKyAgICAgICAgQVRLX1RZUEVfSFlQRVJMSU5LX0lNUEwgdG8gdGhl
IGxpc3Qgb2YgcmVjb2duaXplZCB0eXBlcy4KKyAgICAgICAgKGdldEludGVyZmFjZU1hc2tGcm9t
T2JqZWN0KTogRGVjaWRlIHdoZW4gaXQncyBuZWVkZWQgdG8gYWRkCisgICAgICAgIFdBSV9IWVBF
UlRFWFQgYW5kIFdBSV9IWVBFUkxJTksgdG8gdGhlIGludGVyZmFjZSBtYXNrLgorCisgICAgICAg
ICogYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oOiBBZGRlZC4K
KyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNw
cDogQWRkZWQuCisgICAgICAgIChyZXR1cm5TdHJpbmcpOiBSZXR1cm4gKGNvbnN0IGNoYXIqKSBm
cm9tIFN0cmluZyB2YXJpYWJsZXMuCisgICAgICAgIChjb3JlKTogUmV0dXJuIHRoZSBhc3NvY2lh
dGVkIEFjY2Vzc2liaWxpdHlPYmplY3QuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rQWN0aW9uRG9BY3Rpb24pOiBQYXJ0IG9mIHRoZQorICAgICAgICBpbXBsZW1lbnRhdGlvbiBv
ZiB0aGUgQXRrQWN0aW9uIGludGVyZmFjZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtBY3Rpb25HZXROQWN0aW9ucyk6IExpa2V3aXNlLgorICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0FjdGlvbkdldERlc2NyaXB0aW9uKTogTGlrZXdpc2UuCisgICAgICAgICh3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZyk6IExpa2V3aXNlLgor
ICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5hbWUpOiBMaWtld2lz
ZS4KKyAgICAgICAgKGF0a0FjdGlvbkludGVyZmFjZUluaXQpOiBJbml0aWFsaXplIHRoZSBBdGtB
Y3Rpb24gaW50ZXJmYWNlLgorICAgICAgICAoZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QpOiBSZXR1
cm5zIHRoZSBsZW5ndGggZm9yIGEgZ2l2ZW4gUmFuZ2UsCisgICAgICAgIGNvbnNpZGVyaW5nIHNw
ZWNpYWwgY2FzZXMgKGUuZy4gTGlzdCBpdGVtIG1hcmtlcnMpCisgICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rR2V0VXJpKTogIEltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiB0aGUKKyAg
ICAgICAgbWV0aG9kcyBpbiB0aGUgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLgorICAgICAg
ICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE9iamVjdCk6IExpa2V3aXNlLgorICAgICAg
ICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFN0YXJ0SW5kZXgpOiBMaWtld2lzZS4KKyAg
ICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRFbmRJbmRleCk6IExpa2V3aXNlLgor
ICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lzVmFsaWQpOiBMaWtld2lzZS4KKyAg
ICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXROQW5jaG9ycyk6IExpa2V3aXNlLgor
ICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lzU2VsZWN0ZWRMaW5rKTogTGlrZXdp
c2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW5pdCk6IEluaXRpYWxpemUg
dGhlCisgICAgICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgaW5zdGFuY2UuCisgICAgICAg
ICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rRmluYWxpemUpOiBGaW5hbGl6ZSBtZXRob2QuCisg
ICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3NJbml0KTogSW5pdGlhbGl6ZSB0
aGUKKyAgICAgICAgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayBjbGFzcy4KKyAgICAgICAgKHdl
YmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRUeXBlKTogSW1wbGVtZW50YXRpb24gb2YgdGhlCisg
ICAgICAgIGdldF90eXBlKCkgZnVuY3Rpb24gZm9yIHRoZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJs
aW5rIGNsYXNzLgorICAgICAgICAoaHlwZXJsaW5rSW1wbEZpbmFsaXplZCk6IFVucmVmIHRoZSBB
dGtIeXBlcmxpbmtJbXBsIG9iamVjdAorICAgICAgICBhc3NvY2lhdGVkIHRvIHRoZSBXZWJLaXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rIG9iamVjdCB3aGVuIHRoaXMgaXMgbm8KKyAgICAgICAgbG9uZ2Vy
IGFsaXZlLCByZW1vdmluZyBpdCBmcm9tIHRoZSBpbnRlcm5hbCBoYXNoIG1hcC4KKyAgICAgICAg
KHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNyZWF0ZSk6IFJldHVybnMgYW4gaW5zdGFu
Y2Ugb2YgdGhlCisgICAgICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MgYXNzb2Np
YXRlZCB0byBhIGdpdmVuCisgICAgICAgIEF0a0h5cGVybGlua0ltcGwgb2JqZWN0LCByZXR1cm5p
bmcgYW4gYWxyZWFkeSBjcmVhdGVkIGluc3RhbmNlLCBpZgorICAgICAgICBwcmVzZW50IChpbnRl
cm5hbGx5IHN0b3JlZCBpbiBhIGhhc2ggbWFwKS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KTogUHVibGljIGZ1bmN0aW9uCisgICAgICAg
IHJldHVybmluZyB0aGUgQWNjZXNzaWJpbGl0eU9iamVjdCBhc3NvY2lhdGVkIHRvIHRoZSBpbnN0
YW5jZSBvZgorICAgICAgICB0aGUgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayBjbGFzcy4KKwog
MjAxMC0xMC0xOSAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAgICAg
ICBCdWlsZCBmaXggKEVGTCwgbWF5YmUgbW9yZSkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCA4MTFmZmE2Li45MzJjYTY1
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dlYkNvcmUvR05VbWFr
ZWZpbGUuYW0KQEAgLTM0NTYsNiArMzQ1Niw4IEBAIHdlYmNvcmVndGtfc291cmNlcyArPSBcCiAJ
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5j
cHAgXAogCVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBw
ZXJBdGsuaCBcCiAJV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BWE9iamVjdENhY2hlQXRrLmNw
cCBcCisJV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5r
LmggXAorCVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlu
ay5jcHAgXAogCVdlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0Q29udHJvbGxlckd0ay5jcHAgXAog
CVdlYkNvcmUvcGFnZS9ndGsvRHJhZ0NvbnRyb2xsZXJHdGsuY3BwIFwKIAlXZWJDb3JlL3BhZ2Uv
Z3RrL0V2ZW50SGFuZGxlckd0ay5jcHAgXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAgYi9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcAppbmRleCBhYTg4
MjE3Li40ZjdjZTcyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vz
c2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcAorKysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
Z3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcApAQCAtNjAsMTQgKzYwLDE1IEBA
CiAjaW5jbHVkZSAiUmVuZGVyVGV4dC5oIgogI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgogI2lu
Y2x1ZGUgIlRleHRJdGVyYXRvci5oIgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNp
bmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmcuaD4KKyNpbmNsdWRlICJXZWJLaXRBY2Nlc3Np
YmxlSHlwZXJsaW5rLmgiCiAKICNpbmNsdWRlIDxhdGsvYXRrLmg+CiAjaW5jbHVkZSA8Z2xpYi5o
PgogI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGxpYmdhaWwtdXRpbC9nYWls
LXV0aWwuaD4KICNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0
b21pY1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogdXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTE0Myw2ICsxNDQsMTEgQEAgc3RhdGljIEFjY2Vzc2liaWxp
dHlPYmplY3QqIGNvcmUoQXRrVGFibGUqIHRhYmxlKQogICAgIHJldHVybiBjb3JlKEFUS19PQkpF
Q1QodGFibGUpKTsKIH0KIAorc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrSHlw
ZXJ0ZXh0KiBoeXBlcnRleHQpCit7CisgICAgcmV0dXJuIGNvcmUoQVRLX09CSkVDVChoeXBlcnRl
eHQpKTsKK30KKwogc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrRG9jdW1lbnQq
IGRvY3VtZW50KQogewogICAgIHJldHVybiBjb3JlKEFUS19PQkpFQ1QoZG9jdW1lbnQpKTsKQEAg
LTE5MzEsNiArMTkzNyw4NCBAQCBzdGF0aWMgdm9pZCBhdGtfdGFibGVfaW50ZXJmYWNlX2luaXQo
QXRrVGFibGVJZmFjZSogaWZhY2UpCiAgICAgaWZhY2UtPmdldF9yb3dfZGVzY3JpcHRpb24gPSB3
ZWJraXRfYWNjZXNzaWJsZV90YWJsZV9nZXRfcm93X2Rlc2NyaXB0aW9uOwogfQogCitzdGF0aWMg
QXRrSHlwZXJsaW5rKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGluayhBdGtIeXBlcnRl
eHQqIGh5cGVydGV4dCwgZ2ludCBpbmRleCkKK3sKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBj
b3JlT2JqZWN0ID0gY29yZShoeXBlcnRleHQpOworICAgIEFjY2Vzc2liaWxpdHlPYmplY3Q6OkFj
Y2Vzc2liaWxpdHlDaGlsZHJlblZlY3RvciBjaGlsZHJlbiA9IGNvcmVPYmplY3QtPmNoaWxkcmVu
KCk7CisgICAgaWYgKGluZGV4IDwgMCB8fCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oaW5kZXgpID49
IGNoaWxkcmVuLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBnaW50IGN1cnJlbnRM
aW5rID0gLTE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsg
aSsrKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVDaGlsZCA9IGNoaWxkcmVu
LmF0KGkpLmdldCgpOworICAgICAgICBpZiAoIWNvcmVDaGlsZC0+YWNjZXNzaWJpbGl0eUlzSWdu
b3JlZCgpICYmIGNvcmVDaGlsZC0+aXNMaW5rKCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnRMaW5r
Kys7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gY3VycmVudExpbmspCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgICAgIEF0a09iamVjdCogYXhPYmplY3QgPSBjb3JlQ2hp
bGQtPndyYXBwZXIoKTsKKyAgICAgICAgICAgIGlmICghYXhPYmplY3QgfHwgIUFUS19JU19IWVBF
UkxJTktfSU1QTChheE9iamVjdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAg
ICAgICAgIHJldHVybiBhdGtfaHlwZXJsaW5rX2ltcGxfZ2V0X2h5cGVybGluayhBVEtfSFlQRVJM
SU5LX0lNUEwoYXhPYmplY3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOwor
fQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TkxpbmtzKEF0a0h5
cGVydGV4dCogaHlwZXJ0ZXh0KQoreworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmpl
Y3QgPSBjb3JlKGh5cGVydGV4dCk7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdDo6QWNjZXNzaWJp
bGl0eUNoaWxkcmVuVmVjdG9yIGNoaWxkcmVuID0gY29yZU9iamVjdC0+Y2hpbGRyZW4oKTsKKwor
ICAgIGdpbnQgbGlua3NGb3VuZCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNo
aWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVD
aGlsZCA9IGNoaWxkcmVuLmF0KGkpLmdldCgpOworICAgICAgICBpZiAoIWNvcmVDaGlsZC0+YWNj
ZXNzaWJpbGl0eUlzSWdub3JlZCgpICYmIGNvcmVDaGlsZC0+aXNMaW5rKCkpCisgICAgICAgICAg
ICBsaW5rc0ZvdW5kKys7CisgICAgfQorCisgICAgcmV0dXJuIGxpbmtzRm91bmQ7Cit9CisKK3N0
YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXRMaW5rSW5kZXgoQXRrSHlwZXJ0
ZXh0KiBoeXBlcnRleHQsIGdpbnQgY2hhckluZGV4KQoreworICAgIGdpbnQgbkxpbmtzID0gd2Vi
a2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldE5MaW5rcyhoeXBlcnRleHQpOworICAgIGlmICghbkxp
bmtzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGdpbnQgaSA9IDA7IGkgPCBuTGlu
a3M7IGkrKykgeworICAgICAgICBBdGtIeXBlcmxpbmsqIGh5cGVybGluayA9IEFUS19IWVBFUkxJ
Tksod2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldExpbmsoaHlwZXJ0ZXh0LCBpKSk7CisgICAg
ICAgIGdpbnQgc3RhcnRJbmRleCA9IGF0a19oeXBlcmxpbmtfZ2V0X3N0YXJ0X2luZGV4KGh5cGVy
bGluayk7CisgICAgICAgIGdpbnQgZW5kSW5kZXggPSBhdGtfaHlwZXJsaW5rX2dldF9lbmRfaW5k
ZXgoaHlwZXJsaW5rKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2hhciBpbmRleCBpbiB0
aGUgbGluaydzIG9mZnNldCByYW5nZQorICAgICAgICBpZiAoc3RhcnRJbmRleCA8PSBjaGFySW5k
ZXggJiYgY2hhckluZGV4IDwgZW5kSW5kZXgpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9
CisKKyAgICAvLyBOb3QgZm91bmQgaWYgcmVhY2hlZAorICAgIHJldHVybiAtMTsKK30KKworc3Rh
dGljIHZvaWQgYXRrSHlwZXJ0ZXh0SW50ZXJmYWNlSW5pdChBdGtIeXBlcnRleHRJZmFjZSogaWZh
Y2UpCit7CisgICAgaWZhY2UtPmdldF9saW5rID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdl
dExpbms7CisgICAgaWZhY2UtPmdldF9uX2xpbmtzID0gd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4
dEdldE5MaW5rczsKKyAgICBpZmFjZS0+Z2V0X2xpbmtfaW5kZXggPSB3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJ0ZXh0R2V0TGlua0luZGV4OworfQorCitzdGF0aWMgQXRrSHlwZXJsaW5rKiB3ZWJraXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rSW1wbEdldEh5cGVybGluayhBdGtIeXBlcmxpbmtJbXBsKiBoeXBl
cmxpbmspCit7CisgICAgcmV0dXJuIEFUS19IWVBFUkxJTksod2Via2l0QWNjZXNzaWJsZUh5cGVy
bGlua0dldE9yQ3JlYXRlKGh5cGVybGluaykpOworfQorCitzdGF0aWMgdm9pZCBhdGtIeXBlcmxp
bmtJbXBsSW50ZXJmYWNlSW5pdChBdGtIeXBlcmxpbmtJbXBsSWZhY2UqIGlmYWNlKQoreworICAg
IGlmYWNlLT5nZXRfaHlwZXJsaW5rID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ltcGxHZXRI
eXBlcmxpbms7Cit9CisKIHN0YXRpYyBjb25zdCBnY2hhciogZG9jdW1lbnRBdHRyaWJ1dGVWYWx1
ZShBdGtEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IGdjaGFyKiBhdHRyaWJ1dGUpCiB7CiAgICAg
RG9jdW1lbnQqIGNvcmVEb2N1bWVudCA9IGNvcmUoZG9jdW1lbnQpLT5kb2N1bWVudCgpOwpAQCAt
MjAwMiw2ICsyMDg2LDEwIEBAIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyBBdGtJbnRlcmZh
Y2VzSW5pdEZ1bmN0aW9uc1tdID0gewogICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwg
MH0sCiAgICAgeyhHSW50ZXJmYWNlSW5pdEZ1bmMpYXRrX3RhYmxlX2ludGVyZmFjZV9pbml0LAog
ICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCisgICAgeyhHSW50ZXJmYWNlSW5p
dEZ1bmMpYXRrSHlwZXJ0ZXh0SW50ZXJmYWNlSW5pdCwKKyAgICAgKEdJbnRlcmZhY2VGaW5hbGl6
ZUZ1bmMpIDAsIDB9LAorICAgIHsoR0ludGVyZmFjZUluaXRGdW5jKWF0a0h5cGVybGlua0ltcGxJ
bnRlcmZhY2VJbml0LAorICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCiAgICAg
eyhHSW50ZXJmYWNlSW5pdEZ1bmMpYXRrX2RvY3VtZW50X2ludGVyZmFjZV9pbml0LAogICAgICAo
R0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0KIH07CkBAIC0yMDE0LDMxICsyMTAyLDM3IEBA
IGVudW0gV0FJVHlwZSB7CiAgICAgV0FJX0NPTVBPTkVOVCwKICAgICBXQUlfSU1BR0UsCiAgICAg
V0FJX1RBQkxFLAorICAgIFdBSV9IWVBFUlRFWFQsCisgICAgV0FJX0hZUEVSTElOSywKICAgICBX
QUlfRE9DVU1FTlQKIH07CiAKIHN0YXRpYyBHVHlwZSBHZXRBdGtJbnRlcmZhY2VUeXBlRnJvbVdB
SVR5cGUoV0FJVHlwZSB0eXBlKQogewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBXQUlfQUNU
SU9OOgotICAgICAgcmV0dXJuIEFUS19UWVBFX0FDVElPTjsKLSAgY2FzZSBXQUlfU0VMRUNUSU9O
OgotICAgICAgcmV0dXJuIEFUS19UWVBFX1NFTEVDVElPTjsKLSAgY2FzZSBXQUlfRURJVEFCTEVf
VEVYVDoKLSAgICAgIHJldHVybiBBVEtfVFlQRV9FRElUQUJMRV9URVhUOwotICBjYXNlIFdBSV9U
RVhUOgotICAgICAgcmV0dXJuIEFUS19UWVBFX1RFWFQ7Ci0gIGNhc2UgV0FJX0NPTVBPTkVOVDoK
LSAgICAgIHJldHVybiBBVEtfVFlQRV9DT01QT05FTlQ7Ci0gIGNhc2UgV0FJX0lNQUdFOgotICAg
ICAgcmV0dXJuIEFUS19UWVBFX0lNQUdFOwotICBjYXNlIFdBSV9UQUJMRToKLSAgICAgIHJldHVy
biBBVEtfVFlQRV9UQUJMRTsKLSAgY2FzZSBXQUlfRE9DVU1FTlQ6Ci0gICAgICByZXR1cm4gQVRL
X1RZUEVfRE9DVU1FTlQ7Ci0gIH0KLQotICByZXR1cm4gR19UWVBFX0lOVkFMSUQ7CisgICAgc3dp
dGNoICh0eXBlKSB7CisgICAgY2FzZSBXQUlfQUNUSU9OOgorICAgICAgICByZXR1cm4gQVRLX1RZ
UEVfQUNUSU9OOworICAgIGNhc2UgV0FJX1NFTEVDVElPTjoKKyAgICAgICAgcmV0dXJuIEFUS19U
WVBFX1NFTEVDVElPTjsKKyAgICBjYXNlIFdBSV9FRElUQUJMRV9URVhUOgorICAgICAgICByZXR1
cm4gQVRLX1RZUEVfRURJVEFCTEVfVEVYVDsKKyAgICBjYXNlIFdBSV9URVhUOgorICAgICAgICBy
ZXR1cm4gQVRLX1RZUEVfVEVYVDsKKyAgICBjYXNlIFdBSV9DT01QT05FTlQ6CisgICAgICAgIHJl
dHVybiBBVEtfVFlQRV9DT01QT05FTlQ7CisgICAgY2FzZSBXQUlfSU1BR0U6CisgICAgICAgIHJl
dHVybiBBVEtfVFlQRV9JTUFHRTsKKyAgICBjYXNlIFdBSV9UQUJMRToKKyAgICAgICAgcmV0dXJu
IEFUS19UWVBFX1RBQkxFOworICAgIGNhc2UgV0FJX0hZUEVSVEVYVDoKKyAgICAgICAgcmV0dXJu
IEFUS19UWVBFX0hZUEVSVEVYVDsKKyAgICBjYXNlIFdBSV9IWVBFUkxJTks6CisgICAgICAgIHJl
dHVybiBBVEtfVFlQRV9IWVBFUkxJTktfSU1QTDsKKyAgICBjYXNlIFdBSV9ET0NVTUVOVDoKKyAg
ICAgICAgcmV0dXJuIEFUS19UWVBFX0RPQ1VNRU5UOworICAgIH0KKworICAgIHJldHVybiBHX1RZ
UEVfSU5WQUxJRDsKIH0KIAogc3RhdGljIGd1aW50MTYgZ2V0SW50ZXJmYWNlTWFza0Zyb21PYmpl
Y3QoQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCkKQEAgLTIwNDgsMjAgKzIxNDIsMjQg
QEAgc3RhdGljIGd1aW50MTYgZ2V0SW50ZXJmYWNlTWFza0Zyb21PYmplY3QoQWNjZXNzaWJpbGl0
eU9iamVjdCogY29yZU9iamVjdCkKICAgICAvLyBDb21wb25lbnQgaW50ZXJmYWNlIGlzIGFsd2F5
cyBzdXBwb3J0ZWQKICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0NPTVBPTkVOVDsKIAor
ICAgIEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUgPSBjb3JlT2JqZWN0LT5yb2xlVmFsdWUoKTsKKwog
ICAgIC8vIEFjdGlvbgotICAgIGlmICghY29yZU9iamVjdC0+YWN0aW9uVmVyYigpLmlzRW1wdHko
KSkKKyAgICBpZiAoIWNvcmVPYmplY3QtPmFjdGlvblZlcmIoKS5pc0VtcHR5KCkpIHsKICAgICAg
ICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9BQ1RJT047CiAKKyAgICAgICAgaWYgKCFjb3Jl
T2JqZWN0LT5hY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgJiYgY29yZU9iamVjdC0+aXNMaW5rKCkp
CisgICAgICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0hZUEVSTElOSzsKKyAgICB9
CisKICAgICAvLyBTZWxlY3Rpb24KICAgICBpZiAoY29yZU9iamVjdC0+aXNMaXN0Qm94KCkpCiAg
ICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfU0VMRUNUSU9OOwogCiAgICAgLy8gVGV4
dCAmIEVkaXRhYmxlIFRleHQKLSAgICBBY2Nlc3NpYmlsaXR5Um9sZSByb2xlID0gY29yZU9iamVj
dC0+cm9sZVZhbHVlKCk7Ci0KICAgICBpZiAocm9sZSA9PSBTdGF0aWNUZXh0Um9sZSkKICAgICAg
ICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9URVhUOwotICAgIGVsc2UgaWYgKGNvcmVPYmpl
Y3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKQorICAgIGVsc2UgaWYgKGNvcmVPYmpl
Y3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKSB7CiAgICAgICAgIGlmIChjb3JlT2Jq
ZWN0LT5pc1RleHRDb250cm9sKCkpIHsKICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8
PCBXQUlfVEVYVDsKICAgICAgICAgICAgIGlmICghY29yZU9iamVjdC0+aXNSZWFkT25seSgpKQpA
QCAtMjA2OSwxOCArMjE2NywyNCBAQCBzdGF0aWMgZ3VpbnQxNiBnZXRJbnRlcmZhY2VNYXNrRnJv
bU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0KQogICAgICAgICB9IGVsc2Ug
ewogICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCogYXhSZW5kZXJPYmplY3Qg
PSBzdGF0aWNfY2FzdDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Kj4oY29yZU9iamVjdCk7CiAg
ICAgICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gYXhSZW5kZXJPYmplY3QtPnJlbmRl
cmVyKCk7Ci0gICAgICAgICAgICBpZiAocm9sZSAhPSBUYWJsZVJvbGUgJiYgcmVuZGVyZXIgJiYg
cmVuZGVyZXItPmNoaWxkcmVuSW5saW5lKCkpCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTWFz
ayB8PSAxIDw8IFdBSV9URVhUOwotICAgICAgICAgICAgZWxzZSBpZiAocm9sZSA9PSBMaXN0SXRl
bVJvbGUpIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIFRFWFQgaW50ZXJmYWNlIGZvciBs
aXN0IGl0ZW1zIHdob3NlCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGls
ZCBoYXMgYSB0ZXh0IHJlbmRlcmVyCisgICAgICAgICAgICBpZiAocm9sZSAhPSBUYWJsZVJvbGUp
IHsKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0hZUEVSVEVYVDsK
KyAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmNoaWxkcmVuSW5saW5l
KCkpCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfVEVYVDsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIHRoZSBURVhUIGludGVyZmFjZSBm
b3IgbGlzdCBpdGVtcyB3aG9zZQorICAgICAgICAgICAgLy8gZmlyc3QgYWNjZXNzaWJsZSBjaGls
ZCBoYXMgYSB0ZXh0IHJlbmRlcmVyCisgICAgICAgICAgICBpZiAocm9sZSA9PSBMaXN0SXRlbVJv
bGUpIHsKICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpBY2Nlc3NpYmlsaXR5
Q2hpbGRyZW5WZWN0b3IgY2hpbGRyZW4gPSBheFJlbmRlck9iamVjdC0+Y2hpbGRyZW4oKTsKICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAg
IEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4UmVuZGVyQ2hpbGQgPSBjaGlsZHJlbi5hdCgwKS5nZXQo
KTsKICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSBnZXRJbnRlcmZhY2VNYXNr
RnJvbU9iamVjdChheFJlbmRlckNoaWxkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICB9CisKICAgICAgICAgfQorICAgIH0KIAogICAgIC8vIEltYWdlCiAgICAgaWYgKGNvcmVPYmpl
Y3QtPmlzSW1hZ2UoKSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2Vi
S2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dl
YktpdEFjY2Vzc2libGVIeXBlcmxpbmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmYyN2MxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
Z3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgiCisKKyNpZiBIQVZFKEFDQ0VTU0lC
SUxJVFkpCisKKyNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCisjaW5jbHVkZSAiQWNjZXNzaWJp
bGl0eU9iamVjdC5oIgorI2luY2x1ZGUgIkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmgi
CisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUG9zaXRpb24uaCIKKyNpbmNsdWRlICJSYW5nZS5oIgor
I2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIK
KyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKKworI2luY2x1ZGUgPGF0ay9hdGsuaD4KKyNpbmNs
dWRlIDxnbGliLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCisvLyBVc2UgdGhpcyBo
YXNoIHRhYmxlIHRvIGhlbHAgcmV1c2luZyBpbnN0YW5jZXMgb2YgdGhlCisvLyBXZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rIGNsYXNzIHRocm91Z2hvdXQgdGhlCisvLyB3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rR2V0T3JDcmVhdGUgbWV0aG9kCitzdGF0aWMgR0hhc2hUYWJsZSogaGFzaFRhYmxl
ID0gMDsKKworc3RhdGljIGdwb2ludGVyIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRD
bGFzcyA9IDA7CisKKy8vIFVzZWQgdG8gcHJvdmlkZSBjb25zdCBjaGFyKiByZXR1cm5zLgorc3Rh
dGljIGNvbnN0IGNoYXIqIHJldHVyblN0cmluZyhjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBz
dGF0aWMgQ1N0cmluZyByZXR1cm5lZFN0cmluZzsKKyAgICByZXR1cm5lZFN0cmluZyA9IHN0ci51
dGY4KCk7CisgICAgcmV0dXJuIHJldHVybmVkU3RyaW5nLmRhdGEoKTsKK30KKworc3RhdGljIEFj
Y2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGwpCit7Cisg
ICAgaWYgKCFsaW5rSW1wbCB8fCAhV0VCS0lUX0lTX0FDQ0VTU0lCTEUobGlua0ltcGwpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiB3ZWJraXRfYWNjZXNzaWJsZV9nZXRfYWNjZXNz
aWJpbGl0eV9vYmplY3QoV0VCS0lUX0FDQ0VTU0lCTEUobGlua0ltcGwpKTsKK30KKworc3RhdGlj
IEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmUoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGlu
aykKK3sKKyAgICBpZiAoIWxpbmspCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNv
cmUobGluay0+bGlua0ltcGwpOworfQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29y
ZShBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgaWYgKCFXRUJLSVRfSVNfQUNDRVNTSUJMRV9I
WVBFUkxJTksobGluaykpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNvcmUoV0VC
S0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxp
dHlPYmplY3QqIGNvcmUoQXRrQWN0aW9uKiBhY3Rpb24pCit7CisgICAgcmV0dXJuIGNvcmUoV0VC
S0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbikpOworfQorCisKK3N0YXRpYyBnYm9vbGVh
biB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uRG9BY3Rpb24oQXRrQWN0aW9uKiBhY3Rp
b24sIGdpbnQgaW5kZXgpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FD
Q0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiksIEZBTFNFKTsKKyAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0ltcGwsIEZBTFNF
KTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghaW5kZXgsIEZBTFNFKTsKKworICAgIGlmICgh
QVRLX0lTX0FDVElPTihXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0lt
cGwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBj
b3JlT2JqZWN0ID0gY29yZShhY3Rpb24pOworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAgICAg
cmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIGNvcmVPYmplY3QtPnBlcmZvcm1EZWZhdWx0QWN0
aW9uKCk7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25H
ZXROQWN0aW9ucyhBdGtBY3Rpb24qIGFjdGlvbikKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKSwgMCk7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiktPmxpbmtJ
bXBsLCAwKTsKKworICAgIGlmICghQVRLX0lTX0FDVElPTihXRUJLSVRfQUNDRVNTSUJMRV9IWVBF
UkxJTksoYWN0aW9uKS0+bGlua0ltcGwpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVy
biAxOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtB
Y3Rpb25HZXREZXNjcmlwdGlvbihBdGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0
aW9uKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQ
RVJMSU5LKGFjdGlvbiktPmxpbmtJbXBsLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCgh
aW5kZXgsIDApOworCisgICAgLy8gVE9ETzogTmVlZCBhIHdheSB0byBwcm92aWRlL2xvY2FsaXpl
IGFjdGlvbiBkZXNjcmlwdGlvbnMuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
IiI7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkdldEtleWJpbmRpbmcoQXRrQWN0aW9uKiBhY3Rpb24sIGdpbnQgaW5kZXgpCit7CisgICAg
Z19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlv
biksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVS
TElOSyhhY3Rpb24pLT5saW5rSW1wbCwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWlu
ZGV4LCAwKTsKKworICAgIGlmICghQVRLX0lTX0FDVElPTihXRUJLSVRfQUNDRVNTSUJMRV9IWVBF
UkxJTksoYWN0aW9uKS0+bGlua0ltcGwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZShhY3Rpb24pOworICAgIGlmICgh
Y29yZU9iamVjdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIHJldHVyblN0
cmluZyhjb3JlT2JqZWN0LT5hY2Nlc3NLZXkoKS5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBjb25z
dCBnY2hhciogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5hbWUoQXRrQWN0aW9u
KiBhY3Rpb24sIGdpbnQgaW5kZXgpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lU
X0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiksIDApOworICAgIGdfcmV0dXJuX3ZhbF9p
Zl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCwgMCk7
CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWluZGV4LCAwKTsKKworICAgIGlmICghQVRLX0lT
X0FDVElPTihXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0ltcGwpKQor
ICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2Jq
ZWN0ID0gY29yZShhY3Rpb24pOworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAgICAgcmV0dXJu
IEZBTFNFOworCisgICAgcmV0dXJuIHJldHVyblN0cmluZyhjb3JlT2JqZWN0LT5hY3Rpb25WZXJi
KCkpOworfQorCitzdGF0aWMgdm9pZCBhdGtBY3Rpb25JbnRlcmZhY2VJbml0KEF0a0FjdGlvbklm
YWNlKiBpZmFjZSkKK3sKKyAgICBpZmFjZS0+ZG9fYWN0aW9uID0gd2Via2l0QWNjZXNzaWJsZUh5
cGVybGlua0FjdGlvbkRvQWN0aW9uOworICAgIGlmYWNlLT5nZXRfbl9hY3Rpb25zID0gd2Via2l0
QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5BY3Rpb25zOworICAgIGlmYWNlLT5nZXRfZGVz
Y3JpcHRpb24gPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0RGVzY3JpcHRpb247
CisgICAgaWZhY2UtPmdldF9rZXliaW5kaW5nID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkdldEtleWJpbmRpbmc7CisgICAgaWZhY2UtPmdldF9uYW1lID0gd2Via2l0QWNjZXNzaWJs
ZUh5cGVybGlua0FjdGlvbkdldE5hbWU7Cit9CisKK3N0YXRpYyBnY2hhciogd2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0dldFVyaShBdGtIeXBlcmxpbmsqIGxpbmssIGdpbnQgaW5kZXgpCit7Cisg
ICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxp
bmspLCAwKTsKKyAgICAvLyBGSVhNRSBEbyBOT1Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIGluc3Rh
bmNlIG9mIGFuIEF0a09iamVjdAorICAgIC8vIGltcGxlbWVudGluZyBBdGtIeXBlcmxpbmtJbXBs
IGluIGV2ZXJ5IGluc3RhbmNlIG9mIEF0a0h5cGVyTGluaworICAgIGdfcmV0dXJuX3ZhbF9pZl9m
YWlsKCFpbmRleCwgMCk7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0g
Y29yZShsaW5rKTsKKyAgICBpZiAoIWNvcmVPYmplY3QgfHwgY29yZU9iamVjdC0+dXJsKCkuaXNO
dWxsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdfc3RyZHVwKHJldHVyblN0
cmluZyhjb3JlT2JqZWN0LT51cmwoKS5zdHJpbmcoKSkpOworfQorCitzdGF0aWMgQXRrT2JqZWN0
KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2JqZWN0KEF0a0h5cGVybGluayogbGluaywg
Z2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNT
SUJMRV9IWVBFUkxJTksobGluayksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJ
VF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+bGlua0ltcGwsIDApOworCisgICAgLy8gRklY
TUUgRG8gTk9UIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiBhbiBBdGtPYmplY3QK
KyAgICAvLyBpbXBsZW1lbnRpbmcgQXRrSHlwZXJsaW5rSW1wbCBpbiBldmVyeSBpbnN0YW5jZSBv
ZiBBdGtIeXBlckxpbmsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisg
ICAgcmV0dXJuIEFUS19PQkpFQ1QoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLT5s
aW5rSW1wbCk7Cit9CisKK3N0YXRpYyBnaW50IGdldFJhbmdlTGVuZ3RoRm9yT2JqZWN0KEFjY2Vz
c2liaWxpdHlPYmplY3QqIG9iaiwgUmFuZ2UqIHJhbmdlKQoreworICAgIC8vIFRoaXMgaXMgZ29p
bmcgdG8gYmUgdGhlIGFjdHVhbCBsZW5ndGggaW4gbW9zdCBvZiB0aGUgY2FzZXMKKyAgICBnaW50
IGJhc2VMZW5ndGggPSBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHJhbmdlKTsKKworICAgIC8v
IENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgaHlwZXJsaW5rIGJlbG9uZ3MgdG8gYSBsaXN0IGl0
ZW0uCisgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUg
aXRlbSdzIG1hcmtlcgorICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIHBhcmVudCA9IG9iai0+cGFy
ZW50T2JqZWN0VW5pZ25vcmVkKCk7CisgICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+aXNBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0KCkgfHwgIXBhcmVudC0+aXNMaXN0SXRlbSgpKQorICAgICAg
ICByZXR1cm4gYmFzZUxlbmd0aDsKKworICAgIC8vIEV2ZW4gaWYgd2UgZG9uJ3QgZXhwb3NlIGxp
c3QgbWFya2VycyB0byBBc3Npc3RpdmUKKyAgICAvLyBUZWNobm9sb2dpZXMsIHdlIG5lZWQgdG8g
aGF2ZSBhIHdheSB0byBtZWFzdXJlIHRoZWlyIGxlbmd0aAorICAgIC8vIGZvciB0aG9zZSBjYXNl
cyB3aGVuIGl0J3MgbmVlZGVkIHRvIHRha2UgaXQgaW50byBhY2NvdW50CisgICAgLy8gc2VwYXJh
dGVseSAoYXMgaW4gZ2V0QWNjZXNzaWJpbGl0eU9iamVjdEZvck9mZnNldCkKKyAgICBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBtYXJrZXJPYmogPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICBpZiAo
IW1hcmtlck9iaikKKyAgICAgICAgcmV0dXJuIGJhc2VMZW5ndGg7CisKKyAgICBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dCo+KG1hcmtlck9iaiktPnJlbmRlcmVyKCk7CisgICAgaWYgKCFyZW5kZXJlciB8fCAhcmVuZGVy
ZXItPmlzTGlzdE1hcmtlcigpKQorICAgICAgICByZXR1cm4gYmFzZUxlbmd0aDsKKworICAgIFJl
bmRlckxpc3RNYXJrZXIqIG1hcmtlciA9IHRvUmVuZGVyTGlzdE1hcmtlcihyZW5kZXJlcik7Cisg
ICAgcmV0dXJuIGJhc2VMZW5ndGggKyBtYXJrZXItPnRleHQoKS5sZW5ndGgoKSArIG1hcmtlci0+
c3VmZml4KCkubGVuZ3RoKCk7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtHZXRTdGFydEluZGV4KEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOworCisg
ICAgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUobGluayk7CisgICAgaWYg
KCFjb3JlT2JqZWN0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGUqIG5vZGUgPSBjb3Jl
T2JqZWN0LT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKG5vZGUtPmRvY3VtZW50KCksIGZp
cnN0UG9zaXRpb25Jbk5vZGUobm9kZS0+cGFyZW50Tm9kZSgpKSwgZmlyc3RQb3NpdGlvbkluTm9k
ZShub2RlKSk7CisgICAgcmV0dXJuIGdldFJhbmdlTGVuZ3RoRm9yT2JqZWN0KGNvcmVPYmplY3Qs
IHJhbmdlLmdldCgpKTsKK30KKworc3RhdGljIGdpbnQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldEVuZEluZGV4KEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOworCisgICAgQWNj
ZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUobGluayk7CisgICAgaWYgKCFjb3Jl
T2JqZWN0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGUqIG5vZGUgPSBjb3JlT2JqZWN0
LT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0
cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKG5vZGUtPmRvY3VtZW50KCksIGZpcnN0UG9z
aXRpb25Jbk5vZGUobm9kZS0+cGFyZW50Tm9kZSgpKSwgbGFzdFBvc2l0aW9uSW5Ob2RlKG5vZGUp
KTsKKyAgICByZXR1cm4gZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QoY29yZU9iamVjdCwgcmFuZ2Uu
Z2V0KCkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lz
VmFsaWQoQXRrSHlwZXJsaW5rKiBsaW5rKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdF
QktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKSwgMCk7CisgICAgZ19yZXR1cm5fdmFs
X2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLT5saW5rSW1wbCwgRkFM
U0UpOworCisgICAgLy8gTGluayBpcyB2YWxpZCBmb3IgdGhlIHdob2xlIG9iamVjdCdzIGxpZmV0
aW1lCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtHZXROQW5jaG9ycyhBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgLy8gRklYTUUg
RG8gTk9UIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiBhbiBBdGtPYmplY3QKKyAg
ICAvLyBpbXBsZW1lbnRpbmcgQXRrSHlwZXJsaW5rSW1wbCBpbiBldmVyeSBpbnN0YW5jZSBvZiBB
dGtIeXBlckxpbmsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJM
RV9IWVBFUkxJTksobGluayksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9B
Q0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+bGlua0ltcGwsIDApOworICAgIHJldHVybiAxOwor
fQorCitzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lzU2VsZWN0ZWRM
aW5rKEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICAvLyBOb3QgaW1wbGVtZW50ZWQ6IHRoaXMg
ZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBpbiBBVEsgbm93CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtJbml0KEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICBXRUJLSVRfQUNDRVNTSUJMRV9I
WVBFUkxJTksobGluayktPmxpbmtJbXBsID0gMDsKK30KKworc3RhdGljIHZvaWQgd2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKK3sKKyAgICBHX09CSkVD
VF9DTEFTUyh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rUGFyZW50Q2xhc3MpLT5maW5hbGl6ZShv
YmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3NJ
bml0KEF0a0h5cGVybGlua0NsYXNzKiBrbGFzcykKK3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmpl
Y3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKKworICAgIHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtQYXJlbnRDbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudChrbGFzcyk7CisK
KyAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Zp
bmFsaXplOworCisgICAga2xhc3MtPmdldF91cmkgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
R2V0VXJpOworICAgIGtsYXNzLT5nZXRfb2JqZWN0ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldE9iamVjdDsKKyAgICBrbGFzcy0+Z2V0X3N0YXJ0X2luZGV4ID0gd2Via2l0QWNjZXNzaWJs
ZUh5cGVybGlua0dldFN0YXJ0SW5kZXg7CisgICAga2xhc3MtPmdldF9lbmRfaW5kZXggPSB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0RW5kSW5kZXg7CisgICAga2xhc3MtPmlzX3ZhbGlkID0g
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0lzVmFsaWQ7CisgICAga2xhc3MtPmdldF9uX2FuY2hv
cnMgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0TkFuY2hvcnM7CisgICAga2xhc3MtPmlz
X3NlbGVjdGVkX2xpbmsgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNTZWxlY3RlZExpbms7
Cit9CisKK0dUeXBlCit3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VHlwZSh2b2lkKQorewor
ICAgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSB0eXBlVm9sYXRpbGUgPSAwOworCisgICAgaWYgKGdf
b25jZV9pbml0X2VudGVyKCZ0eXBlVm9sYXRpbGUpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBH
VHlwZUluZm8gdGluZm8gPSB7CisgICAgICAgICAgICBzaXplb2YoV2ViS2l0QWNjZXNzaWJsZUh5
cGVybGlua0NsYXNzKSwKKyAgICAgICAgICAgIChHQmFzZUluaXRGdW5jKSAwLAorICAgICAgICAg
ICAgKEdCYXNlRmluYWxpemVGdW5jKSAwLAorICAgICAgICAgICAgKEdDbGFzc0luaXRGdW5jKSB3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3NJbml0LAorICAgICAgICAgICAgKEdDbGFzc0Zp
bmFsaXplRnVuYykgMCwKKyAgICAgICAgICAgIDAsIC8qIGNsYXNzIGRhdGEgKi8KKyAgICAgICAg
ICAgIHNpemVvZihXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKSwgLyogaW5zdGFuY2Ugc2l6ZSAq
LworICAgICAgICAgICAgMCwgLyogbmIgcHJlYWxsb2NzICovCisgICAgICAgICAgICAoR0luc3Rh
bmNlSW5pdEZ1bmMpIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbml0LAorICAgICAgICAgICAg
MCAvKiB2YWx1ZSB0YWJsZSAqLworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBH
SW50ZXJmYWNlSW5mbyBhY3Rpb25JbmZvID0KKyAgICAgICAgICB7CisgICAgICAgICAgICAoR0lu
dGVyZmFjZUluaXRGdW5jKShHSW50ZXJmYWNlSW5pdEZ1bmMpYXRrQWN0aW9uSW50ZXJmYWNlSW5p
dCwKKyAgICAgICAgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwCisgICAgICAgICAg
fTsKKworICAgICAgICBHVHlwZSB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyhBVEtfVFlQ
RV9IWVBFUkxJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIiwgJnRpbmZvLCBHVHlwZUZsYWdzKDApKTsKKyAg
ICAgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljKHR5cGUsIEFUS19UWVBFX0FDVElPTiwg
JmFjdGlvbkluZm8pOworCisgICAgICAgIGdfb25jZV9pbml0X2xlYXZlKCZ0eXBlVm9sYXRpbGUs
IHR5cGUpOworICAgIH0KKworICAgIHJldHVybiB0eXBlVm9sYXRpbGU7Cit9CisKK3N0YXRpYyB2
b2lkIGh5cGVybGlua0ltcGxGaW5hbGl6ZWQoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGlu
aywgQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGwpCit7CisgICAgLy8gT2JqZWN0IG5vIGxvbmdl
ciBhbGl2ZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGhhc2ggdGFibGUgYW5kCisgICAgLy8gZGVzdHJv
eSB0aGUgQXRrSHlwZXJsaW5rIG9iamVjdAorICAgIEFTU0VSVChoYXNoVGFibGUpOworICAgIGdf
aGFzaF90YWJsZV9yZW1vdmUoaGFzaFRhYmxlLCAodm9pZCopbGlua0ltcGwpOworICAgIGdfb2Jq
ZWN0X3VucmVmKGxpbmspOworfQorCitXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKiB3ZWJraXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUoQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGwp
Cit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoQVRLX0lTX0hZUEVSTElOS19JTVBMKGxpbmtJ
bXBsKSwgMCk7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIGZvciB0aGUgaGFzaCB0YWJs
ZQorICAgIGlmICghaGFzaFRhYmxlKQorICAgICAgICBoYXNoVGFibGUgPSBnX2hhc2hfdGFibGVf
bmV3KGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsKTsKKworICAgIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsqIGxpbmsgPSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoZ19oYXNoX3Rh
YmxlX2xvb2t1cChoYXNoVGFibGUsIChjb25zdCB2b2lkKilsaW5rSW1wbCkpOworICAgIGlmICgh
bGluaykgeworICAgICAgICBsaW5rID0gc3RhdGljX2Nhc3Q8V2ViS2l0QWNjZXNzaWJsZUh5cGVy
bGluayo+KGdfb2JqZWN0X25ldyhXRUJLSVRfVFlQRV9BQ0NFU1NJQkxFX0hZUEVSTElOSywgMCkp
OworICAgICAgICBsaW5rLT5saW5rSW1wbCA9IGxpbmtJbXBsOworCisgICAgICAgIGdfb2JqZWN0
X3dlYWtfcmVmKEdfT0JKRUNUKGxpbmtJbXBsKSwgKEdXZWFrTm90aWZ5KWh5cGVybGlua0ltcGxG
aW5hbGl6ZWQsIGxpbmspOworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0KGhhc2hUYWJsZSwg
KHZvaWQqKWxpbmtJbXBsLCBsaW5rKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30KKwor
V2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdCogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dl
dEFjY2Vzc2liaWxpdHlPYmplY3QoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogbGluaykKK3sK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTkso
bGluayksIDApOworICAgIHJldHVybiBjb3JlKGxpbmspOworfQorCisjZW5kaWYgLy8gSEFWRShB
Q0NFU1NJQklMSVRZKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmggYi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktp
dEFjY2Vzc2libGVIeXBlcmxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5mNzhlY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9X
ZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFdlYktpdEFjY2Vzc2libGVIeXBlcmxp
bmtfaAorI2RlZmluZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rX2gKKworI2luY2x1ZGUgPGF0
ay9hdGsuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQWNjZXNzaWJpbGl0eU9iamVj
dDsKK30KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVf
SFlQRVJMSU5LICAgICAgICAgICAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRU
eXBlICgpKQorI2RlZmluZSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksob2JqKSAgICAgICAg
ICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFdFQktJVF9UWVBF
X0FDQ0VTU0lCTEVfSFlQRVJMSU5LLCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rKSkKKyNkZWZp
bmUgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0NMQVNTKGtsYXNzKSAgICAgICAgICAoR19U
WVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQ
RVJMSU5LLCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MpKQorI2RlZmluZSBXRUJLSVRf
SVNfQUNDRVNTSUJMRV9IWVBFUkxJTksob2JqKSAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tf
SU5TVEFOQ0VfVFlQRSAoKG9iaiksIFdFQktJVF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKSkK
KyNkZWZpbmUgV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0NMQVNTKGtsYXNzKSAgICAg
ICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIFdFQktJVF9UWVBFX0FDQ0VTU0lC
TEVfSFlQRVJMSU5LKSkKKyNkZWZpbmUgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0dFVF9D
TEFTUyhvYmopICAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFdFQktJ
VF9UWVBFX0FDQ0VTU0lCTEVfSFlQRVJMSU5LLCBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xh
c3MpKQorCit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayAgICAgICAg
ICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rOwordHlwZWRlZiBzdHJ1Y3QgX1dlYktp
dEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcyAgICAgICAgICAgV2ViS2l0QWNjZXNzaWJsZUh5cGVy
bGlua0NsYXNzOworCitzdHJ1Y3QgX1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgeworICAgIEF0
a0h5cGVybGluayBwYXJlbnQ7CisgICAgQXRrSHlwZXJsaW5rSW1wbCogbGlua0ltcGw7Cit9Owor
CitzdHJ1Y3QgX1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcyB7CisgICAgQXRrT2JqZWN0
Q2xhc3MgcGFyZW50Q2xhc3M7Cit9OworCitHVHlwZSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
R2V0VHlwZSh2b2lkKSBHX0dOVUNfQ09OU1Q7CisKK1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsq
IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNyZWF0ZShBdGtIeXBlcmxpbmtJbXBsKiBs
aW5rSW1wbCk7CisKK1dlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3QqIHdlYmtpdEFjY2Vzc2li
bGVIeXBlcmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KFdlYktpdEFjY2Vzc2libGVIeXBlcmxp
bmsqIGxpbmspOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLy8gV2ViS2l0QWNjZXNzaWJsZUh5
cGVybGlua19oCmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL0NoYW5nZUxvZyBiL1dlYktpdC9ndGsv
Q2hhbmdlTG9nCmluZGV4IGQxOTkwMmMuLmUzOTRkMzYgMTAwNjQ0Ci0tLSBhL1dlYktpdC9ndGsv
Q2hhbmdlTG9nCisrKyBiL1dlYktpdC9ndGsvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIw
MTAtMTAtMjAgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHdGtdIEF0a0h5
cGVybGluayBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODUKKworICAgICAgICBOZXcgdGVzdCB0byBlbnN1
cmUgdGhlIEF0a0h5cGVydGV4dC9BdGtIeXBlcmxpbmsgc3R1ZmYgd29ya3MuCisKKyAgICAgICAg
KiB0ZXN0cy90ZXN0YXRrLmM6CisgICAgICAgICh0ZXN0V2Via2l0QXRrSHlwZXJ0ZXh0QW5kSHlw
ZXJsaW5rcyk6IE5ldyB0ZXN0LCBjaGVja2luZyBib3RoIHRoZQorICAgICAgICBpbXBsZW1lbnRh
dGlvbiBvZiB0aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZSwgdGhlIHN1YmNsYXNzIG9mIHRoZQor
ICAgICAgICBBdGtIeXBlcmxpbmsgYWJzdHJhY3QgY2xhc3MsIGFuZCB0aGUgaW1wbGVtZW50YXRp
b24gb2YgdGhlCisgICAgICAgIEF0a0FjdGlvbiBpbnRlcmZhY2UgaW4gdGhhdCBzdWJjbGFzcy4K
KyAgICAgICAgKG1haW4pOiBBZGRlZCB0aGUgbmV3IHVuaXQgdGVzdC4KKwogMjAxMC0xMC0xOSAg
Sm9vbmUgSHVyICA8am9vbmVAa2xkcC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGlu
IFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMgYi9XZWJL
aXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwppbmRleCBjOGRmNGVmLi40Mjg2Mjc1IDEwMDY0NAotLS0g
YS9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYworKysgYi9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3Rh
dGsuYwpAQCAtNDYsNiArNDYsOCBAQCBzdGF0aWMgY29uc3QgY2hhciogY29udGVudHNJblRhYmxl
V2l0aEhlYWRlcnMgPSAiPGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGg+Zm9vPAogCiBzdGF0aWMg
Y29uc3QgY2hhciogZm9ybVdpdGhUZXh0SW5wdXRzID0gIjxodG1sPjxib2R5Pjxmb3JtPjxpbnB1
dCB0eXBlPSd0ZXh0JyBuYW1lPSdlbnRyeScgLz48L2Zvcm0+PC9ib2R5PjwvaHRtbD4iOwogCitz
dGF0aWMgY29uc3QgY2hhciogaHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyA9ICI8aHRtbD48Ym9keT48
cD5BIHBhcmFncmFwaCB3aXRoIG5vIGxpbmtzIGF0IGFsbDwvcD48cD48YSBocmVmPSdodHRwOi8v
Zm9vLmJhci5iYXovJz5BIGxpbmU8L2E+IHdpdGggPGEgaHJlZj0naHR0cDovL2Jhci5iYXouZm9v
Lyc+YSBsaW5rIGluIHRoZSBtaWRkbGU8L2E+IGFzIHdlbGwgYXMgYXQgdGhlIGJlZ2lubmluZyBh
bmQgPGEgaHJlZj0naHR0cDovL2Jhei5mb28uYmFyLyc+YXQgdGhlIGVuZDwvYT48L3A+PC9ib2R5
PjwvaHRtbD4iOworCiBzdGF0aWMgY29uc3QgY2hhciogbGlzdHNPZkl0ZW1zID0gIjxodG1sPjxi
b2R5Pjx1bD48bGk+dGV4dCBvbmx5PC9saT48bGk+PGEgaHJlZj0nZm9vJz5saW5rIG9ubHk8L2E+
PC9saT48bGk+dGV4dCBhbmQgYSA8YSBocmVmPSdiYXInPmxpbms8L2E+PC9saT48L3VsPjxvbD48
bGk+dGV4dCBvbmx5PC9saT48bGk+PGEgaHJlZj0nZm9vJz5saW5rIG9ubHk8L2E+PC9saT48bGk+
dGV4dCBhbmQgYSA8YSBocmVmPSdiYXInPmxpbms8L2E+PC9saT48L29sPjwvYm9keT48L2h0bWw+
IjsKIAogc3RhdGljIGNvbnN0IGNoYXIqIHRleHRGb3JTZWxlY3Rpb25zID0gIjxodG1sPjxib2R5
PjxwPkEgcGFyYWdyYXBoIHdpdGggcGxhaW4gdGV4dDwvcD48cD5BIHBhcmFncmFwaCB3aXRoIDxh
IGhyZWY9J2h0dHA6Ly93ZWJraXQub3JnJz5hIGxpbms8L2E+IGluIHRoZSBtaWRkbGU8L3A+PC9i
b2R5PjwvaHRtbD4iOwpAQCAtOTY0LDYgKzk2Niw4MiBAQCBzdGF0aWMgdm9pZCB0ZXN0V2Via2l0
QXRrR2V0RXh0ZW50cyh2b2lkKQogICAgIGdfb2JqZWN0X3VucmVmKHdlYlZpZXcpOwogfQogCitz
dGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrSHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyh2b2lkKQorewor
ICAgIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92
aWV3X25ldygpKTsKKyAgICBnX29iamVjdF9yZWZfc2luayh3ZWJWaWV3KTsKKyAgICBHdGtBbGxv
Y2F0aW9uIGFsbG9jID0geyAwLCAwLCA4MDAsIDYwMCB9OworICAgIGd0a193aWRnZXRfc2l6ZV9h
bGxvY2F0ZShHVEtfV0lER0VUKHdlYlZpZXcpLCAmYWxsb2MpOworICAgIHdlYmtpdF93ZWJfdmll
d19sb2FkX3N0cmluZyh3ZWJWaWV3LCBoeXBlcnRleHRBbmRIeXBlcmxpbmtzLCAwLCAwLCAwKTsK
KyAgICBHTWFpbkxvb3AqIGxvb3AgPSBnX21haW5fbG9vcF9uZXcoMCwgVFJVRSk7CisKKyAgICBn
X2lkbGVfYWRkKChHU291cmNlRnVuYyliYWlsX291dCwgbG9vcCk7CisgICAgZ19tYWluX2xvb3Bf
cnVuKGxvb3ApOworCisgICAgQXRrT2JqZWN0KiBvYmogPSBndGtfd2lkZ2V0X2dldF9hY2Nlc3Np
YmxlKEdUS19XSURHRVQod2ViVmlldykpOworICAgIGdfYXNzZXJ0KG9iaik7CisKKyAgICBBdGtP
YmplY3QqIHBhcmFncmFwaDEgPSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9iaiwg
MCk7CisgICAgZ19hc3NlcnQoQVRLX09CSkVDVChwYXJhZ3JhcGgxKSk7CisgICAgZ19hc3NlcnQo
YXRrX29iamVjdF9nZXRfcm9sZShwYXJhZ3JhcGgxKSA9PSBBVEtfUk9MRV9QQVJBR1JBUEgpOwor
ICAgIGdfYXNzZXJ0KEFUS19JU19IWVBFUlRFWFQocGFyYWdyYXBoMSkpOworCisgICAgLy8gTm8g
bGlua3MgaW4gdGhlIGZpcnN0IHBhcmFncmFwaAorICAgIGdpbnQgbkxpbmtzID0gYXRrX2h5cGVy
dGV4dF9nZXRfbl9saW5rcyhBVEtfSFlQRVJURVhUKHBhcmFncmFwaDEpKTsKKyAgICBnX2Fzc2Vy
dF9jbXBpbnQobkxpbmtzLCA9PSwgMCk7CisKKyAgICBBdGtPYmplY3QqIHBhcmFncmFwaDIgPSBh
dGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9iaiwgMSk7CisgICAgZ19hc3NlcnQoQVRL
X09CSkVDVChwYXJhZ3JhcGgyKSk7CisgICAgZ19hc3NlcnQoYXRrX29iamVjdF9nZXRfcm9sZShw
YXJhZ3JhcGgyKSA9PSBBVEtfUk9MRV9QQVJBR1JBUEgpOworICAgIGdfYXNzZXJ0KEFUS19JU19I
WVBFUlRFWFQocGFyYWdyYXBoMikpOworCisgICAgLy8gQ2hlY2sgbGlua3MgaW4gdGhlIHNlY29u
ZCBwYXJhZ3JhcGgKKyAgICBuTGlua3MgPSBhdGtfaHlwZXJ0ZXh0X2dldF9uX2xpbmtzKEFUS19I
WVBFUlRFWFQocGFyYWdyYXBoMikpOworICAgIGdfYXNzZXJ0X2NtcGludChuTGlua3MsID09LCAz
KTsKKworICAgIEF0a0h5cGVybGluayogaExpbmsxID0gYXRrX2h5cGVydGV4dF9nZXRfbGluayhB
VEtfSFlQRVJURVhUKHBhcmFncmFwaDIpLCAwKTsKKyAgICBnX2Fzc2VydChBVEtfSFlQRVJMSU5L
KGhMaW5rMSkpOworICAgIEF0a09iamVjdCogaExpbmtPYmplY3QxID0gYXRrX2h5cGVybGlua19n
ZXRfb2JqZWN0KGhMaW5rMSwgMCk7CisgICAgZ19hc3NlcnQoQVRLX09CSkVDVChoTGlua09iamVj
dDEpKTsKKyAgICBnX2Fzc2VydChhdGtfb2JqZWN0X2dldF9yb2xlKGhMaW5rT2JqZWN0MSkgPT0g
QVRLX1JPTEVfTElOSyk7CisgICAgZ19hc3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X3N0
YXJ0X2luZGV4KGhMaW5rMSksID09LCAwKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVy
bGlua19nZXRfZW5kX2luZGV4KGhMaW5rMSksID09LCA2KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQo
YXRrX2h5cGVybGlua19nZXRfbl9hbmNob3JzKGhMaW5rMSksID09LCAxKTsKKyAgICBnX2Fzc2Vy
dF9jbXBzdHIoYXRrX2h5cGVybGlua19nZXRfdXJpKGhMaW5rMSwgMCksID09LCAiaHR0cDovL2Zv
by5iYXIuYmF6LyIpOworCisgICAgQXRrSHlwZXJsaW5rKiBoTGluazIgPSBhdGtfaHlwZXJ0ZXh0
X2dldF9saW5rKEFUS19IWVBFUlRFWFQocGFyYWdyYXBoMiksIDEpOworICAgIGdfYXNzZXJ0KEFU
S19IWVBFUkxJTksoaExpbmsyKSk7CisgICAgQXRrT2JqZWN0KiBoTGlua09iamVjdDIgPSBhdGtf
aHlwZXJsaW5rX2dldF9vYmplY3QoaExpbmsyLCAwKTsKKyAgICBnX2Fzc2VydChBVEtfT0JKRUNU
KGhMaW5rT2JqZWN0MikpOworICAgIGdfYXNzZXJ0KGF0a19vYmplY3RfZ2V0X3JvbGUoaExpbmtP
YmplY3QyKSA9PSBBVEtfUk9MRV9MSU5LKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVy
bGlua19nZXRfc3RhcnRfaW5kZXgoaExpbmsyKSwgPT0sIDEyKTsKKyAgICBnX2Fzc2VydF9jbXBp
bnQoYXRrX2h5cGVybGlua19nZXRfZW5kX2luZGV4KGhMaW5rMiksID09LCAzMik7CisgICAgZ19h
c3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X25fYW5jaG9ycyhoTGluazIpLCA9PSwgMSk7
CisgICAgZ19hc3NlcnRfY21wc3RyKGF0a19oeXBlcmxpbmtfZ2V0X3VyaShoTGluazIsIDApLCA9
PSwgImh0dHA6Ly9iYXIuYmF6LmZvby8iKTsKKworICAgIEF0a0h5cGVybGluayogaExpbmszID0g
YXRrX2h5cGVydGV4dF9nZXRfbGluayhBVEtfSFlQRVJURVhUKHBhcmFncmFwaDIpLCAyKTsKKyAg
ICBnX2Fzc2VydChBVEtfSFlQRVJMSU5LKGhMaW5rMykpOworICAgIEF0a09iamVjdCogaExpbmtP
YmplY3QzID0gYXRrX2h5cGVybGlua19nZXRfb2JqZWN0KGhMaW5rMywgMCk7CisgICAgZ19hc3Nl
cnQoQVRLX09CSkVDVChoTGlua09iamVjdDMpKTsKKyAgICBnX2Fzc2VydChhdGtfb2JqZWN0X2dl
dF9yb2xlKGhMaW5rT2JqZWN0MykgPT0gQVRLX1JPTEVfTElOSyk7CisgICAgZ19hc3NlcnRfY21w
aW50KGF0a19oeXBlcmxpbmtfZ2V0X3N0YXJ0X2luZGV4KGhMaW5rMyksID09LCA2NSk7CisgICAg
Z19hc3NlcnRfY21waW50KGF0a19oeXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoTGluazMpLCA9PSwg
NzUpOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9uX2FuY2hvcnMoaExp
bmszKSwgPT0sIDEpOworICAgIGdfYXNzZXJ0X2NtcHN0cihhdGtfaHlwZXJsaW5rX2dldF91cmko
aExpbmszLCAwKSwgPT0sICJodHRwOi8vYmF6LmZvby5iYXIvIik7CisKKyAgICAvLyBGaW5hbGx5
IGNoZWNrIHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlIGZvciBhIGdpdmVuIEF0a0h5cGVybGluawor
ICAgIGdfYXNzZXJ0KEFUS19JU19BQ1RJT04oaExpbmsxKSk7CisgICAgZ19hc3NlcnRfY21waW50
KGF0a19hY3Rpb25fZ2V0X25fYWN0aW9ucyhBVEtfQUNUSU9OKGhMaW5rMSkpLCA9PSwgMSk7Cisg
ICAgZ19hc3NlcnRfY21wc3RyKGF0a19hY3Rpb25fZ2V0X2tleWJpbmRpbmcoQVRLX0FDVElPTiho
TGluazEpLCAwKSwgPT0sICIiKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoYXRrX2FjdGlvbl9nZXRf
bmFtZShBVEtfQUNUSU9OKGhMaW5rMSksIDApLCA9PSwgImp1bXAiKTsKKyAgICBnX2Fzc2VydChh
dGtfYWN0aW9uX2RvX2FjdGlvbihBVEtfQUNUSU9OKGhMaW5rMSksIDApKTsKKworICAgIGdfb2Jq
ZWN0X3VucmVmKHBhcmFncmFwaDEpOworICAgIGdfb2JqZWN0X3VucmVmKHBhcmFncmFwaDIpOwor
ICAgIGdfb2JqZWN0X3VucmVmKHdlYlZpZXcpOworfQorCisKIHN0YXRpYyB2b2lkIHRlc3RXZWJr
aXRBdGtMaXN0c09mSXRlbXModm9pZCkKIHsKICAgICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3ID0g
V0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJfdmlld19uZXcoKSk7CkBAIC0xMTE2LDYgKzExOTQs
NyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiAgICAgZ190ZXN0X2FkZF9mdW5j
KCIvd2Via2l0L2F0ay90ZXh0QXR0cmlidXRlcyIsIHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRl
cyk7CiAgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Via2l0L2F0ay90ZXh0U2VsZWN0aW9ucyIsIHRl
c3RXZWtpdEF0a1RleHRTZWxlY3Rpb25zKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQv
YXRrL2dldEV4dGVudHMiLCB0ZXN0V2Via2l0QXRrR2V0RXh0ZW50cyk7CisgICAgZ190ZXN0X2Fk
ZF9mdW5jKCIvd2Via2l0L2F0ay9oeXBlcnRleHRBbmRIeXBlcmxpbmtzIiwgdGVzdFdlYmtpdEF0
a0h5cGVydGV4dEFuZEh5cGVybGlua3MpOwogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9h
dGsvbGlzdHNPZkl0ZW1zIiwgdGVzdFdlYmtpdEF0a0xpc3RzT2ZJdGVtcyk7CiAgICAgZ190ZXN0
X2FkZF9mdW5jKCIvd2Via2l0L2F0ay90ZXh0Q2hhbmdlZE5vdGlmaWNhdGlvbnMiLCB0ZXN0V2Vi
a2l0QXRrVGV4dENoYW5nZWROb3RpZmljYXRpb25zKTsKICAgICByZXR1cm4gZ190ZXN0X3J1biAo
KTsKLS0gCjEuNy4xCgo=
</data>
<flag name="review"
          id="61331"
          type_id="1"
          status="-"
          setter="mrobinson"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71406</attachid>
            <date>2010-10-21 01:55:20 -0700</date>
            <delta_ts>2010-10-28 01:32:39 -0700</delta_ts>
            <desc>Patch proposal + unit test</desc>
            <filename>0001-2010-10-20-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>43110</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA4MmMyOTdmYzA4NDEzODg2Y2EzMTZkNDJlZTBlYTBmY2U4YjgyNGQzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBXZWQsIDIwIE9jdCAyMDEwIDE4OjM0OjA5ICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gMjAxMC0xMC0yMCAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+
CgogICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3RrXSBBdGtI
eXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODUKCiAgICAgICAgSW1wbGVtZW50ZWQgdGhlIEF0
a0h5cGVybGluay9BdGtIeXBlcnRleHQgc3R1ZmYgaW4gdGhlIEdUSyBwb3J0LgoKICAgICAgICBF
dmVuIHRob3VnaHQgdGhlc2Uga2luZCBvZiB0YXNrcyBhcmUgdXN1YWxseSBhYm91dCBpbXBsZW1l
bnRpbmcgYW4KICAgICAgICBpbnRlcmZhY2UsIGluIHRoaXMgY2FzZSBpdCB3YXMgbmVlZGVkIHRv
IGltcGxlbWVudCBzb21lIG1vcmUKICAgICAgICB0aGluZ3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQg
QXRrSHlwZXJsaW5rIGlzIG5laXRoZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgbm9yIGFuIEF0a09i
amVjdCwgYnV0IGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MgY2hpbGQgb2YgR09iamVjdCB0aGF0CiAg
ICAgICAgbmVlZHMgdG8gYmUgcmVkZWZpbmVkIGluIGEgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgdGhh
dCBvbmUuIE9uIHRvcAogICAgICAgIG9mIHRoYXQsIGl0IHdhcyBuZWVkZWQgdG8gaW1wbGVtZW50
IHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlIGFzCiAgICAgICAgd2VsbCBmb3IgdGhhdCBuZXcgY2xh
c3MsIHNvIGV4cG9zZWQgaHlwZXJsaW5rcyBjYW4gd29yayBhcwogICAgICAgIGV4cGVjdGVkIHdp
dGggQXNzaXN0aXZlIFRlY2hub2xvZ2llcyBiYXNlZCBvbiBBVEsuCgogICAgICAgIEZ1cnRoZXJt
b3JlLCBhcyB0aGVyZSdzIG5vIG1lY2hhbmlzbSB0byBnZXQgYSBpbnN0YW5jZSBvZiB0aGF0CiAg
ICAgICAgQXRrSHlwZXJsaW5rIG90aGVyIHRoYW4gZG9pbmcgaXQgdGhyb3VnaCBhbiBBdGtPYmpl
Y3QgaW1wbGVtZW50aW5nCiAgICAgICAgdGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UsIGl0IHdh
cyBuZWVkZWQgdG8gYWxzbyBhZGQgdGhlIGNvZGUgdG8KICAgICAgICBpbXBsZW1lbnQgdGhhdCBv
bmUsIHNvIGl0IG1ha2VzIHBvc3NpYmxlIHRvIGFzayBmb3IgdGhlCiAgICAgICAgJ2h5cGVybGlu
a3MnIHVuZGVyIGFuICdoeXBlcnRleHQnIGFjY2Vzc2libGUgb2JqZWN0LgoKICAgICAgICBGaW5h
bGx5LCB0byBjb21wbGV0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIHRoaXMgc3R1ZmYgYW5k
IG1ha2UKICAgICAgICBpdCBhbGwgY29uc2lzdGVudCwgaXQgd2FzIG5lZWRlZCBhcyB3ZWxsIHRv
IGltcGxlbWVudCB0aGUKICAgICAgICBBdGtIeXBlcmxpbmtJbXBsIGludGVyZmFjZSAocHJvdmlk
aW5nIGp1c3Qgb25lIG1ldGhvZCBvbmx5KSBzbwogICAgICAgIHRoYXQgYWxsb3dzIHJldHJpZXZp
bmcgdGhlIEF0a0h5cGVybGluayBvYmplY3QgYXNzb2NpYXRlZCB0byBhbgogICAgICAgIEF0a09i
amVjdCBpbXBsZW1lbnRpbmcgc3VjaCBhbiBpbnRlcmZhY2UuCgogICAgICAgICogR05VbWFrZWZp
bGUuYW06IEFkZCB0aGUgbmV3IFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuW2h8Y3BwXQogICAg
ICAgIGZpbGVzIHRvIHRoZSBzb3VyY2VzIGxpc3QgZm9yIHRoZSBHVEsgcG9ydC4KCiAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHA6CiAg
ICAgICAgKGNvcmUpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjb3JlIGFjY2Vzc2liaWxp
dHkgb2JqZWN0CiAgICAgICAgcmVsYXRlZCB0byBhbiBBdGtPYmplY3QgaW1wbGVtZW50aW5nIHRo
ZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0
ZXh0R2V0TGluayk6IE5ldywgcGFydCBvZiB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0
aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZS4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVy
dGV4dEdldE5MaW5rcyk6IE5ldywgbGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVI
eXBlcnRleHRHZXRMaW5rSW5kZXgpOiBOZXcsIGxpa2V3aXNlLgogICAgICAgIChhdGtIeXBlcnRl
eHRJbnRlcmZhY2VJbml0KTogTmV3LCBpbml0aWFsaXplIHRoZSBBdGtIeXBlcnRleHQKICAgICAg
ICBpbnRlcmZhY2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbXBsR2V0SHlw
ZXJsaW5rKTogTmV3LCBwYXJ0IG9mIHRoZQogICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBB
dGtIeXBlcmxpbmtJbXBsIGludGVyZmFjZS4KICAgICAgICAoYXRrSHlwZXJsaW5rSW1wbEludGVy
ZmFjZUluaXQpOiBOZXcsIGluaXRpYWxpemUgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rSW1wbCBp
bnRlcmZhY2UuCiAgICAgICAgKEdldEF0a0ludGVyZmFjZVR5cGVGcm9tV0FJVHlwZSk6IEFkZCBB
VEtfVFlQRV9IWVBFUlRFWFQgYW5kCiAgICAgICAgQVRLX1RZUEVfSFlQRVJMSU5LX0lNUEwgdG8g
dGhlIGxpc3Qgb2YgcmVjb2duaXplZCB0eXBlcy4KICAgICAgICAoZ2V0SW50ZXJmYWNlTWFza0Zy
b21PYmplY3QpOiBEZWNpZGUgd2hlbiBpdCdzIG5lZWRlZCB0byBhZGQKICAgICAgICBXQUlfSFlQ
RVJURVhUIGFuZCBXQUlfSFlQRVJMSU5LIHRvIHRoZSBpbnRlcmZhY2UgbWFzay4KCiAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmg6IEFkZGVkLgog
ICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHA6
IEFkZGVkLgogICAgICAgIChyZXR1cm5TdHJpbmcpOiBSZXR1cm4gKGNvbnN0IGNoYXIqKSBmcm9t
IFN0cmluZyB2YXJpYWJsZXMuCiAgICAgICAgKGNvcmUpOiBSZXR1cm4gdGhlIGFzc29jaWF0ZWQg
QWNjZXNzaWJpbGl0eU9iamVjdC4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkRvQWN0aW9uKTogUGFydCBvZiB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUg
QXRrQWN0aW9uIGludGVyZmFjZS4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0Fj
dGlvbkdldE5BY3Rpb25zKTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtBY3Rpb25HZXREZXNjcmlwdGlvbik6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZyk6IExpa2V3aXNlLgogICAgICAgICh3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TmFtZSk6IExpa2V3aXNlLgogICAgICAg
IChhdGtBY3Rpb25JbnRlcmZhY2VJbml0KTogSW5pdGlhbGl6ZSB0aGUgQXRrQWN0aW9uIGludGVy
ZmFjZS4KICAgICAgICAoZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QpOiBSZXR1cm5zIHRoZSBsZW5n
dGggZm9yIGEgZ2l2ZW4gUmFuZ2UsCiAgICAgICAgY29uc2lkZXJpbmcgc3BlY2lhbCBjYXNlcyAo
ZS5nLiBMaXN0IGl0ZW0gbWFya2VycykKICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldFVSSSk6ICBJbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlCiAgICAgICAgbWV0aG9kcyBp
biB0aGUgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLgogICAgICAgICh3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0T2JqZWN0KTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2li
bGVIeXBlcmxpbmtHZXRTdGFydEluZGV4KTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtHZXRFbmRJbmRleCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rSXNWYWxpZCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0TkFuY2hvcnMpOiBMaWtld2lzZS4KICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0lzU2VsZWN0ZWRMaW5rKTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFj
Y2Vzc2libGVIeXBlcmxpbmtJbml0KTogSW5pdGlhbGl6ZSB0aGUKICAgICAgICBXZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rIGluc3RhbmNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rRmluYWxpemUpOiBGaW5hbGl6ZSBtZXRob2QuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVI
eXBlcmxpbmtDbGFzc0luaXQpOiBJbml0aWFsaXplIHRoZQogICAgICAgIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsgY2xhc3MuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRU
eXBlKTogSW1wbGVtZW50YXRpb24gb2YgdGhlCiAgICAgICAgZ2V0X3R5cGUoKSBmdW5jdGlvbiBm
b3IgdGhlIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCiAgICAgICAgKGh5cGVybGlu
a0ltcGxGaW5hbGl6ZWQpOiBVbnJlZiB0aGUgQXRrSHlwZXJsaW5rSW1wbCBvYmplY3QKICAgICAg
ICBhc3NvY2lhdGVkIHRvIHRoZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIG9iamVjdCB3aGVu
IHRoaXMgaXMgbm8KICAgICAgICBsb25nZXIgYWxpdmUsIHJlbW92aW5nIGl0IGZyb20gdGhlIGlu
dGVybmFsIGhhc2ggbWFwLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JD
cmVhdGUpOiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZQogICAgICAgIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmsgY2xhc3MgYXNzb2NpYXRlZCB0byBhIGdpdmVuCiAgICAgICAgQXRrSHlwZXJs
aW5rSW1wbCBvYmplY3QsIHJldHVybmluZyBhbiBhbHJlYWR5IGNyZWF0ZWQgaW5zdGFuY2UsIGlm
CiAgICAgICAgcHJlc2VudCAoaW50ZXJuYWxseSBzdG9yZWQgaW4gYSBoYXNoIG1hcCkuCiAgICAg
ICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KTogUHVi
bGljIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJuaW5nIHRoZSBBY2Nlc3NpYmlsaXR5T2JqZWN0IGFz
c29jaWF0ZWQgdG8gdGhlIGluc3RhbmNlIG9mCiAgICAgICAgdGhlIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmsgY2xhc3MuCgoyMDEwLTEwLTIwICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNo
ZXpAaWdhbGlhLmNvbT4KCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCgogICAg
ICAgIFtHdGtdIEF0a0h5cGVybGluayBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAogICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzc4NQoKICAgICAgICBOZXcg
dGVzdCB0byBlbnN1cmUgdGhlIEF0a0h5cGVydGV4dC9BdGtIeXBlcmxpbmsgc3R1ZmYgd29ya3Mu
CgogICAgICAgICogdGVzdHMvdGVzdGF0ay5jOgogICAgICAgICh0ZXN0V2Via2l0QXRrSHlwZXJ0
ZXh0QW5kSHlwZXJsaW5rcyk6IE5ldyB0ZXN0LCBjaGVja2luZyBib3RoIHRoZQogICAgICAgIGlt
cGxlbWVudGF0aW9uIG9mIHRoZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNlLCB0aGUgc3ViY2xhc3Mg
b2YgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLCBhbmQgdGhlIGltcGxl
bWVudGF0aW9uIG9mIHRoZQogICAgICAgIEF0a0FjdGlvbiBpbnRlcmZhY2UgaW4gdGhhdCBzdWJj
bGFzcy4KICAgICAgICAobWFpbik6IEFkZGVkIHRoZSBuZXcgdW5pdCB0ZXN0LgotLS0KIFdlYkNv
cmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5MCArKysr
KwogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg
ICAyICsKIC4uLi9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwICAgICAgICAg
IHwgIDE2NiArKysrKysrLS0KIC4uLi9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAg
ICAgICAgICAgICAgIHwgIDM3MSArKysrKysrKysrKysrKysrKysrKwogLi4uL2FjY2Vzc2liaWxp
dHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCAgfCAgIDU4ICsrKwogV2ViS2l0L2d0
ay9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2ICsKIFdlYktp
dC9ndGsvdGVzdHMvdGVzdGF0ay5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3OSArKysr
KwogNyBmaWxlcyBjaGFuZ2VkLCA3NTEgaW5zZXJ0aW9ucygrKSwgMzEgZGVsZXRpb25zKC0pCiBj
cmVhdGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3Np
YmxlSHlwZXJsaW5rLmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFdlYkNvcmUvYWNjZXNzaWJpbGl0
eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAzYjY2ZjgzLi4wMmY0ZjJhIDEwMDY0
NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwz
ICsxLDkzIEBACisyMDEwLTEwLTIwICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdh
bGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBbR3RrXSBBdGtIeXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNzg1CisKKyAgICAgICAgSW1w
bGVtZW50ZWQgdGhlIEF0a0h5cGVybGluay9BdGtIeXBlcnRleHQgc3R1ZmYgaW4gdGhlIEdUSyBw
b3J0LgorCisgICAgICAgIEV2ZW4gdGhvdWdodCB0aGVzZSBraW5kIG9mIHRhc2tzIGFyZSB1c3Vh
bGx5IGFib3V0IGltcGxlbWVudGluZyBhbgorICAgICAgICBpbnRlcmZhY2UsIGluIHRoaXMgY2Fz
ZSBpdCB3YXMgbmVlZGVkIHRvIGltcGxlbWVudCBzb21lIG1vcmUKKyAgICAgICAgdGhpbmdzIGR1
ZSB0byB0aGUgZmFjdCB0aGF0IEF0a0h5cGVybGluayBpcyBuZWl0aGVyIGFuIGludGVyZmFjZQor
ICAgICAgICBub3IgYW4gQXRrT2JqZWN0LCBidXQganVzdCBhbiBhYnN0cmFjdCBjbGFzcyBjaGls
ZCBvZiBHT2JqZWN0IHRoYXQKKyAgICAgICAgbmVlZHMgdG8gYmUgcmVkZWZpbmVkIGluIGEgc3Bl
Y2lmaWMgc3ViY2xhc3Mgb2YgdGhhdCBvbmUuIE9uIHRvcAorICAgICAgICBvZiB0aGF0LCBpdCB3
YXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgQXRrQWN0aW9uIGludGVyZmFjZSBhcworICAgICAg
ICB3ZWxsIGZvciB0aGF0IG5ldyBjbGFzcywgc28gZXhwb3NlZCBoeXBlcmxpbmtzIGNhbiB3b3Jr
IGFzCisgICAgICAgIGV4cGVjdGVkIHdpdGggQXNzaXN0aXZlIFRlY2hub2xvZ2llcyBiYXNlZCBv
biBBVEsuCisKKyAgICAgICAgRnVydGhlcm1vcmUsIGFzIHRoZXJlJ3Mgbm8gbWVjaGFuaXNtIHRv
IGdldCBhIGluc3RhbmNlIG9mIHRoYXQKKyAgICAgICAgQXRrSHlwZXJsaW5rIG90aGVyIHRoYW4g
ZG9pbmcgaXQgdGhyb3VnaCBhbiBBdGtPYmplY3QgaW1wbGVtZW50aW5nCisgICAgICAgIHRoZSBB
dGtIeXBlcnRleHQgaW50ZXJmYWNlLCBpdCB3YXMgbmVlZGVkIHRvIGFsc28gYWRkIHRoZSBjb2Rl
IHRvCisgICAgICAgIGltcGxlbWVudCB0aGF0IG9uZSwgc28gaXQgbWFrZXMgcG9zc2libGUgdG8g
YXNrIGZvciB0aGUKKyAgICAgICAgJ2h5cGVybGlua3MnIHVuZGVyIGFuICdoeXBlcnRleHQnIGFj
Y2Vzc2libGUgb2JqZWN0LgorCisgICAgICAgIEZpbmFsbHksIHRvIGNvbXBsZXRlIHRoZSBpbXBs
ZW1lbnRhdGlvbiBvZiBhbGwgdGhpcyBzdHVmZiBhbmQgbWFrZQorICAgICAgICBpdCBhbGwgY29u
c2lzdGVudCwgaXQgd2FzIG5lZWRlZCBhcyB3ZWxsIHRvIGltcGxlbWVudCB0aGUKKyAgICAgICAg
QXRrSHlwZXJsaW5rSW1wbCBpbnRlcmZhY2UgKHByb3ZpZGluZyBqdXN0IG9uZSBtZXRob2Qgb25s
eSkgc28KKyAgICAgICAgdGhhdCBhbGxvd3MgcmV0cmlldmluZyB0aGUgQXRrSHlwZXJsaW5rIG9i
amVjdCBhc3NvY2lhdGVkIHRvIGFuCisgICAgICAgIEF0a09iamVjdCBpbXBsZW1lbnRpbmcgc3Vj
aCBhbiBpbnRlcmZhY2UuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRkIHRoZSBuZXcg
V2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5baHxjcHBdCisgICAgICAgIGZpbGVzIHRvIHRoZSBz
b3VyY2VzIGxpc3QgZm9yIHRoZSBHVEsgcG9ydC4KKworICAgICAgICAqIGFjY2Vzc2liaWxpdHkv
Z3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcDoKKyAgICAgICAgKGNvcmUpOiBO
ZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjb3JlIGFjY2Vzc2liaWxpdHkgb2JqZWN0CisgICAg
ICAgIHJlbGF0ZWQgdG8gYW4gQXRrT2JqZWN0IGltcGxlbWVudGluZyB0aGUgQXRrSHlwZXJ0ZXh0
IGludGVyZmFjZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXRMaW5rKTog
TmV3LCBwYXJ0IG9mIHRoZQorICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXRrSHlwZXJ0
ZXh0IGludGVyZmFjZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXROTGlu
a3MpOiBOZXcsIGxpa2V3aXNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdl
dExpbmtJbmRleCk6IE5ldywgbGlrZXdpc2UuCisgICAgICAgIChhdGtIeXBlcnRleHRJbnRlcmZh
Y2VJbml0KTogTmV3LCBpbml0aWFsaXplIHRoZSBBdGtIeXBlcnRleHQKKyAgICAgICAgaW50ZXJm
YWNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ltcGxHZXRIeXBlcmxpbmsp
OiBOZXcsIHBhcnQgb2YgdGhlCisgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdGtIeXBl
cmxpbmtJbXBsIGludGVyZmFjZS4KKyAgICAgICAgKGF0a0h5cGVybGlua0ltcGxJbnRlcmZhY2VJ
bml0KTogTmV3LCBpbml0aWFsaXplIHRoZQorICAgICAgICBBdGtIeXBlcmxpbmtJbXBsIGludGVy
ZmFjZS4KKyAgICAgICAgKEdldEF0a0ludGVyZmFjZVR5cGVGcm9tV0FJVHlwZSk6IEFkZCBBVEtf
VFlQRV9IWVBFUlRFWFQgYW5kCisgICAgICAgIEFUS19UWVBFX0hZUEVSTElOS19JTVBMIHRvIHRo
ZSBsaXN0IG9mIHJlY29nbml6ZWQgdHlwZXMuCisgICAgICAgIChnZXRJbnRlcmZhY2VNYXNrRnJv
bU9iamVjdCk6IERlY2lkZSB3aGVuIGl0J3MgbmVlZGVkIHRvIGFkZAorICAgICAgICBXQUlfSFlQ
RVJURVhUIGFuZCBXQUlfSFlQRVJMSU5LIHRvIHRoZSBpbnRlcmZhY2UgbWFzay4KKworICAgICAg
ICAqIGFjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaDogQWRkZWQu
CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5j
cHA6IEFkZGVkLgorICAgICAgICAocmV0dXJuU3RyaW5nKTogUmV0dXJuIChjb25zdCBjaGFyKikg
ZnJvbSBTdHJpbmcgdmFyaWFibGVzLgorICAgICAgICAoY29yZSk6IFJldHVybiB0aGUgYXNzb2Np
YXRlZCBBY2Nlc3NpYmlsaXR5T2JqZWN0LgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVy
bGlua0FjdGlvbkRvQWN0aW9uKTogUGFydCBvZiB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24g
b2YgdGhlIEF0a0FjdGlvbiBpbnRlcmZhY2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rQWN0aW9uR2V0TkFjdGlvbnMpOiBMaWtld2lzZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtBY3Rpb25HZXREZXNjcmlwdGlvbik6IExpa2V3aXNlLgorICAgICAgICAo
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldEtleWJpbmRpbmcpOiBMaWtld2lzZS4K
KyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25HZXROYW1lKTogTGlrZXdp
c2UuCisgICAgICAgIChhdGtBY3Rpb25JbnRlcmZhY2VJbml0KTogSW5pdGlhbGl6ZSB0aGUgQXRr
QWN0aW9uIGludGVyZmFjZS4KKyAgICAgICAgKGdldFJhbmdlTGVuZ3RoRm9yT2JqZWN0KTogUmV0
dXJucyB0aGUgbGVuZ3RoIGZvciBhIGdpdmVuIFJhbmdlLAorICAgICAgICBjb25zaWRlcmluZyBz
cGVjaWFsIGNhc2VzIChlLmcuIExpc3QgaXRlbSBtYXJrZXJzKQorICAgICAgICAod2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0dldFVSSSk6ICBJbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlCisg
ICAgICAgIG1ldGhvZHMgaW4gdGhlIEF0a0h5cGVybGluayBhYnN0cmFjdCBjbGFzcy4KKyAgICAg
ICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPYmplY3QpOiBMaWtld2lzZS4KKyAgICAg
ICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRTdGFydEluZGV4KTogTGlrZXdpc2UuCisg
ICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0RW5kSW5kZXgpOiBMaWtld2lzZS4K
KyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJc1ZhbGlkKTogTGlrZXdpc2UuCisg
ICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0TkFuY2hvcnMpOiBMaWtld2lzZS4K
KyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJc1NlbGVjdGVkTGluayk6IExpa2V3
aXNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0luaXQpOiBJbml0aWFsaXpl
IHRoZQorICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGluc3RhbmNlLgorICAgICAg
ICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplKTogRmluYWxpemUgbWV0aG9kLgor
ICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0NsYXNzSW5pdCk6IEluaXRpYWxpemUg
dGhlCisgICAgICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCisgICAgICAgICh3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VHlwZSk6IEltcGxlbWVudGF0aW9uIG9mIHRoZQor
ICAgICAgICBnZXRfdHlwZSgpIGZ1bmN0aW9uIGZvciB0aGUgV2ViS2l0QWNjZXNzaWJsZUh5cGVy
bGluayBjbGFzcy4KKyAgICAgICAgKGh5cGVybGlua0ltcGxGaW5hbGl6ZWQpOiBVbnJlZiB0aGUg
QXRrSHlwZXJsaW5rSW1wbCBvYmplY3QKKyAgICAgICAgYXNzb2NpYXRlZCB0byB0aGUgV2ViS2l0
QWNjZXNzaWJsZUh5cGVybGluayBvYmplY3Qgd2hlbiB0aGlzIGlzIG5vCisgICAgICAgIGxvbmdl
ciBhbGl2ZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgaW50ZXJuYWwgaGFzaCBtYXAuCisgICAgICAg
ICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUpOiBSZXR1cm5zIGFuIGluc3Rh
bmNlIG9mIHRoZQorICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGNsYXNzIGFzc29j
aWF0ZWQgdG8gYSBnaXZlbgorICAgICAgICBBdGtIeXBlcmxpbmtJbXBsIG9iamVjdCwgcmV0dXJu
aW5nIGFuIGFscmVhZHkgY3JlYXRlZCBpbnN0YW5jZSwgaWYKKyAgICAgICAgcHJlc2VudCAoaW50
ZXJuYWxseSBzdG9yZWQgaW4gYSBoYXNoIG1hcCkuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rR2V0QWNjZXNzaWJpbGl0eU9iamVjdCk6IFB1YmxpYyBmdW5jdGlvbgorICAgICAg
ICByZXR1cm5pbmcgdGhlIEFjY2Vzc2liaWxpdHlPYmplY3QgYXNzb2NpYXRlZCB0byB0aGUgaW5z
dGFuY2Ugb2YKKyAgICAgICAgdGhlIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCisK
IDIwMTAtMTAtMTkgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAg
ICAgQnVpbGQgZml4IChFRkwsIG1heWJlIG1vcmUpLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVt
YWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggODExZmZhNi4uOTMyY2E2
NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQorKysgYi9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtCkBAIC0zNDU2LDYgKzM0NTYsOCBAQCB3ZWJjb3JlZ3RrX3NvdXJjZXMgKz0gXAog
CVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsu
Y3BwIFwKIAlXZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVyQXRrLmggXAogCVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQVhPYmplY3RDYWNoZUF0ay5j
cHAgXAorCVdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlu
ay5oIFwKKwlXZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxp
bmsuY3BwIFwKIAlXZWJDb3JlL2JpbmRpbmdzL2pzL1NjcmlwdENvbnRyb2xsZXJHdGsuY3BwIFwK
IAlXZWJDb3JlL3BhZ2UvZ3RrL0RyYWdDb250cm9sbGVyR3RrLmNwcCBcCiAJV2ViQ29yZS9wYWdl
L2d0ay9FdmVudEhhbmRsZXJHdGsuY3BwIFwKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJp
bGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwIGIvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAKaW5kZXggYWE4
ODIxNy4uYWFkOTBjZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAKKysrIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAKQEAgLTYwLDE0ICs2MCwxNSBA
QAogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNp
bmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+Ci0j
aW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nLmg+CisjaW5jbHVkZSAiV2ViS2l0QWNjZXNz
aWJsZUh5cGVybGluay5oIgogCiAjaW5jbHVkZSA8YXRrL2F0ay5oPgogI2luY2x1ZGUgPGdsaWIu
aD4KICNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KICNpbmNsdWRlIDxsaWJnYWlsLXV0aWwvZ2Fp
bC11dGlsLmg+CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9B
dG9taWNTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIHVzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOwogCkBAIC0xNDMsNiArMTQ0LDExIEBAIHN0YXRpYyBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjb3JlKEF0a1RhYmxlKiB0YWJsZSkKICAgICByZXR1cm4gY29yZShBVEtfT0JK
RUNUKHRhYmxlKSk7CiB9CiAKK3N0YXRpYyBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlKEF0a0h5
cGVydGV4dCogaHlwZXJ0ZXh0KQoreworICAgIHJldHVybiBjb3JlKEFUS19PQkpFQ1QoaHlwZXJ0
ZXh0KSk7Cit9CisKIHN0YXRpYyBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlKEF0a0RvY3VtZW50
KiBkb2N1bWVudCkKIHsKICAgICByZXR1cm4gY29yZShBVEtfT0JKRUNUKGRvY3VtZW50KSk7CkBA
IC0xOTMxLDYgKzE5MzcsODQgQEAgc3RhdGljIHZvaWQgYXRrX3RhYmxlX2ludGVyZmFjZV9pbml0
KEF0a1RhYmxlSWZhY2UqIGlmYWNlKQogICAgIGlmYWNlLT5nZXRfcm93X2Rlc2NyaXB0aW9uID0g
d2Via2l0X2FjY2Vzc2libGVfdGFibGVfZ2V0X3Jvd19kZXNjcmlwdGlvbjsKIH0KIAorc3RhdGlj
IEF0a0h5cGVybGluayogd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldExpbmsoQXRrSHlwZXJ0
ZXh0KiBoeXBlcnRleHQsIGdpbnQgaW5kZXgpCit7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdDo6
QWNjZXNzaWJpbGl0eUNoaWxkcmVuVmVjdG9yIGNoaWxkcmVuID0gY29yZShoeXBlcnRleHQpLT5j
aGlsZHJlbigpOworICAgIGlmIChpbmRleCA8IDAgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGlu
ZGV4KSA+PSBjaGlsZHJlbi5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZ2ludCBj
dXJyZW50TGluayA9IC0xOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjaGlsZHJlbi5z
aXplKCk7IGkrKykgeworICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlQ2hpbGQgPSBj
aGlsZHJlbi5hdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKCFjb3JlQ2hpbGQtPmFjY2Vzc2liaWxp
dHlJc0lnbm9yZWQoKSAmJiBjb3JlQ2hpbGQtPmlzTGluaygpKSB7CisgICAgICAgICAgICBjdXJy
ZW50TGluaysrOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IGN1cnJlbnRMaW5rKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBBdGtPYmplY3QqIGF4T2JqZWN0ID0g
Y29yZUNoaWxkLT53cmFwcGVyKCk7CisgICAgICAgICAgICBpZiAoIWF4T2JqZWN0IHx8ICFBVEtf
SVNfSFlQRVJMSU5LX0lNUEwoYXhPYmplY3QpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwor
CisgICAgICAgICAgICByZXR1cm4gYXRrX2h5cGVybGlua19pbXBsX2dldF9oeXBlcmxpbmsoQVRL
X0hZUEVSTElOS19JTVBMKGF4T2JqZWN0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gMDsKK30KKworc3RhdGljIGdpbnQgd2Via2l0QWNjZXNzaWJsZUh5cGVydGV4dEdldE5MaW5r
cyhBdGtIeXBlcnRleHQqIGh5cGVydGV4dCkKK3sKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpB
Y2Nlc3NpYmlsaXR5Q2hpbGRyZW5WZWN0b3IgY2hpbGRyZW4gPSBjb3JlKGh5cGVydGV4dCktPmNo
aWxkcmVuKCk7CisgICAgaWYgKCFjaGlsZHJlbi5zaXplKCkpCisgICAgICByZXR1cm4gMDsKKwor
ICAgIGdpbnQgbGlua3NGb3VuZCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGls
ZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlQ2hp
bGQgPSBjaGlsZHJlbi5hdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKCFjb3JlQ2hpbGQtPmFjY2Vz
c2liaWxpdHlJc0lnbm9yZWQoKSAmJiBjb3JlQ2hpbGQtPmlzTGluaygpKQorICAgICAgICAgICAg
bGlua3NGb3VuZCsrOworICAgIH0KKworICAgIHJldHVybiBsaW5rc0ZvdW5kOworfQorCitzdGF0
aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGlua0luZGV4KEF0a0h5cGVydGV4
dCogaHlwZXJ0ZXh0LCBnaW50IGNoYXJJbmRleCkKK3sKKyAgICBzaXplX3QgbGlua3NDb3VudCA9
IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXROTGlua3MoaHlwZXJ0ZXh0KTsKKyAgICBpZiAo
IWxpbmtzQ291bnQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbGlua3NDb3VudDsgaSsrKSB7CisgICAgICAgIEF0a0h5cGVybGluayogaHlwZXJsaW5r
ID0gQVRLX0hZUEVSTElOSyh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGluayhoeXBlcnRl
eHQsIGkpKTsKKyAgICAgICAgZ2ludCBzdGFydEluZGV4ID0gYXRrX2h5cGVybGlua19nZXRfc3Rh
cnRfaW5kZXgoaHlwZXJsaW5rKTsKKyAgICAgICAgZ2ludCBlbmRJbmRleCA9IGF0a19oeXBlcmxp
bmtfZ2V0X2VuZF9pbmRleChoeXBlcmxpbmspOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBj
aGFyIGluZGV4IGluIHRoZSBsaW5rJ3Mgb2Zmc2V0IHJhbmdlCisgICAgICAgIGlmIChzdGFydElu
ZGV4IDw9IGNoYXJJbmRleCAmJiBjaGFySW5kZXggPCBlbmRJbmRleCkKKyAgICAgICAgICAgIHJl
dHVybiBpOworICAgIH0KKworICAgIC8vIE5vdCBmb3VuZCBpZiByZWFjaGVkCisgICAgcmV0dXJu
IC0xOworfQorCitzdGF0aWMgdm9pZCBhdGtIeXBlcnRleHRJbnRlcmZhY2VJbml0KEF0a0h5cGVy
dGV4dElmYWNlKiBpZmFjZSkKK3sKKyAgICBpZmFjZS0+Z2V0X2xpbmsgPSB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJ0ZXh0R2V0TGluazsKKyAgICBpZmFjZS0+Z2V0X25fbGlua3MgPSB3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJ0ZXh0R2V0TkxpbmtzOworICAgIGlmYWNlLT5nZXRfbGlua19pbmRleCA9IHdl
YmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXRMaW5rSW5kZXg7Cit9CisKK3N0YXRpYyBBdGtIeXBl
cmxpbmsqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbXBsR2V0SHlwZXJsaW5rKEF0a0h5cGVy
bGlua0ltcGwqIGh5cGVybGluaykKK3sKKyAgICByZXR1cm4gQVRLX0hZUEVSTElOSyh3ZWJraXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUoaHlwZXJsaW5rKSk7Cit9CisKK3N0YXRpYyB2
b2lkIGF0a0h5cGVybGlua0ltcGxJbnRlcmZhY2VJbml0KEF0a0h5cGVybGlua0ltcGxJZmFjZSog
aWZhY2UpCit7CisgICAgaWZhY2UtPmdldF9oeXBlcmxpbmsgPSB3ZWJraXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rSW1wbEdldEh5cGVybGluazsKK30KKwogc3RhdGljIGNvbnN0IGdjaGFyKiBkb2N1bWVu
dEF0dHJpYnV0ZVZhbHVlKEF0a0RvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgZ2NoYXIqIGF0dHJp
YnV0ZSkKIHsKICAgICBEb2N1bWVudCogY29yZURvY3VtZW50ID0gY29yZShkb2N1bWVudCktPmRv
Y3VtZW50KCk7CkBAIC0yMDAyLDYgKzIwODYsMTAgQEAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJ
bmZvIEF0a0ludGVyZmFjZXNJbml0RnVuY3Rpb25zW10gPSB7CiAgICAgIChHSW50ZXJmYWNlRmlu
YWxpemVGdW5jKSAwLCAwfSwKICAgICB7KEdJbnRlcmZhY2VJbml0RnVuYylhdGtfdGFibGVfaW50
ZXJmYWNlX2luaXQsCiAgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwfSwKKyAgICB7
KEdJbnRlcmZhY2VJbml0RnVuYylhdGtIeXBlcnRleHRJbnRlcmZhY2VJbml0LAorICAgICAoR0lu
dGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCisgICAgeyhHSW50ZXJmYWNlSW5pdEZ1bmMpYXRr
SHlwZXJsaW5rSW1wbEludGVyZmFjZUluaXQsCisgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5j
KSAwLCAwfSwKICAgICB7KEdJbnRlcmZhY2VJbml0RnVuYylhdGtfZG9jdW1lbnRfaW50ZXJmYWNl
X2luaXQsCiAgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwfQogfTsKQEAgLTIwMTQs
MzEgKzIxMDIsMzcgQEAgZW51bSBXQUlUeXBlIHsKICAgICBXQUlfQ09NUE9ORU5ULAogICAgIFdB
SV9JTUFHRSwKICAgICBXQUlfVEFCTEUsCisgICAgV0FJX0hZUEVSVEVYVCwKKyAgICBXQUlfSFlQ
RVJMSU5LLAogICAgIFdBSV9ET0NVTUVOVAogfTsKIAogc3RhdGljIEdUeXBlIEdldEF0a0ludGVy
ZmFjZVR5cGVGcm9tV0FJVHlwZShXQUlUeXBlIHR5cGUpCiB7Ci0gIHN3aXRjaCAodHlwZSkgewot
ICBjYXNlIFdBSV9BQ1RJT046Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfQUNUSU9OOwotICBjYXNl
IFdBSV9TRUxFQ1RJT046Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfU0VMRUNUSU9OOwotICBjYXNl
IFdBSV9FRElUQUJMRV9URVhUOgotICAgICAgcmV0dXJuIEFUS19UWVBFX0VESVRBQkxFX1RFWFQ7
Ci0gIGNhc2UgV0FJX1RFWFQ6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfVEVYVDsKLSAgY2FzZSBX
QUlfQ09NUE9ORU5UOgotICAgICAgcmV0dXJuIEFUS19UWVBFX0NPTVBPTkVOVDsKLSAgY2FzZSBX
QUlfSU1BR0U6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfSU1BR0U7Ci0gIGNhc2UgV0FJX1RBQkxF
OgotICAgICAgcmV0dXJuIEFUS19UWVBFX1RBQkxFOwotICBjYXNlIFdBSV9ET0NVTUVOVDoKLSAg
ICAgIHJldHVybiBBVEtfVFlQRV9ET0NVTUVOVDsKLSAgfQotCi0gIHJldHVybiBHX1RZUEVfSU5W
QUxJRDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdBSV9BQ1RJT046CisgICAgICAg
IHJldHVybiBBVEtfVFlQRV9BQ1RJT047CisgICAgY2FzZSBXQUlfU0VMRUNUSU9OOgorICAgICAg
ICByZXR1cm4gQVRLX1RZUEVfU0VMRUNUSU9OOworICAgIGNhc2UgV0FJX0VESVRBQkxFX1RFWFQ6
CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9FRElUQUJMRV9URVhUOworICAgIGNhc2UgV0FJX1RF
WFQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9URVhUOworICAgIGNhc2UgV0FJX0NPTVBPTkVO
VDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0NPTVBPTkVOVDsKKyAgICBjYXNlIFdBSV9JTUFH
RToKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0lNQUdFOworICAgIGNhc2UgV0FJX1RBQkxFOgor
ICAgICAgICByZXR1cm4gQVRLX1RZUEVfVEFCTEU7CisgICAgY2FzZSBXQUlfSFlQRVJURVhUOgor
ICAgICAgICByZXR1cm4gQVRLX1RZUEVfSFlQRVJURVhUOworICAgIGNhc2UgV0FJX0hZUEVSTElO
SzoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0hZUEVSTElOS19JTVBMOworICAgIGNhc2UgV0FJ
X0RPQ1VNRU5UOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfRE9DVU1FTlQ7CisgICAgfQorCisg
ICAgcmV0dXJuIEdfVFlQRV9JTlZBTElEOwogfQogCiBzdGF0aWMgZ3VpbnQxNiBnZXRJbnRlcmZh
Y2VNYXNrRnJvbU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0KQpAQCAtMjA0
OCwyMCArMjE0MiwyNCBAQCBzdGF0aWMgZ3VpbnQxNiBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVj
dChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0KQogICAgIC8vIENvbXBvbmVudCBpbnRl
cmZhY2UgaXMgYWx3YXlzIHN1cHBvcnRlZAogICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlf
Q09NUE9ORU5UOwogCisgICAgQWNjZXNzaWJpbGl0eVJvbGUgcm9sZSA9IGNvcmVPYmplY3QtPnJv
bGVWYWx1ZSgpOworCiAgICAgLy8gQWN0aW9uCi0gICAgaWYgKCFjb3JlT2JqZWN0LT5hY3Rpb25W
ZXJiKCkuaXNFbXB0eSgpKQorICAgIGlmICghY29yZU9iamVjdC0+YWN0aW9uVmVyYigpLmlzRW1w
dHkoKSkgewogICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX0FDVElPTjsKIAorICAg
ICAgICBpZiAoIWNvcmVPYmplY3QtPmFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSAmJiBjb3JlT2Jq
ZWN0LT5pc0xpbmsoKSkKKyAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfSFlQ
RVJMSU5LOworICAgIH0KKwogICAgIC8vIFNlbGVjdGlvbgogICAgIGlmIChjb3JlT2JqZWN0LT5p
c0xpc3RCb3goKSkKICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9TRUxFQ1RJT047
CiAKICAgICAvLyBUZXh0ICYgRWRpdGFibGUgVGV4dAotICAgIEFjY2Vzc2liaWxpdHlSb2xlIHJv
bGUgPSBjb3JlT2JqZWN0LT5yb2xlVmFsdWUoKTsKLQogICAgIGlmIChyb2xlID09IFN0YXRpY1Rl
eHRSb2xlKQogICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX1RFWFQ7Ci0gICAgZWxz
ZSBpZiAoY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0KCkpCisgICAgZWxz
ZSBpZiAoY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0KCkpIHsKICAgICAg
ICAgaWYgKGNvcmVPYmplY3QtPmlzVGV4dENvbnRyb2woKSkgewogICAgICAgICAgICAgaW50ZXJm
YWNlTWFzayB8PSAxIDw8IFdBSV9URVhUOwogICAgICAgICAgICAgaWYgKCFjb3JlT2JqZWN0LT5p
c1JlYWRPbmx5KCkpCkBAIC0yMDY5LDE4ICsyMTY3LDI0IEBAIHN0YXRpYyBndWludDE2IGdldElu
dGVyZmFjZU1hc2tGcm9tT2JqZWN0KEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QpCiAg
ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0KiBh
eFJlbmRlck9iamVjdCA9IHN0YXRpY19jYXN0PEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QqPihj
b3JlT2JqZWN0KTsKICAgICAgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBheFJlbmRl
ck9iamVjdC0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIGlmIChyb2xlICE9IFRhYmxlUm9sZSAm
JiByZW5kZXJlciAmJiByZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAgICAgICAg
ICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX1RFWFQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChy
b2xlID09IExpc3RJdGVtUm9sZSkgewotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgVEVYVCBp
bnRlcmZhY2UgZm9yIGxpc3QgaXRlbXMgd2hvc2UKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBh
Y2Nlc3NpYmxlIGNoaWxkIGhhcyBhIHRleHQgcmVuZGVyZXIKKyAgICAgICAgICAgIGlmIChyb2xl
ICE9IFRhYmxlUm9sZSkgeworICAgICAgICAgICAgICAgIGludGVyZmFjZU1hc2sgfD0gMSA8PCBX
QUlfSFlQRVJURVhUOworICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci0+
Y2hpbGRyZW5JbmxpbmUoKSkKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAx
IDw8IFdBSV9URVhUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdGhlIFRF
WFQgaW50ZXJmYWNlIGZvciBsaXN0IGl0ZW1zIHdob3NlCisgICAgICAgICAgICAvLyBmaXJzdCBh
Y2Nlc3NpYmxlIGNoaWxkIGhhcyBhIHRleHQgcmVuZGVyZXIKKyAgICAgICAgICAgIGlmIChyb2xl
ID09IExpc3RJdGVtUm9sZSkgewogICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3Q6
OkFjY2Vzc2liaWxpdHlDaGlsZHJlblZlY3RvciBjaGlsZHJlbiA9IGF4UmVuZGVyT2JqZWN0LT5j
aGlsZHJlbigpOwogICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5zaXplKCkpIHsKICAgICAg
ICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYXhSZW5kZXJDaGlsZCA9IGNoaWxk
cmVuLmF0KDApLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IGdl
dEludGVyZmFjZU1hc2tGcm9tT2JqZWN0KGF4UmVuZGVyQ2hpbGQpOwogICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIH0KKwogICAgICAgICB9CisgICAgfQogCiAgICAgLy8gSW1hZ2UKICAg
ICBpZiAoY29yZU9iamVjdC0+aXNJbWFnZSgpKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcCBiL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5MmM4YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5jcHAKQEAgLTAsMCAr
MSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCIKKworI2lm
IEhBVkUoQUNDRVNTSUJJTElUWSkKKworI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKKyNpbmNs
dWRlICJBY2Nlc3NpYmlsaXR5T2JqZWN0LmgiCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU9iamVj
dFdyYXBwZXJBdGsuaCIKKyNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQb3NpdGlvbi5oIgorI2luY2x1
ZGUgIlJhbmdlLmgiCisjaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5oIgorI2luY2x1ZGUgIlJl
bmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgorCisjaW5jbHVkZSA8YXRr
L2F0ay5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
Ky8vIFVzZSB0aGlzIGhhc2ggdGFibGUgdG8gaGVscCByZXVzaW5nIGluc3RhbmNlcyBvZiB0aGUK
Ky8vIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MgdGhyb3VnaG91dCB0aGUKKy8vIHdl
YmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRPckNyZWF0ZSBtZXRob2QKK3N0YXRpYyBHSGFzaFRh
YmxlKiBoYXNoVGFibGUgPSAwOworCitzdGF0aWMgZ3BvaW50ZXIgd2Via2l0QWNjZXNzaWJsZUh5
cGVybGlua1BhcmVudENsYXNzID0gMDsKKworLy8gVXNlZCB0byBwcm92aWRlIGNvbnN0IGNoYXIq
IHJldHVybnMuCitzdGF0aWMgY29uc3QgY2hhciogcmV0dXJuU3RyaW5nKGNvbnN0IFN0cmluZyYg
c3RyKQoreworICAgIHN0YXRpYyBDU3RyaW5nIHJldHVybmVkU3RyaW5nOworICAgIHJldHVybmVk
U3RyaW5nID0gc3RyLnV0ZjgoKTsKKyAgICByZXR1cm4gcmV0dXJuZWRTdHJpbmcuZGF0YSgpOwor
fQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtIeXBlcmxpbmtJbXBsKiBs
aW5rSW1wbCkKK3sKKyAgICBpZiAoIWxpbmtJbXBsIHx8ICFXRUJLSVRfSVNfQUNDRVNTSUJMRShs
aW5rSW1wbCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHdlYmtpdF9hY2Nlc3Np
YmxlX2dldF9hY2Nlc3NpYmlsaXR5X29iamVjdChXRUJLSVRfQUNDRVNTSUJMRShsaW5rSW1wbCkp
OworfQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShXZWJLaXRBY2Nlc3NpYmxl
SHlwZXJsaW5rKiBsaW5rKQoreworICAgIGlmICghbGluaykKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICByZXR1cm4gY29yZShsaW5rLT5saW5rSW1wbCk7Cit9CisKK3N0YXRpYyBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjb3JlKEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICBpZiAoIVdFQktJVF9J
U19BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBy
ZXR1cm4gY29yZShXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluaykpOworfQorCitzdGF0
aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtBY3Rpb24qIGFjdGlvbikKK3sKKyAgICBy
ZXR1cm4gY29yZShXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKSk7Cit9CisKKwor
c3RhdGljIGdib29sZWFuIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25Eb0FjdGlvbihB
dGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKSwgRkFMU0UpOworICAgIGdf
cmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5s
aW5rSW1wbCwgRkFMU0UpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgRkFMU0Up
OworCisgICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhh
Y3Rpb24pLT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEFjY2Vzc2li
aWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGFjdGlvbik7CisgICAgaWYgKCFjb3JlT2Jq
ZWN0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gY29yZU9iamVjdC0+cGVy
Zm9ybURlZmF1bHRBY3Rpb24oKTsKK30KKworc3RhdGljIGdpbnQgd2Via2l0QWNjZXNzaWJsZUh5
cGVybGlua0FjdGlvbkdldE5BY3Rpb25zKEF0a0FjdGlvbiogYWN0aW9uKQoreworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLCAw
KTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTkso
YWN0aW9uKS0+bGlua0ltcGwsIDApOworCisgICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9B
Q0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiAw
OworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciogd2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0FjdGlvbkdldERlc2NyaXB0aW9uKEF0a0FjdGlvbiogYWN0aW9uLCBnaW50
IGluZGV4KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxF
X0hZUEVSTElOSyhhY3Rpb24pLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRf
QUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+bGlua0ltcGwsIDApOworICAgIGdfcmV0dXJu
X3ZhbF9pZl9mYWlsKCFpbmRleCwgMCk7CisKKyAgICAvLyBUT0RPOiBOZWVkIGEgd2F5IHRvIHBy
b3ZpZGUvbG9jYWxpemUgYWN0aW9uIGRlc2NyaXB0aW9ucy4KKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyKiB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZyhBdGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBp
bmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9I
WVBFUkxJTksoYWN0aW9uKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FD
Q0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiktPmxpbmtJbXBsLCAwKTsKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisgICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9B
Q0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiBG
QUxTRTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGFjdGlv
bik7CisgICAgaWYgKCFjb3JlT2JqZWN0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBy
ZXR1cm4gcmV0dXJuU3RyaW5nKGNvcmVPYmplY3QtPmFjY2Vzc0tleSgpLnN0cmluZygpKTsKK30K
Kworc3RhdGljIGNvbnN0IGdjaGFyKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0
TmFtZShBdGtBY3Rpb24qIGFjdGlvbiwgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKSwgMCk7CisgICAg
Z19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbikt
PmxpbmtJbXBsLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisg
ICAgaWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24p
LT5saW5rSW1wbCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEFjY2Vzc2liaWxpdHlP
YmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGFjdGlvbik7CisgICAgaWYgKCFjb3JlT2JqZWN0KQor
ICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gcmV0dXJuU3RyaW5nKGNvcmVPYmpl
Y3QtPmFjdGlvblZlcmIoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0a0FjdGlvbkludGVyZmFjZUlu
aXQoQXRrQWN0aW9uSWZhY2UqIGlmYWNlKQoreworICAgIGlmYWNlLT5kb19hY3Rpb24gPSB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uRG9BY3Rpb247CisgICAgaWZhY2UtPmdldF9uX2Fj
dGlvbnMgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TkFjdGlvbnM7CisgICAg
aWZhY2UtPmdldF9kZXNjcmlwdGlvbiA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25H
ZXREZXNjcmlwdGlvbjsKKyAgICBpZmFjZS0+Z2V0X2tleWJpbmRpbmcgPSB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZzsKKyAgICBpZmFjZS0+Z2V0X25hbWUgPSB3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TmFtZTsKK30KKworc3RhdGljIGdjaGFy
KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VVJJKEF0a0h5cGVybGluayogbGluaywgZ2lu
dCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJM
RV9IWVBFUkxJTksobGluayksIDApOworICAgIC8vIEZJWE1FOiBEbyBOT1Qgc3VwcG9ydCBtb3Jl
IHRoYW4gb25lIGluc3RhbmNlIG9mIGFuIEF0a09iamVjdAorICAgIC8vIGltcGxlbWVudGluZyBB
dGtIeXBlcmxpbmtJbXBsIGluIGV2ZXJ5IGluc3RhbmNlIG9mIEF0a0h5cGVyTGluaworICAgIGdf
cmV0dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgMCk7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0
KiBjb3JlT2JqZWN0ID0gY29yZShsaW5rKTsKKyAgICBpZiAoIWNvcmVPYmplY3QgfHwgY29yZU9i
amVjdC0+dXJsKCkuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdf
c3RyZHVwKHJldHVyblN0cmluZyhjb3JlT2JqZWN0LT51cmwoKS5zdHJpbmcoKSkpOworfQorCitz
dGF0aWMgQXRrT2JqZWN0KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2JqZWN0KEF0a0h5
cGVybGluayogbGluaywgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChX
RUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOworICAgIGdfcmV0dXJuX3Zh
bF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+bGlua0ltcGwsIDAp
OworCisgICAgLy8gRklYTUU6IERvIE5PVCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ug
b2YgYW4gQXRrT2JqZWN0CisgICAgLy8gaW1wbGVtZW50aW5nIEF0a0h5cGVybGlua0ltcGwgaW4g
ZXZlcnkgaW5zdGFuY2Ugb2YgQXRrSHlwZXJMaW5rCisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwo
IWluZGV4LCAwKTsKKworICAgIHJldHVybiBBVEtfT0JKRUNUKFdFQktJVF9BQ0NFU1NJQkxFX0hZ
UEVSTElOSyhsaW5rKS0+bGlua0ltcGwpOworfQorCitzdGF0aWMgZ2ludCBnZXRSYW5nZUxlbmd0
aEZvck9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmosIFJhbmdlKiByYW5nZSkKK3sKKyAg
ICAvLyBUaGlzIGlzIGdvaW5nIHRvIGJlIHRoZSBhY3R1YWwgbGVuZ3RoIGluIG1vc3Qgb2YgdGhl
IGNhc2VzCisgICAgZ2ludCBiYXNlTGVuZ3RoID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChy
YW5nZSk7CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGh5cGVybGluayBiZWxv
bmdzIHRvIGEgbGlzdCBpdGVtLgorICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRo
ZSBsZW5ndGggb2YgdGhlIGl0ZW0ncyBtYXJrZXIKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBw
YXJlbnQgPSBvYmotPnBhcmVudE9iamVjdFVuaWdub3JlZCgpOworICAgIGlmICghcGFyZW50IHx8
ICFwYXJlbnQtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpIHx8ICFwYXJlbnQtPmlzTGlz
dEl0ZW0oKSkKKyAgICAgICAgcmV0dXJuIGJhc2VMZW5ndGg7CisKKyAgICAvLyBFdmVuIGlmIHdl
IGRvbid0IGV4cG9zZSBsaXN0IG1hcmtlcnMgdG8gQXNzaXN0aXZlCisgICAgLy8gVGVjaG5vbG9n
aWVzLCB3ZSBuZWVkIHRvIGhhdmUgYSB3YXkgdG8gbWVhc3VyZSB0aGVpciBsZW5ndGgKKyAgICAv
LyBmb3IgdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5lZWRlZCB0byB0YWtlIGl0IGludG8gYWNjb3Vu
dAorICAgIC8vIHNlcGFyYXRlbHkgKGFzIGluIGdldEFjY2Vzc2liaWxpdHlPYmplY3RGb3JPZmZz
ZXQpCisgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogbWFya2VyT2JqID0gcGFyZW50LT5maXJzdENo
aWxkKCk7CisgICAgaWYgKCFtYXJrZXJPYmopCisgICAgICAgIHJldHVybiBiYXNlTGVuZ3RoOwor
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IHN0YXRpY19jYXN0PGNvbnN0IEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3QqPihtYXJrZXJPYmopLT5yZW5kZXJlcigpOworICAgIGlmICghcmVu
ZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0xpc3RNYXJrZXIoKSkKKyAgICAgICAgcmV0dXJuIGJhc2VM
ZW5ndGg7CisKKyAgICBSZW5kZXJMaXN0TWFya2VyKiBtYXJrZXIgPSB0b1JlbmRlckxpc3RNYXJr
ZXIocmVuZGVyZXIpOworICAgIHJldHVybiBiYXNlTGVuZ3RoICsgbWFya2VyLT50ZXh0KCkubGVu
Z3RoKCkgKyBtYXJrZXItPnN1ZmZpeCgpLmxlbmd0aCgpOworfQorCitzdGF0aWMgZ2ludCB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0U3RhcnRJbmRleChBdGtIeXBlcmxpbmsqIGxpbmspCit7
CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5L
KGxpbmspLCAwKTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3Jl
KGxpbmspOworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBO
b2RlKiBub2RlID0gY29yZU9iamVjdC0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gUmFuZ2U6OmNyZWF0ZShub2Rl
LT5kb2N1bWVudCgpLCBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5vZGUtPnBhcmVudE5vZGUoKSksIGZp
cnN0UG9zaXRpb25Jbk5vZGUobm9kZSkpOworICAgIHJldHVybiBnZXRSYW5nZUxlbmd0aEZvck9i
amVjdChjb3JlT2JqZWN0LCByYW5nZS5nZXQoKSk7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFj
Y2Vzc2libGVIeXBlcmxpbmtHZXRFbmRJbmRleChBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAg
Z19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmsp
LCAwKTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKGxpbmsp
OworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBOb2RlKiBu
b2RlID0gY29yZU9iamVjdC0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gUmFuZ2U6OmNyZWF0ZShub2RlLT5kb2N1
bWVudCgpLCBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5vZGUtPnBhcmVudE5vZGUoKSksIGxhc3RQb3Np
dGlvbkluTm9kZShub2RlKSk7CisgICAgcmV0dXJuIGdldFJhbmdlTGVuZ3RoRm9yT2JqZWN0KGNv
cmVPYmplY3QsIHJhbmdlLmdldCgpKTsKK30KKworc3RhdGljIGdib29sZWFuIHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtJc1ZhbGlkKEF0a0h5cGVybGluayogbGluaykKK3sKKyAgICBnX3JldHVy
bl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOwor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5r
KS0+bGlua0ltcGwsIEZBTFNFKTsKKworICAgIC8vIExpbmsgaXMgdmFsaWQgZm9yIHRoZSB3aG9s
ZSBvYmplY3QncyBsaWZldGltZQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2ludCB3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0TkFuY2hvcnMoQXRrSHlwZXJsaW5rKiBsaW5rKQor
eworICAgIC8vIEZJWE1FIERvIE5PVCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2Yg
YW4gQXRrT2JqZWN0CisgICAgLy8gaW1wbGVtZW50aW5nIEF0a0h5cGVybGlua0ltcGwgaW4gZXZl
cnkgaW5zdGFuY2Ugb2YgQXRrSHlwZXJMaW5rCisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VC
S0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLCAwKTsKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayktPmxpbmtJbXBsLCAwKTsK
KyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGdib29sZWFuIHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtJc1NlbGVjdGVkTGluayhBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgLy8gTm90IGlt
cGxlbWVudGVkOiB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgaW4gQVRLIG5vdworICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW5pdChBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgV0VC
S0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLT5saW5rSW1wbCA9IDA7Cit9CisKK3N0YXRp
YyB2b2lkIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtGaW5hbGl6ZShHT2JqZWN0KiBvYmplY3Qp
Cit7CisgICAgR19PQkpFQ1RfQ0xBU1Mod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua1BhcmVudENs
YXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0QWNjZXNzaWJs
ZUh5cGVybGlua0NsYXNzSW5pdChBdGtIeXBlcmxpbmtDbGFzcyoga2xhc3MpCit7CisgICAgR09i
amVjdENsYXNzKiBnb2JqZWN0Q2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7CisKKyAgICB3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rUGFyZW50Q2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19w
YXJlbnQoa2xhc3MpOworCisgICAgZ29iamVjdENsYXNzLT5maW5hbGl6ZSA9IHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtGaW5hbGl6ZTsKKworICAgIGtsYXNzLT5nZXRfdXJpID0gd2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0dldFVSSTsKKyAgICBrbGFzcy0+Z2V0X29iamVjdCA9IHdlYmtpdEFj
Y2Vzc2libGVIeXBlcmxpbmtHZXRPYmplY3Q7CisgICAga2xhc3MtPmdldF9zdGFydF9pbmRleCA9
IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRTdGFydEluZGV4OworICAgIGtsYXNzLT5nZXRf
ZW5kX2luZGV4ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldEVuZEluZGV4OworICAgIGts
YXNzLT5pc192YWxpZCA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJc1ZhbGlkOworICAgIGts
YXNzLT5nZXRfbl9hbmNob3JzID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE5BbmNob3Jz
OworICAgIGtsYXNzLT5pc19zZWxlY3RlZF9saW5rID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0lzU2VsZWN0ZWRMaW5rOworfQorCitHVHlwZSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0
VHlwZSgpCit7CisgICAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHR5cGVWb2xhdGlsZSA9IDA7CisK
KyAgICBpZiAoZ19vbmNlX2luaXRfZW50ZXIoJnR5cGVWb2xhdGlsZSkpIHsKKyAgICAgICAgc3Rh
dGljIGNvbnN0IEdUeXBlSW5mbyB0aW5mbyA9IHsKKyAgICAgICAgICAgIHNpemVvZihXZWJLaXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MpLAorICAgICAgICAgICAgKEdCYXNlSW5pdEZ1bmMpIDAs
CisgICAgICAgICAgICAoR0Jhc2VGaW5hbGl6ZUZ1bmMpIDAsCisgICAgICAgICAgICAoR0NsYXNz
SW5pdEZ1bmMpIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzc0luaXQsCisgICAgICAgICAg
ICAoR0NsYXNzRmluYWxpemVGdW5jKSAwLAorICAgICAgICAgICAgMCwgLyogY2xhc3MgZGF0YSAq
LworICAgICAgICAgICAgc2l6ZW9mKFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmspLCAvKiBpbnN0
YW5jZSBzaXplICovCisgICAgICAgICAgICAwLCAvKiBuYiBwcmVhbGxvY3MgKi8KKyAgICAgICAg
ICAgIChHSW5zdGFuY2VJbml0RnVuYykgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0luaXQsCisg
ICAgICAgICAgICAwIC8qIHZhbHVlIHRhYmxlICovCisgICAgICAgIH07CisKKyAgICAgICAgc3Rh
dGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIGFjdGlvbkluZm8gPQorICAgICAgICAgIHsKKyAgICAg
ICAgICAgIChHSW50ZXJmYWNlSW5pdEZ1bmMpKEdJbnRlcmZhY2VJbml0RnVuYylhdGtBY3Rpb25J
bnRlcmZhY2VJbml0LAorICAgICAgICAgICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpIDAsIDAK
KyAgICAgICAgICB9OworCisgICAgICAgIEdUeXBlIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3Rh
dGljKEFUS19UWVBFX0hZUEVSTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIldlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsiLCAmdGluZm8sIEdUeXBlRmxh
Z3MoMCkpOworICAgICAgICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWModHlwZSwgQVRLX1RZ
UEVfQUNUSU9OLCAmYWN0aW9uSW5mbyk7CisKKyAgICAgICAgZ19vbmNlX2luaXRfbGVhdmUoJnR5
cGVWb2xhdGlsZSwgdHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVWb2xhdGlsZTsKK30K
Kworc3RhdGljIHZvaWQgaHlwZXJsaW5rSW1wbEZpbmFsaXplZChXZWJLaXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rKiBsaW5rLCBBdGtIeXBlcmxpbmtJbXBsKiBsaW5rSW1wbCkKK3sKKyAgICAvLyBPYmpl
Y3Qgbm8gbG9uZ2VyIGFsaXZlLCByZW1vdmUgaXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBhbmQKKyAg
ICAvLyBkZXN0cm95IHRoZSBBdGtIeXBlcmxpbmsgb2JqZWN0CisgICAgQVNTRVJUKGhhc2hUYWJs
ZSk7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZShoYXNoVGFibGUsIGxpbmtJbXBsKTsKKyAgICBn
X29iamVjdF91bnJlZihsaW5rKTsKK30KKworV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayogd2Vi
a2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE9yQ3JlYXRlKEF0a0h5cGVybGlua0ltcGwqIGxpbmtJ
bXBsKQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEFUS19JU19IWVBFUkxJTktfSU1QTChs
aW5rSW1wbCksIDApOworCisgICAgLy8gTGF6eSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIGhhc2gg
dGFibGUKKyAgICBpZiAoIWhhc2hUYWJsZSkKKyAgICAgICAgaGFzaFRhYmxlID0gZ19oYXNoX3Rh
YmxlX25ldyhnX2RpcmVjdF9oYXNoLCBnX2RpcmVjdF9lcXVhbCk7CisKKyAgICBXZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rKiBsaW5rID0gV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGdfaGFz
aF90YWJsZV9sb29rdXAoaGFzaFRhYmxlLCAoY29uc3Qgdm9pZCopbGlua0ltcGwpKTsKKyAgICBp
ZiAoIWxpbmspIHsKKyAgICAgICAgbGluayA9IHN0YXRpY19jYXN0PFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmsqPihnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkss
IDApKTsKKyAgICAgICAgbGluay0+bGlua0ltcGwgPSBsaW5rSW1wbDsKKworICAgICAgICBnX29i
amVjdF93ZWFrX3JlZihHX09CSkVDVChsaW5rSW1wbCksIChHV2Vha05vdGlmeSloeXBlcmxpbmtJ
bXBsRmluYWxpemVkLCBsaW5rKTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2luc2VydChoYXNoVGFi
bGUsICh2b2lkKilsaW5rSW1wbCwgbGluayk7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9
CisKK1dlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3QqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxp
bmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxpbmsp
Cit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJM
SU5LKGxpbmspLCAwKTsKKyAgICByZXR1cm4gY29yZShsaW5rKTsKK30KKworI2VuZGlmIC8vIEhB
VkUoQUNDRVNTSUJJTElUWSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsv
V2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9X
ZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uZjc4ZWNhOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9n
dGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXZWJLaXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rX2gKKyNkZWZpbmUgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua19oCisKKyNpbmNsdWRl
IDxhdGsvYXRrLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEFjY2Vzc2liaWxpdHlP
YmplY3Q7Cit9CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJLSVRfVFlQRV9BQ0NFU1NJ
QkxFX0hZUEVSTElOSyAgICAgICAgICAgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
R2V0VHlwZSAoKSkKKyNkZWZpbmUgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKG9iaikgICAg
ICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBXRUJLSVRf
VFlQRV9BQ0NFU1NJQkxFX0hZUEVSTElOSywgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluaykpCisj
ZGVmaW5lIFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOS19DTEFTUyhrbGFzcykgICAgICAgICAg
KEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBXRUJLSVRfVFlQRV9BQ0NFU1NJQkxF
X0hZUEVSTElOSywgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua0NsYXNzKSkKKyNkZWZpbmUgV0VC
S0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKG9iaikgICAgICAgICAgICAgICAoR19UWVBFX0NI
RUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBXRUJLSVRfVFlQRV9BQ0NFU1NJQkxFX0hZUEVSTElO
SykpCisjZGVmaW5lIFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOS19DTEFTUyhrbGFzcykg
ICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBXRUJLSVRfVFlQRV9BQ0NF
U1NJQkxFX0hZUEVSTElOSykpCisjZGVmaW5lIFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOS19H
RVRfQ0xBU1Mob2JqKSAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBX
RUJLSVRfVFlQRV9BQ0NFU1NJQkxFX0hZUEVSTElOSywgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlu
a0NsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgICAg
ICAgICAgICAgICAgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluazsKK3R5cGVkZWYgc3RydWN0IF9X
ZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MgICAgICAgICAgIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmtDbGFzczsKKworc3RydWN0IF9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIHsKKyAg
ICBBdGtIeXBlcmxpbmsgcGFyZW50OworICAgIEF0a0h5cGVybGlua0ltcGwqIGxpbmtJbXBsOwor
fTsKKworc3RydWN0IF9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MgeworICAgIEF0a09i
amVjdENsYXNzIHBhcmVudENsYXNzOworfTsKKworR1R5cGUgd2Via2l0QWNjZXNzaWJsZUh5cGVy
bGlua0dldFR5cGUodm9pZCkgR19HTlVDX0NPTlNUOworCitXZWJLaXRBY2Nlc3NpYmxlSHlwZXJs
aW5rKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T3JDcmVhdGUoQXRrSHlwZXJsaW5rSW1w
bCogbGlua0ltcGwpOworCitXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0KiB3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rR2V0QWNjZXNzaWJpbGl0eU9iamVjdChXZWJLaXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rKiBsaW5rKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8vIFdlYktpdEFjY2Vzc2li
bGVIeXBlcmxpbmtfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cgYi9XZWJLaXQv
Z3RrL0NoYW5nZUxvZwppbmRleCBkMTk5MDJjLi5lMzk0ZDM2IDEwMDY0NAotLS0gYS9XZWJLaXQv
Z3RrL0NoYW5nZUxvZworKysgYi9XZWJLaXQvZ3RrL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE5IEBA
CisyMDEwLTEwLTIwICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbR3RrXSBB
dGtIeXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNzg1CisKKyAgICAgICAgTmV3IHRlc3QgdG8g
ZW5zdXJlIHRoZSBBdGtIeXBlcnRleHQvQXRrSHlwZXJsaW5rIHN0dWZmIHdvcmtzLgorCisgICAg
ICAgICogdGVzdHMvdGVzdGF0ay5jOgorICAgICAgICAodGVzdFdlYmtpdEF0a0h5cGVydGV4dEFu
ZEh5cGVybGlua3MpOiBOZXcgdGVzdCwgY2hlY2tpbmcgYm90aCB0aGUKKyAgICAgICAgaW1wbGVt
ZW50YXRpb24gb2YgdGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UsIHRoZSBzdWJjbGFzcyBvZiB0
aGUKKyAgICAgICAgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLCBhbmQgdGhlIGltcGxlbWVu
dGF0aW9uIG9mIHRoZQorICAgICAgICBBdGtBY3Rpb24gaW50ZXJmYWNlIGluIHRoYXQgc3ViY2xh
c3MuCisgICAgICAgIChtYWluKTogQWRkZWQgdGhlIG5ldyB1bml0IHRlc3QuCisKIDIwMTAtMTAt
MTkgIEpvb25lIEh1ciAgPGpvb25lQGtsZHAub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE1h
cnRpbiBSb2JpbnNvbi4KZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsvdGVzdHMvdGVzdGF0ay5jIGIv
V2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMKaW5kZXggYzhkZjRlZi4uNDI4NjI3NSAxMDA2NDQK
LS0tIGEvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMKKysrIGIvV2ViS2l0L2d0ay90ZXN0cy90
ZXN0YXRrLmMKQEAgLTQ2LDYgKzQ2LDggQEAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnRlbnRzSW5U
YWJsZVdpdGhIZWFkZXJzID0gIjxodG1sPjxib2R5Pjx0YWJsZT48dHI+PHRoPmZvbzwKIAogc3Rh
dGljIGNvbnN0IGNoYXIqIGZvcm1XaXRoVGV4dElucHV0cyA9ICI8aHRtbD48Ym9keT48Zm9ybT48
aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZW50cnknIC8+PC9mb3JtPjwvYm9keT48L2h0bWw+IjsK
IAorc3RhdGljIGNvbnN0IGNoYXIqIGh5cGVydGV4dEFuZEh5cGVybGlua3MgPSAiPGh0bWw+PGJv
ZHk+PHA+QSBwYXJhZ3JhcGggd2l0aCBubyBsaW5rcyBhdCBhbGw8L3A+PHA+PGEgaHJlZj0naHR0
cDovL2Zvby5iYXIuYmF6Lyc+QSBsaW5lPC9hPiB3aXRoIDxhIGhyZWY9J2h0dHA6Ly9iYXIuYmF6
LmZvby8nPmEgbGluayBpbiB0aGUgbWlkZGxlPC9hPiBhcyB3ZWxsIGFzIGF0IHRoZSBiZWdpbm5p
bmcgYW5kIDxhIGhyZWY9J2h0dHA6Ly9iYXouZm9vLmJhci8nPmF0IHRoZSBlbmQ8L2E+PC9wPjwv
Ym9keT48L2h0bWw+IjsKKwogc3RhdGljIGNvbnN0IGNoYXIqIGxpc3RzT2ZJdGVtcyA9ICI8aHRt
bD48Ym9keT48dWw+PGxpPnRleHQgb25seTwvbGk+PGxpPjxhIGhyZWY9J2Zvbyc+bGluayBvbmx5
PC9hPjwvbGk+PGxpPnRleHQgYW5kIGEgPGEgaHJlZj0nYmFyJz5saW5rPC9hPjwvbGk+PC91bD48
b2w+PGxpPnRleHQgb25seTwvbGk+PGxpPjxhIGhyZWY9J2Zvbyc+bGluayBvbmx5PC9hPjwvbGk+
PGxpPnRleHQgYW5kIGEgPGEgaHJlZj0nYmFyJz5saW5rPC9hPjwvbGk+PC9vbD48L2JvZHk+PC9o
dG1sPiI7CiAKIHN0YXRpYyBjb25zdCBjaGFyKiB0ZXh0Rm9yU2VsZWN0aW9ucyA9ICI8aHRtbD48
Ym9keT48cD5BIHBhcmFncmFwaCB3aXRoIHBsYWluIHRleHQ8L3A+PHA+QSBwYXJhZ3JhcGggd2l0
aCA8YSBocmVmPSdodHRwOi8vd2Via2l0Lm9yZyc+YSBsaW5rPC9hPiBpbiB0aGUgbWlkZGxlPC9w
PjwvYm9keT48L2h0bWw+IjsKQEAgLTk2NCw2ICs5NjYsODIgQEAgc3RhdGljIHZvaWQgdGVzdFdl
YmtpdEF0a0dldEV4dGVudHModm9pZCkKICAgICBnX29iamVjdF91bnJlZih3ZWJWaWV3KTsKIH0K
IAorc3RhdGljIHZvaWQgdGVzdFdlYmtpdEF0a0h5cGVydGV4dEFuZEh5cGVybGlua3Modm9pZCkK
K3sKKyAgICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93
ZWJfdmlld19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3Npbmsod2ViVmlldyk7CisgICAgR3Rr
QWxsb2NhdGlvbiBhbGxvYyA9IHsgMCwgMCwgODAwLCA2MDAgfTsKKyAgICBndGtfd2lkZ2V0X3Np
emVfYWxsb2NhdGUoR1RLX1dJREdFVCh3ZWJWaWV3KSwgJmFsbG9jKTsKKyAgICB3ZWJraXRfd2Vi
X3ZpZXdfbG9hZF9zdHJpbmcod2ViVmlldywgaHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcywgMCwgMCwg
MCk7CisgICAgR01haW5Mb29wKiBsb29wID0gZ19tYWluX2xvb3BfbmV3KDAsIFRSVUUpOworCisg
ICAgZ19pZGxlX2FkZCgoR1NvdXJjZUZ1bmMpYmFpbF9vdXQsIGxvb3ApOworICAgIGdfbWFpbl9s
b29wX3J1bihsb29wKTsKKworICAgIEF0a09iamVjdCogb2JqID0gZ3RrX3dpZGdldF9nZXRfYWNj
ZXNzaWJsZShHVEtfV0lER0VUKHdlYlZpZXcpKTsKKyAgICBnX2Fzc2VydChvYmopOworCisgICAg
QXRrT2JqZWN0KiBwYXJhZ3JhcGgxID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChv
YmosIDApOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QocGFyYWdyYXBoMSkpOworICAgIGdfYXNz
ZXJ0KGF0a19vYmplY3RfZ2V0X3JvbGUocGFyYWdyYXBoMSkgPT0gQVRLX1JPTEVfUEFSQUdSQVBI
KTsKKyAgICBnX2Fzc2VydChBVEtfSVNfSFlQRVJURVhUKHBhcmFncmFwaDEpKTsKKworICAgIC8v
IE5vIGxpbmtzIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGgKKyAgICBnaW50IG5MaW5rcyA9IGF0a19o
eXBlcnRleHRfZ2V0X25fbGlua3MoQVRLX0hZUEVSVEVYVChwYXJhZ3JhcGgxKSk7CisgICAgZ19h
c3NlcnRfY21waW50KG5MaW5rcywgPT0sIDApOworCisgICAgQXRrT2JqZWN0KiBwYXJhZ3JhcGgy
ID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChvYmosIDEpOworICAgIGdfYXNzZXJ0
KEFUS19PQkpFQ1QocGFyYWdyYXBoMikpOworICAgIGdfYXNzZXJ0KGF0a19vYmplY3RfZ2V0X3Jv
bGUocGFyYWdyYXBoMikgPT0gQVRLX1JPTEVfUEFSQUdSQVBIKTsKKyAgICBnX2Fzc2VydChBVEtf
SVNfSFlQRVJURVhUKHBhcmFncmFwaDIpKTsKKworICAgIC8vIENoZWNrIGxpbmtzIGluIHRoZSBz
ZWNvbmQgcGFyYWdyYXBoCisgICAgbkxpbmtzID0gYXRrX2h5cGVydGV4dF9nZXRfbl9saW5rcyhB
VEtfSFlQRVJURVhUKHBhcmFncmFwaDIpKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQobkxpbmtzLCA9
PSwgMyk7CisKKyAgICBBdGtIeXBlcmxpbmsqIGhMaW5rMSA9IGF0a19oeXBlcnRleHRfZ2V0X2xp
bmsoQVRLX0hZUEVSVEVYVChwYXJhZ3JhcGgyKSwgMCk7CisgICAgZ19hc3NlcnQoQVRLX0hZUEVS
TElOSyhoTGluazEpKTsKKyAgICBBdGtPYmplY3QqIGhMaW5rT2JqZWN0MSA9IGF0a19oeXBlcmxp
bmtfZ2V0X29iamVjdChoTGluazEsIDApOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QoaExpbmtP
YmplY3QxKSk7CisgICAgZ19hc3NlcnQoYXRrX29iamVjdF9nZXRfcm9sZShoTGlua09iamVjdDEp
ID09IEFUS19ST0xFX0xJTkspOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dl
dF9zdGFydF9pbmRleChoTGluazEpLCA9PSwgMCk7CisgICAgZ19hc3NlcnRfY21waW50KGF0a19o
eXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoTGluazEpLCA9PSwgNik7CisgICAgZ19hc3NlcnRfY21w
aW50KGF0a19oeXBlcmxpbmtfZ2V0X25fYW5jaG9ycyhoTGluazEpLCA9PSwgMSk7CisgICAgZ19h
c3NlcnRfY21wc3RyKGF0a19oeXBlcmxpbmtfZ2V0X3VyaShoTGluazEsIDApLCA9PSwgImh0dHA6
Ly9mb28uYmFyLmJhei8iKTsKKworICAgIEF0a0h5cGVybGluayogaExpbmsyID0gYXRrX2h5cGVy
dGV4dF9nZXRfbGluayhBVEtfSFlQRVJURVhUKHBhcmFncmFwaDIpLCAxKTsKKyAgICBnX2Fzc2Vy
dChBVEtfSFlQRVJMSU5LKGhMaW5rMikpOworICAgIEF0a09iamVjdCogaExpbmtPYmplY3QyID0g
YXRrX2h5cGVybGlua19nZXRfb2JqZWN0KGhMaW5rMiwgMCk7CisgICAgZ19hc3NlcnQoQVRLX09C
SkVDVChoTGlua09iamVjdDIpKTsKKyAgICBnX2Fzc2VydChhdGtfb2JqZWN0X2dldF9yb2xlKGhM
aW5rT2JqZWN0MikgPT0gQVRLX1JPTEVfTElOSyk7CisgICAgZ19hc3NlcnRfY21waW50KGF0a19o
eXBlcmxpbmtfZ2V0X3N0YXJ0X2luZGV4KGhMaW5rMiksID09LCAxMik7CisgICAgZ19hc3NlcnRf
Y21waW50KGF0a19oeXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoTGluazIpLCA9PSwgMzIpOworICAg
IGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9uX2FuY2hvcnMoaExpbmsyKSwgPT0s
IDEpOworICAgIGdfYXNzZXJ0X2NtcHN0cihhdGtfaHlwZXJsaW5rX2dldF91cmkoaExpbmsyLCAw
KSwgPT0sICJodHRwOi8vYmFyLmJhei5mb28vIik7CisKKyAgICBBdGtIeXBlcmxpbmsqIGhMaW5r
MyA9IGF0a19oeXBlcnRleHRfZ2V0X2xpbmsoQVRLX0hZUEVSVEVYVChwYXJhZ3JhcGgyKSwgMik7
CisgICAgZ19hc3NlcnQoQVRLX0hZUEVSTElOSyhoTGluazMpKTsKKyAgICBBdGtPYmplY3QqIGhM
aW5rT2JqZWN0MyA9IGF0a19oeXBlcmxpbmtfZ2V0X29iamVjdChoTGluazMsIDApOworICAgIGdf
YXNzZXJ0KEFUS19PQkpFQ1QoaExpbmtPYmplY3QzKSk7CisgICAgZ19hc3NlcnQoYXRrX29iamVj
dF9nZXRfcm9sZShoTGlua09iamVjdDMpID09IEFUS19ST0xFX0xJTkspOworICAgIGdfYXNzZXJ0
X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9zdGFydF9pbmRleChoTGluazMpLCA9PSwgNjUpOwor
ICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9lbmRfaW5kZXgoaExpbmszKSwg
PT0sIDc1KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVybGlua19nZXRfbl9hbmNob3Jz
KGhMaW5rMyksID09LCAxKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoYXRrX2h5cGVybGlua19nZXRf
dXJpKGhMaW5rMywgMCksID09LCAiaHR0cDovL2Jhei5mb28uYmFyLyIpOworCisgICAgLy8gRmlu
YWxseSBjaGVjayB0aGUgQXRrQWN0aW9uIGludGVyZmFjZSBmb3IgYSBnaXZlbiBBdGtIeXBlcmxp
bmsKKyAgICBnX2Fzc2VydChBVEtfSVNfQUNUSU9OKGhMaW5rMSkpOworICAgIGdfYXNzZXJ0X2Nt
cGludChhdGtfYWN0aW9uX2dldF9uX2FjdGlvbnMoQVRLX0FDVElPTihoTGluazEpKSwgPT0sIDEp
OworICAgIGdfYXNzZXJ0X2NtcHN0cihhdGtfYWN0aW9uX2dldF9rZXliaW5kaW5nKEFUS19BQ1RJ
T04oaExpbmsxKSwgMCksID09LCAiIik7CisgICAgZ19hc3NlcnRfY21wc3RyKGF0a19hY3Rpb25f
Z2V0X25hbWUoQVRLX0FDVElPTihoTGluazEpLCAwKSwgPT0sICJqdW1wIik7CisgICAgZ19hc3Nl
cnQoYXRrX2FjdGlvbl9kb19hY3Rpb24oQVRLX0FDVElPTihoTGluazEpLCAwKSk7CisKKyAgICBn
X29iamVjdF91bnJlZihwYXJhZ3JhcGgxKTsKKyAgICBnX29iamVjdF91bnJlZihwYXJhZ3JhcGgy
KTsKKyAgICBnX29iamVjdF91bnJlZih3ZWJWaWV3KTsKK30KKworCiBzdGF0aWMgdm9pZCB0ZXN0
V2Via2l0QXRrTGlzdHNPZkl0ZW1zKHZvaWQpCiB7CiAgICAgV2ViS2l0V2ViVmlldyogd2ViVmll
dyA9IFdFQktJVF9XRUJfVklFVyh3ZWJraXRfd2ViX3ZpZXdfbmV3KCkpOwpAQCAtMTExNiw2ICsx
MTk0LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogICAgIGdfdGVzdF9hZGRf
ZnVuYygiL3dlYmtpdC9hdGsvdGV4dEF0dHJpYnV0ZXMiLCB0ZXN0V2Via2l0QXRrVGV4dEF0dHJp
YnV0ZXMpOwogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvdGV4dFNlbGVjdGlvbnMi
LCB0ZXN0V2VraXRBdGtUZXh0U2VsZWN0aW9ucyk7CiAgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Vi
a2l0L2F0ay9nZXRFeHRlbnRzIiwgdGVzdFdlYmtpdEF0a0dldEV4dGVudHMpOworICAgIGdfdGVz
dF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvaHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyIsIHRlc3RXZWJr
aXRBdGtIeXBlcnRleHRBbmRIeXBlcmxpbmtzKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJr
aXQvYXRrL2xpc3RzT2ZJdGVtcyIsIHRlc3RXZWJraXRBdGtMaXN0c09mSXRlbXMpOwogICAgIGdf
dGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvdGV4dENoYW5nZWROb3RpZmljYXRpb25zIiwgdGVz
dFdlYmtpdEF0a1RleHRDaGFuZ2VkTm90aWZpY2F0aW9ucyk7CiAgICAgcmV0dXJuIGdfdGVzdF9y
dW4gKCk7Ci0tIAoxLjcuMQoK
</data>
<flag name="review"
          id="61447"
          type_id="1"
          status="-"
          setter="mrobinson"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72159</attachid>
            <date>2010-10-28 01:32:39 -0700</date>
            <delta_ts>2010-10-29 15:27:23 -0700</delta_ts>
            <desc>Patch proposal + unit test</desc>
            <filename>0001-2010-10-28-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>44616</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAwZjE1OWExYmI0MTNhMTQ2ZmU5ODdlNWNlYjJkOGVjZWQzYmRlOTczIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBUaHUsIDI4IE9jdCAyMDEwIDEwOjAwOjU2ICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gMjAxMC0xMC0yOCAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+
CgogICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3RrXSBBdGtI
eXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODUKCiAgICAgICAgSW1wbGVtZW50ZWQgdGhlIEF0
a0h5cGVybGluay9BdGtIeXBlcnRleHQgc3R1ZmYgaW4gdGhlIEdUSyBwb3J0LgoKICAgICAgICBF
dmVuIHRob3VnaHQgdGhlc2Uga2luZCBvZiB0YXNrcyBhcmUgdXN1YWxseSBhYm91dCBpbXBsZW1l
bnRpbmcgYW4KICAgICAgICBpbnRlcmZhY2UsIGluIHRoaXMgY2FzZSBpdCB3YXMgbmVlZGVkIHRv
IGltcGxlbWVudCBzb21lIG1vcmUKICAgICAgICB0aGluZ3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQg
QXRrSHlwZXJsaW5rIGlzIG5laXRoZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgbm9yIGFuIEF0a09i
amVjdCwgYnV0IGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MgY2hpbGQgb2YgR09iamVjdCB0aGF0CiAg
ICAgICAgbmVlZHMgdG8gYmUgcmVkZWZpbmVkIGluIGEgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgdGhh
dCBvbmUuIE9uIHRvcAogICAgICAgIG9mIHRoYXQsIGl0IHdhcyBuZWVkZWQgdG8gaW1wbGVtZW50
IHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlIGFzCiAgICAgICAgd2VsbCBmb3IgdGhhdCBuZXcgY2xh
c3MsIHNvIGV4cG9zZWQgaHlwZXJsaW5rcyBjYW4gd29yayBhcwogICAgICAgIGV4cGVjdGVkIHdp
dGggQXNzaXN0aXZlIFRlY2hub2xvZ2llcyBiYXNlZCBvbiBBVEsuCgogICAgICAgIEZ1cnRoZXJt
b3JlLCBhcyB0aGVyZSdzIG5vIG1lY2hhbmlzbSB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgdGhhdAog
ICAgICAgIEF0a0h5cGVybGluayBvdGhlciB0aGFuIGRvaW5nIGl0IHRocm91Z2ggYW4gQXRrT2Jq
ZWN0IGltcGxlbWVudGluZwogICAgICAgIHRoZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNlLCBpdCB3
YXMgbmVlZGVkIHRvIGFsc28gYWRkIHRoZSBjb2RlIHRvCiAgICAgICAgaW1wbGVtZW50IHRoYXQg
b25lLCBzbyBpdCBtYWtlcyBwb3NzaWJsZSB0byBhc2sgZm9yIHRoZQogICAgICAgICdoeXBlcmxp
bmtzJyB1bmRlciBhbiAnaHlwZXJ0ZXh0JyBhY2Nlc3NpYmxlIG9iamVjdC4KCiAgICAgICAgRmlu
YWxseSwgdG8gY29tcGxldGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFsbCB0aGlzIHN0dWZmIGFu
ZCBtYWtlCiAgICAgICAgaXQgYWxsIGNvbnNpc3RlbnQsIGl0IHdhcyBuZWVkZWQgYXMgd2VsbCB0
byBpbXBsZW1lbnQgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rSW1wbCBpbnRlcmZhY2UgKHByb3Zp
ZGluZyBqdXN0IG9uZSBtZXRob2Qgb25seSkgc28KICAgICAgICB0aGF0IGFsbG93cyByZXRyaWV2
aW5nIHRoZSBBdGtIeXBlcmxpbmsgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYW4KICAgICAgICBBdGtP
YmplY3QgaW1wbGVtZW50aW5nIHN1Y2ggYW4gaW50ZXJmYWNlLgoKICAgICAgICAqIEdOVW1ha2Vm
aWxlLmFtOiBBZGQgdGhlIG5ldyBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLltofGNwcF0KICAg
ICAgICBmaWxlcyB0byB0aGUgc291cmNlcyBsaXN0IGZvciB0aGUgR1RLIHBvcnQuCgogICAgICAg
ICogYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgog
ICAgICAgIChjb3JlKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY29yZSBhY2Nlc3NpYmls
aXR5IG9iamVjdAogICAgICAgIHJlbGF0ZWQgdG8gYW4gQXRrT2JqZWN0IGltcGxlbWVudGluZyB0
aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZS4KICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVy
dGV4dEdldExpbmspOiBOZXcsIHBhcnQgb2YgdGhlCiAgICAgICAgaW1wbGVtZW50YXRpb24gb2Yg
dGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBl
cnRleHRHZXROTGlua3MpOiBOZXcsIGxpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJ0ZXh0R2V0TGlua0luZGV4KTogTmV3LCBsaWtld2lzZS4KICAgICAgICAoYXRrSHlwZXJ0
ZXh0SW50ZXJmYWNlSW5pdCk6IE5ldywgaW5pdGlhbGl6ZSB0aGUgQXRrSHlwZXJ0ZXh0CiAgICAg
ICAgaW50ZXJmYWNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW1wbEdldEh5
cGVybGluayk6IE5ldywgcGFydCBvZiB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUg
QXRrSHlwZXJsaW5rSW1wbCBpbnRlcmZhY2UuCiAgICAgICAgKGF0a0h5cGVybGlua0ltcGxJbnRl
cmZhY2VJbml0KTogTmV3LCBpbml0aWFsaXplIHRoZQogICAgICAgIEF0a0h5cGVybGlua0ltcGwg
aW50ZXJmYWNlLgogICAgICAgIChHZXRBdGtJbnRlcmZhY2VUeXBlRnJvbVdBSVR5cGUpOiBBZGQg
QVRLX1RZUEVfSFlQRVJURVhUIGFuZAogICAgICAgIEFUS19UWVBFX0hZUEVSTElOS19JTVBMIHRv
IHRoZSBsaXN0IG9mIHJlY29nbml6ZWQgdHlwZXMuCiAgICAgICAgKGdldEludGVyZmFjZU1hc2tG
cm9tT2JqZWN0KTogRGVjaWRlIHdoZW4gaXQncyBuZWVkZWQgdG8gYWRkCiAgICAgICAgV0FJX0hZ
UEVSVEVYVCBhbmQgV0FJX0hZUEVSTElOSyB0byB0aGUgaW50ZXJmYWNlIG1hc2suCgogICAgICAg
ICogYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oOiBBZGRlZC4K
ICAgICAgICAqIGFjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuY3Bw
OiBBZGRlZC4KICAgICAgICAocmV0dXJuU3RyaW5nKTogUmV0dXJuIChjb25zdCBjaGFyKikgZnJv
bSBTdHJpbmcgdmFyaWFibGVzLgogICAgICAgIChjb3JlKTogUmV0dXJuIHRoZSBhc3NvY2lhdGVk
IEFjY2Vzc2liaWxpdHlPYmplY3QuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtB
Y3Rpb25Eb0FjdGlvbik6IFBhcnQgb2YgdGhlCiAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhl
IEF0a0FjdGlvbiBpbnRlcmZhY2UuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtB
Y3Rpb25HZXROQWN0aW9ucyk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rQWN0aW9uR2V0RGVzY3JpcHRpb24pOiBMaWtld2lzZS4KICAgICAgICAod2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldEtleWJpbmRpbmcpOiBMaWtld2lzZS4KICAgICAgICAo
d2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5hbWUpOiBMaWtld2lzZS4KICAgICAg
ICAoYXRrQWN0aW9uSW50ZXJmYWNlSW5pdCk6IEluaXRpYWxpemUgdGhlIEF0a0FjdGlvbiBpbnRl
cmZhY2UuCiAgICAgICAgKGdldFJhbmdlTGVuZ3RoRm9yT2JqZWN0KTogUmV0dXJucyB0aGUgbGVu
Z3RoIGZvciBhIGdpdmVuIFJhbmdlLAogICAgICAgIGNvbnNpZGVyaW5nIHNwZWNpYWwgY2FzZXMg
KGUuZy4gTGlzdCBpdGVtIG1hcmtlcnMpLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rR2V0VVJJKTogSW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIHRoZQogICAgICAgIG1ldGhvZHMg
aW4gdGhlIEF0a0h5cGVybGluayBhYnN0cmFjdCBjbGFzcy4KICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0dldE9iamVjdCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0U3RhcnRJbmRleCk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rR2V0RW5kSW5kZXgpOiBMaWtld2lzZS4KICAgICAgICAod2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0lzVmFsaWQpOiBMaWtld2lzZS4KICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0dldE5BbmNob3JzKTogTGlrZXdpc2UuCiAgICAgICAgKHdlYmtpdEFjY2Vz
c2libGVIeXBlcmxpbmtJc1NlbGVjdGVkTGluayk6IExpa2V3aXNlLgogICAgICAgICh3ZWJraXRB
Y2Nlc3NpYmxlSHlwZXJsaW5rR2V0UHJvcGVydHkpOiBHZXR0ZXIgbWV0aG9kLgogICAgICAgICh3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rU2V0UHJvcGVydHkpOiBTZXR0ZXIgbWV0aG9kLgogICAg
ICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rRmluYWxpemUpOiBGaW5hbGl6ZSBtZXRob2Qu
CiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzc0luaXQpOiBJbml0aWFsaXpl
IHRoZQogICAgICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCiAgICAgICAgKHdl
YmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJbml0KTogSW5pdGlhbGl6ZSB0aGUKICAgICAgICBXZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGluc3RhbmNlLgogICAgICAgICh3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rR2V0VHlwZSk6IEltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgICAgIGdldF90eXBl
KCkgZnVuY3Rpb24gZm9yIHRoZSBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIGNsYXNzLgogICAg
ICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rTmV3KTogUmV0dXJucyBhbiBpbnN0YW5jZSBv
ZiB0aGUgY2xhc3MKICAgICAgICBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gQXRrSHlwZXJsaW5rSW1w
bCBvYmplY3QuCiAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRBY2Nlc3NpYmls
aXR5T2JqZWN0KTogUHVibGljIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJuaW5nIHRoZSBBY2Nlc3Np
YmlsaXR5T2JqZWN0IGFzc29jaWF0ZWQgdG8gdGhlIGluc3RhbmNlIG9mCiAgICAgICAgdGhlIFdl
YktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCgoyMDEwLTEwLTI4ICBNYXJpbyBTYW5jaGV6
IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCgogICAgICAgIFtHdGtdIEF0a0h5cGVybGluayBuZWVkcyB0byBiZSBpbXBsZW1l
bnRlZAogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzc4
NQoKICAgICAgICBOZXcgdGVzdCB0byBlbnN1cmUgdGhlIEF0a0h5cGVydGV4dC9BdGtIeXBlcmxp
bmsgc3R1ZmYgd29ya3MuCgogICAgICAgICogdGVzdHMvdGVzdGF0ay5jOgogICAgICAgICh0ZXN0
V2Via2l0QXRrSHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyk6IE5ldyB0ZXN0LCBjaGVja2luZyBib3Ro
IHRoZQogICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdGtIeXBlcnRleHQgaW50ZXJmYWNl
LCB0aGUgc3ViY2xhc3Mgb2YgdGhlCiAgICAgICAgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNz
LCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgICAgIEF0a0FjdGlvbiBpbnRlcmZh
Y2UgaW4gdGhhdCBzdWJjbGFzcy4KICAgICAgICAobWFpbik6IEFkZGVkIHRoZSBuZXcgdW5pdCB0
ZXN0LgotLS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHwgICA4NyArKysrKwogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfCAgICAyICsKIC4uLi9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJB
dGsuY3BwICAgICAgICAgIHwgIDE3MCArKysrKysrLS0KIC4uLi9ndGsvV2ViS2l0QWNjZXNzaWJs
ZUh5cGVybGluay5jcHAgICAgICAgICAgICAgIHwgIDM5MiArKysrKysrKysrKysrKysrKysrKwog
Li4uL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCAgfCAgIDYz
ICsrKysKIFdlYktpdC9ndGsvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHwgICAxNiArCiBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYyAgICAgICAgICAgICAgICAgICAg
ICAgICB8ICAgNzggKysrKwogNyBmaWxlcyBjaGFuZ2VkLCA3NzcgaW5zZXJ0aW9ucygrKSwgMzEg
ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0
ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFdlYkNv
cmUvYWNjZXNzaWJpbGl0eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBkZTYyZjMy
Li4yNjZkNGI3IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0No
YW5nZUxvZwpAQCAtMSwzICsxLDkwIEBACisyMDEwLTEwLTI4ICBNYXJpbyBTYW5jaGV6IFByYWRh
ICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbR3RrXSBBdGtIeXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50
ZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNzg1
CisKKyAgICAgICAgSW1wbGVtZW50ZWQgdGhlIEF0a0h5cGVybGluay9BdGtIeXBlcnRleHQgc3R1
ZmYgaW4gdGhlIEdUSyBwb3J0LgorCisgICAgICAgIEV2ZW4gdGhvdWdodCB0aGVzZSBraW5kIG9m
IHRhc2tzIGFyZSB1c3VhbGx5IGFib3V0IGltcGxlbWVudGluZyBhbgorICAgICAgICBpbnRlcmZh
Y2UsIGluIHRoaXMgY2FzZSBpdCB3YXMgbmVlZGVkIHRvIGltcGxlbWVudCBzb21lIG1vcmUKKyAg
ICAgICAgdGhpbmdzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEF0a0h5cGVybGluayBpcyBuZWl0aGVy
IGFuIGludGVyZmFjZQorICAgICAgICBub3IgYW4gQXRrT2JqZWN0LCBidXQganVzdCBhbiBhYnN0
cmFjdCBjbGFzcyBjaGlsZCBvZiBHT2JqZWN0IHRoYXQKKyAgICAgICAgbmVlZHMgdG8gYmUgcmVk
ZWZpbmVkIGluIGEgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgdGhhdCBvbmUuIE9uIHRvcAorICAgICAg
ICBvZiB0aGF0LCBpdCB3YXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgQXRrQWN0aW9uIGludGVy
ZmFjZSBhcworICAgICAgICB3ZWxsIGZvciB0aGF0IG5ldyBjbGFzcywgc28gZXhwb3NlZCBoeXBl
cmxpbmtzIGNhbiB3b3JrIGFzCisgICAgICAgIGV4cGVjdGVkIHdpdGggQXNzaXN0aXZlIFRlY2hu
b2xvZ2llcyBiYXNlZCBvbiBBVEsuCisKKyAgICAgICAgRnVydGhlcm1vcmUsIGFzIHRoZXJlJ3Mg
bm8gbWVjaGFuaXNtIHRvIGdldCBhbiBpbnN0YW5jZSBvZiB0aGF0CisgICAgICAgIEF0a0h5cGVy
bGluayBvdGhlciB0aGFuIGRvaW5nIGl0IHRocm91Z2ggYW4gQXRrT2JqZWN0IGltcGxlbWVudGlu
ZworICAgICAgICB0aGUgQXRrSHlwZXJ0ZXh0IGludGVyZmFjZSwgaXQgd2FzIG5lZWRlZCB0byBh
bHNvIGFkZCB0aGUgY29kZSB0bworICAgICAgICBpbXBsZW1lbnQgdGhhdCBvbmUsIHNvIGl0IG1h
a2VzIHBvc3NpYmxlIHRvIGFzayBmb3IgdGhlCisgICAgICAgICdoeXBlcmxpbmtzJyB1bmRlciBh
biAnaHlwZXJ0ZXh0JyBhY2Nlc3NpYmxlIG9iamVjdC4KKworICAgICAgICBGaW5hbGx5LCB0byBj
b21wbGV0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIHRoaXMgc3R1ZmYgYW5kIG1ha2UKKyAg
ICAgICAgaXQgYWxsIGNvbnNpc3RlbnQsIGl0IHdhcyBuZWVkZWQgYXMgd2VsbCB0byBpbXBsZW1l
bnQgdGhlCisgICAgICAgIEF0a0h5cGVybGlua0ltcGwgaW50ZXJmYWNlIChwcm92aWRpbmcganVz
dCBvbmUgbWV0aG9kIG9ubHkpIHNvCisgICAgICAgIHRoYXQgYWxsb3dzIHJldHJpZXZpbmcgdGhl
IEF0a0h5cGVybGluayBvYmplY3QgYXNzb2NpYXRlZCB0byBhbgorICAgICAgICBBdGtPYmplY3Qg
aW1wbGVtZW50aW5nIHN1Y2ggYW4gaW50ZXJmYWNlLgorCisgICAgICAgICogR05VbWFrZWZpbGUu
YW06IEFkZCB0aGUgbmV3IFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuW2h8Y3BwXQorICAgICAg
ICBmaWxlcyB0byB0aGUgc291cmNlcyBsaXN0IGZvciB0aGUgR1RLIHBvcnQuCisKKyAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHA6Cisg
ICAgICAgIChjb3JlKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY29yZSBhY2Nlc3NpYmls
aXR5IG9iamVjdAorICAgICAgICByZWxhdGVkIHRvIGFuIEF0a09iamVjdCBpbXBsZW1lbnRpbmcg
dGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlw
ZXJ0ZXh0R2V0TGluayk6IE5ldywgcGFydCBvZiB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24g
b2YgdGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJ0ZXh0R2V0TkxpbmtzKTogTmV3LCBsaWtld2lzZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vz
c2libGVIeXBlcnRleHRHZXRMaW5rSW5kZXgpOiBOZXcsIGxpa2V3aXNlLgorICAgICAgICAoYXRr
SHlwZXJ0ZXh0SW50ZXJmYWNlSW5pdCk6IE5ldywgaW5pdGlhbGl6ZSB0aGUgQXRrSHlwZXJ0ZXh0
CisgICAgICAgIGludGVyZmFjZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJ
bXBsR2V0SHlwZXJsaW5rKTogTmV3LCBwYXJ0IG9mIHRoZQorICAgICAgICBpbXBsZW1lbnRhdGlv
biBvZiB0aGUgQXRrSHlwZXJsaW5rSW1wbCBpbnRlcmZhY2UuCisgICAgICAgIChhdGtIeXBlcmxp
bmtJbXBsSW50ZXJmYWNlSW5pdCk6IE5ldywgaW5pdGlhbGl6ZSB0aGUKKyAgICAgICAgQXRrSHlw
ZXJsaW5rSW1wbCBpbnRlcmZhY2UuCisgICAgICAgIChHZXRBdGtJbnRlcmZhY2VUeXBlRnJvbVdB
SVR5cGUpOiBBZGQgQVRLX1RZUEVfSFlQRVJURVhUIGFuZAorICAgICAgICBBVEtfVFlQRV9IWVBF
UkxJTktfSU1QTCB0byB0aGUgbGlzdCBvZiByZWNvZ25pemVkIHR5cGVzLgorICAgICAgICAoZ2V0
SW50ZXJmYWNlTWFza0Zyb21PYmplY3QpOiBEZWNpZGUgd2hlbiBpdCdzIG5lZWRlZCB0byBhZGQK
KyAgICAgICAgV0FJX0hZUEVSVEVYVCBhbmQgV0FJX0hZUEVSTElOSyB0byB0aGUgaW50ZXJmYWNl
IG1hc2suCisKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rLmg6IEFkZGVkLgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vz
c2libGVIeXBlcmxpbmsuY3BwOiBBZGRlZC4KKyAgICAgICAgKHJldHVyblN0cmluZyk6IFJldHVy
biAoY29uc3QgY2hhciopIGZyb20gU3RyaW5nIHZhcmlhYmxlcy4KKyAgICAgICAgKGNvcmUpOiBS
ZXR1cm4gdGhlIGFzc29jaWF0ZWQgQWNjZXNzaWJpbGl0eU9iamVjdC4KKyAgICAgICAgKHdlYmtp
dEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25Eb0FjdGlvbik6IFBhcnQgb2YgdGhlCisgICAgICAg
IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdGtBY3Rpb24gaW50ZXJmYWNlLgorICAgICAgICAod2Vi
a2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5BY3Rpb25zKTogTGlrZXdpc2UuCisgICAg
ICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0RGVzY3JpcHRpb24pOiBMaWtl
d2lzZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25HZXRLZXliaW5k
aW5nKTogTGlrZXdpc2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9u
R2V0TmFtZSk6IExpa2V3aXNlLgorICAgICAgICAoYXRrQWN0aW9uSW50ZXJmYWNlSW5pdCk6IElu
aXRpYWxpemUgdGhlIEF0a0FjdGlvbiBpbnRlcmZhY2UuCisgICAgICAgIChnZXRSYW5nZUxlbmd0
aEZvck9iamVjdCk6IFJldHVybnMgdGhlIGxlbmd0aCBmb3IgYSBnaXZlbiBSYW5nZSwKKyAgICAg
ICAgY29uc2lkZXJpbmcgc3BlY2lhbCBjYXNlcyAoZS5nLiBMaXN0IGl0ZW0gbWFya2VycykuCisg
ICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VVJJKTogSW1wbGVtZW50YXRpb24g
b2Ygb25lIG9mIHRoZQorICAgICAgICBtZXRob2RzIGluIHRoZSBBdGtIeXBlcmxpbmsgYWJzdHJh
Y3QgY2xhc3MuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2JqZWN0KTog
TGlrZXdpc2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0U3RhcnRJbmRl
eCk6IExpa2V3aXNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldEVuZElu
ZGV4KTogTGlrZXdpc2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNWYWxp
ZCk6IExpa2V3aXNlLgorICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE5BbmNo
b3JzKTogTGlrZXdpc2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNTZWxl
Y3RlZExpbmspOiBMaWtld2lzZS4KKyAgICAgICAgKHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtH
ZXRQcm9wZXJ0eSk6IEdldHRlciBtZXRob2QuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlw
ZXJsaW5rU2V0UHJvcGVydHkpOiBTZXR0ZXIgbWV0aG9kLgorICAgICAgICAod2Via2l0QWNjZXNz
aWJsZUh5cGVybGlua0ZpbmFsaXplKTogRmluYWxpemUgbWV0aG9kLgorICAgICAgICAod2Via2l0
QWNjZXNzaWJsZUh5cGVybGlua0NsYXNzSW5pdCk6IEluaXRpYWxpemUgdGhlCisgICAgICAgIFdl
YktpdEFjY2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxl
SHlwZXJsaW5rSW5pdCk6IEluaXRpYWxpemUgdGhlCisgICAgICAgIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmsgaW5zdGFuY2UuCisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0
VHlwZSk6IEltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgICAgICBnZXRfdHlwZSgpIGZ1bmN0aW9u
IGZvciB0aGUgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayBjbGFzcy4KKyAgICAgICAgKHdlYmtp
dEFjY2Vzc2libGVIeXBlcmxpbmtOZXcpOiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFz
cworICAgICAgICBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gQXRrSHlwZXJsaW5rSW1wbCBvYmplY3Qu
CisgICAgICAgICh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0QWNjZXNzaWJpbGl0eU9iamVj
dCk6IFB1YmxpYyBmdW5jdGlvbgorICAgICAgICByZXR1cm5pbmcgdGhlIEFjY2Vzc2liaWxpdHlP
YmplY3QgYXNzb2NpYXRlZCB0byB0aGUgaW5zdGFuY2Ugb2YKKyAgICAgICAgdGhlIFdlYktpdEFj
Y2Vzc2libGVIeXBlcmxpbmsgY2xhc3MuCisKIDIwMTAtMTAtMjcgIE1hcmlvIFNhbmNoZXogUHJh
ZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE1hcnRpbiBS
b2JpbnNvbi4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dO
VW1ha2VmaWxlLmFtCmluZGV4IDZmMTZhMGYuLjFkMjEwZmMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
R05VbWFrZWZpbGUuYW0KKysrIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMzQ3Niw2ICsz
NDc2LDggQEAgd2ViY29yZWd0a19zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
Z3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcCBcCiAJV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5oIFwKIAlXZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvZ3RrL0FYT2JqZWN0Q2FjaGVBdGsuY3BwIFwKKwlXZWJDb3JlL2FjY2Vzc2li
aWxpdHkvZ3RrL1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCBcCisJV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2d0ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcCBcCiAJV2ViQ29yZS9iaW5k
aW5ncy9qcy9TY3JpcHRDb250cm9sbGVyR3RrLmNwcCBcCiAJV2ViQ29yZS9wYWdlL2d0ay9EcmFn
Q29udHJvbGxlckd0ay5jcHAgXAogCVdlYkNvcmUvcGFnZS9ndGsvRXZlbnRIYW5kbGVyR3RrLmNw
cCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlP
YmplY3RXcmFwcGVyQXRrLmNwcCBiL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJp
bGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCmluZGV4IDI4M2IyZGUuLjcyNmNkYjEgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJB
dGsuY3BwCisrKyBiL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVj
dFdyYXBwZXJBdGsuY3BwCkBAIC02MCwxNCArNjAsMTUgQEAKICNpbmNsdWRlICJSZW5kZXJUZXh0
LmgiCiAjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgi
Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21p
Y1N0cmluZy5oPgorI2luY2x1ZGUgIldlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsuaCIKIAogI2lu
Y2x1ZGUgPGF0ay9hdGsuaD4KICNpbmNsdWRlIDxnbGliLmg+CiAjaW5jbHVkZSA8Z2xpYi9ncHJp
bnRmLmg+CiAjaW5jbHVkZSA8bGliZ2FpbC11dGlsL2dhaWwtdXRpbC5oPgogI2luY2x1ZGUgPHBh
bmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQXRvbWljU3RyaW5nLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIApAQCAt
MTQzLDYgKzE0NCwxMSBAQCBzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtUYWJs
ZSogdGFibGUpCiAgICAgcmV0dXJuIGNvcmUoQVRLX09CSkVDVCh0YWJsZSkpOwogfQogCitzdGF0
aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtIeXBlcnRleHQqIGh5cGVydGV4dCkKK3sK
KyAgICByZXR1cm4gY29yZShBVEtfT0JKRUNUKGh5cGVydGV4dCkpOworfQorCiBzdGF0aWMgQWNj
ZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtEb2N1bWVudCogZG9jdW1lbnQpCiB7CiAgICAgcmV0
dXJuIGNvcmUoQVRLX09CSkVDVChkb2N1bWVudCkpOwpAQCAtMTk1NCw2ICsxOTYwLDg5IEBAIHN0
YXRpYyB2b2lkIGF0a190YWJsZV9pbnRlcmZhY2VfaW5pdChBdGtUYWJsZUlmYWNlKiBpZmFjZSkK
ICAgICBpZmFjZS0+Z2V0X3Jvd19kZXNjcmlwdGlvbiA9IHdlYmtpdF9hY2Nlc3NpYmxlX3RhYmxl
X2dldF9yb3dfZGVzY3JpcHRpb247CiB9CiAKK3N0YXRpYyBBdGtIeXBlcmxpbmsqIHdlYmtpdEFj
Y2Vzc2libGVIeXBlcnRleHRHZXRMaW5rKEF0a0h5cGVydGV4dCogaHlwZXJ0ZXh0LCBnaW50IGlu
ZGV4KQoreworICAgIEFjY2Vzc2liaWxpdHlPYmplY3Q6OkFjY2Vzc2liaWxpdHlDaGlsZHJlblZl
Y3RvciBjaGlsZHJlbiA9IGNvcmUoaHlwZXJ0ZXh0KS0+Y2hpbGRyZW4oKTsKKyAgICBpZiAoaW5k
ZXggPCAwIHx8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihpbmRleCkgPj0gY2hpbGRyZW4uc2l6ZSgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGdpbnQgY3VycmVudExpbmsgPSAtMTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAg
QWNjZXNzaWJpbGl0eU9iamVjdCogY29yZUNoaWxkID0gY2hpbGRyZW4uYXQoaSkuZ2V0KCk7Cisg
ICAgICAgIGlmICghY29yZUNoaWxkLT5hY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgJiYgY29yZUNo
aWxkLT5pc0xpbmsoKSkgeworICAgICAgICAgICAgY3VycmVudExpbmsrKzsKKyAgICAgICAgICAg
IGlmIChpbmRleCAhPSBjdXJyZW50TGluaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgQXRrT2JqZWN0KiBheE9iamVjdCA9IGNvcmVDaGlsZC0+d3JhcHBlcigpOwor
ICAgICAgICAgICAgaWYgKCFheE9iamVjdCB8fCAhQVRLX0lTX0hZUEVSTElOS19JTVBMKGF4T2Jq
ZWN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgcmV0dXJuIGF0
a19oeXBlcmxpbmtfaW1wbF9nZXRfaHlwZXJsaW5rKEFUS19IWVBFUkxJTktfSU1QTChheE9iamVj
dCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnaW50
IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRleHRHZXROTGlua3MoQXRrSHlwZXJ0ZXh0KiBoeXBlcnRl
eHQpCit7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdDo6QWNjZXNzaWJpbGl0eUNoaWxkcmVuVmVj
dG9yIGNoaWxkcmVuID0gY29yZShoeXBlcnRleHQpLT5jaGlsZHJlbigpOworICAgIGlmICghY2hp
bGRyZW4uc2l6ZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGdpbnQgbGlua3NGb3VuZCA9
IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewor
ICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlQ2hpbGQgPSBjaGlsZHJlbi5hdChpKS5n
ZXQoKTsKKyAgICAgICAgaWYgKCFjb3JlQ2hpbGQtPmFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSAm
JiBjb3JlQ2hpbGQtPmlzTGluaygpKQorICAgICAgICAgICAgbGlua3NGb3VuZCsrOworICAgIH0K
KworICAgIHJldHVybiBsaW5rc0ZvdW5kOworfQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJ0ZXh0R2V0TGlua0luZGV4KEF0a0h5cGVydGV4dCogaHlwZXJ0ZXh0LCBnaW50IGNo
YXJJbmRleCkKK3sKKyAgICBzaXplX3QgbGlua3NDb3VudCA9IHdlYmtpdEFjY2Vzc2libGVIeXBl
cnRleHRHZXROTGlua3MoaHlwZXJ0ZXh0KTsKKyAgICBpZiAoIWxpbmtzQ291bnQpCisgICAgICAg
IHJldHVybiAtMTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlua3NDb3VudDsgaSsr
KSB7CisgICAgICAgIEF0a0h5cGVybGluayogaHlwZXJsaW5rID0gQVRLX0hZUEVSTElOSyh3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGluayhoeXBlcnRleHQsIGkpKTsKKyAgICAgICAgZ2lu
dCBzdGFydEluZGV4ID0gYXRrX2h5cGVybGlua19nZXRfc3RhcnRfaW5kZXgoaHlwZXJsaW5rKTsK
KyAgICAgICAgZ2ludCBlbmRJbmRleCA9IGF0a19oeXBlcmxpbmtfZ2V0X2VuZF9pbmRleChoeXBl
cmxpbmspOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaGFyIGluZGV4IGluIHRoZSBsaW5r
J3Mgb2Zmc2V0IHJhbmdlCisgICAgICAgIGlmIChzdGFydEluZGV4IDw9IGNoYXJJbmRleCAmJiBj
aGFySW5kZXggPCBlbmRJbmRleCkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAg
IC8vIE5vdCBmb3VuZCBpZiByZWFjaGVkCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9p
ZCBhdGtIeXBlcnRleHRJbnRlcmZhY2VJbml0KEF0a0h5cGVydGV4dElmYWNlKiBpZmFjZSkKK3sK
KyAgICBpZmFjZS0+Z2V0X2xpbmsgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0TGluazsK
KyAgICBpZmFjZS0+Z2V0X25fbGlua3MgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJ0ZXh0R2V0Tkxp
bmtzOworICAgIGlmYWNlLT5nZXRfbGlua19pbmRleCA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcnRl
eHRHZXRMaW5rSW5kZXg7Cit9CisKK3N0YXRpYyBBdGtIeXBlcmxpbmsqIHdlYmtpdEFjY2Vzc2li
bGVIeXBlcmxpbmtJbXBsR2V0SHlwZXJsaW5rKEF0a0h5cGVybGlua0ltcGwqIGh5cGVybGluaykK
K3sKKyAgICBBdGtIeXBlcmxpbmsqIGh5cGVybGlua09iamVjdCA9IEFUS19IWVBFUkxJTksoZ19v
YmplY3RfZ2V0X2RhdGEoR19PQkpFQ1QoaHlwZXJsaW5rKSwgImh5cGVybGluay1vYmplY3QiKSk7
CisgICAgaWYgKCFoeXBlcmxpbmtPYmplY3QpIHsKKyAgICAgICAgaHlwZXJsaW5rT2JqZWN0ID0g
QVRLX0hZUEVSTElOSyh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rTmV3KGh5cGVybGluaykpOwor
ICAgICAgICBnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChoeXBlcmxpbmspLCAiaHlwZXJsaW5r
LW9iamVjdCIsIGh5cGVybGlua09iamVjdCk7CisgICAgfQorICAgIHJldHVybiBoeXBlcmxpbmtP
YmplY3Q7Cit9CisKK3N0YXRpYyB2b2lkIGF0a0h5cGVybGlua0ltcGxJbnRlcmZhY2VJbml0KEF0
a0h5cGVybGlua0ltcGxJZmFjZSogaWZhY2UpCit7CisgICAgaWZhY2UtPmdldF9oeXBlcmxpbmsg
PSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW1wbEdldEh5cGVybGluazsKK30KKwogc3RhdGlj
IGNvbnN0IGdjaGFyKiBkb2N1bWVudEF0dHJpYnV0ZVZhbHVlKEF0a0RvY3VtZW50KiBkb2N1bWVu
dCwgY29uc3QgZ2NoYXIqIGF0dHJpYnV0ZSkKIHsKICAgICBEb2N1bWVudCogY29yZURvY3VtZW50
ID0gY29yZShkb2N1bWVudCktPmRvY3VtZW50KCk7CkBAIC0yMDI1LDYgKzIxMTQsMTAgQEAgc3Rh
dGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIEF0a0ludGVyZmFjZXNJbml0RnVuY3Rpb25zW10gPSB7
CiAgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwfSwKICAgICB7KEdJbnRlcmZhY2VJ
bml0RnVuYylhdGtfdGFibGVfaW50ZXJmYWNlX2luaXQsCiAgICAgIChHSW50ZXJmYWNlRmluYWxp
emVGdW5jKSAwLCAwfSwKKyAgICB7KEdJbnRlcmZhY2VJbml0RnVuYylhdGtIeXBlcnRleHRJbnRl
cmZhY2VJbml0LAorICAgICAoR0ludGVyZmFjZUZpbmFsaXplRnVuYykgMCwgMH0sCisgICAgeyhH
SW50ZXJmYWNlSW5pdEZ1bmMpYXRrSHlwZXJsaW5rSW1wbEludGVyZmFjZUluaXQsCisgICAgIChH
SW50ZXJmYWNlRmluYWxpemVGdW5jKSAwLCAwfSwKICAgICB7KEdJbnRlcmZhY2VJbml0RnVuYylh
dGtfZG9jdW1lbnRfaW50ZXJmYWNlX2luaXQsCiAgICAgIChHSW50ZXJmYWNlRmluYWxpemVGdW5j
KSAwLCAwfQogfTsKQEAgLTIwMzcsMzEgKzIxMzAsMzcgQEAgZW51bSBXQUlUeXBlIHsKICAgICBX
QUlfQ09NUE9ORU5ULAogICAgIFdBSV9JTUFHRSwKICAgICBXQUlfVEFCTEUsCisgICAgV0FJX0hZ
UEVSVEVYVCwKKyAgICBXQUlfSFlQRVJMSU5LLAogICAgIFdBSV9ET0NVTUVOVAogfTsKIAogc3Rh
dGljIEdUeXBlIEdldEF0a0ludGVyZmFjZVR5cGVGcm9tV0FJVHlwZShXQUlUeXBlIHR5cGUpCiB7
Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFdBSV9BQ1RJT046Ci0gICAgICByZXR1cm4gQVRL
X1RZUEVfQUNUSU9OOwotICBjYXNlIFdBSV9TRUxFQ1RJT046Ci0gICAgICByZXR1cm4gQVRLX1RZ
UEVfU0VMRUNUSU9OOwotICBjYXNlIFdBSV9FRElUQUJMRV9URVhUOgotICAgICAgcmV0dXJuIEFU
S19UWVBFX0VESVRBQkxFX1RFWFQ7Ci0gIGNhc2UgV0FJX1RFWFQ6Ci0gICAgICByZXR1cm4gQVRL
X1RZUEVfVEVYVDsKLSAgY2FzZSBXQUlfQ09NUE9ORU5UOgotICAgICAgcmV0dXJuIEFUS19UWVBF
X0NPTVBPTkVOVDsKLSAgY2FzZSBXQUlfSU1BR0U6Ci0gICAgICByZXR1cm4gQVRLX1RZUEVfSU1B
R0U7Ci0gIGNhc2UgV0FJX1RBQkxFOgotICAgICAgcmV0dXJuIEFUS19UWVBFX1RBQkxFOwotICBj
YXNlIFdBSV9ET0NVTUVOVDoKLSAgICAgIHJldHVybiBBVEtfVFlQRV9ET0NVTUVOVDsKLSAgfQot
Ci0gIHJldHVybiBHX1RZUEVfSU5WQUxJRDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNl
IFdBSV9BQ1RJT046CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9BQ1RJT047CisgICAgY2FzZSBX
QUlfU0VMRUNUSU9OOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfU0VMRUNUSU9OOworICAgIGNh
c2UgV0FJX0VESVRBQkxFX1RFWFQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9FRElUQUJMRV9U
RVhUOworICAgIGNhc2UgV0FJX1RFWFQ6CisgICAgICAgIHJldHVybiBBVEtfVFlQRV9URVhUOwor
ICAgIGNhc2UgV0FJX0NPTVBPTkVOVDoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0NPTVBPTkVO
VDsKKyAgICBjYXNlIFdBSV9JTUFHRToKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0lNQUdFOwor
ICAgIGNhc2UgV0FJX1RBQkxFOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfVEFCTEU7CisgICAg
Y2FzZSBXQUlfSFlQRVJURVhUOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVfSFlQRVJURVhUOwor
ICAgIGNhc2UgV0FJX0hZUEVSTElOSzoKKyAgICAgICAgcmV0dXJuIEFUS19UWVBFX0hZUEVSTElO
S19JTVBMOworICAgIGNhc2UgV0FJX0RPQ1VNRU5UOgorICAgICAgICByZXR1cm4gQVRLX1RZUEVf
RE9DVU1FTlQ7CisgICAgfQorCisgICAgcmV0dXJuIEdfVFlQRV9JTlZBTElEOwogfQogCiBzdGF0
aWMgZ3VpbnQxNiBnZXRJbnRlcmZhY2VNYXNrRnJvbU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0
KiBjb3JlT2JqZWN0KQpAQCAtMjA3MSwyMCArMjE3MCwyNCBAQCBzdGF0aWMgZ3VpbnQxNiBnZXRJ
bnRlcmZhY2VNYXNrRnJvbU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0KQog
ICAgIC8vIENvbXBvbmVudCBpbnRlcmZhY2UgaXMgYWx3YXlzIHN1cHBvcnRlZAogICAgIGludGVy
ZmFjZU1hc2sgfD0gMSA8PCBXQUlfQ09NUE9ORU5UOwogCisgICAgQWNjZXNzaWJpbGl0eVJvbGUg
cm9sZSA9IGNvcmVPYmplY3QtPnJvbGVWYWx1ZSgpOworCiAgICAgLy8gQWN0aW9uCi0gICAgaWYg
KCFjb3JlT2JqZWN0LT5hY3Rpb25WZXJiKCkuaXNFbXB0eSgpKQorICAgIGlmICghY29yZU9iamVj
dC0+YWN0aW9uVmVyYigpLmlzRW1wdHkoKSkgewogICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEg
PDwgV0FJX0FDVElPTjsKIAorICAgICAgICBpZiAoIWNvcmVPYmplY3QtPmFjY2Vzc2liaWxpdHlJ
c0lnbm9yZWQoKSAmJiBjb3JlT2JqZWN0LT5pc0xpbmsoKSkKKyAgICAgICAgICAgIGludGVyZmFj
ZU1hc2sgfD0gMSA8PCBXQUlfSFlQRVJMSU5LOworICAgIH0KKwogICAgIC8vIFNlbGVjdGlvbgog
ICAgIGlmIChjb3JlT2JqZWN0LT5pc0xpc3RCb3goKSkKICAgICAgICAgaW50ZXJmYWNlTWFzayB8
PSAxIDw8IFdBSV9TRUxFQ1RJT047CiAKICAgICAvLyBUZXh0ICYgRWRpdGFibGUgVGV4dAotICAg
IEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUgPSBjb3JlT2JqZWN0LT5yb2xlVmFsdWUoKTsKLQogICAg
IGlmIChyb2xlID09IFN0YXRpY1RleHRSb2xlKQogICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEg
PDwgV0FJX1RFWFQ7Ci0gICAgZWxzZSBpZiAoY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0KCkpCisgICAgZWxzZSBpZiAoY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0KCkpIHsKICAgICAgICAgaWYgKGNvcmVPYmplY3QtPmlzVGV4dENvbnRyb2woKSkg
ewogICAgICAgICAgICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9URVhUOwogICAgICAgICAg
ICAgaWYgKCFjb3JlT2JqZWN0LT5pc1JlYWRPbmx5KCkpCkBAIC0yMDkyLDExICsyMTk1LDE1IEBA
IHN0YXRpYyBndWludDE2IGdldEludGVyZmFjZU1hc2tGcm9tT2JqZWN0KEFjY2Vzc2liaWxpdHlP
YmplY3QqIGNvcmVPYmplY3QpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBY2Nlc3Np
YmlsaXR5UmVuZGVyT2JqZWN0KiBheFJlbmRlck9iamVjdCA9IHN0YXRpY19jYXN0PEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3QqPihjb3JlT2JqZWN0KTsKICAgICAgICAgICAgIFJlbmRlck9iamVj
dCogcmVuZGVyZXIgPSBheFJlbmRlck9iamVjdC0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIGlm
IChyb2xlICE9IFRhYmxlUm9sZSAmJiByZW5kZXJlciAmJiByZW5kZXJlci0+Y2hpbGRyZW5Jbmxp
bmUoKSkKLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VNYXNrIHw9IDEgPDwgV0FJX1RFWFQ7Ci0g
ICAgICAgICAgICBlbHNlIGlmIChyb2xlID09IExpc3RJdGVtUm9sZSkgewotICAgICAgICAgICAg
ICAgIC8vIEFkZCB0aGUgVEVYVCBpbnRlcmZhY2UgZm9yIGxpc3QgaXRlbXMgd2hvc2UKLSAgICAg
ICAgICAgICAgICAvLyBmaXJzdCBhY2Nlc3NpYmxlIGNoaWxkIGhhcyBhIHRleHQgcmVuZGVyZXIK
KyAgICAgICAgICAgIGlmIChyb2xlICE9IFRhYmxlUm9sZSkgeworICAgICAgICAgICAgICAgIGlu
dGVyZmFjZU1hc2sgfD0gMSA8PCBXQUlfSFlQRVJURVhUOworICAgICAgICAgICAgICAgIGlmIChy
ZW5kZXJlciAmJiByZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKSkKKyAgICAgICAgICAgICAgICAg
ICAgaW50ZXJmYWNlTWFzayB8PSAxIDw8IFdBSV9URVhUOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBBZGQgdGhlIFRFWFQgaW50ZXJmYWNlIGZvciBsaXN0IGl0ZW1zIHdob3NlCisg
ICAgICAgICAgICAvLyBmaXJzdCBhY2Nlc3NpYmxlIGNoaWxkIGhhcyBhIHRleHQgcmVuZGVyZXIK
KyAgICAgICAgICAgIGlmIChyb2xlID09IExpc3RJdGVtUm9sZSkgewogICAgICAgICAgICAgICAg
IEFjY2Vzc2liaWxpdHlPYmplY3Q6OkFjY2Vzc2liaWxpdHlDaGlsZHJlblZlY3RvciBjaGlsZHJl
biA9IGF4UmVuZGVyT2JqZWN0LT5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgIGlmIChjaGls
ZHJlbi5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCog
YXhSZW5kZXJDaGlsZCA9IGNoaWxkcmVuLmF0KDApLmdldCgpOwpAQCAtMjEwNCw2ICsyMjExLDcg
QEAgc3RhdGljIGd1aW50MTYgZ2V0SW50ZXJmYWNlTWFza0Zyb21PYmplY3QoQWNjZXNzaWJpbGl0
eU9iamVjdCogY29yZU9iamVjdCkKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAg
ICAgICAgIH0KKyAgICB9CiAKICAgICAvLyBJbWFnZQogICAgIGlmIChjb3JlT2JqZWN0LT5pc0lt
YWdlKCkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL1dlYktpdEFjY2Vz
c2libGVIeXBlcmxpbmsuY3BwIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJLaXRBY2Nl
c3NpYmxlSHlwZXJsaW5rLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41
OTI3NDMwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9XZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmNwcApAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
V2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oIgorCisjaWYgSEFWRShBQ0NFU1NJQklMSVRZKQor
CisjaW5jbHVkZSAiQVhPYmplY3RDYWNoZS5oIgorI2luY2x1ZGUgIkFjY2Vzc2liaWxpdHlPYmpl
Y3QuaCIKKyNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5oIgorI2luY2x1
ZGUgIkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgorI2luY2x1ZGUgIlBvc2l0aW9uLmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKKyNpbmNsdWRl
ICJSZW5kZXJMaXN0TWFya2VyLmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCisjaW5jbHVk
ZSAiVGV4dEl0ZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhdGsvYXRrLmg+CisjaW5jbHVkZSA8Z2xp
Yi5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RydWN0IF9XZWJLaXRBY2Nlc3Np
YmxlSHlwZXJsaW5rUHJpdmF0ZSB7CisgICAgV2ViS2l0QWNjZXNzaWJsZSogaHlwZXJsaW5rSW1w
bDsKK307CisKKyNkZWZpbmUgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0dFVF9QUklWQVRF
KG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfUFJJVkFURSgob2JqKSwgV0VCS0lUX1RZUEVfQUND
RVNTSUJMRV9IWVBFUkxJTkssIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtQcml2YXRlKSkKKwor
ZW51bSB7CisgICAgUFJPUF8wLAorCisgICAgUFJPUF9IWVBFUkxJTktfSU1QTAorfTsKKworc3Rh
dGljIGdwb2ludGVyIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRDbGFzcyA9IDA7CisK
Ky8vIFVzZWQgdG8gcHJvdmlkZSBjb25zdCBjaGFyKiByZXR1cm5zLgorc3RhdGljIGNvbnN0IGNo
YXIqIHJldHVyblN0cmluZyhjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBzdGF0aWMgQ1N0cmlu
ZyByZXR1cm5lZFN0cmluZzsKKyAgICByZXR1cm5lZFN0cmluZyA9IHN0ci51dGY4KCk7CisgICAg
cmV0dXJuIHJldHVybmVkU3RyaW5nLmRhdGEoKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlP
YmplY3QqIGNvcmUoV2ViS2l0QWNjZXNzaWJsZSogYWNjZXNzaWJsZSkKK3sKKyAgICBpZiAoIWFj
Y2Vzc2libGUgfHwgIVdFQktJVF9JU19BQ0NFU1NJQkxFKGFjY2Vzc2libGUpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiB3ZWJraXRfYWNjZXNzaWJsZV9nZXRfYWNjZXNzaWJpbGl0
eV9vYmplY3QoYWNjZXNzaWJsZSk7Cit9CisKK3N0YXRpYyBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBj
b3JlKFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxpbmspCit7CisgICAgaWYgKCFsaW5rKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjb3JlKGxpbmstPnByaXYtPmh5cGVybGlu
a0ltcGwpOworfQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZShBdGtIeXBlcmxp
bmsqIGxpbmspCit7CisgICAgaWYgKCFXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGlu
aykpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNvcmUoV0VCS0lUX0FDQ0VTU0lC
TEVfSFlQRVJMSU5LKGxpbmspKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNv
cmUoQXRrQWN0aW9uKiBhY3Rpb24pCit7CisgICAgcmV0dXJuIGNvcmUoV0VCS0lUX0FDQ0VTU0lC
TEVfSFlQRVJMSU5LKGFjdGlvbikpOworfQorCisKK3N0YXRpYyBnYm9vbGVhbiB3ZWJraXRBY2Nl
c3NpYmxlSHlwZXJsaW5rQWN0aW9uRG9BY3Rpb24oQXRrQWN0aW9uKiBhY3Rpb24sIGdpbnQgaW5k
ZXgpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQ
RVJMSU5LKGFjdGlvbiksIEZBTFNFKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRf
QUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+cHJpdi0+aHlwZXJsaW5rSW1wbCwgRkFMU0Up
OworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgRkFMU0UpOworCisgICAgaWYgKCFB
VEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5wcml2LT5o
eXBlcmxpbmtJbXBsKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQWNjZXNzaWJpbGl0
eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUoYWN0aW9uKTsKKyAgICBpZiAoIWNvcmVPYmplY3Qp
CisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBjb3JlT2JqZWN0LT5wZXJmb3Jt
RGVmYXVsdEFjdGlvbigpOworfQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJs
aW5rQWN0aW9uR2V0TkFjdGlvbnMoQXRrQWN0aW9uKiBhY3Rpb24pCit7CisgICAgZ19yZXR1cm5f
dmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiksIDApOwor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rp
b24pLT5wcml2LT5oeXBlcmxpbmtJbXBsLCAwKTsKKworICAgIGlmICghQVRLX0lTX0FDVElPTihX
RUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+cHJpdi0+aHlwZXJsaW5rSW1wbCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBn
Y2hhciogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldERlc2NyaXB0aW9uKEF0a0Fj
dGlvbiogYWN0aW9uLCBnaW50IGluZGV4KQoreworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdF
QktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLCAwKTsKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+cHJpdi0+aHlw
ZXJsaW5rSW1wbCwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWluZGV4LCAwKTsKKwor
ICAgIC8vIFRPRE86IE5lZWQgYSB3YXkgdG8gcHJvdmlkZS9sb2NhbGl6ZSBhY3Rpb24gZGVzY3Jp
cHRpb25zLgorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuICIiOworfQorCitzdGF0
aWMgY29uc3QgZ2NoYXIqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25HZXRLZXliaW5k
aW5nKEF0a0FjdGlvbiogYWN0aW9uLCBnaW50IGluZGV4KQoreworICAgIGdfcmV0dXJuX3ZhbF9p
Zl9mYWlsKFdFQktJVF9JU19BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLCAwKTsKKyAgICBn
X3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoYWN0aW9uKS0+
cHJpdi0+aHlwZXJsaW5rSW1wbCwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWluZGV4
LCAwKTsKKworICAgIGlmICghQVRLX0lTX0FDVElPTihXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJ
TksoYWN0aW9uKS0+cHJpdi0+aHlwZXJsaW5rSW1wbCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgQWNjZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUoYWN0aW9uKTsKKyAgICBp
ZiAoIWNvcmVPYmplY3QpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHJldHVyblN0
cmluZyhjb3JlT2JqZWN0LT5hY2Nlc3NLZXkoKS5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBjb25z
dCBnY2hhciogd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0FjdGlvbkdldE5hbWUoQXRrQWN0aW9u
KiBhY3Rpb24sIGdpbnQgaW5kZXgpCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lU
X0lTX0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGFjdGlvbiksIDApOworICAgIGdfcmV0dXJuX3ZhbF9p
Zl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5wcml2LT5oeXBlcmxp
bmtJbXBsLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisgICAg
aWYgKCFBVEtfSVNfQUNUSU9OKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhhY3Rpb24pLT5w
cml2LT5oeXBlcmxpbmtJbXBsKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZShhY3Rpb24pOworICAgIGlmICghY29yZU9iamVj
dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gcmV0dXJuU3RyaW5nKGNvcmVPYmpl
Y3QtPmFjdGlvblZlcmIoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0a0FjdGlvbkludGVyZmFjZUlu
aXQoQXRrQWN0aW9uSWZhY2UqIGlmYWNlKQoreworICAgIGlmYWNlLT5kb19hY3Rpb24gPSB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uRG9BY3Rpb247CisgICAgaWZhY2UtPmdldF9uX2Fj
dGlvbnMgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TkFjdGlvbnM7CisgICAg
aWZhY2UtPmdldF9kZXNjcmlwdGlvbiA9IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtBY3Rpb25H
ZXREZXNjcmlwdGlvbjsKKyAgICBpZmFjZS0+Z2V0X2tleWJpbmRpbmcgPSB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rQWN0aW9uR2V0S2V5YmluZGluZzsKKyAgICBpZmFjZS0+Z2V0X25hbWUgPSB3
ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rQWN0aW9uR2V0TmFtZTsKK30KKworc3RhdGljIGdjaGFy
KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VVJJKEF0a0h5cGVybGluayogbGluaywgZ2lu
dCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJM
RV9IWVBFUkxJTksobGluayksIDApOworICAgIC8vIEZJWE1FOiBEbyBOT1Qgc3VwcG9ydCBtb3Jl
IHRoYW4gb25lIGluc3RhbmNlIG9mIGFuIEF0a09iamVjdAorICAgIC8vIGltcGxlbWVudGluZyBB
dGtIeXBlcmxpbmtJbXBsIGluIGV2ZXJ5IGluc3RhbmNlIG9mIEF0a0h5cGVyTGluaworICAgIGdf
cmV0dXJuX3ZhbF9pZl9mYWlsKCFpbmRleCwgMCk7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0
KiBjb3JlT2JqZWN0ID0gY29yZShsaW5rKTsKKyAgICBpZiAoIWNvcmVPYmplY3QgfHwgY29yZU9i
amVjdC0+dXJsKCkuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdf
c3RyZHVwKHJldHVyblN0cmluZyhjb3JlT2JqZWN0LT51cmwoKS5zdHJpbmcoKSkpOworfQorCitz
dGF0aWMgQXRrT2JqZWN0KiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0T2JqZWN0KEF0a0h5
cGVybGluayogbGluaywgZ2ludCBpbmRleCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChX
RUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTksobGluayksIDApOworICAgIGdfcmV0dXJuX3Zh
bF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+cHJpdi0+aHlwZXJs
aW5rSW1wbCwgMCk7CisKKyAgICAvLyBGSVhNRTogRG8gTk9UIHN1cHBvcnQgbW9yZSB0aGFuIG9u
ZSBpbnN0YW5jZSBvZiBhbiBBdGtPYmplY3QKKyAgICAvLyBpbXBsZW1lbnRpbmcgQXRrSHlwZXJs
aW5rSW1wbCBpbiBldmVyeSBpbnN0YW5jZSBvZiBBdGtIeXBlckxpbmsKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbCghaW5kZXgsIDApOworCisgICAgcmV0dXJuIEFUS19PQkpFQ1QoV0VCS0lUX0FD
Q0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLT5wcml2LT5oeXBlcmxpbmtJbXBsKTsKK30KKworc3Rh
dGljIGdpbnQgZ2V0UmFuZ2VMZW5ndGhGb3JPYmplY3QoQWNjZXNzaWJpbGl0eU9iamVjdCogb2Jq
LCBSYW5nZSogcmFuZ2UpCit7CisgICAgLy8gVGhpcyBpcyBnb2luZyB0byBiZSB0aGUgYWN0dWFs
IGxlbmd0aCBpbiBtb3N0IG9mIHRoZSBjYXNlcworICAgIGludCBiYXNlTGVuZ3RoID0gVGV4dEl0
ZXJhdG9yOjpyYW5nZUxlbmd0aChyYW5nZSk7CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBj
dXJyZW50IGh5cGVybGluayBiZWxvbmdzIHRvIGEgbGlzdCBpdGVtLgorICAgIC8vIElmIHNvLCB3
ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBsZW5ndGggb2YgdGhlIGl0ZW0ncyBtYXJrZXIKKyAgICBB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBwYXJlbnQgPSBvYmotPnBhcmVudE9iamVjdFVuaWdub3JlZCgp
OworICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dCgpIHx8ICFwYXJlbnQtPmlzTGlzdEl0ZW0oKSkKKyAgICAgICAgcmV0dXJuIGJhc2VMZW5ndGg7
CisKKyAgICAvLyBFdmVuIGlmIHdlIGRvbid0IGV4cG9zZSBsaXN0IG1hcmtlcnMgdG8gQXNzaXN0
aXZlCisgICAgLy8gVGVjaG5vbG9naWVzLCB3ZSBuZWVkIHRvIGhhdmUgYSB3YXkgdG8gbWVhc3Vy
ZSB0aGVpciBsZW5ndGgKKyAgICAvLyBmb3IgdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5lZWRlZCB0
byB0YWtlIGl0IGludG8gYWNjb3VudAorICAgIC8vIHNlcGFyYXRlbHkgKGFzIGluIGdldEFjY2Vz
c2liaWxpdHlPYmplY3RGb3JPZmZzZXQpCisgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogbWFya2Vy
T2JqID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisgICAgaWYgKCFtYXJrZXJPYmopCisgICAgICAg
IHJldHVybiBiYXNlTGVuZ3RoOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IHN0YXRp
Y19jYXN0PGNvbnN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QqPihtYXJrZXJPYmopLT5yZW5k
ZXJlcigpOworICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc0xpc3RNYXJrZXIoKSkK
KyAgICAgICAgcmV0dXJuIGJhc2VMZW5ndGg7CisKKyAgICBSZW5kZXJMaXN0TWFya2VyKiBtYXJr
ZXIgPSB0b1JlbmRlckxpc3RNYXJrZXIocmVuZGVyZXIpOworICAgIHJldHVybiBiYXNlTGVuZ3Ro
ICsgbWFya2VyLT50ZXh0KCkubGVuZ3RoKCkgKyBtYXJrZXItPnN1ZmZpeCgpLmxlbmd0aCgpOwor
fQorCitzdGF0aWMgZ2ludCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0U3RhcnRJbmRleChB
dGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lT
X0FDQ0VTU0lCTEVfSFlQRVJMSU5LKGxpbmspLCAwKTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmpl
Y3QqIGNvcmVPYmplY3QgPSBjb3JlKGxpbmspOworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBOb2RlKiBub2RlID0gY29yZU9iamVjdC0+bm9kZSgpOworICAg
IGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdl
ID0gUmFuZ2U6OmNyZWF0ZShub2RlLT5kb2N1bWVudCgpLCBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5v
ZGUtPnBhcmVudE5vZGUoKSksIGZpcnN0UG9zaXRpb25Jbk5vZGUobm9kZSkpOworICAgIHJldHVy
biBnZXRSYW5nZUxlbmd0aEZvck9iamVjdChjb3JlT2JqZWN0LCByYW5nZS5nZXQoKSk7Cit9CisK
K3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRFbmRJbmRleChBdGtIeXBl
cmxpbmsqIGxpbmspCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VT
U0lCTEVfSFlQRVJMSU5LKGxpbmspLCAwKTsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNv
cmVPYmplY3QgPSBjb3JlKGxpbmspOworICAgIGlmICghY29yZU9iamVjdCkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBOb2RlKiBub2RlID0gY29yZU9iamVjdC0+bm9kZSgpOworICAgIGlmICgh
bm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gUmFu
Z2U6OmNyZWF0ZShub2RlLT5kb2N1bWVudCgpLCBmaXJzdFBvc2l0aW9uSW5Ob2RlKG5vZGUtPnBh
cmVudE5vZGUoKSksIGxhc3RQb3NpdGlvbkluTm9kZShub2RlKSk7CisgICAgcmV0dXJuIGdldFJh
bmdlTGVuZ3RoRm9yT2JqZWN0KGNvcmVPYmplY3QsIHJhbmdlLmdldCgpKTsKK30KKworc3RhdGlj
IGdib29sZWFuIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtJc1ZhbGlkKEF0a0h5cGVybGluayog
bGluaykKK3sKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9I
WVBFUkxJTksobGluayksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NF
U1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+cHJpdi0+aHlwZXJsaW5rSW1wbCwgRkFMU0UpOworCisg
ICAgLy8gTGluayBpcyB2YWxpZCBmb3IgdGhlIHdob2xlIG9iamVjdCdzIGxpZmV0aW1lCisgICAg
cmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnaW50IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtH
ZXROQW5jaG9ycyhBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgLy8gRklYTUUgRG8gTk9UIHN1
cHBvcnQgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiBhbiBBdGtPYmplY3QKKyAgICAvLyBpbXBs
ZW1lbnRpbmcgQXRrSHlwZXJsaW5rSW1wbCBpbiBldmVyeSBpbnN0YW5jZSBvZiBBdGtIeXBlckxp
bmsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJ
TksobGluayksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9BQ0NFU1NJQkxF
X0hZUEVSTElOSyhsaW5rKS0+cHJpdi0+aHlwZXJsaW5rSW1wbCwgMCk7CisgICAgcmV0dXJuIDE7
Cit9CisKK3N0YXRpYyBnYm9vbGVhbiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNTZWxlY3Rl
ZExpbmsoQXRrSHlwZXJsaW5rKiBsaW5rKQoreworICAgIC8vIE5vdCBpbXBsZW1lbnRlZDogdGhp
cyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGluIEFUSyBub3cKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0QWNjZXNzaWJsZUh5
cGVybGlua0dldFByb3BlcnR5KEdPYmplY3QqIG9iamVjdCwgZ3VpbnQgcHJvcElkLCBHVmFsdWUq
IHZhbHVlLCBHUGFyYW1TcGVjKiBwc3BlYykKK3sKKyAgICBzd2l0Y2ggKHByb3BJZCkgeworICAg
IGNhc2UgUFJPUF9IWVBFUkxJTktfSU1QTDoKKyAgICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0KHZh
bHVlLCBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksob2JqZWN0KS0+cHJpdi0+aHlwZXJsaW5r
SW1wbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dB
Uk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3QsIHByb3BJZCwgcHNwZWMpOworICAgIH0KK30K
Kworc3RhdGljIHZvaWQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua1NldFByb3BlcnR5KEdPYmpl
Y3QqIG9iamVjdCwgZ3VpbnQgcHJvcElkLCBjb25zdCBHVmFsdWUqIHZhbHVlLCBHUGFyYW1TcGVj
KiBwc3BlYykKK3sKKyAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rUHJpdmF0ZSogcHJpdiA9
IFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhvYmplY3QpLT5wcml2OworCisgICAgc3dpdGNo
IChwcm9wSWQpIHsKKyAgICBjYXNlIFBST1BfSFlQRVJMSU5LX0lNUEw6CisgICAgICAgIC8vIE5v
IG5lZWQgdG8gY2hlY2sgYW5kIHVucmVmIHByZXZpb3VzIHZhbHVlcyBvZgorICAgICAgICAvLyBw
cml2LT5oeXBlcmxpbmtJbXBsIGFzIHRoaXMgaXMgYSBDT05TVFJVQ1QgT05MWSBwcm9wZXJ0eQor
ICAgICAgICBwcml2LT5oeXBlcmxpbmtJbXBsID0gV0VCS0lUX0FDQ0VTU0lCTEUoZ192YWx1ZV9n
ZXRfb2JqZWN0KHZhbHVlKSk7CisgICAgICAgIGdfb2JqZWN0X3dlYWtfcmVmKEdfT0JKRUNUKHBy
aXYtPmh5cGVybGlua0ltcGwpLCAoR1dlYWtOb3RpZnkpZ19vYmplY3RfdW5yZWYsIG9iamVjdCk7
CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5W
QUxJRF9QUk9QRVJUWV9JRChvYmplY3QsIHByb3BJZCwgcHNwZWMpOworICAgIH0KK30KKworc3Rh
dGljIHZvaWQgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplKEdPYmplY3QqIG9iamVj
dCkKK3sKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rUGFyZW50
Q2xhc3MpLT5maW5hbGl6ZShvYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rQ2xhc3NJbml0KEF0a0h5cGVybGlua0NsYXNzKiBrbGFzcykKK3sKKyAgICBH
T2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKKworICAg
IHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtQYXJlbnRDbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVr
X3BhcmVudChrbGFzcyk7CisKKyAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0ZpbmFsaXplOworICAgIGdvYmplY3RDbGFzcy0+c2V0X3Byb3BlcnR5
ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua1NldFByb3BlcnR5OworICAgIGdvYmplY3RDbGFz
cy0+Z2V0X3Byb3BlcnR5ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFByb3BlcnR5Owor
CisgICAga2xhc3MtPmdldF91cmkgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0VVJJOwor
ICAgIGtsYXNzLT5nZXRfb2JqZWN0ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldE9iamVj
dDsKKyAgICBrbGFzcy0+Z2V0X3N0YXJ0X2luZGV4ID0gd2Via2l0QWNjZXNzaWJsZUh5cGVybGlu
a0dldFN0YXJ0SW5kZXg7CisgICAga2xhc3MtPmdldF9lbmRfaW5kZXggPSB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0RW5kSW5kZXg7CisgICAga2xhc3MtPmlzX3ZhbGlkID0gd2Via2l0QWNj
ZXNzaWJsZUh5cGVybGlua0lzVmFsaWQ7CisgICAga2xhc3MtPmdldF9uX2FuY2hvcnMgPSB3ZWJr
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rR2V0TkFuY2hvcnM7CisgICAga2xhc3MtPmlzX3NlbGVjdGVk
X2xpbmsgPSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSXNTZWxlY3RlZExpbms7CisKKyAgICBn
X29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RDbGFzcywgUFJPUF9IWVBFUkxJ
TktfSU1QTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3Bl
Y19vYmplY3QoImh5cGVybGluay1pbXBsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh5cGVybGluayBpbXBsZW1lbnRhdGlvbiIsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJU
aGUgYXNzb2NpYXRlZCBXZWJLaXRBY2Nlc3NpYmxlIGluc3RhbmNlLiIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9UWVBFX0FD
Q0VTU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChHUGFyYW1GbGFncykoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNU
UlVDVF9PTkxZIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICAgIGdfdHlwZV9jbGFz
c19hZGRfcHJpdmF0ZShnb2JqZWN0Q2xhc3MsIHNpemVvZihXZWJLaXRBY2Nlc3NpYmxlSHlwZXJs
aW5rUHJpdmF0ZSkpOworfQorCitzdGF0aWMgdm9pZCB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5r
SW5pdChBdGtIeXBlcmxpbmsqIGxpbmspCit7CisgICAgV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJM
SU5LKGxpbmspLT5wcml2ID0gV0VCS0lUX0FDQ0VTU0lCTEVfSFlQRVJMSU5LX0dFVF9QUklWQVRF
KGxpbmspOworICAgIFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhsaW5rKS0+cHJpdi0+aHlw
ZXJsaW5rSW1wbCA9IDA7Cit9CisKK0dUeXBlIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtHZXRU
eXBlKCkKK3sKKyAgICBzdGF0aWMgdm9sYXRpbGUgZ3NpemUgdHlwZVZvbGF0aWxlID0gMDsKKwor
ICAgIGlmIChnX29uY2VfaW5pdF9lbnRlcigmdHlwZVZvbGF0aWxlKSkgeworICAgICAgICBzdGF0
aWMgY29uc3QgR1R5cGVJbmZvIHRpbmZvID0geworICAgICAgICAgICAgc2l6ZW9mKFdlYktpdEFj
Y2Vzc2libGVIeXBlcmxpbmtDbGFzcyksCisgICAgICAgICAgICAoR0Jhc2VJbml0RnVuYykgMCwK
KyAgICAgICAgICAgIChHQmFzZUZpbmFsaXplRnVuYykgMCwKKyAgICAgICAgICAgIChHQ2xhc3NJ
bml0RnVuYykgd2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0NsYXNzSW5pdCwKKyAgICAgICAgICAg
IChHQ2xhc3NGaW5hbGl6ZUZ1bmMpIDAsCisgICAgICAgICAgICAwLCAvKiBjbGFzcyBkYXRhICov
CisgICAgICAgICAgICBzaXplb2YoV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluayksIC8qIGluc3Rh
bmNlIHNpemUgKi8KKyAgICAgICAgICAgIDAsIC8qIG5iIHByZWFsbG9jcyAqLworICAgICAgICAg
ICAgKEdJbnN0YW5jZUluaXRGdW5jKSB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rSW5pdCwKKyAg
ICAgICAgICAgIDAgLyogdmFsdWUgdGFibGUgKi8KKyAgICAgICAgfTsKKworICAgICAgICBzdGF0
aWMgY29uc3QgR0ludGVyZmFjZUluZm8gYWN0aW9uSW5mbyA9IHsKKyAgICAgICAgICAgIChHSW50
ZXJmYWNlSW5pdEZ1bmMpKEdJbnRlcmZhY2VJbml0RnVuYylhdGtBY3Rpb25JbnRlcmZhY2VJbml0
LAorICAgICAgICAgICAgKEdJbnRlcmZhY2VGaW5hbGl6ZUZ1bmMpIDAsIDAKKyAgICAgICAgfTsK
KworICAgICAgICBHVHlwZSB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyhBVEtfVFlQRV9I
WVBFUkxJTkssICJXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rIiwgJnRpbmZvLCBHVHlwZUZsYWdz
KDApKTsKKyAgICAgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljKHR5cGUsIEFUS19UWVBF
X0FDVElPTiwgJmFjdGlvbkluZm8pOworCisgICAgICAgIGdfb25jZV9pbml0X2xlYXZlKCZ0eXBl
Vm9sYXRpbGUsIHR5cGUpOworICAgIH0KKworICAgIHJldHVybiB0eXBlVm9sYXRpbGU7Cit9CisK
K1dlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIHdlYmtpdEFjY2Vzc2libGVIeXBlcmxpbmtOZXco
QXRrSHlwZXJsaW5rSW1wbCogaHlwZXJsaW5rSW1wbCkKK3sKKyAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChBVEtfSVNfSFlQRVJMSU5LX0lNUEwoaHlwZXJsaW5rSW1wbCksIDApOworICAgIHJldHVy
biBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTksoZ19vYmplY3RfbmV3KFdFQktJVF9UWVBFX0FD
Q0VTU0lCTEVfSFlQRVJMSU5LLCAiaHlwZXJsaW5rLWltcGwiLCBoeXBlcmxpbmtJbXBsLCAwKSk7
Cit9CisKK1dlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3QqIHdlYmtpdEFjY2Vzc2libGVIeXBl
cmxpbmtHZXRBY2Nlc3NpYmlsaXR5T2JqZWN0KFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmsqIGxp
bmspCit7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0FDQ0VTU0lCTEVfSFlQ
RVJMSU5LKGxpbmspLCAwKTsKKyAgICByZXR1cm4gY29yZShsaW5rKTsKK30KKworI2VuZGlmIC8v
IEhBVkUoQUNDRVNTSUJJTElUWSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9n
dGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oIGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0
ay9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uOWRmODE5ZAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYWNjZXNzaWJpbGl0
eS9ndGsvV2ViS2l0QWNjZXNzaWJsZUh5cGVybGluay5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXZWJLaXRBY2Nlc3NpYmxl
SHlwZXJsaW5rX2gKKyNkZWZpbmUgV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua19oCisKKyNpbmNs
dWRlICJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5oIgorCisjaW5jbHVkZSA8YXRrL2F0
ay5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBBY2Nlc3NpYmlsaXR5T2JqZWN0Owor
fQorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBF
UkxJTksgICAgICAgICAgICAgICAgICAod2Via2l0QWNjZXNzaWJsZUh5cGVybGlua0dldFR5cGUg
KCkpCisjZGVmaW5lIFdFQktJVF9BQ0NFU1NJQkxFX0hZUEVSTElOSyhvYmopICAgICAgICAgICAg
ICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgV0VCS0lUX1RZUEVfQUND
RVNTSUJMRV9IWVBFUkxJTkssIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmspKQorI2RlZmluZSBX
RUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTktfQ0xBU1Moa2xhc3MpICAgICAgICAgIChHX1RZUEVf
Q0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJ
TkssIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcykpCisjZGVmaW5lIFdFQktJVF9JU19B
Q0NFU1NJQkxFX0hZUEVSTElOSyhvYmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNU
QU5DRV9UWVBFICgob2JqKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9IWVBFUkxJTkspKQorI2Rl
ZmluZSBXRUJLSVRfSVNfQUNDRVNTSUJMRV9IWVBFUkxJTktfQ0xBU1Moa2xhc3MpICAgICAgIChH
X1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgV0VCS0lUX1RZUEVfQUNDRVNTSUJMRV9I
WVBFUkxJTkspKQorI2RlZmluZSBXRUJLSVRfQUNDRVNTSUJMRV9IWVBFUkxJTktfR0VUX0NMQVNT
KG9iaikgICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgV0VCS0lUX1RZ
UEVfQUNDRVNTSUJMRV9IWVBFUkxJTkssIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtDbGFzcykp
CisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rICAgICAgICAgICAg
ICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbms7Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0QWNj
ZXNzaWJsZUh5cGVybGlua0NsYXNzICAgICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5r
Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfV2ViS2l0QWNjZXNzaWJsZUh5cGVybGlua1ByaXZhdGUg
ICAgICAgICBXZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rUHJpdmF0ZTsKKworc3RydWN0IF9XZWJL
aXRBY2Nlc3NpYmxlSHlwZXJsaW5rIHsKKyAgICBBdGtIeXBlcmxpbmsgcGFyZW50OworCisgICAg
Ly8gcHJpdmF0ZQorICAgIFdlYktpdEFjY2Vzc2libGVIeXBlcmxpbmtQcml2YXRlICpwcml2Owor
fTsKKworc3RydWN0IF9XZWJLaXRBY2Nlc3NpYmxlSHlwZXJsaW5rQ2xhc3MgeworICAgIEF0a09i
amVjdENsYXNzIHBhcmVudENsYXNzOworfTsKKworR1R5cGUgd2Via2l0QWNjZXNzaWJsZUh5cGVy
bGlua0dldFR5cGUodm9pZCkgR19HTlVDX0NPTlNUOworCitXZWJLaXRBY2Nlc3NpYmxlSHlwZXJs
aW5rKiB3ZWJraXRBY2Nlc3NpYmxlSHlwZXJsaW5rTmV3KEF0a0h5cGVybGlua0ltcGwqIGh5cGVy
bGlua0ltcGwpOworCitXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0KiB3ZWJraXRBY2Nlc3Np
YmxlSHlwZXJsaW5rR2V0QWNjZXNzaWJpbGl0eU9iamVjdChXZWJLaXRBY2Nlc3NpYmxlSHlwZXJs
aW5rKiBsaW5rKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8vIFdlYktpdEFjY2Vzc2libGVI
eXBlcmxpbmtfaApkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cgYi9XZWJLaXQvZ3Rr
L0NoYW5nZUxvZwppbmRleCA1N2MzZTI3Li5jZjYwYTIwIDEwMDY0NAotLS0gYS9XZWJLaXQvZ3Rr
L0NoYW5nZUxvZworKysgYi9XZWJLaXQvZ3RrL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE5IEBACisy
MDEwLTEwLTI4ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbR3RrXSBBdGtI
eXBlcmxpbmsgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNzg1CisKKyAgICAgICAgTmV3IHRlc3QgdG8gZW5z
dXJlIHRoZSBBdGtIeXBlcnRleHQvQXRrSHlwZXJsaW5rIHN0dWZmIHdvcmtzLgorCisgICAgICAg
ICogdGVzdHMvdGVzdGF0ay5jOgorICAgICAgICAodGVzdFdlYmtpdEF0a0h5cGVydGV4dEFuZEh5
cGVybGlua3MpOiBOZXcgdGVzdCwgY2hlY2tpbmcgYm90aCB0aGUKKyAgICAgICAgaW1wbGVtZW50
YXRpb24gb2YgdGhlIEF0a0h5cGVydGV4dCBpbnRlcmZhY2UsIHRoZSBzdWJjbGFzcyBvZiB0aGUK
KyAgICAgICAgQXRrSHlwZXJsaW5rIGFic3RyYWN0IGNsYXNzLCBhbmQgdGhlIGltcGxlbWVudGF0
aW9uIG9mIHRoZQorICAgICAgICBBdGtBY3Rpb24gaW50ZXJmYWNlIGluIHRoYXQgc3ViY2xhc3Mu
CisgICAgICAgIChtYWluKTogQWRkZWQgdGhlIG5ldyB1bml0IHRlc3QuCisKIDIwMTAtMTAtMjcg
IE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IE1hcnRpbiBSb2JpbnNvbi4KZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsvdGVzdHMv
dGVzdGF0ay5jIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMKaW5kZXggYmQ2NDczYS4uNTBl
NGEwOCAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMKKysrIGIvV2ViS2l0
L2d0ay90ZXN0cy90ZXN0YXRrLmMKQEAgLTQ2LDYgKzQ2LDggQEAgc3RhdGljIGNvbnN0IGNoYXIq
IGNvbnRlbnRzSW5UYWJsZVdpdGhIZWFkZXJzID0gIjxodG1sPjxib2R5Pjx0YWJsZT48dHI+PHRo
PmZvbzwKIAogc3RhdGljIGNvbnN0IGNoYXIqIGZvcm1XaXRoVGV4dElucHV0cyA9ICI8aHRtbD48
Ym9keT48Zm9ybT48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZW50cnknIC8+PC9mb3JtPjwvYm9k
eT48L2h0bWw+IjsKIAorc3RhdGljIGNvbnN0IGNoYXIqIGh5cGVydGV4dEFuZEh5cGVybGlua3Mg
PSAiPGh0bWw+PGJvZHk+PHA+QSBwYXJhZ3JhcGggd2l0aCBubyBsaW5rcyBhdCBhbGw8L3A+PHA+
PGEgaHJlZj0naHR0cDovL2Zvby5iYXIuYmF6Lyc+QSBsaW5lPC9hPiB3aXRoIDxhIGhyZWY9J2h0
dHA6Ly9iYXIuYmF6LmZvby8nPmEgbGluayBpbiB0aGUgbWlkZGxlPC9hPiBhcyB3ZWxsIGFzIGF0
IHRoZSBiZWdpbm5pbmcgYW5kIDxhIGhyZWY9J2h0dHA6Ly9iYXouZm9vLmJhci8nPmF0IHRoZSBl
bmQ8L2E+PC9wPjwvYm9keT48L2h0bWw+IjsKKwogc3RhdGljIGNvbnN0IGNoYXIqIGxheW91dEFu
ZERhdGFUYWJsZXMgPSAiPGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGg+T2RkPC90aD48dGg+RXZl
bjwvdGg+PC90cj48dHI+PHRkPjE8L3RkPjx0ZD4yPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlPjx0
cj48dGQ+Zm9vPC90ZD48dGQ+YmFyPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4iOwog
CiBzdGF0aWMgY29uc3QgY2hhciogbGlua3NXaXRoSW5saW5lSW1hZ2VzID0gIjxodG1sPjxoZWFk
PjxzdHlsZT5hLmh0dHA6YmVmb3JlIHtjb250ZW50OiB1cmwobm8taW1hZ2UucG5nKTt9PC9zdHls
ZT48Ym9keT48cD48YSBjbGFzcz0naHR0cCcgaHJlZj0nZm9vJz5mb288L2E+IGJhciBiYXo8L3A+
PHA+Zm9vIDxhIGNsYXNzPSdodHRwJyBocmVmPSdiYXInPmJhcjwvYT4gYmF6PC9wPjxwPmZvbyBi
YXIgPGEgY2xhc3M9J2h0dHAnIGhyZWY9J2Jheic+YmF6PC9hPjwvcD48L2JvZHk+PC9odG1sPiI7
CkBAIC0xMDcwLDYgKzEwNzIsODEgQEAgc3RhdGljIHZvaWQgdGVzdFdlYmtpdEF0a0xpbmtzV2l0
aElubGluZUltYWdlcyh2b2lkKQogICAgIGdfb2JqZWN0X3VucmVmKHdlYlZpZXcpOwogfQogCitz
dGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrSHlwZXJ0ZXh0QW5kSHlwZXJsaW5rcyh2b2lkKQorewor
ICAgIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92
aWV3X25ldygpKTsKKyAgICBnX29iamVjdF9yZWZfc2luayh3ZWJWaWV3KTsKKyAgICBHdGtBbGxv
Y2F0aW9uIGFsbG9jID0geyAwLCAwLCA4MDAsIDYwMCB9OworICAgIGd0a193aWRnZXRfc2l6ZV9h
bGxvY2F0ZShHVEtfV0lER0VUKHdlYlZpZXcpLCAmYWxsb2MpOworICAgIHdlYmtpdF93ZWJfdmll
d19sb2FkX3N0cmluZyh3ZWJWaWV3LCBoeXBlcnRleHRBbmRIeXBlcmxpbmtzLCAwLCAwLCAwKTsK
KworICAgIC8vIE1hbnVhbGx5IHNwaW4gdGhlIG1haW4gY29udGV4dCB0byBnZXQgdGhlIGFjY2Vz
c2libGUgb2JqZWN0cworICAgIHdoaWxlIChnX21haW5fY29udGV4dF9wZW5kaW5nKDApKQorICAg
ICAgICBnX21haW5fY29udGV4dF9pdGVyYXRpb24oMCwgVFJVRSk7CisKKyAgICBBdGtPYmplY3Qq
IG9iaiA9IGd0a193aWRnZXRfZ2V0X2FjY2Vzc2libGUoR1RLX1dJREdFVCh3ZWJWaWV3KSk7Cisg
ICAgZ19hc3NlcnQob2JqKTsKKworICAgIEF0a09iamVjdCogcGFyYWdyYXBoMSA9IGF0a19vYmpl
Y3RfcmVmX2FjY2Vzc2libGVfY2hpbGQob2JqLCAwKTsKKyAgICBnX2Fzc2VydChBVEtfT0JKRUNU
KHBhcmFncmFwaDEpKTsKKyAgICBnX2Fzc2VydChhdGtfb2JqZWN0X2dldF9yb2xlKHBhcmFncmFw
aDEpID09IEFUS19ST0xFX1BBUkFHUkFQSCk7CisgICAgZ19hc3NlcnQoQVRLX0lTX0hZUEVSVEVY
VChwYXJhZ3JhcGgxKSk7CisKKyAgICAvLyBObyBsaW5rcyBpbiB0aGUgZmlyc3QgcGFyYWdyYXBo
CisgICAgZ2ludCBuTGlua3MgPSBhdGtfaHlwZXJ0ZXh0X2dldF9uX2xpbmtzKEFUS19IWVBFUlRF
WFQocGFyYWdyYXBoMSkpOworICAgIGdfYXNzZXJ0X2NtcGludChuTGlua3MsID09LCAwKTsKKwor
ICAgIEF0a09iamVjdCogcGFyYWdyYXBoMiA9IGF0a19vYmplY3RfcmVmX2FjY2Vzc2libGVfY2hp
bGQob2JqLCAxKTsKKyAgICBnX2Fzc2VydChBVEtfT0JKRUNUKHBhcmFncmFwaDIpKTsKKyAgICBn
X2Fzc2VydChhdGtfb2JqZWN0X2dldF9yb2xlKHBhcmFncmFwaDIpID09IEFUS19ST0xFX1BBUkFH
UkFQSCk7CisgICAgZ19hc3NlcnQoQVRLX0lTX0hZUEVSVEVYVChwYXJhZ3JhcGgyKSk7CisKKyAg
ICAvLyBDaGVjayBsaW5rcyBpbiB0aGUgc2Vjb25kIHBhcmFncmFwaAorICAgIG5MaW5rcyA9IGF0
a19oeXBlcnRleHRfZ2V0X25fbGlua3MoQVRLX0hZUEVSVEVYVChwYXJhZ3JhcGgyKSk7CisgICAg
Z19hc3NlcnRfY21waW50KG5MaW5rcywgPT0sIDMpOworCisgICAgQXRrSHlwZXJsaW5rKiBoTGlu
azEgPSBhdGtfaHlwZXJ0ZXh0X2dldF9saW5rKEFUS19IWVBFUlRFWFQocGFyYWdyYXBoMiksIDAp
OworICAgIGdfYXNzZXJ0KEFUS19IWVBFUkxJTksoaExpbmsxKSk7CisgICAgQXRrT2JqZWN0KiBo
TGlua09iamVjdDEgPSBhdGtfaHlwZXJsaW5rX2dldF9vYmplY3QoaExpbmsxLCAwKTsKKyAgICBn
X2Fzc2VydChBVEtfT0JKRUNUKGhMaW5rT2JqZWN0MSkpOworICAgIGdfYXNzZXJ0KGF0a19vYmpl
Y3RfZ2V0X3JvbGUoaExpbmtPYmplY3QxKSA9PSBBVEtfUk9MRV9MSU5LKTsKKyAgICBnX2Fzc2Vy
dF9jbXBpbnQoYXRrX2h5cGVybGlua19nZXRfc3RhcnRfaW5kZXgoaExpbmsxKSwgPT0sIDApOwor
ICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9lbmRfaW5kZXgoaExpbmsxKSwg
PT0sIDYpOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9uX2FuY2hvcnMo
aExpbmsxKSwgPT0sIDEpOworICAgIGdfYXNzZXJ0X2NtcHN0cihhdGtfaHlwZXJsaW5rX2dldF91
cmkoaExpbmsxLCAwKSwgPT0sICJodHRwOi8vZm9vLmJhci5iYXovIik7CisKKyAgICBBdGtIeXBl
cmxpbmsqIGhMaW5rMiA9IGF0a19oeXBlcnRleHRfZ2V0X2xpbmsoQVRLX0hZUEVSVEVYVChwYXJh
Z3JhcGgyKSwgMSk7CisgICAgZ19hc3NlcnQoQVRLX0hZUEVSTElOSyhoTGluazIpKTsKKyAgICBB
dGtPYmplY3QqIGhMaW5rT2JqZWN0MiA9IGF0a19oeXBlcmxpbmtfZ2V0X29iamVjdChoTGluazIs
IDApOworICAgIGdfYXNzZXJ0KEFUS19PQkpFQ1QoaExpbmtPYmplY3QyKSk7CisgICAgZ19hc3Nl
cnQoYXRrX29iamVjdF9nZXRfcm9sZShoTGlua09iamVjdDIpID09IEFUS19ST0xFX0xJTkspOwor
ICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9zdGFydF9pbmRleChoTGluazIp
LCA9PSwgMTIpOworICAgIGdfYXNzZXJ0X2NtcGludChhdGtfaHlwZXJsaW5rX2dldF9lbmRfaW5k
ZXgoaExpbmsyKSwgPT0sIDMyKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVybGlua19n
ZXRfbl9hbmNob3JzKGhMaW5rMiksID09LCAxKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoYXRrX2h5
cGVybGlua19nZXRfdXJpKGhMaW5rMiwgMCksID09LCAiaHR0cDovL2Jhci5iYXouZm9vLyIpOwor
CisgICAgQXRrSHlwZXJsaW5rKiBoTGluazMgPSBhdGtfaHlwZXJ0ZXh0X2dldF9saW5rKEFUS19I
WVBFUlRFWFQocGFyYWdyYXBoMiksIDIpOworICAgIGdfYXNzZXJ0KEFUS19IWVBFUkxJTksoaExp
bmszKSk7CisgICAgQXRrT2JqZWN0KiBoTGlua09iamVjdDMgPSBhdGtfaHlwZXJsaW5rX2dldF9v
YmplY3QoaExpbmszLCAwKTsKKyAgICBnX2Fzc2VydChBVEtfT0JKRUNUKGhMaW5rT2JqZWN0Mykp
OworICAgIGdfYXNzZXJ0KGF0a19vYmplY3RfZ2V0X3JvbGUoaExpbmtPYmplY3QzKSA9PSBBVEtf
Uk9MRV9MSU5LKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVybGlua19nZXRfc3RhcnRf
aW5kZXgoaExpbmszKSwgPT0sIDY1KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2h5cGVybGlu
a19nZXRfZW5kX2luZGV4KGhMaW5rMyksID09LCA3NSk7CisgICAgZ19hc3NlcnRfY21waW50KGF0
a19oeXBlcmxpbmtfZ2V0X25fYW5jaG9ycyhoTGluazMpLCA9PSwgMSk7CisgICAgZ19hc3NlcnRf
Y21wc3RyKGF0a19oeXBlcmxpbmtfZ2V0X3VyaShoTGluazMsIDApLCA9PSwgImh0dHA6Ly9iYXou
Zm9vLmJhci8iKTsKKworICAgIC8vIEZpbmFsbHkgY2hlY2sgdGhlIEF0a0FjdGlvbiBpbnRlcmZh
Y2UgZm9yIGEgZ2l2ZW4gQXRrSHlwZXJsaW5rCisgICAgZ19hc3NlcnQoQVRLX0lTX0FDVElPTiho
TGluazEpKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoYXRrX2FjdGlvbl9nZXRfbl9hY3Rpb25zKEFU
S19BQ1RJT04oaExpbmsxKSksID09LCAxKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoYXRrX2FjdGlv
bl9nZXRfa2V5YmluZGluZyhBVEtfQUNUSU9OKGhMaW5rMSksIDApLCA9PSwgIiIpOworICAgIGdf
YXNzZXJ0X2NtcHN0cihhdGtfYWN0aW9uX2dldF9uYW1lKEFUS19BQ1RJT04oaExpbmsxKSwgMCks
ID09LCAianVtcCIpOworICAgIGdfYXNzZXJ0KGF0a19hY3Rpb25fZG9fYWN0aW9uKEFUS19BQ1RJ
T04oaExpbmsxKSwgMCkpOworCisgICAgZ19vYmplY3RfdW5yZWYocGFyYWdyYXBoMSk7CisgICAg
Z19vYmplY3RfdW5yZWYocGFyYWdyYXBoMik7CisgICAgZ19vYmplY3RfdW5yZWYod2ViVmlldyk7
Cit9CisKIHN0YXRpYyB2b2lkIHRlc3RXZWJraXRBdGtMaXN0c09mSXRlbXModm9pZCkKIHsKICAg
ICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJfdmll
d19uZXcoKSk7CkBAIC0xMjIyLDYgKzEyOTksNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioq
IGFyZ3YpCiAgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Via2l0L2F0ay90ZXh0QXR0cmlidXRlcyIs
IHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyk7CiAgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Vi
a2l0L2F0ay90ZXh0U2VsZWN0aW9ucyIsIHRlc3RXZWtpdEF0a1RleHRTZWxlY3Rpb25zKTsKICAg
ICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL2dldEV4dGVudHMiLCB0ZXN0V2Via2l0QXRr
R2V0RXh0ZW50cyk7CisgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Via2l0L2F0ay9oeXBlcnRleHRB
bmRIeXBlcmxpbmtzIiwgdGVzdFdlYmtpdEF0a0h5cGVydGV4dEFuZEh5cGVybGlua3MpOwogICAg
IGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvbGF5b3V0QW5kRGF0YVRhYmxlcyIsIHRlc3RX
ZWJraXRBdGtMYXlvdXRBbmREYXRhVGFibGVzKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJr
aXQvYXRrL2xpbmtzV2l0aElubGluZUltYWdlcyIsIHRlc3RXZWJraXRBdGtMaW5rc1dpdGhJbmxp
bmVJbWFnZXMpOwogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvbGlzdHNPZkl0ZW1z
IiwgdGVzdFdlYmtpdEF0a0xpc3RzT2ZJdGVtcyk7Ci0tIAoxLjcuMQoK
</data>
<flag name="review"
          id="62362"
          type_id="1"
          status="+"
          setter="mrobinson"
    />
          </attachment>
      

    </bug>

</bugzilla>