<?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>80490</bug_id>
          
          <creation_ts>2012-03-06 22:13:39 -0800</creation_ts>
          <short_desc>[Microdata] Implement cache mechanism for HTMLPropertiesCollection.</short_desc>
          <delta_ts>2012-04-11 08:20:28 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>68609</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Arko Saha">arko</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>572532</commentid>
    <comment_count>0</comment_count>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-06 22:13:39 -0800</bug_when>
    <thetext>Currently HTMLPropertiesCollection item, length does not use cache. Its recomputing item, length every time. Need to implement caching mechanism for HTMLPropertiesCollection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573798</commentid>
    <comment_count>1</comment_count>
      <attachid>130817</attachid>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-08 06:32:53 -0800</bug_when>
    <thetext>Created attachment 130817
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574196</commentid>
    <comment_count>2</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-03-08 14:19:45 -0800</bug_when>
    <thetext>I&apos;m going to defer to rniwa in reviewing this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574923</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-09 08:54:12 -0800</bug_when>
    <thetext>As I discussee with arko on IRC, we should push back on the spec so that property item lists are in the document order instead of being sorted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575028</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-09 11:30:38 -0800</bug_when>
    <thetext>Wait... the spec says it&apos;s in the tree order :(

http://dev.w3.org/html5/md/#htmlpropertiescollection
collection(index)
Returns the element with index index from the collection. The items are sorted in tree order.

We shouldn&apos;t need to do any of these sorting. DOM is in the tree order by default!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575970</commentid>
    <comment_count>5</comment_count>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-12 00:22:50 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Wait... the spec says it&apos;s in the tree order :(
&gt; 
&gt; http://dev.w3.org/html5/md/#htmlpropertiescollection
&gt; collection(index)
&gt; Returns the element with index index from the collection. The items are sorted in tree order.
&gt; 
&gt; We shouldn&apos;t need to do any of these sorting. DOM is in the tree order by default!

Let me try to explain the situation with below example:

&lt;div id=&quot;id1&quot;&gt;
&lt;p itemprop=&quot;foo&quot; id=&quot;a&quot;&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;section itemscope itemref=&quot;id1 id2&quot;&gt;
&lt;p itemprop=&quot;foo&quot; id=&quot;b&quot;&gt;&lt;/p&gt;
&lt;/section&gt;

&lt;div id=&quot;id2&quot;&gt;
&lt;p itemprop=&quot;foo&quot; id=&quot;c&quot;&gt;&lt;/p&gt;
&lt;/div&gt;

Here &lt;section&gt; has itemscope attribute, its an microdata item.

if we do item = document.getItems()[0], it will return the &lt;section&gt; element. first item in the document. 

item.properties.namedItem(foo) must return a NodeList object containing three &lt;p&gt; elements with id- a, b, c respectively. it should be in the tree order. 

With itemref attribute we can specify the additional properties of an item. Those properties will not be children of the item as they are added through itmref attribute.

Now to find the properties of an item we do the below steps as per spec :
1. Find all children of the item with itemprop attribute.
2. Find the properties which are added through the itemref attribute. In the example: find element with id &apos;id1&apos;, &apos;id2&apos;. Then find the properties of id1, id2
3. Sort the result in the tree order.

Please note that the traversal is started from base element i.e &lt;section&gt; in this case and not from the document root so the node list we get will not be in tree order(without step 3). It will be b, a, c.

So without sorting how to get the properties in tree order (a, b, c)??</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>575973</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-12 00:42:19 -0700</bug_when>
    <thetext>Thanks for the clarification.

(In reply to comment #5)
&gt; With itemref attribute we can specify the additional properties of an item. Those properties will not be children of the item as they are added through itmref attribute.
&gt; 
&gt; Now to find the properties of an item we do the below steps as per spec :
&gt; 1. Find all children of the item with itemprop attribute.

If we&apos;re currently in one of these children, then we can simply look for the next sibling.

&gt; 2. Find the properties which are added through the itemref attribute. In the example: find element with id &apos;id1&apos;, &apos;id2&apos;. Then find the properties of id1, id2

We can probably cache a sorted (in tree order) list of these itemref ids. We can then use it to find the next element with the said id in the tree order.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>578408</commentid>
    <comment_count>7</comment_count>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-14 08:17:34 -0700</bug_when>
    <thetext>I have modified the patch so that it caches only item and itemref elements. And sort happens only on this list. Chlidren of item and itemref elements are exculded from sorting as they are already in tree order.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>578410</commentid>
    <comment_count>8</comment_count>
      <attachid>131853</attachid>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-14 08:19:13 -0700</bug_when>
    <thetext>Created attachment 131853
Updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>583033</commentid>
    <comment_count>9</comment_count>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-20 07:07:27 -0700</bug_when>
    <thetext>Hi Ryosuke, can you please review the updated patch. Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>585004</commentid>
    <comment_count>10</comment_count>
      <attachid>131853</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-21 23:31:27 -0700</bug_when>
    <thetext>Comment on attachment 131853
Updated patch

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

r- because you probably want to address some of my comments.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:67
&gt; +static Node* nextNodeOrSibling(Node* base, Node* node)

Could you give this function more descriptive name? It does certainly traverse next node or sibling but it doesn&apos;t explain why it does.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:69
&gt; +    return (node == base) || (node-&gt;isHTMLElement() &amp;&amp; !toHTMLElement(node)-&gt;fastHasAttribute(itemscopeAttr))

No need for parenthesis around node == base.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:79
&gt; +    Node* current;
&gt; +    if (!previous)
&gt; +        current = base;
&gt; +    else
&gt; +        current = nextNodeOrSibling(base, previous);

I think you should use the ternary operator here.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:84
&gt; +        if (!current-&gt;isHTMLElement())
&gt; +            continue;
&gt; +        Element* element = toHTMLElement(current);

It seems odd to check if current is a HTML element then store it to Element*.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:98
&gt; +    if (!base()-&gt;isHTMLElement() || !toHTMLElement(base())-&gt;fastHasAttribute(itemscopeAttr))

Can base() ever return non-Element node? Maybe we want to change the type there so that we don&apos;t have to check whether it&apos;s not an element or not.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:103
&gt; +    m_cache.itemRefElements.append(baseElement);
&gt; +    m_cache.hasItemRefElements = true;

We probably want to add a bunch of helper functions in m_cache so that we don&apos;t have to update these member variables manually like this.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:125
&gt; +    for (unsigned i = 0; i &lt; m_cache.itemRefElements.size(); ++i)
&gt; +        for (Element* element = itemAfter(m_cache.itemRefElements[i], 0); element; element = itemAfter(m_cache.itemRefElements[i], element))
&gt; +            ++length;

You need curly brackets for the outer for loop.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:158
&gt; +        for (unsigned i = 0; i &lt; m_cache.itemRefElements.size(); ++i)

You need curly brackets for this for loop since the statement is more than one line.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:159
&gt; +            if ((m_cache.current = itemAfter(m_cache.itemRefElements[i], 0))) {

No extra parenthesis needed.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:165
&gt; +                m_cache.itemRefElementPosition = i;
&gt; +                break;
&gt; +            }
&gt; +        m_cache.position = 0;
&gt; +        if (!m_cache.current)
&gt; +            return 0;

It seems like this entire block is redundant and can be merged into the for loop below.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:168
&gt; +    Element* e = m_cache.current;

Please don&apos;t use one-letter variable name like e.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:174
&gt; +            e = itemAfter(m_cache.itemRefElements[i], e);

We need to initialize e before each inner loop here (i.e. before for (unsigned pos = currentPosition;...), right?

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:179
&gt; +            if (e)
&gt; +                currentPosition++;
&gt; +            else
&gt; +                break;

It&apos;s probably better to bail out early as in:
if (!e)
    break;
currentPosition++;

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:204
&gt; +            if (m_cache.propertyNames-&gt;isEmpty() || !m_cache.propertyNames-&gt;contains(propertyName))

I think you can just check !m_cache.propertyNames-&gt;contains(propertyName). If m_cache.propertyNames-&gt;isEmpty(), then it certainly doesn&apos;t contain anything.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:233
&gt; +    invalidateCacheIfNeeded();
&gt; +    updateNameCache();

It seems like updateNameCache can call invalidateCacheIfNeeded.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>588823</commentid>
    <comment_count>11</comment_count>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-27 06:31:34 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; It seems like this entire block is redundant and can be merged into the for loop below.
&gt; 

The algorithm of HTMLPropertiesCollection::item() method is as below:

In if (!m_cache.current || m_cache.position &gt; index) {.. }

Here we reset the position to 0. set current to the 0th property in the collection. set the itemRefElementPosition to the position in itemRefElements where we find the 0th property.

The first block is responsible for finding the 0th property in the itemRefElements list. Then searching required property in the collection starts in the second block. 
So we require this block to get started with the searching in the second block.

In the second block i.e, for (unsigned i = m_cache.itemRefElementPosition..) :

1. The outer for loop picks an element from itemRefElements.
2. The inner for loop is responsible to find a property in that element i.e, itemRefElements[i]. using itemAfter() method.
itemAfter() returns the 0th property if the previous element is null else returns the next property in the itemRefElements[i]. It will return null if it already processed all properties in itemRefElements[i].
3. increment the currentPosition appropriately. 
4. If the currentPosition is equal to index then return the property. else find the next property.
5. If the next property is null that means itemRefElements[i] has no more property to process. then control will come to the outer for loop and picks the next element in the itemRefElements. And executes above steps (repeat from step 1). 

So I think if we merge two blocks here then the algorithm would become little unclear and complex.

In the following block,
if (!m_cache.current || m_cache.position &gt; index) {m_cache.position = 0; ... }
we are resetting the position to 0, but if we do not set the m_cache.current to the first property in the collection, it might require some special handling for the 0th property to start the search with.. which might complicate the algo.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589670</commentid>
    <comment_count>12</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-27 22:59:30 -0700</bug_when>
    <thetext>Thanks for the clarification.

(In reply to comment #11)
&gt; The first block is responsible for finding the 0th property in the itemRefElements list. Then searching required property in the collection starts in the second block. 
&gt; So we require this block to get started with the searching in the second block.
&gt; 
&gt; In the second block i.e, for (unsigned i = m_cache.itemRefElementPosition..) :
&gt; 
&gt; 1. The outer for loop picks an element from itemRefElements.
&gt; 2. The inner for loop is responsible to find a property in that element i.e, itemRefElements[i]. using itemAfter() method.
&gt; itemAfter() returns the 0th property if the previous element is null else returns the next property in the itemRefElements[i]. It will return null if it already processed all properties in itemRefElements[i].
&gt; 3. increment the currentPosition appropriately. 
&gt; 4. If the currentPosition is equal to index then return the property. else find the next property.
&gt; 5. If the next property is null that means itemRefElements[i] has no more property to process. then control will come to the outer for loop and picks the next element in the itemRefElements. And executes above steps (repeat from step 1). 
&gt; 
&gt; So I think if we merge two blocks here then the algorithm would become little unclear and complex.

In that case, can extract either or both parts as a helper function(s) with some descriptive name? That&apos;ll make the semantics much clearer :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>591150</commentid>
    <comment_count>13</comment_count>
      <attachid>134572</attachid>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-03-29 07:03:52 -0700</bug_when>
    <thetext>Created attachment 134572
Updated patch

Incorporated review comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>591628</commentid>
    <comment_count>14</comment_count>
      <attachid>134572</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-03-29 15:23:33 -0700</bug_when>
    <thetext>Comment on attachment 134572
Updated patch

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

Okay, the patch looks much better. Maybe we want one more iteration before we land this.

&gt; Source/WebCore/html/HTMLCollection.h:92
&gt; +#if ENABLE(MICRODATA)
&gt; +        NodeCacheMap propertyCache;
&gt; +        Vector&lt;Element*&gt; itemRefElements;
&gt; +        RefPtr&lt;DOMStringList&gt; propertyNames;
&gt; +        unsigned itemRefElementPosition;
&gt; +        bool hasItemRefElements;
&gt; +#endif

On my second thought, it might be better to store this in HTMLPropertiesCollection or an inner class or HTMLPropertiesCollection
because the change as is will increase the size of all HTMLCollection even though those collections would never use these variables.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:67
&gt; +static Node* nextNodeToProcess(Node* base, Node* node)

Maybe it&apos;s better to call this function nextNodeWithProperty? nextNodeToProcess sounds too generic.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:69
&gt; +    // An Microdata item may contain properties which in turn an item itself. Properties can also

&quot;which in turn&quot; what? &quot;which in turn are items themselves&quot;?

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:110
&gt; +    std::sort(itemRefElements.begin(), itemRefElements.end(), compareTreeOrder);

This is very inefficient. I think it&apos;s probably better to walk the entire document and collect nodes in the document order
since sorting nodes will end up doing the same work anyway.

&gt; Source/WebCore/html/HTMLPropertiesCollection.cpp:184
&gt; +        for (unsigned pos = currentPosition; pos &lt; index; ++pos) {

What&apos;s the point of pos local variable here? Can&apos;t we just increment currentPosition?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597618</commentid>
    <comment_count>15</comment_count>
      <attachid>136059</attachid>
    <who name="Arko Saha">arko</who>
    <bug_when>2012-04-06 13:40:16 -0700</bug_when>
    <thetext>Created attachment 136059
Updated patch

Incorporated review comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>600281</commentid>
    <comment_count>16</comment_count>
      <attachid>136059</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-11 08:20:23 -0700</bug_when>
    <thetext>Comment on attachment 136059
Updated patch

Clearing flags on attachment: 136059

Committed r113862: &lt;http://trac.webkit.org/changeset/113862&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>600282</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-11 08:20:28 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130817</attachid>
            <date>2012-03-08 06:32:53 -0800</date>
            <delta_ts>2012-03-14 08:19:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch_80490.diff</filename>
            <type>text/plain</type>
            <size>9745</size>
            <attacher name="Arko Saha">arko</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMDE2NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDEyLTAzLTA4ICBBcmtvIFNh
aGEgIDxhcmtvQG1vdG9yb2xhLmNvbT4KKworICAgICAgICBNaWNyb2RhdGE6IEltcGxlbWVudCBj
YWNoZSBtZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwNDkwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgY2FjaGluZyBt
ZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4gQ2FjaGUgcHJvcGVydGllcyBu
b2RlIGxpc3QgYW5kCisgICAgICAgIGludmFsaWRhdGUgaXQgd2hlbiBkb20gdHJlZSBjaGFuZ2Vz
LiBXaGVuZXZlciBhbnkgcXVlcnkgaXMgbWFkZSBvbiBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24s
CisgICAgICAgIHJlc3VsdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWNoZS4gRWFybGlhciB3ZSB1
c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXJ0aWVzIG5vZGUgbGlzdCBldmVyeQorICAgICAgICB0aW1l
IGEgcXVlcnkgaXMgbWFkZS4KKworICAgICAgICAqIGh0bWwvSFRNTENvbGxlY3Rpb24uaDoKKyAg
ICAgICAgKiBodG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OmZpbmRQcm9wZXRp
ZXNPZkFuSXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246
OnVwZGF0ZU5hbWVDYWNoZSk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6aXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJv
cGVydGllc0NvbGxlY3Rpb246Om5hbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbjo6bmFtZWRJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbjo6aGFzTmFtZWRJdGVtKToKKyAgICAgICAgKiBodG1sL0hUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbi5oOgorICAgICAgICAoSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uKToKKwog
MjAxMi0wMy0wOCAgSWx5YSBUaWtob25vdnNreSAgPGxvaXNsb0BjaHJvbWl1bS5vcmc+CiAKICAg
ICAgICAgV2ViIEluc3BlY3RvcjogVGhlIGZ1bmN0aW9uIGhhZCB0byByZXR1cm4gYSBoYXNoIGJ1
dCBpdCByZXR1cm5lZCBqdXN0IGFkZHJlc3MuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hU
TUxDb2xsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29s
bGVjdGlvbi5oCShyZXZpc2lvbiAxMTAxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxD
b2xsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTgyLDYgKzgyLDggQEAgcHJvdGVjdGVkOgog
ICAgICAgICBpbnQgZWxlbWVudHNBcnJheVBvc2l0aW9uOwogICAgICAgICBib29sIGhhc0xlbmd0
aDsKICAgICAgICAgYm9vbCBoYXNOYW1lQ2FjaGU7CisgICAgICAgIFZlY3RvcjxOb2RlKj4gcHJv
cGVydGllc05vZGVMaXN0OworICAgICAgICBib29sIGlzUHJvcGVydGllc05vZGVMaXN0U29ydGVk
OwogCiAgICAgICAgIHZvaWQgY2xlYXIoKQogICAgICAgICB7CkBAIC05NCw2ICs5Niw4IEBAIHBy
b3RlY3RlZDoKICAgICAgICAgICAgIGVsZW1lbnRzQXJyYXlQb3NpdGlvbiA9IDA7CiAgICAgICAg
ICAgICBoYXNMZW5ndGggPSBmYWxzZTsKICAgICAgICAgICAgIGhhc05hbWVDYWNoZSA9IGZhbHNl
OworICAgICAgICAgICAgcHJvcGVydGllc05vZGVMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBp
c1Byb3BlcnRpZXNOb2RlTGlzdFNvcnRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBtX2Nh
Y2hlOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0Nv
bGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMTAxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU3LDcgKzU3LDYg
QEAgUGFzc093blB0cjxIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24+IEhUTQogCiBIVE1MUHJvcGVy
dGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbihOb2RlKiBpdGVtTm9kZSkK
ICAgICA6IEhUTUxDb2xsZWN0aW9uKGl0ZW1Ob2RlLCBJdGVtUHJvcGVydGllcykKLSAgICAsIG1f
cHJvcGVydHlOYW1lcyhET01TdHJpbmdMaXN0OjpjcmVhdGUoKSkKIHsKIH0KIApAQCAtMTE4LDE4
ICsxMTcsMzEgQEAgdm9pZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OmZpbmRQcm9wZQogCiAg
ICAgICAgIC8vIElmIGN1cnJlbnQgaGFzIGFuIGl0ZW1wcm9wIGF0dHJpYnV0ZSBzcGVjaWZpZWQs
IGFkZCBpdCB0byByZXN1bHRzLgogICAgICAgICBpZiAoZWxlbWVudC0+ZmFzdEhhc0F0dHJpYnV0
ZShpdGVtcHJvcEF0dHIpKQotICAgICAgICAgICAgIG1fcHJvcGVydGllcy5hcHBlbmQoY3VycmVu
dCk7CisgICAgICAgICAgICBtX2NhY2hlLnByb3BlcnRpZXNOb2RlTGlzdC5hcHBlbmQoY3VycmVu
dCk7CiAgICAgfQogfQogCit2b2lkIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6dXBkYXRlTmFt
ZUNhY2hlKCkgY29uc3QKK3sKKyAgICBpZiAobV9jYWNoZS5oYXNOYW1lQ2FjaGUpCisgICAgICAg
IHJldHVybjsKKworICAgIGZpbmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOworICAgIG1fY2Fj
aGUuaGFzTmFtZUNhY2hlID0gdHJ1ZTsKKyAgICBtX2NhY2hlLmxlbmd0aCA9IG1fY2FjaGUucHJv
cGVydGllc05vZGVMaXN0LnNpemUoKTsKKyAgICBtX2NhY2hlLmhhc0xlbmd0aCA9IHRydWU7Cit9
CisKIHVuc2lnbmVkIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bGVuZ3RoKCkgY29uc3QKIHsK
ICAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVudCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2Uo
KSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpCiAgICAgICAgIHJldHVybiAwOwog
Ci0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgZmluZFByb3BldGllc09mQW5JdGVtKGJh
c2UoKSk7Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5zaXplKCk7CisgICAgaW52YWxpZGF0ZUNh
Y2hlSWZOZWVkZWQoKTsKKyAgICBpZiAoIW1fY2FjaGUuaGFzTGVuZ3RoKQorICAgICAgICB1cGRh
dGVOYW1lQ2FjaGUoKTsKKworICAgIHJldHVybiBtX2NhY2hlLmxlbmd0aDsKIH0KIAogTm9kZSog
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdApAQCAt
MTM3LDQwICsxNDksNjMgQEAgTm9kZSogSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjppdGVtKHVu
cwogICAgIGlmICghYmFzZSgpLT5pc0hUTUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFz
ZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKICAgICAgICAgcmV0dXJuIDA7
CiAKLSAgICBtX3Byb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0o
YmFzZSgpKTsKKyAgICBpbnZhbGlkYXRlQ2FjaGVJZk5lZWRlZCgpOworICAgIHVwZGF0ZU5hbWVD
YWNoZSgpOworCisgICAgaWYgKG1fY2FjaGUuY3VycmVudCAmJiBtX2NhY2hlLnBvc2l0aW9uID09
IGluZGV4KQorICAgICAgICByZXR1cm4gbV9jYWNoZS5jdXJyZW50OwogCi0gICAgaWYgKG1fcHJv
cGVydGllcy5zaXplKCkgPD0gaW5kZXgpCisgICAgaWYgKG1fY2FjaGUuaGFzTGVuZ3RoICYmIG1f
Y2FjaGUubGVuZ3RoIDw9IGluZGV4KQogICAgICAgICByZXR1cm4gMDsKIAotICAgIHN0ZDo6c29y
dChtX3Byb3BlcnRpZXMuYmVnaW4oKSwgbV9wcm9wZXJ0aWVzLmVuZCgpLCBjb21wYXJlVHJlZU9y
ZGVyKTsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzW2luZGV4XTsKKyAgICBpZiAoIW1fY2FjaGUu
Y3VycmVudCB8fCBtX2NhY2hlLnBvc2l0aW9uID4gaW5kZXgpIHsKKyAgICAgICAgbV9jYWNoZS5j
dXJyZW50ID0gMDsKKyAgICAgICAgbV9jYWNoZS5wb3NpdGlvbiA9IDA7CisgICAgfQorCisgICAg
aWYgKCFtX2NhY2hlLmlzUHJvcGVydGllc05vZGVMaXN0U29ydGVkKSB7CisgICAgICAgIHN0ZDo6
c29ydChtX2NhY2hlLnByb3BlcnRpZXNOb2RlTGlzdC5iZWdpbigpLCBtX2NhY2hlLnByb3BlcnRp
ZXNOb2RlTGlzdC5lbmQoKSwgY29tcGFyZVRyZWVPcmRlcik7CisgICAgICAgIG1fY2FjaGUuaXNQ
cm9wZXJ0aWVzTm9kZUxpc3RTb3J0ZWQgPSB0cnVlOworICAgIH0KKworICAgIFZlY3RvcjxOb2Rl
Kj4gcHJvcGVydGllcyA9IG1fY2FjaGUucHJvcGVydGllc05vZGVMaXN0OworICAgIGlmIChpbmRl
eCA8IHByb3BlcnRpZXMuc2l6ZSgpKSB7CisgICAgICAgIG1fY2FjaGUuY3VycmVudCA9IHRvRWxl
bWVudChwcm9wZXJ0aWVzW2luZGV4XSk7CisgICAgICAgIG1fY2FjaGUucG9zaXRpb24gPSBpbmRl
eDsKKyAgICAgICAgcmV0dXJuIG1fY2FjaGUuY3VycmVudDsKKyAgICB9CisKKyAgICByZXR1cm4g
MDsKIH0KIAogUGFzc1JlZlB0cjxET01TdHJpbmdMaXN0PiBIVE1MUHJvcGVydGllc0NvbGxlY3Rp
b246Om5hbWVzKCkgY29uc3QKIHsKLSAgICBtX3Byb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBtX3By
b3BlcnR5TmFtZXMtPmNsZWFyKCk7Ci0KKyAgICBSZWZQdHI8RE9NU3RyaW5nTGlzdD4gcHJvcGVy
dHlOYW1lcyA9IERPTVN0cmluZ0xpc3Q6OmNyZWF0ZSgpOwogICAgIGlmICghYmFzZSgpLT5pc0hU
TUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShp
dGVtc2NvcGVBdHRyKSkKLSAgICAgICAgcmV0dXJuIG1fcHJvcGVydHlOYW1lczsKKyAgICAgICAg
cmV0dXJuIHByb3BlcnR5TmFtZXM7CiAKLSAgICBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oYmFzZSgp
KTsKKyAgICBpbnZhbGlkYXRlQ2FjaGVJZk5lZWRlZCgpOworICAgIHVwZGF0ZU5hbWVDYWNoZSgp
OworCisgICAgaWYgKCFtX2NhY2hlLmlzUHJvcGVydGllc05vZGVMaXN0U29ydGVkKSB7CisgICAg
ICAgIHN0ZDo6c29ydChtX2NhY2hlLnByb3BlcnRpZXNOb2RlTGlzdC5iZWdpbigpLCBtX2NhY2hl
LnByb3BlcnRpZXNOb2RlTGlzdC5lbmQoKSwgY29tcGFyZVRyZWVPcmRlcik7CisgICAgICAgIG1f
Y2FjaGUuaXNQcm9wZXJ0aWVzTm9kZUxpc3RTb3J0ZWQgPSB0cnVlOworICAgIH0KIAotICAgIHN0
ZDo6c29ydChtX3Byb3BlcnRpZXMuYmVnaW4oKSwgbV9wcm9wZXJ0aWVzLmVuZCgpLCBjb21wYXJl
VHJlZU9yZGVyKTsKKyAgICBWZWN0b3I8Tm9kZSo+IHByb3BlcnRpZXMgPSBtX2NhY2hlLnByb3Bl
cnRpZXNOb2RlTGlzdDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wcm9wZXJ0aWVz
LnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNp
emUoKTsgKytpKSB7CiAgICAgICAgIC8vIEZvciBlYWNoIGl0ZW0gcHJvcGVydGllcywgc3BsaXQg
dGhlIHZhbHVlIG9mIHRoYXQgaXRlbXByb3AgYXR0cmlidXRlIG9uIHNwYWNlcy4KICAgICAgICAg
Ly8gQWRkIGFsbCB0b2tlbnMgdG8gcHJvcGVydHkgbmFtZXMsIHdpdGggdGhlIG9yZGVyIHByZXNl
cnZlZCBidXQgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0gICAgICAgIERPTVNldHRhYmxlVG9r
ZW5MaXN0KiBpdGVtUHJvcGVydHkgPSBtX3Byb3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7CisgICAg
ICAgIERPTVNldHRhYmxlVG9rZW5MaXN0KiBpdGVtUHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldLT5p
dGVtUHJvcCgpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1Qcm9wZXJ0eS0+
bGVuZ3RoKCk7ICsraSkgewogICAgICAgICAgICAgQXRvbWljU3RyaW5nIHByb3BlcnR5TmFtZSA9
IGl0ZW1Qcm9wZXJ0eS0+aXRlbShpKTsKLSAgICAgICAgICAgIGlmIChtX3Byb3BlcnR5TmFtZXMt
PmlzRW1wdHkoKSB8fCAhbV9wcm9wZXJ0eU5hbWVzLT5jb250YWlucyhwcm9wZXJ0eU5hbWUpKQot
ICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lcy0+YXBwZW5kKHByb3BlcnR5TmFtZSk7Cisg
ICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lcy0+aXNFbXB0eSgpIHx8ICFwcm9wZXJ0eU5hbWVz
LT5jb250YWlucyhwcm9wZXJ0eU5hbWUpKQorICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZXMt
PmFwcGVuZChwcm9wZXJ0eU5hbWUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1f
cHJvcGVydHlOYW1lczsKKyAgICByZXR1cm4gcHJvcGVydHlOYW1lczsKIH0KIAogUGFzc1JlZlB0
cjxOb2RlTGlzdD4gSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpuYW1lZEl0ZW0oY29uc3QgU3Ry
aW5nJiBuYW1lKSBjb25zdApAQCAtMTc4LDE4ICsyMTMsMjMgQEAgUGFzc1JlZlB0cjxOb2RlTGlz
dD4gSFRNTFByb3BlcnRpZXNDb2xsZQogICAgIGlmICghYmFzZSgpLT5pc0hUTUxFbGVtZW50KCkg
fHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRy
KSkKICAgICAgIHJldHVybiAwOwogCi0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgVmVj
dG9yPFJlZlB0cjxOb2RlPiA+IG5hbWVkSXRlbXM7Ci0gICAgZmluZFByb3BldGllc09mQW5JdGVt
KGJhc2UoKSk7CisgICAgaW52YWxpZGF0ZUNhY2hlSWZOZWVkZWQoKTsKKyAgICB1cGRhdGVOYW1l
Q2FjaGUoKTsKKworICAgIGlmICghbV9jYWNoZS5pc1Byb3BlcnRpZXNOb2RlTGlzdFNvcnRlZCkg
eworICAgICAgICBzdGQ6OnNvcnQobV9jYWNoZS5wcm9wZXJ0aWVzTm9kZUxpc3QuYmVnaW4oKSwg
bV9jYWNoZS5wcm9wZXJ0aWVzTm9kZUxpc3QuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOworICAg
ICAgICBtX2NhY2hlLmlzUHJvcGVydGllc05vZGVMaXN0U29ydGVkID0gdHJ1ZTsKKyAgICB9CiAK
LSAgICBzdGQ6OnNvcnQobV9wcm9wZXJ0aWVzLmJlZ2luKCksIG1fcHJvcGVydGllcy5lbmQoKSwg
Y29tcGFyZVRyZWVPcmRlcik7CisgICAgVmVjdG9yPFJlZlB0cjxOb2RlPiA+IG5hbWVkSXRlbXM7
CisgICAgVmVjdG9yPE5vZGUqPiBwcm9wZXJ0aWVzID0gbV9jYWNoZS5wcm9wZXJ0aWVzTm9kZUxp
c3Q7CiAKICAgICAvLyBGb3IgZWFjaCBpdGVtIHByb3BlcnRpZXMsIHNwbGl0IHRoZSB2YWx1ZSBv
ZiB0aGF0IGl0ZW1wcm9wIGF0dHJpYnV0ZSBvbiBzcGFjZXMuCiAgICAgLy8gQWRkIGVsZW1lbnQg
dG8gbmFtZWRJdGVtIHRoYXQgY29udGFpbnMgYSBwcm9wZXJ0eSBuYW1lZCBuYW1lLCB3aXRoIHRo
ZSBvcmRlciBwcmVzZXJ2ZWQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Byb3BlcnRp
ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9w
ZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRlbVByb3AoKTsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRE9NU2V0dGFibGVUb2tl
bkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7CiAgICAgICAg
IGlmIChpdGVtUHJvcGVydHktPnRva2VucygpLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAg
bmFtZWRJdGVtcy5hcHBlbmQobV9wcm9wZXJ0aWVzW2ldKTsKKyAgICAgICAgICAgIG5hbWVkSXRl
bXMuYXBwZW5kKHByb3BlcnRpZXNbaV0pOwogICAgIH0KIAogICAgIC8vIEZJWE1FOiBIVE1MNSBz
cGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gUHJvcGVydHlOb2RlTGlzdC4KQEAgLTIw
MSwxMyArMjQxLDE0IEBAIGJvb2wgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpoYXNOYW1lZEkK
ICAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVudCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2Uo
KSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKIAotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwotICAgIGZpbmRQcm9wZXRpZXNPZkFuSXRl
bShiYXNlKCkpOworICAgIGludmFsaWRhdGVDYWNoZUlmTmVlZGVkKCk7CisgICAgdXBkYXRlTmFt
ZUNhY2hlKCk7CiAKICAgICAvLyBGb3IgZWFjaCBpdGVtIHByb3BlcnRpZXMsIHNwbGl0IHRoZSB2
YWx1ZSBvZiB0aGF0IGl0ZW1wcm9wIGF0dHJpYnV0ZSBvbiBzcGFjZXMuCiAgICAgLy8gUmV0dXJu
IHRydWUgaWYgZWxlbWVudCBjb250YWlucyBhIHByb3BlcnR5IG5hbWVkIG5hbWUuCi0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX3Byb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAg
RE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRl
bVByb3AoKTsKKyAgICBWZWN0b3I8Tm9kZSo+IHByb3BlcnRpZXMgPSBtX2NhY2hlLnByb3BlcnRp
ZXNOb2RlTGlzdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IHBy
b3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7CiAgICAgICAgIGlmIChpdGVtUHJvcGVydHktPnRva2Vu
cygpLmNvbnRhaW5zKG5hbWUpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5oCShy
ZXZpc2lvbiAxMTAxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC01NiwxMSArNTYsMTAgQEAgcHVibGljOgogcHJp
dmF0ZToKICAgICBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24oTm9kZSopOwogCisgICAgdmlydHVh
bCB2b2lkIHVwZGF0ZU5hbWVDYWNoZSgpIGNvbnN0OworCiAgICAgdm9pZCBmaW5kUHJvcGV0aWVz
T2ZBbkl0ZW0oTm9kZSogY3VycmVudCkgY29uc3Q7CiAgICAgdm9pZCBnZXROYW1lZEl0ZW1zKFZl
Y3RvcjxSZWZQdHI8Tm9kZT4gPiYsIGNvbnN0IFN0cmluZyYpIGNvbnN0OwotCi0gICAgbXV0YWJs
ZSBWZWN0b3I8Tm9kZSo+IG1fcHJvcGVydGllczsKLSAgICBtdXRhYmxlIFJlZlB0cjxET01TdHJp
bmdMaXN0PiBtX3Byb3BlcnR5TmFtZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="133935"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>131853</attachid>
            <date>2012-03-14 08:19:13 -0700</date>
            <delta_ts>2012-03-29 07:03:52 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>patch_80490_modified.diff</filename>
            <type>text/plain</type>
            <size>16449</size>
            <attacher name="Arko Saha">arko</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMDY5OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQyIEBACisyMDEyLTAzLTE0ICBBcmtvIFNh
aGEgIDxhcmtvQG1vdG9yb2xhLmNvbT4KKworICAgICAgICBNaWNyb2RhdGE6IEltcGxlbWVudCBj
YWNoZSBtZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwNDkwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgY2FjaGluZyBt
ZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4KKyAgICAgICAgcHJvcGVydHlD
YWNoZSAtIGNvbnRhaW5zIG1pY3JvZGF0YSBpdGVtIHByb3BlcnRpZXMuCisgICAgICAgIGl0ZW1S
ZWZFbGVtZW50cyAtIGNvbnRhaW5zIHNvcnRlZCBtaWNyb2RhdGEgaXRlbSBhbmQgaXRlbXJlZiBl
bGVtZW50cy4KKyAgICAgICAgcHJvcGVydHlOYW1lcyAtIGNvbnRhaW5zIG1pY3JvZGF0YSBwcm9w
ZXJ0eSBuYW1lcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgIGl0
ZW1SZWZFbGVtZW50UG9zaXRpb24gLSBzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBpdGVt
UmVmRWxlbWVudHMuCisgICAgICAgIGhhc0l0ZW1SZWZFbGVtZW50cyAtIHNldCB0byB0dXJlIG9u
Y2Ugd2UgaGF2ZSBzb3J0ZWQgbWljcm9kYXRhIGl0ZW0gYW5kIGl0ZW1yZWYgZWxlbWVudHMgbGlz
dCBpLmUsIGl0ZW1SZWZFbGVtZW50cy4KKyAgICAgICAgQ2FjaGUgaXMgaW52YWxpZGF0ZWQgb25s
eSB3aGVuIGRvbSB0cmVlIG1vZGlmaWVkLiBXaGVuZXZlciBhbnkgcXVlcnkgaXMgbWFkZSBvbiBI
VE1MUHJvcGVydGllc0NvbGxlY3Rpb24sCisgICAgICAgIHJlc3VsdCBpcyByZXR1cm5lZCBmcm9t
IHRoZSBjYWNoZS4gRWFybGlhciB3ZSB1c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXJ0aWVzIG5vZGUg
bGlzdCBldmVyeSB0aW1lIGEgcXVlcnkgaXMgbWFkZS4KKworICAgICAgICAqIGh0bWwvSFRNTENv
bGxlY3Rpb24uaDoKKyAgICAgICAgKiBodG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpuZXh0Tm9kZU9yU2libGluZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Oml0ZW1BZnRlcik6IFRh
a2VzIHBhcmVudCBiYXNlIGFuZCBwcmV2aW91cyBpdGVtIHByb3BlcnR5IGFzIGFyZ3VtZW50Lgor
ICAgICAgICBGaW5kcyB0aGUgbmV4dCBpdGVtIHByb3BlcnR5IGluIGJhc2UuCisgICAgICAgIChX
ZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OnVwZGF0ZVJlZkVsZW1lbnRzKTogQXBw
ZW5kcyBtaWNyb2RhdGEgaXRlbSBlbGVtZW50IGFuZCBlbGVtZW50cyB3aGljaAorICAgICAgICBh
cmUgYWRkZWQgdGhyb3VnaCBpdGVtcmVmIGF0dHJpYnV0ZSBpbiBpdGVtUmVmRWxlbWVudHMuIFNv
cnQgaXRlbVJlZkVsZW1lbnRzIGluIHRyZWUgb3JkZXIuCisgICAgICAgIE5vdGUtIGhlcmUgc29y
dCBoYXBwZW5zIG9ubHkgb24gaXRlbSBhbmQgaXRlbXJlZiBlbGVtZW50cy4gV2UgZG9udCBzb3J0
IGVhY2ggcHJvcGVydHkgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6Y2FsY0xlbmd0aCk6IENh
bGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBwcm9wZXJ0aWVzIGNvbGxlY3Rpb24gaWYgbGVuZ3RoCisg
ICAgICAgIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGNhY2hlLgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpsZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6SFRN
TFByb3BlcnRpZXNDb2xsZWN0aW9uOjppdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9w
ZXJ0aWVzQ29sbGVjdGlvbjo6ZmluZFByb3BlcnRpZXMpOiBGaW5kcyBtaWNyb2RhdGEgaXRlbSBw
cm9wZXJ0aWVzIGluIHRoZSBiYXNlIGVsZW1lbnQuCisgICAgICAgIEFwcGVuZHMgdGhlIHByb3Bl
cnRpZXMgaW4gcHJvcGVydHlDYWNoZSBhbmQgcHJvcGVydHkgbmFtZXMgaW4gcHJvcGVydHlOYW1l
cy4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6dXBkYXRlTmFt
ZUNhY2hlKTogSXQgdXBkYXRlcyB0aGUgcHJvcGVydHlDYWNoZSBhbmQgcHJvcGVydHlOYW1lcyBp
ZiBoYXNOYW1lQ2FjaGUgaXMgZmFsc2UuCisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGll
c0NvbGxlY3Rpb246Om5hbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbjo6bmFtZWRJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbjo6aGFzTmFtZWRJdGVtKToKKyAgICAgICAgKiBodG1sL0hUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbi5oOgorICAgICAgICAoSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uKToKKwogMjAxMi0w
My0xNCAgU2ltb24gSGF1c21hbm4gIDxzaW1vbi5oYXVzbWFubkBub2tpYS5jb20+CiAKICAgICAg
ICAgW1F0XSBSdW5Mb29wUXQgaXMgbWlzc2luZyByZWVudHJhbmN5IGd1YXJkcwpJbmRleDogU291
cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2h0bWwvSFRNTENvbGxlY3Rpb24uaAkocmV2aXNpb24gMTEwNjk5KQorKysgU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw2ICsy
NSw3IEBACiAKICNpbmNsdWRlICJOb2RlLmgiCiAjaW5jbHVkZSAiQ29sbGVjdGlvblR5cGUuaCIK
KyNpbmNsdWRlICJET01TdHJpbmdMaXN0LmgiCiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNp
bmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CkBAIC04
Miw2ICs4MywxMyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIGludCBlbGVtZW50c0FycmF5UG9zaXRp
b247CiAgICAgICAgIGJvb2wgaGFzTGVuZ3RoOwogICAgICAgICBib29sIGhhc05hbWVDYWNoZTsK
KyNpZiBFTkFCTEUoTUlDUk9EQVRBKQorICAgICAgICBOb2RlQ2FjaGVNYXAgcHJvcGVydHlDYWNo
ZTsKKyAgICAgICAgVmVjdG9yPEVsZW1lbnQqPiBpdGVtUmVmRWxlbWVudHM7CisgICAgICAgIFJl
ZlB0cjxET01TdHJpbmdMaXN0PiBwcm9wZXJ0eU5hbWVzOworICAgICAgICB1bnNpZ25lZCBpdGVt
UmVmRWxlbWVudFBvc2l0aW9uOworICAgICAgICBib29sIGhhc0l0ZW1SZWZFbGVtZW50czsKKyNl
bmRpZgogCiAgICAgICAgIHZvaWQgY2xlYXIoKQogICAgICAgICB7CkBAIC05NCw2ICsxMDIsMTMg
QEAgcHJvdGVjdGVkOgogICAgICAgICAgICAgZWxlbWVudHNBcnJheVBvc2l0aW9uID0gMDsKICAg
ICAgICAgICAgIGhhc0xlbmd0aCA9IGZhbHNlOwogICAgICAgICAgICAgaGFzTmFtZUNhY2hlID0g
ZmFsc2U7CisjaWYgRU5BQkxFKE1JQ1JPREFUQSkKKyAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUu
Y2xlYXIoKTsKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50cy5jbGVhcigpOworICAgICAgICAg
ICAgcHJvcGVydHlOYW1lcy5jbGVhcigpOworICAgICAgICAgICAgaXRlbVJlZkVsZW1lbnRQb3Np
dGlvbiA9IDA7CisgICAgICAgICAgICBoYXNJdGVtUmVmRWxlbWVudHMgPSBmYWxzZTsKKyNlbmRp
ZgogICAgICAgICB9CiAgICAgfSBtX2NhY2hlOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMTA2OTkpCisr
KyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTU3LDcgKzU3LDYgQEAgUGFzc093blB0cjxIVE1MUHJvcGVydGllc0NvbGxl
Y3Rpb24+IEhUTQogCiBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbihOb2RlKiBpdGVtTm9kZSkKICAgICA6IEhUTUxDb2xsZWN0aW9uKGl0ZW1Ob2RlLCBJ
dGVtUHJvcGVydGllcykKLSAgICAsIG1fcHJvcGVydHlOYW1lcyhET01TdHJpbmdMaXN0OjpjcmVh
dGUoKSkKIHsKIH0KIApAQCAtNjUsNjEgKzY0LDY2IEBAIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlv
bjo6fkhUTUxQcm9wZXJ0aWUKIHsKIH0KIAotdm9pZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246
OmZpbmRQcm9wZXRpZXNPZkFuSXRlbShOb2RlKiByb290KSBjb25zdAorc3RhdGljIE5vZGUqIG5l
eHROb2RlT3JTaWJsaW5nKE5vZGUqIGJhc2UsIE5vZGUqIG5vZGUpCiB7Ci0gICAgLy8gNS4yLjUg
QXNzb2NpYXRpbmcgbmFtZXMgd2l0aCBpdGVtcy4KLSAgICBWZWN0b3I8Tm9kZSo+IG1lbW9yeTsK
KyAgICByZXR1cm4gKG5vZGUgPT0gYmFzZSkgfHwgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSAmJiAh
dG9IVE1MRWxlbWVudChub2RlKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKKyAg
ICAgICAgICAgID8gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShiYXNlKSA6IG5vZGUtPnRyYXZlcnNl
TmV4dFNpYmxpbmcoYmFzZSk7Cit9CiAKLSAgICBtZW1vcnkuYXBwZW5kKHJvb3QpOworRWxlbWVu
dCogSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjppdGVtQWZ0ZXIoRWxlbWVudCogYmFzZSwgRWxl
bWVudCogcHJldmlvdXMpIGNvbnN0Cit7CisgICAgTm9kZSogY3VycmVudDsKKyAgICBpZiAoIXBy
ZXZpb3VzKQorICAgICAgICBjdXJyZW50ID0gYmFzZTsKKyAgICBlbHNlCisgICAgICAgIGN1cnJl
bnQgPSBuZXh0Tm9kZU9yU2libGluZyhiYXNlLCBwcmV2aW91cyk7CiAKLSAgICBWZWN0b3I8Tm9k
ZSo+IHBlbmRpbmc7Ci0gICAgLy8gQWRkIHRoZSBjaGlsZCBlbGVtZW50cyBvZiByb290LCBpZiBh
bnksIHRvIHBlbmRpbmcuCi0gICAgZm9yIChOb2RlKiBjaGlsZCA9IHJvb3QtPmZpcnN0Q2hpbGQo
KTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlmIChjaGls
ZC0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICAgICAgcGVuZGluZy5hcHBlbmQoY2hpbGQpOwot
Ci0gICAgLy8gSWYgcm9vdCBoYXMgYW4gaXRlbXJlZiBhdHRyaWJ1dGUsIHNwbGl0IHRoZSB2YWx1
ZSBvZiB0aGF0IGl0ZW1yZWYgYXR0cmlidXRlIG9uIHNwYWNlcy4KLSAgICAvLyBGb3IgZWFjaCBy
ZXN1bHRpbmcgdG9rZW4gSUQsIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaW4gdGhlIGhvbWUgc3Vi
dHJlZSBvZiByb290IHdpdGggdGhlIElEIElELAotICAgIC8vIHRoZW4gYWRkIHRoZSBmaXJzdCBz
dWNoIGVsZW1lbnQgdG8gcGVuZGluZy4KLSAgICBpZiAodG9IVE1MRWxlbWVudChyb290KS0+ZmFz
dEhhc0F0dHJpYnV0ZShpdGVtcmVmQXR0cikpIHsKLSAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxp
c3QqIGl0ZW1SZWYgPSByb290LT5pdGVtUmVmKCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBpdGVtUmVmLT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICBBdG9taWNTdHJp
bmcgaWQgPSBpdGVtUmVmLT5pdGVtKGkpOwotCi0gICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50
ID0gcm9vdC0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoaWQpOwotICAgICAgICAgICAgaWYg
KGVsZW1lbnQgJiYgZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHBl
bmRpbmcuYXBwZW5kKGVsZW1lbnQpOworICAgIGZvciAoOyBjdXJyZW50OyBjdXJyZW50ID0gbmV4
dE5vZGVPclNpYmxpbmcoYmFzZSwgY3VycmVudCkpIHsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5p
c0hUTUxFbGVtZW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgRWxlbWVudCog
ZWxlbWVudCA9IHRvSFRNTEVsZW1lbnQoY3VycmVudCk7CisgICAgICAgIGlmIChlbGVtZW50LT5m
YXN0SGFzQXR0cmlidXRlKGl0ZW1wcm9wQXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVt
ZW50OwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gTG9vcCB0aWxsIHdlIGhhdmUgcHJvY2Vz
c2VkIGFsbCBwZW5kaW5nIGVsZW1lbnRzCi0gICAgd2hpbGUgKCFwZW5kaW5nLmlzRW1wdHkoKSkg
eworICAgIHJldHVybiAwOworfQogCi0gICAgICAgIC8vIFJlbW92ZSBmaXJzdCBlbGVtZW50IGZy
b20gcGVuZGluZyBhbmQgbGV0IGN1cnJlbnQgYmUgdGhhdCBlbGVtZW50LgotICAgICAgICBOb2Rl
KiBjdXJyZW50ID0gcGVuZGluZ1swXTsKLSAgICAgICAgcGVuZGluZy5yZW1vdmUoMCk7Ci0KLSAg
ICAgICAgLy8gSWYgY3VycmVudCBpcyBhbHJlYWR5IGluIG1lbW9yeSwgdGhlcmUgaXMgYSBtaWNy
b2RhdGEgZXJyb3I7Ci0gICAgICAgIGlmIChtZW1vcnkuY29udGFpbnMoY3VycmVudCkpIHsKLSAg
ICAgICAgICAgIC8vIG1pY3JvZGF0YSBlcnJvcjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Cit2b2lkIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6dXBkYXRlUmVmRWxlbWVudHMo
KSBjb25zdAoreworICAgIGlmIChtX2NhY2hlLmhhc0l0ZW1SZWZFbGVtZW50cykKKyAgICAgICAg
cmV0dXJuOwogCi0gICAgICAgIG1lbW9yeS5hcHBlbmQoY3VycmVudCk7CisgICAgaWYgKCFiYXNl
KCktPmlzSFRNTEVsZW1lbnQoKSB8fCAhdG9IVE1MRWxlbWVudChiYXNlKCkpLT5mYXN0SGFzQXR0
cmlidXRlKGl0ZW1zY29wZUF0dHIpKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAgLy8gSWYg
Y3VycmVudCBkb2VzIG5vdCBoYXZlIGFuIGl0ZW1zY29wZSBhdHRyaWJ1dGUsIHRoZW46IGFkZCBh
bGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIGN1cnJlbnQgdG8gcGVuZGluZy4KLSAgICAgICAgSFRN
TEVsZW1lbnQqIGVsZW1lbnQgPSB0b0hUTUxFbGVtZW50KGN1cnJlbnQpOwotICAgICAgICBpZiAo
IWVsZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpIHsKLSAgICAgICAgICAg
IGZvciAoTm9kZSogY2hpbGQgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9
IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNIVE1M
RWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZChjaGlsZCk7Ci0g
ICAgICAgIH0KKyAgICBIVE1MRWxlbWVudCogYmFzZUVsZW1lbnQgPSB0b0hUTUxFbGVtZW50KGJh
c2UoKSk7CisgICAgbV9jYWNoZS5pdGVtUmVmRWxlbWVudHMuYXBwZW5kKGJhc2VFbGVtZW50KTsK
KyAgICBtX2NhY2hlLmhhc0l0ZW1SZWZFbGVtZW50cyA9IHRydWU7CisKKyAgICBpZiAoIWJhc2VF
bGVtZW50LT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1yZWZBdHRyKSkKKyAgICAgICAgcmV0dXJuOwog
Ci0gICAgICAgIC8vIElmIGN1cnJlbnQgaGFzIGFuIGl0ZW1wcm9wIGF0dHJpYnV0ZSBzcGVjaWZp
ZWQsIGFkZCBpdCB0byByZXN1bHRzLgotICAgICAgICBpZiAoZWxlbWVudC0+ZmFzdEhhc0F0dHJp
YnV0ZShpdGVtcHJvcEF0dHIpKQotICAgICAgICAgICAgIG1fcHJvcGVydGllcy5hcHBlbmQoY3Vy
cmVudCk7CisgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1SZWYgPSBiYXNlRWxlbWVudC0+
aXRlbVJlZigpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1SZWYtPmxlbmd0
aCgpOyArK2kpIHsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IGJhc2UoKS0+ZG9jdW1lbnQo
KS0+Z2V0RWxlbWVudEJ5SWQoaXRlbVJlZi0+aXRlbShpKSk7CisgICAgICAgIGlmIChlbGVtZW50
ICYmIGVsZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiAhZWxlbWVudC0+aXNEZXNjZW5kYW50T2Yo
YmFzZSgpKSkKKyAgICAgICAgICAgIG1fY2FjaGUuaXRlbVJlZkVsZW1lbnRzLmFwcGVuZChlbGVt
ZW50KTsKICAgICB9CisKKyAgICBzdGQ6OnNvcnQobV9jYWNoZS5pdGVtUmVmRWxlbWVudHMuYmVn
aW4oKSwgbV9jYWNoZS5pdGVtUmVmRWxlbWVudHMuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOwor
fQorCit1bnNpZ25lZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OmNhbGNMZW5ndGgoKSBjb25z
dAoreworICAgIHVuc2lnbmVkIGxlbmd0aCA9IDA7CisgICAgdXBkYXRlUmVmRWxlbWVudHMoKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jYWNoZS5pdGVtUmVmRWxlbWVudHMuc2l6
ZSgpOyArK2kpCisgICAgICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGl0ZW1BZnRlcihtX2Nh
Y2hlLml0ZW1SZWZFbGVtZW50c1tpXSwgMCk7IGVsZW1lbnQ7IGVsZW1lbnQgPSBpdGVtQWZ0ZXIo
bV9jYWNoZS5pdGVtUmVmRWxlbWVudHNbaV0sIGVsZW1lbnQpKQorICAgICAgICAgICAgKytsZW5n
dGg7CisgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAogdW5zaWduZWQgSFRNTFByb3BlcnRpZXNDb2xs
ZWN0aW9uOjpsZW5ndGgoKSBjb25zdApAQCAtMTI3LDkgKzEzMSwxMiBAQCB1bnNpZ25lZCBIVE1M
UHJvcGVydGllc0NvbGxlY3Rpb246Omxlbmd0CiAgICAgaWYgKCFiYXNlKCktPmlzSFRNTEVsZW1l
bnQoKSB8fCAhdG9IVE1MRWxlbWVudChiYXNlKCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29w
ZUF0dHIpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwot
ICAgIGZpbmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOwotICAgIHJldHVybiBtX3Byb3BlcnRp
ZXMuc2l6ZSgpOworICAgIGludmFsaWRhdGVDYWNoZUlmTmVlZGVkKCk7CisgICAgaWYgKCFtX2Nh
Y2hlLmhhc0xlbmd0aCkgeworICAgICAgICBtX2NhY2hlLmxlbmd0aCA9IGNhbGNMZW5ndGgoKTsK
KyAgICAgICAgbV9jYWNoZS5oYXNMZW5ndGggPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbV9j
YWNoZS5sZW5ndGg7CiB9CiAKIE5vZGUqIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6aXRlbSh1
bnNpZ25lZCBpbmRleCkgY29uc3QKQEAgLTEzNyw0MCArMTQ0LDk1IEBAIE5vZGUqIEhUTUxQcm9w
ZXJ0aWVzQ29sbGVjdGlvbjo6aXRlbSh1bnMKICAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVu
dCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3Bl
QXR0cikpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0g
ICAgZmluZFByb3BldGllc09mQW5JdGVtKGJhc2UoKSk7CisgICAgaW52YWxpZGF0ZUNhY2hlSWZO
ZWVkZWQoKTsKKyAgICBpZiAobV9jYWNoZS5jdXJyZW50ICYmIG1fY2FjaGUucG9zaXRpb24gPT0g
aW5kZXgpCisgICAgICAgIHJldHVybiBtX2NhY2hlLmN1cnJlbnQ7CiAKLSAgICBpZiAobV9wcm9w
ZXJ0aWVzLnNpemUoKSA8PSBpbmRleCkKKyAgICBpZiAobV9jYWNoZS5oYXNMZW5ndGggJiYgbV9j
YWNoZS5sZW5ndGggPD0gaW5kZXgpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgc3RkOjpzb3J0
KG1fcHJvcGVydGllcy5iZWdpbigpLCBtX3Byb3BlcnRpZXMuZW5kKCksIGNvbXBhcmVUcmVlT3Jk
ZXIpOwotICAgIHJldHVybiBtX3Byb3BlcnRpZXNbaW5kZXhdOwotfQorICAgIHVwZGF0ZVJlZkVs
ZW1lbnRzKCk7CiAKLVBhc3NSZWZQdHI8RE9NU3RyaW5nTGlzdD4gSFRNTFByb3BlcnRpZXNDb2xs
ZWN0aW9uOjpuYW1lcygpIGNvbnN0Ci17Ci0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAg
bV9wcm9wZXJ0eU5hbWVzLT5jbGVhcigpOworICAgIGlmICghbV9jYWNoZS5jdXJyZW50IHx8IG1f
Y2FjaGUucG9zaXRpb24gPiBpbmRleCkgeworICAgICAgICBtX2NhY2hlLml0ZW1SZWZFbGVtZW50
UG9zaXRpb24gPSAwOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jYWNoZS5p
dGVtUmVmRWxlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBpZiAoKG1fY2FjaGUuY3Vy
cmVudCA9IGl0ZW1BZnRlcihtX2NhY2hlLml0ZW1SZWZFbGVtZW50c1tpXSwgMCkpKSB7CisgICAg
ICAgICAgICAgICAgbV9jYWNoZS5pdGVtUmVmRWxlbWVudFBvc2l0aW9uID0gaTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgbV9jYWNoZS5wb3NpdGlvbiA9
IDA7CisgICAgICAgIGlmICghbV9jYWNoZS5jdXJyZW50KQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgfQogCi0gICAgaWYgKCFiYXNlKCktPmlzSFRNTEVsZW1lbnQoKSB8fCAhdG9IVE1MRWxl
bWVudChiYXNlKCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0dHIpKQotICAgICAgICBy
ZXR1cm4gbV9wcm9wZXJ0eU5hbWVzOworICAgIEVsZW1lbnQqIGUgPSBtX2NhY2hlLmN1cnJlbnQ7
CisgICAgdW5zaWduZWQgY3VycmVudFBvc2l0aW9uID0gbV9jYWNoZS5wb3NpdGlvbjsKIAotICAg
IGZpbmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOworICAgIGJvb2wgZm91bmQgPSAobV9jYWNo
ZS5wb3NpdGlvbiA9PSBpbmRleCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gbV9jYWNoZS5pdGVt
UmVmRWxlbWVudFBvc2l0aW9uOyBpIDwgbV9jYWNoZS5pdGVtUmVmRWxlbWVudHMuc2l6ZSgpICYm
ICFmb3VuZDsgKytpKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgcG9zID0gY3VycmVudFBvc2l0
aW9uOyBwb3MgPCBpbmRleDsgKytwb3MpIHsKKyAgICAgICAgICAgIGUgPSBpdGVtQWZ0ZXIobV9j
YWNoZS5pdGVtUmVmRWxlbWVudHNbaV0sIGUpOworCisgICAgICAgICAgICBpZiAoZSkKKyAgICAg
ICAgICAgICAgICBjdXJyZW50UG9zaXRpb24rKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA9PSBpbmRl
eCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2Nh
Y2hlLml0ZW1SZWZFbGVtZW50UG9zaXRpb24gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9jYWNoZS5jdXJyZW50ID0g
ZTsKKyAgICBtX2NhY2hlLnBvc2l0aW9uID0gaW5kZXg7CisgICAgcmV0dXJuIG1fY2FjaGUuY3Vy
cmVudDsKK30KIAotICAgIHN0ZDo6c29ydChtX3Byb3BlcnRpZXMuYmVnaW4oKSwgbV9wcm9wZXJ0
aWVzLmVuZCgpLCBjb21wYXJlVHJlZU9yZGVyKTsKK3ZvaWQgSFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uOjpmaW5kUHJvcGVydGllcyhFbGVtZW50KiBiYXNlKSBjb25zdAoreworICAgIGZvciAoRWxl
bWVudCogZWxlbWVudCA9IGl0ZW1BZnRlcihiYXNlLCAwKTsgZWxlbWVudDsgZWxlbWVudCA9IGl0
ZW1BZnRlcihiYXNlLCBlbGVtZW50KSkgewogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3Byb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgLy8gRm9yIGVhY2ggaXRlbSBwcm9w
ZXJ0aWVzLCBzcGxpdCB0aGUgdmFsdWUgb2YgdGhhdCBpdGVtcHJvcCBhdHRyaWJ1dGUgb24gc3Bh
Y2VzLgotICAgICAgICAvLyBBZGQgYWxsIHRva2VucyB0byBwcm9wZXJ0eSBuYW1lcywgd2l0aCB0
aGUgb3JkZXIgcHJlc2VydmVkIGJ1dCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLSAgICAgICAg
RE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRl
bVByb3AoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtUHJvcGVydHktPmxl
bmd0aCgpOyArK2kpIHsKKyAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0
eSA9IGVsZW1lbnQtPml0ZW1Qcm9wKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBpdGVtUHJvcGVydHktPmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgIEF0b21pY1N0cmlu
ZyBwcm9wZXJ0eU5hbWUgPSBpdGVtUHJvcGVydHktPml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAo
bV9wcm9wZXJ0eU5hbWVzLT5pc0VtcHR5KCkgfHwgIW1fcHJvcGVydHlOYW1lcy0+Y29udGFpbnMo
cHJvcGVydHlOYW1lKSkKLSAgICAgICAgICAgICAgICBtX3Byb3BlcnR5TmFtZXMtPmFwcGVuZChw
cm9wZXJ0eU5hbWUpOworCisgICAgICAgICAgICBpZiAoIW1fY2FjaGUucHJvcGVydHlOYW1lcykK
KyAgICAgICAgICAgICAgICBtX2NhY2hlLnByb3BlcnR5TmFtZXMgPSBET01TdHJpbmdMaXN0Ojpj
cmVhdGUoKTsKKyAgICAgICAgICAgIGlmIChtX2NhY2hlLnByb3BlcnR5TmFtZXMtPmlzRW1wdHko
KSB8fCAhbV9jYWNoZS5wcm9wZXJ0eU5hbWVzLT5jb250YWlucyhwcm9wZXJ0eU5hbWUpKQorICAg
ICAgICAgICAgICAgIG1fY2FjaGUucHJvcGVydHlOYW1lcy0+YXBwZW5kKHByb3BlcnR5TmFtZSk7
CisKKyAgICAgICAgICAgIFZlY3RvcjxFbGVtZW50Kj4qIHByb3BlcnR5UmVzdWx0cyA9IG1fY2Fj
aGUucHJvcGVydHlDYWNoZS5nZXQocHJvcGVydHlOYW1lLmltcGwoKSk7CisgICAgICAgICAgICBp
ZiAoIXByb3BlcnR5UmVzdWx0cyB8fCAhcHJvcGVydHlSZXN1bHRzLT5jb250YWlucyhlbGVtZW50
KSkKKyAgICAgICAgICAgICAgICBhcHBlbmQobV9jYWNoZS5wcm9wZXJ0eUNhY2hlLCBwcm9wZXJ0
eU5hbWUsIGVsZW1lbnQpOwogICAgICAgICB9CiAgICAgfQorfQorCit2b2lkIEhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbjo6dXBkYXRlTmFtZUNhY2hlKCkgY29uc3QKK3sKKyAgICBpZiAobV9jYWNo
ZS5oYXNOYW1lQ2FjaGUpCisgICAgICAgIHJldHVybjsKIAotICAgIHJldHVybiBtX3Byb3BlcnR5
TmFtZXM7CisgICAgdXBkYXRlUmVmRWxlbWVudHMoKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBtX2NhY2hlLml0ZW1SZWZFbGVtZW50cy5zaXplKCk7ICsraSkKKyAgICAgICAgZmlu
ZFByb3BlcnRpZXMobV9jYWNoZS5pdGVtUmVmRWxlbWVudHNbaV0pOworCisgICAgbV9jYWNoZS5o
YXNOYW1lQ2FjaGUgPSB0cnVlOworfQorCitQYXNzUmVmUHRyPERPTVN0cmluZ0xpc3Q+IEhUTUxQ
cm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZXMoKSBjb25zdAoreworICAgIGlmICghYmFzZSgpLT5p
c0hUTUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0
ZShpdGVtc2NvcGVBdHRyKSkKKyAgICAgICAgcmV0dXJuIERPTVN0cmluZ0xpc3Q6OmNyZWF0ZSgp
OworCisgICAgaW52YWxpZGF0ZUNhY2hlSWZOZWVkZWQoKTsKKyAgICB1cGRhdGVOYW1lQ2FjaGUo
KTsKKworICAgIHJldHVybiBtX2NhY2hlLnByb3BlcnR5TmFtZXM7CiB9CiAKIFBhc3NSZWZQdHI8
Tm9kZUxpc3Q+IEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZWRJdGVtKGNvbnN0IFN0cmlu
ZyYgbmFtZSkgY29uc3QKQEAgLTE3OCwxOSArMjQwLDE0IEBAIFBhc3NSZWZQdHI8Tm9kZUxpc3Q+
IEhUTUxQcm9wZXJ0aWVzQ29sbGUKICAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVudCgpIHx8
ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikp
CiAgICAgICByZXR1cm4gMDsKIAotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwogICAgIFZlY3Rv
cjxSZWZQdHI8Tm9kZT4gPiBuYW1lZEl0ZW1zOwotICAgIGZpbmRQcm9wZXRpZXNPZkFuSXRlbShi
YXNlKCkpOwogCi0gICAgc3RkOjpzb3J0KG1fcHJvcGVydGllcy5iZWdpbigpLCBtX3Byb3BlcnRp
ZXMuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOworICAgIGludmFsaWRhdGVDYWNoZUlmTmVlZGVk
KCk7CisgICAgdXBkYXRlTmFtZUNhY2hlKCk7CiAKLSAgICAvLyBGb3IgZWFjaCBpdGVtIHByb3Bl
cnRpZXMsIHNwbGl0IHRoZSB2YWx1ZSBvZiB0aGF0IGl0ZW1wcm9wIGF0dHJpYnV0ZSBvbiBzcGFj
ZXMuCi0gICAgLy8gQWRkIGVsZW1lbnQgdG8gbmFtZWRJdGVtIHRoYXQgY29udGFpbnMgYSBwcm9w
ZXJ0eSBuYW1lZCBuYW1lLCB3aXRoIHRoZSBvcmRlciBwcmVzZXJ2ZWQuCi0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX3Byb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRE9NU2V0
dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRlbVByb3Ao
KTsKLSAgICAgICAgaWYgKGl0ZW1Qcm9wZXJ0eS0+dG9rZW5zKCkuY29udGFpbnMobmFtZSkpCi0g
ICAgICAgICAgICBuYW1lZEl0ZW1zLmFwcGVuZChtX3Byb3BlcnRpZXNbaV0pOwotICAgIH0KKyAg
ICBWZWN0b3I8RWxlbWVudCo+KiBwcm9wZXJ0eVJlc3VsdHMgPSBtX2NhY2hlLnByb3BlcnR5Q2Fj
aGUuZ2V0KEF0b21pY1N0cmluZyhuYW1lKS5pbXBsKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IHByb3BlcnR5UmVzdWx0cyAmJiBpIDwgcHJvcGVydHlSZXN1bHRzLT5zaXplKCk7ICsraSkK
KyAgICAgICAgbmFtZWRJdGVtcy5hcHBlbmQocHJvcGVydHlSZXN1bHRzLT5hdChpKSk7CiAKICAg
ICAvLyBGSVhNRTogSFRNTDUgc3BlY2lmaWVzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIFByb3Bl
cnR5Tm9kZUxpc3QuCiAgICAgcmV0dXJuIG5hbWVkSXRlbXMuaXNFbXB0eSgpID8gMCA6IFN0YXRp
Y05vZGVMaXN0OjphZG9wdChuYW1lZEl0ZW1zKTsKQEAgLTIwMSwxNCArMjU4LDExIEBAIGJvb2wg
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpoYXNOYW1lZEkKICAgICBpZiAoIWJhc2UoKS0+aXNI
VE1MRWxlbWVudCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUo
aXRlbXNjb3BlQXR0cikpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fcHJvcGVydGll
cy5jbGVhcigpOwotICAgIGZpbmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOworICAgIGludmFs
aWRhdGVDYWNoZUlmTmVlZGVkKCk7CisgICAgdXBkYXRlTmFtZUNhY2hlKCk7CiAKLSAgICAvLyBG
b3IgZWFjaCBpdGVtIHByb3BlcnRpZXMsIHNwbGl0IHRoZSB2YWx1ZSBvZiB0aGF0IGl0ZW1wcm9w
IGF0dHJpYnV0ZSBvbiBzcGFjZXMuCi0gICAgLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudCBjb250
YWlucyBhIHByb3BlcnR5IG5hbWVkIG5hbWUuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3Byb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3Qq
IGl0ZW1Qcm9wZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRlbVByb3AoKTsKLSAgICAgICAgaWYg
KGl0ZW1Qcm9wZXJ0eS0+dG9rZW5zKCkuY29udGFpbnMobmFtZSkpCisgICAgaWYgKFZlY3RvcjxF
bGVtZW50Kj4qIHByb3BlcnR5Q2FjaGUgPSBtX2NhY2hlLnByb3BlcnR5Q2FjaGUuZ2V0KG5hbWUu
aW1wbCgpKSkgeworICAgICAgICBpZiAoIXByb3BlcnR5Q2FjaGUtPmlzRW1wdHkoKSkKICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MUHJvcGVydGllc0NvbGxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9o
dG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5oCShyZXZpc2lvbiAxMTA2OTkpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC01NiwxMSArNTYsMTEgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBIVE1MUHJvcGVydGll
c0NvbGxlY3Rpb24oTm9kZSopOwogCi0gICAgdm9pZCBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oTm9k
ZSogY3VycmVudCkgY29uc3Q7Ci0gICAgdm9pZCBnZXROYW1lZEl0ZW1zKFZlY3RvcjxSZWZQdHI8
Tm9kZT4gPiYsIGNvbnN0IFN0cmluZyYpIGNvbnN0OwotCi0gICAgbXV0YWJsZSBWZWN0b3I8Tm9k
ZSo+IG1fcHJvcGVydGllczsKLSAgICBtdXRhYmxlIFJlZlB0cjxET01TdHJpbmdMaXN0PiBtX3By
b3BlcnR5TmFtZXM7CisgICAgdW5zaWduZWQgY2FsY0xlbmd0aCgpIGNvbnN0OworICAgIHZvaWQg
ZmluZFByb3BlcnRpZXMoRWxlbWVudCogYmFzZSkgY29uc3Q7CisgICAgRWxlbWVudCogaXRlbUFm
dGVyKEVsZW1lbnQqIGJhc2UsIEVsZW1lbnQqIHByZXZpb3VzKSBjb25zdDsKKyAgICB2b2lkIHVw
ZGF0ZU5hbWVDYWNoZSgpIGNvbnN0OworICAgIHZvaWQgdXBkYXRlUmVmRWxlbWVudHMoKSBjb25z
dDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="135295"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134572</attachid>
            <date>2012-03-29 07:03:52 -0700</date>
            <delta_ts>2012-04-06 13:40:16 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>patch_80490_modified.diff</filename>
            <type>text/plain</type>
            <size>18132</size>
            <attacher name="Arko Saha">arko</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjUyOCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQzIEBACisyMDEyLTAzLTI5ICBBcmtvIFNh
aGEgIDxhcmtvQG1vdG9yb2xhLmNvbT4KKworICAgICAgICBNaWNyb2RhdGE6IEltcGxlbWVudCBj
YWNoZSBtZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwNDkwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgY2FjaGluZyBt
ZWNoYW5pc20gZm9yIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi4KKyAgICAgICAgcHJvcGVydHlD
YWNoZSAtIGNvbnRhaW5zIG1pY3JvZGF0YSBpdGVtIHByb3BlcnRpZXMuCisgICAgICAgIGl0ZW1S
ZWZFbGVtZW50cyAtIGNvbnRhaW5zIHNvcnRlZCBtaWNyb2RhdGEgaXRlbSBhbmQgaXRlbXJlZiBl
bGVtZW50cy4KKyAgICAgICAgcHJvcGVydHlOYW1lcyAtIGNvbnRhaW5zIG1pY3JvZGF0YSBwcm9w
ZXJ0eSBuYW1lcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgIGl0
ZW1SZWZFbGVtZW50UG9zaXRpb24gLSBzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBpdGVt
UmVmRWxlbWVudHMuCisgICAgICAgIGhhc0l0ZW1SZWZFbGVtZW50cyAtIHNldCB0byB0dXJlIG9u
Y2Ugd2UgaGF2ZSBzb3J0ZWQgbWljcm9kYXRhIGl0ZW0gYW5kIGl0ZW1yZWYgZWxlbWVudHMgbGlz
dCBpLmUsIGl0ZW1SZWZFbGVtZW50cy4KKyAgICAgICAgQ2FjaGUgaXMgaW52YWxpZGF0ZWQgb25s
eSB3aGVuIGRvbSB0cmVlIG1vZGlmaWVkLiBXaGVuZXZlciBhbnkgcXVlcnkgaXMgbWFkZSBvbiBI
VE1MUHJvcGVydGllc0NvbGxlY3Rpb24sCisgICAgICAgIHJlc3VsdCBpcyByZXR1cm5lZCBmcm9t
IHRoZSBjYWNoZS4gRWFybGlhciB3ZSB1c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXJ0aWVzIG5vZGUg
bGlzdCBldmVyeSB0aW1lIGEgcXVlcnkgaXMgbWFkZS4KKworICAgICAgICAqIGh0bWwvSFRNTENv
bGxlY3Rpb24uaDoKKyAgICAgICAgKiBodG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpuZXh0Tm9kZVRvUHJvY2Vzcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Oml0ZW1BZnRlcik6IFRh
a2VzIHBhcmVudCBiYXNlIGFuZCBwcmV2aW91cyBpdGVtIHByb3BlcnR5IGFzIGFyZ3VtZW50Lgor
ICAgICAgICBGaW5kcyB0aGUgbmV4dCBpdGVtIHByb3BlcnR5IGluIGJhc2UuCisgICAgICAgIChX
ZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OnVwZGF0ZVJlZkVsZW1lbnRzKTogQXBw
ZW5kcyBtaWNyb2RhdGEgaXRlbSBlbGVtZW50IGFuZCBlbGVtZW50cyB3aGljaAorICAgICAgICBh
cmUgYWRkZWQgdGhyb3VnaCBpdGVtcmVmIGF0dHJpYnV0ZSBpbiBpdGVtUmVmRWxlbWVudHMuIFNv
cnQgaXRlbVJlZkVsZW1lbnRzIGluIHRyZWUgb3JkZXIuCisgICAgICAgIG90ZS0gaGVyZSBzb3J0
IGhhcHBlbnMgb25seSBvbiBpdGVtIGFuZCBpdGVtcmVmIGVsZW1lbnRzLiBXZSBkb250IHNvcnQg
ZWFjaCBwcm9wZXJ0eSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpjYWxjTGVuZ3RoKTogQ2Fs
Y3VsYXRlcyB0aGUgbGVuZ3RoIG9mIHByb3BlcnRpZXMgY29sbGVjdGlvbiBpZiBsZW5ndGgKKyAg
ICAgICAgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY2FjaGUuCisgICAgICAgIChXZWJDb3JlOjpI
VE1MUHJvcGVydGllc0NvbGxlY3Rpb246Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
UHJvcGVydGllc0NvbGxlY3Rpb246OmZpcnN0UHJvcGVydHkpOiBSZXR1cm5zIHRoZSBmaXJzdCBw
cm9wZXJ0eSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbjo6aXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0Nv
bGxlY3Rpb246OmZpbmRQcm9wZXJ0aWVzKTogRmluZHMgbWljcm9kYXRhIGl0ZW0gcHJvcGVydGll
cyBpbiB0aGUgYmFzZSBlbGVtZW50LgorICAgICAgICBBcHBlbmRzIHRoZSBwcm9wZXJ0aWVzIGlu
IHByb3BlcnR5Q2FjaGUgYW5kIHByb3BlcnR5IG5hbWVzIGluIHByb3BlcnR5TmFtZXMuCisgICAg
ICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OnVwZGF0ZU5hbWVDYWNoZSk6
IEl0IHVwZGF0ZXMgdGhlIHByb3BlcnR5Q2FjaGUgYW5kIHByb3BlcnR5TmFtZXMgaWYgaGFzTmFt
ZUNhY2hlIGlzIGZhbHNlLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uOjpuYW1lcyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246
Om5hbWVkSXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246
Omhhc05hbWVkSXRlbSk6CisgICAgICAgICogaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24u
aDoKKyAgICAgICAgKEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbik6CisKIDIwMTItMDMtMjkgIEFu
ZHJleSBLb3N5YWtvdiAgPGNhc2VxQGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVj
dG9yOiB1c2UgY2FudmFzIHRvIHJlbmRlciBiYXJzIGluICJ2ZXJ0aWNhbCBvdmVydmlldyIgbW9k
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTENvbGxlY3Rpb24uaAkocmV2aXNpb24gMTEyNTI4
KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJOb2RlLmgiCiAjaW5jbHVkZSAiQ29sbGVj
dGlvblR5cGUuaCIKKyNpbmNsdWRlICJET01TdHJpbmdMaXN0LmgiCiAjaW5jbHVkZSA8d3RmL0Zv
cndhcmQuaD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3du
UHRyLmg+CkBAIC04Miw2ICs4MywxMyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIGludCBlbGVtZW50
c0FycmF5UG9zaXRpb247CiAgICAgICAgIGJvb2wgaGFzTGVuZ3RoOwogICAgICAgICBib29sIGhh
c05hbWVDYWNoZTsKKyNpZiBFTkFCTEUoTUlDUk9EQVRBKQorICAgICAgICBOb2RlQ2FjaGVNYXAg
cHJvcGVydHlDYWNoZTsKKyAgICAgICAgVmVjdG9yPEVsZW1lbnQqPiBpdGVtUmVmRWxlbWVudHM7
CisgICAgICAgIFJlZlB0cjxET01TdHJpbmdMaXN0PiBwcm9wZXJ0eU5hbWVzOworICAgICAgICB1
bnNpZ25lZCBpdGVtUmVmRWxlbWVudFBvc2l0aW9uOworICAgICAgICBib29sIGhhc0l0ZW1SZWZF
bGVtZW50czsKKyNlbmRpZgogCiAgICAgICAgIHZvaWQgY2xlYXIoKQogICAgICAgICB7CkBAIC05
NCw3ICsxMDIsNjEgQEAgcHJvdGVjdGVkOgogICAgICAgICAgICAgZWxlbWVudHNBcnJheVBvc2l0
aW9uID0gMDsKICAgICAgICAgICAgIGhhc0xlbmd0aCA9IGZhbHNlOwogICAgICAgICAgICAgaGFz
TmFtZUNhY2hlID0gZmFsc2U7CisjaWYgRU5BQkxFKE1JQ1JPREFUQSkKKyAgICAgICAgICAgIHBy
b3BlcnR5Q2FjaGUuY2xlYXIoKTsKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50cy5jbGVhcigp
OworICAgICAgICAgICAgcHJvcGVydHlOYW1lcy5jbGVhcigpOworICAgICAgICAgICAgaXRlbVJl
ZkVsZW1lbnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICBoYXNJdGVtUmVmRWxlbWVudHMgPSBm
YWxzZTsKKyNlbmRpZgogICAgICAgICB9CisKKyNpZiBFTkFCTEUoTUlDUk9EQVRBKQorICAgICAg
ICB2b2lkIHNldEl0ZW1SZWZFbGVtZW50cyhjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBlbGVtZW50
cykKKyAgICAgICAgeworICAgICAgICAgICAgaXRlbVJlZkVsZW1lbnRzID0gZWxlbWVudHM7Cisg
ICAgICAgICAgICBoYXNJdGVtUmVmRWxlbWVudHMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAg
ICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgZ2V0SXRlbVJlZkVsZW1lbnRzKCkKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIGl0ZW1SZWZFbGVtZW50czsKKyAgICAgICAgfQorCisgICAg
ICAgIHZvaWQgdXBkYXRlTGVuZ3RoKHVuc2lnbmVkIGxlbikKKyAgICAgICAgeworICAgICAgICAg
ICAgbGVuZ3RoID0gbGVuOworICAgICAgICAgICAgaGFzTGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgdXBkYXRlUHJvcGVydHlDYWNoZShFbGVtZW50KiBlbGVtZW50LCBj
b25zdCBBdG9taWNTdHJpbmcmIHByb3BlcnR5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAg
aWYgKCFwcm9wZXJ0eU5hbWVzKQorICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZXMgPSBET01T
dHJpbmdMaXN0OjpjcmVhdGUoKTsKKworICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eU5hbWVzLT5j
b250YWlucyhwcm9wZXJ0eU5hbWUpKQorICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZXMtPmFw
cGVuZChwcm9wZXJ0eU5hbWUpOworCisgICAgICAgICAgICBWZWN0b3I8RWxlbWVudCo+KiBwcm9w
ZXJ0eVJlc3VsdHMgPSBwcm9wZXJ0eUNhY2hlLmdldChwcm9wZXJ0eU5hbWUuaW1wbCgpKTsKKyAg
ICAgICAgICAgIGlmICghcHJvcGVydHlSZXN1bHRzIHx8ICFwcm9wZXJ0eVJlc3VsdHMtPmNvbnRh
aW5zKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgIGFwcGVuZChwcm9wZXJ0eUNhY2hlLCBwcm9w
ZXJ0eU5hbWUsIGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVDdXJy
ZW50SXRlbShFbGVtZW50KiBlbGVtZW50LCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIGl0ZW1SZWZF
bGVtZW50UG9zKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50ID0gZWxlbWVudDsKKyAg
ICAgICAgICAgIHBvc2l0aW9uID0gcG9zOworICAgICAgICAgICAgaXRlbVJlZkVsZW1lbnRQb3Np
dGlvbiA9IGl0ZW1SZWZFbGVtZW50UG9zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNl
dFBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudCA9IDA7CisgICAgICAg
ICAgICBwb3NpdGlvbiA9IDA7CisgICAgICAgICAgICBpdGVtUmVmRWxlbWVudFBvc2l0aW9uID0g
MDsKKyAgICAgICAgfQorI2VuZGlmCisKICAgICB9IG1fY2FjaGU7CiAKIHByaXZhdGU6CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3Bw
CShyZXZpc2lvbiAxMTI1MjgpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVz
Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU3LDcgKzU3LDYgQEAgUGFzc093blB0
cjxIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24+IEhUTQogCiBIVE1MUHJvcGVydGllc0NvbGxlY3Rp
b246OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbihOb2RlKiBpdGVtTm9kZSkKICAgICA6IEhUTUxD
b2xsZWN0aW9uKGl0ZW1Ob2RlLCBJdGVtUHJvcGVydGllcykKLSAgICAsIG1fcHJvcGVydHlOYW1l
cyhET01TdHJpbmdMaXN0OjpjcmVhdGUoKSkKIHsKIH0KIApAQCAtNjUsMTMyICs2NCwxODggQEAg
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjp+SFRNTFByb3BlcnRpZQogewogfQogCi12b2lkIEhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6ZmluZFByb3BldGllc09mQW5JdGVtKE5vZGUqIHJvb3Qp
IGNvbnN0CitzdGF0aWMgTm9kZSogbmV4dE5vZGVUb1Byb2Nlc3MoTm9kZSogYmFzZSwgTm9kZSog
bm9kZSkKIHsKLSAgICAvLyA1LjIuNSBBc3NvY2lhdGluZyBuYW1lcyB3aXRoIGl0ZW1zLgotICAg
IFZlY3RvcjxOb2RlKj4gbWVtb3J5OworICAgIC8vIEFuIE1pY3JvZGF0YSBpdGVtIG1heSBjb250
YWluIHByb3BlcnRpZXMgd2hpY2ggaW4gdHVybiBhbiBpdGVtIGl0c2VsZi4gUHJvcGVydGllcyBj
YW4gYWxzbworICAgIC8vIHRoZW1zZWx2ZXMgYmUgZ3JvdXBzIG9mIG5hbWUtdmFsdWUgcGFpcnMs
IGJ5IHB1dHRpbmcgdGhlIGl0ZW1zY29wZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQKKyAgICAv
LyB0aGF0IGRlY2xhcmVzIHRoZSBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5IGhhcyBhbiBpdGVt
c2NvcGUgYXR0cmlidXRlIHNwZWNpZmllZCB0aGVuIHdlIG5lZWQKKyAgICAvLyB0byB0cmF2ZXJz
ZSB0aGUgbmV4dCBzaWJsaW5nLgorICAgIHJldHVybiBub2RlID09IGJhc2UgfHwgKG5vZGUtPmlz
SFRNTEVsZW1lbnQoKSAmJiAhdG9IVE1MRWxlbWVudChub2RlKS0+ZmFzdEhhc0F0dHJpYnV0ZShp
dGVtc2NvcGVBdHRyKSkKKyAgICAgICAgICAgID8gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShiYXNl
KSA6IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoYmFzZSk7Cit9CiAKLSAgICBtZW1vcnkuYXBw
ZW5kKHJvb3QpOworRWxlbWVudCogSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjppdGVtQWZ0ZXIo
RWxlbWVudCogYmFzZSwgRWxlbWVudCogcHJldmlvdXMpIGNvbnN0Cit7CisgICAgTm9kZSogY3Vy
cmVudDsKKyAgICBjdXJyZW50ID0gcHJldmlvdXMgPyBuZXh0Tm9kZVRvUHJvY2VzcyhiYXNlLCBw
cmV2aW91cykgOiBiYXNlOwogCi0gICAgVmVjdG9yPE5vZGUqPiBwZW5kaW5nOwotICAgIC8vIEFk
ZCB0aGUgY2hpbGQgZWxlbWVudHMgb2Ygcm9vdCwgaWYgYW55LCB0byBwZW5kaW5nLgotICAgIGZv
ciAoTm9kZSogY2hpbGQgPSByb290LT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAoY2hpbGQtPmlzSFRNTEVsZW1lbnQoKSkKLSAg
ICAgICAgICAgIHBlbmRpbmcuYXBwZW5kKGNoaWxkKTsKLQotICAgIC8vIElmIHJvb3QgaGFzIGFu
IGl0ZW1yZWYgYXR0cmlidXRlLCBzcGxpdCB0aGUgdmFsdWUgb2YgdGhhdCBpdGVtcmVmIGF0dHJp
YnV0ZSBvbiBzcGFjZXMuCi0gICAgLy8gRm9yIGVhY2ggcmVzdWx0aW5nIHRva2VuIElELCBpZiB0
aGVyZSBpcyBhbiBlbGVtZW50IGluIHRoZSBob21lIHN1YnRyZWUgb2Ygcm9vdCB3aXRoIHRoZSBJ
RCBJRCwKLSAgICAvLyB0aGVuIGFkZCB0aGUgZmlyc3Qgc3VjaCBlbGVtZW50IHRvIHBlbmRpbmcu
Ci0gICAgaWYgKHRvSFRNTEVsZW1lbnQocm9vdCktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXJlZkF0
dHIpKSB7Ci0gICAgICAgIERPTVNldHRhYmxlVG9rZW5MaXN0KiBpdGVtUmVmID0gcm9vdC0+aXRl
bVJlZigpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbVJlZi0+bGVuZ3Ro
KCk7ICsraSkgewotICAgICAgICAgICAgQXRvbWljU3RyaW5nIGlkID0gaXRlbVJlZi0+aXRlbShp
KTsKLQotICAgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHJvb3QtPmRvY3VtZW50KCktPmdl
dEVsZW1lbnRCeUlkKGlkKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQtPmlz
SFRNTEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZChlbGVtZW50KTsK
KyAgICBmb3IgKDsgY3VycmVudDsgY3VycmVudCA9IG5leHROb2RlVG9Qcm9jZXNzKGJhc2UsIGN1
cnJlbnQpKSB7CisgICAgICAgIGlmICghY3VycmVudC0+aXNIVE1MRWxlbWVudCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIEhUTUxFbGVtZW50KiBlbGVtZW50ID0gdG9IVE1MRWxl
bWVudChjdXJyZW50KTsKKyAgICAgICAgaWYgKGVsZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoaXRl
bXByb3BBdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgIH0KICAg
ICB9CiAKLSAgICAvLyBMb29wIHRpbGwgd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHBlbmRpbmcgZWxl
bWVudHMKLSAgICB3aGlsZSAoIXBlbmRpbmcuaXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIDA7Cit9
CiAKLSAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IGVsZW1lbnQgZnJvbSBwZW5kaW5nIGFuZCBsZXQg
Y3VycmVudCBiZSB0aGF0IGVsZW1lbnQuCi0gICAgICAgIE5vZGUqIGN1cnJlbnQgPSBwZW5kaW5n
WzBdOwotICAgICAgICBwZW5kaW5nLnJlbW92ZSgwKTsKLQotICAgICAgICAvLyBJZiBjdXJyZW50
IGlzIGFscmVhZHkgaW4gbWVtb3J5LCB0aGVyZSBpcyBhIG1pY3JvZGF0YSBlcnJvcjsKLSAgICAg
ICAgaWYgKG1lbW9yeS5jb250YWlucyhjdXJyZW50KSkgewotICAgICAgICAgICAgLy8gbWljcm9k
YXRhIGVycm9yOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KK3ZvaWQgSFRNTFBy
b3BlcnRpZXNDb2xsZWN0aW9uOjp1cGRhdGVSZWZFbGVtZW50cygpIGNvbnN0Cit7CisgICAgaWYg
KG1fY2FjaGUuaGFzSXRlbVJlZkVsZW1lbnRzKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAg
bWVtb3J5LmFwcGVuZChjdXJyZW50KTsKKyAgICBIVE1MRWxlbWVudCogYmFzZUVsZW1lbnQgPSB0
b0hUTUxFbGVtZW50KGJhc2UoKSk7CisgICAgVmVjdG9yPEVsZW1lbnQqPiBpdGVtUmVmRWxlbWVu
dHM7CisgICAgaXRlbVJlZkVsZW1lbnRzLmFwcGVuZChiYXNlRWxlbWVudCk7CiAKLSAgICAgICAg
Ly8gSWYgY3VycmVudCBkb2VzIG5vdCBoYXZlIGFuIGl0ZW1zY29wZSBhdHRyaWJ1dGUsIHRoZW46
IGFkZCBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIGN1cnJlbnQgdG8gcGVuZGluZy4KLSAgICAg
ICAgSFRNTEVsZW1lbnQqIGVsZW1lbnQgPSB0b0hUTUxFbGVtZW50KGN1cnJlbnQpOwotICAgICAg
ICBpZiAoIWVsZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpIHsKLSAgICAg
ICAgICAgIGZvciAoTm9kZSogY2hpbGQgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+
aXNIVE1MRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZChjaGls
ZCk7Ci0gICAgICAgIH0KKyAgICBET01TZXR0YWJsZVRva2VuTGlzdCogaXRlbVJlZiA9IGJhc2VF
bGVtZW50LT5pdGVtUmVmKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1SZWYt
Pmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IGJhc2UoKS0+ZG9j
dW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoaXRlbVJlZi0+aXRlbShpKSk7CisgICAgICAgIGlmIChl
bGVtZW50ICYmIGVsZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiAhZWxlbWVudC0+aXNEZXNjZW5k
YW50T2YoYmFzZSgpKSkKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50cy5hcHBlbmQoZWxlbWVu
dCk7CisgICAgfQogCi0gICAgICAgIC8vIElmIGN1cnJlbnQgaGFzIGFuIGl0ZW1wcm9wIGF0dHJp
YnV0ZSBzcGVjaWZpZWQsIGFkZCBpdCB0byByZXN1bHRzLgotICAgICAgICBpZiAoZWxlbWVudC0+
ZmFzdEhhc0F0dHJpYnV0ZShpdGVtcHJvcEF0dHIpKQotICAgICAgICAgICAgIG1fcHJvcGVydGll
cy5hcHBlbmQoY3VycmVudCk7CisgICAgc3RkOjpzb3J0KGl0ZW1SZWZFbGVtZW50cy5iZWdpbigp
LCBpdGVtUmVmRWxlbWVudHMuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOworICAgIG1fY2FjaGUu
c2V0SXRlbVJlZkVsZW1lbnRzKGl0ZW1SZWZFbGVtZW50cyk7Cit9CisKK3Vuc2lnbmVkIEhUTUxQ
cm9wZXJ0aWVzQ29sbGVjdGlvbjo6Y2FsY0xlbmd0aCgpIGNvbnN0Cit7CisgICAgdW5zaWduZWQg
bGVuZ3RoID0gMDsKKyAgICB1cGRhdGVSZWZFbGVtZW50cygpOworCisgICAgY29uc3QgVmVjdG9y
PEVsZW1lbnQqPiYgaXRlbVJlZkVsZW1lbnRzID0gbV9jYWNoZS5nZXRJdGVtUmVmRWxlbWVudHMo
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbVJlZkVsZW1lbnRzLnNpemUoKTsg
KytpKSB7CisgICAgICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGl0ZW1BZnRlcihpdGVtUmVm
RWxlbWVudHNbaV0sIDApOyBlbGVtZW50OyBlbGVtZW50ID0gaXRlbUFmdGVyKGl0ZW1SZWZFbGVt
ZW50c1tpXSwgZWxlbWVudCkpCisgICAgICAgICAgICArK2xlbmd0aDsKICAgICB9CisKKyAgICBy
ZXR1cm4gbGVuZ3RoOwogfQogCiB1bnNpZ25lZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Omxl
bmd0aCgpIGNvbnN0CiB7Ci0gICAgaWYgKCFiYXNlKCktPmlzSFRNTEVsZW1lbnQoKSB8fCAhdG9I
VE1MRWxlbWVudChiYXNlKCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0dHIpKQorICAg
IGlmICghdG9IVE1MRWxlbWVudChiYXNlKCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0
dHIpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwotICAg
IGZpbmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOwotICAgIHJldHVybiBtX3Byb3BlcnRpZXMu
c2l6ZSgpOworICAgIGludmFsaWRhdGVDYWNoZUlmTmVlZGVkKCk7CisKKyAgICBpZiAoIW1fY2Fj
aGUuaGFzTGVuZ3RoKQorICAgICAgICBtX2NhY2hlLnVwZGF0ZUxlbmd0aChjYWxjTGVuZ3RoKCkp
OworCisgICAgcmV0dXJuIG1fY2FjaGUubGVuZ3RoOworfQorCitFbGVtZW50KiBIVE1MUHJvcGVy
dGllc0NvbGxlY3Rpb246OmZpcnN0UHJvcGVydHkoKSBjb25zdAoreworICAgIEVsZW1lbnQqIGVs
ZW1lbnQgPSAwOworICAgIG1fY2FjaGUucmVzZXRQb3NpdGlvbigpOworICAgIGNvbnN0IFZlY3Rv
cjxFbGVtZW50Kj4mIGl0ZW1SZWZFbGVtZW50cyA9IG1fY2FjaGUuZ2V0SXRlbVJlZkVsZW1lbnRz
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1SZWZFbGVtZW50cy5zaXplKCk7
ICsraSkgeworICAgICAgICBlbGVtZW50ID0gaXRlbUFmdGVyKGl0ZW1SZWZFbGVtZW50c1tpXSwg
MCk7CisgICAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgICAgICBtX2NhY2hlLml0ZW1SZWZF
bGVtZW50UG9zaXRpb24gPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gZWxlbWVudDsKIH0KIAogTm9kZSogSFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAogewotICAgIGlmICghYmFzZSgpLT5pc0hU
TUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShp
dGVtc2NvcGVBdHRyKSkKKyAgICBpZiAoIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0
dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBtX3Byb3Bl
cnRpZXMuY2xlYXIoKTsKLSAgICBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oYmFzZSgpKTsKKyAgICBp
bnZhbGlkYXRlQ2FjaGVJZk5lZWRlZCgpOworICAgIGlmIChtX2NhY2hlLmN1cnJlbnQgJiYgbV9j
YWNoZS5wb3NpdGlvbiA9PSBpbmRleCkKKyAgICAgICAgcmV0dXJuIG1fY2FjaGUuY3VycmVudDsK
IAotICAgIGlmIChtX3Byb3BlcnRpZXMuc2l6ZSgpIDw9IGluZGV4KQorICAgIGlmIChtX2NhY2hl
Lmhhc0xlbmd0aCAmJiBtX2NhY2hlLmxlbmd0aCA8PSBpbmRleCkKICAgICAgICAgcmV0dXJuIDA7
CiAKLSAgICBzdGQ6OnNvcnQobV9wcm9wZXJ0aWVzLmJlZ2luKCksIG1fcHJvcGVydGllcy5lbmQo
KSwgY29tcGFyZVRyZWVPcmRlcik7Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllc1tpbmRleF07Cisg
ICAgdXBkYXRlUmVmRWxlbWVudHMoKTsKKyAgICBpZiAoIW1fY2FjaGUuY3VycmVudCB8fCBtX2Nh
Y2hlLnBvc2l0aW9uID4gaW5kZXgpIHsKKyAgICAgICAgbV9jYWNoZS5jdXJyZW50ID0gZmlyc3RQ
cm9wZXJ0eSgpOworICAgICAgICBpZiAoIW1fY2FjaGUuY3VycmVudCkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIGN1cnJlbnRQb3NpdGlvbiA9IG1fY2FjaGUu
cG9zaXRpb247CisgICAgRWxlbWVudCogZWxlbWVudCA9IG1fY2FjaGUuY3VycmVudDsKKyAgICB1
bnNpZ25lZCBpdGVtUmVmRWxlbWVudFBvcyA9IG1fY2FjaGUuaXRlbVJlZkVsZW1lbnRQb3NpdGlv
bjsKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtUmVmRWxlbWVudHMgPSBtX2NhY2hl
LmdldEl0ZW1SZWZFbGVtZW50cygpOworCisgICAgYm9vbCBmb3VuZCA9IChtX2NhY2hlLnBvc2l0
aW9uID09IGluZGV4KTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IGl0ZW1SZWZFbGVtZW50UG9z
OyBpIDwgaXRlbVJlZkVsZW1lbnRzLnNpemUoKSAmJiAhZm91bmQ7ICsraSkgeworICAgICAgICBm
b3IgKHVuc2lnbmVkIHBvcyA9IGN1cnJlbnRQb3NpdGlvbjsgcG9zIDwgaW5kZXg7ICsrcG9zKSB7
CisgICAgICAgICAgICBlbGVtZW50ID0gaXRlbUFmdGVyKGl0ZW1SZWZFbGVtZW50c1tpXSwgZWxl
bWVudCk7CisKKyAgICAgICAgICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbisrOworCisgICAgICAgICAgICBpZiAoY3Vy
cmVudFBvc2l0aW9uID09IGluZGV4KSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50UG9zID0gaTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fY2FjaGUudXBk
YXRlQ3VycmVudEl0ZW0oZWxlbWVudCwgaW5kZXgsIGl0ZW1SZWZFbGVtZW50UG9zKTsKKyAgICBy
ZXR1cm4gbV9jYWNoZS5jdXJyZW50OwogfQogCi1QYXNzUmVmUHRyPERPTVN0cmluZ0xpc3Q+IEhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZXMoKSBjb25zdAordm9pZCBIVE1MUHJvcGVydGll
c0NvbGxlY3Rpb246OmZpbmRQcm9wZXJ0aWVzKEVsZW1lbnQqIGJhc2UpIGNvbnN0CiB7Ci0gICAg
bV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9wcm9wZXJ0eU5hbWVzLT5jbGVhcigpOworICAg
IGZvciAoRWxlbWVudCogZWxlbWVudCA9IGl0ZW1BZnRlcihiYXNlLCAwKTsgZWxlbWVudDsgZWxl
bWVudCA9IGl0ZW1BZnRlcihiYXNlLCBlbGVtZW50KSkgeworICAgICAgICBET01TZXR0YWJsZVRv
a2VuTGlzdCogaXRlbVByb3BlcnR5ID0gZWxlbWVudC0+aXRlbVByb3AoKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1Qcm9wZXJ0eS0+bGVuZ3RoKCk7ICsraSkKKyAgICAg
ICAgICAgIG1fY2FjaGUudXBkYXRlUHJvcGVydHlDYWNoZShlbGVtZW50LCBpdGVtUHJvcGVydHkt
Pml0ZW0oaSkpOworICAgIH0KK30KIAotICAgIGlmICghYmFzZSgpLT5pc0hUTUxFbGVtZW50KCkg
fHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRy
KSkKLSAgICAgICAgcmV0dXJuIG1fcHJvcGVydHlOYW1lczsKK3ZvaWQgSFRNTFByb3BlcnRpZXND
b2xsZWN0aW9uOjp1cGRhdGVOYW1lQ2FjaGUoKSBjb25zdAoreworICAgIGludmFsaWRhdGVDYWNo
ZUlmTmVlZGVkKCk7CisgICAgaWYgKG1fY2FjaGUuaGFzTmFtZUNhY2hlKQorICAgICAgICByZXR1
cm47CiAKLSAgICBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oYmFzZSgpKTsKKyAgICB1cGRhdGVSZWZF
bGVtZW50cygpOwogCi0gICAgc3RkOjpzb3J0KG1fcHJvcGVydGllcy5iZWdpbigpLCBtX3Byb3Bl
cnRpZXMuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3Byb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgLy8gRm9yIGVhY2ggaXRl
bSBwcm9wZXJ0aWVzLCBzcGxpdCB0aGUgdmFsdWUgb2YgdGhhdCBpdGVtcHJvcCBhdHRyaWJ1dGUg
b24gc3BhY2VzLgotICAgICAgICAvLyBBZGQgYWxsIHRva2VucyB0byBwcm9wZXJ0eSBuYW1lcywg
d2l0aCB0aGUgb3JkZXIgcHJlc2VydmVkIGJ1dCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLSAg
ICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IG1fcHJvcGVydGllc1tp
XS0+aXRlbVByb3AoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtUHJvcGVy
dHktPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgIEF0b21pY1N0cmluZyBwcm9wZXJ0eU5h
bWUgPSBpdGVtUHJvcGVydHktPml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobV9wcm9wZXJ0eU5h
bWVzLT5pc0VtcHR5KCkgfHwgIW1fcHJvcGVydHlOYW1lcy0+Y29udGFpbnMocHJvcGVydHlOYW1l
KSkKLSAgICAgICAgICAgICAgICBtX3Byb3BlcnR5TmFtZXMtPmFwcGVuZChwcm9wZXJ0eU5hbWUp
OwotICAgICAgICB9Ci0gICAgfQorICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1SZWZF
bGVtZW50cyA9IG1fY2FjaGUuZ2V0SXRlbVJlZkVsZW1lbnRzKCk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGl0ZW1SZWZFbGVtZW50cy5zaXplKCk7ICsraSkKKyAgICAgICAgZmluZFBy
b3BlcnRpZXMoaXRlbVJlZkVsZW1lbnRzW2ldKTsKKworICAgIG1fY2FjaGUuaGFzTmFtZUNhY2hl
ID0gdHJ1ZTsKK30KIAotICAgIHJldHVybiBtX3Byb3BlcnR5TmFtZXM7CitQYXNzUmVmUHRyPERP
TVN0cmluZ0xpc3Q+IEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZXMoKSBjb25zdAorewor
ICAgIGlmICghdG9IVE1MRWxlbWVudChiYXNlKCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29w
ZUF0dHIpKQorICAgICAgICByZXR1cm4gRE9NU3RyaW5nTGlzdDo6Y3JlYXRlKCk7CisKKyAgICB1
cGRhdGVOYW1lQ2FjaGUoKTsKKworICAgIHJldHVybiBtX2NhY2hlLnByb3BlcnR5TmFtZXM7CiB9
CiAKIFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZWRJ
dGVtKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QKIHsKLSAgICBpZiAoIWJhc2UoKS0+aXNIVE1M
RWxlbWVudCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRl
bXNjb3BlQXR0cikpCisgICAgaWYgKCF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRy
aWJ1dGUoaXRlbXNjb3BlQXR0cikpCiAgICAgICByZXR1cm4gMDsKIAotICAgIG1fcHJvcGVydGll
cy5jbGVhcigpOwogICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiBuYW1lZEl0ZW1zOwotICAgIGZp
bmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOwogCi0gICAgc3RkOjpzb3J0KG1fcHJvcGVydGll
cy5iZWdpbigpLCBtX3Byb3BlcnRpZXMuZW5kKCksIGNvbXBhcmVUcmVlT3JkZXIpOworICAgIHVw
ZGF0ZU5hbWVDYWNoZSgpOwogCi0gICAgLy8gRm9yIGVhY2ggaXRlbSBwcm9wZXJ0aWVzLCBzcGxp
dCB0aGUgdmFsdWUgb2YgdGhhdCBpdGVtcHJvcCBhdHRyaWJ1dGUgb24gc3BhY2VzLgotICAgIC8v
IEFkZCBlbGVtZW50IHRvIG5hbWVkSXRlbSB0aGF0IGNvbnRhaW5zIGEgcHJvcGVydHkgbmFtZWQg
bmFtZSwgd2l0aCB0aGUgb3JkZXIgcHJlc2VydmVkLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9wcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIERPTVNldHRhYmxlVG9rZW5M
aXN0KiBpdGVtUHJvcGVydHkgPSBtX3Byb3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7Ci0gICAgICAg
IGlmIChpdGVtUHJvcGVydHktPnRva2VucygpLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAg
bmFtZWRJdGVtcy5hcHBlbmQobV9wcm9wZXJ0aWVzW2ldKTsKLSAgICB9CisgICAgVmVjdG9yPEVs
ZW1lbnQqPiogcHJvcGVydHlSZXN1bHRzID0gbV9jYWNoZS5wcm9wZXJ0eUNhY2hlLmdldChBdG9t
aWNTdHJpbmcobmFtZSkuaW1wbCgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBwcm9wZXJ0
eVJlc3VsdHMgJiYgaSA8IHByb3BlcnR5UmVzdWx0cy0+c2l6ZSgpOyArK2kpCisgICAgICAgIG5h
bWVkSXRlbXMuYXBwZW5kKHByb3BlcnR5UmVzdWx0cy0+YXQoaSkpOwogCiAgICAgLy8gRklYTUU6
IEhUTUw1IHNwZWNpZmllcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBQcm9wZXJ0eU5vZGVMaXN0
LgogICAgIHJldHVybiBuYW1lZEl0ZW1zLmlzRW1wdHkoKSA/IDAgOiBTdGF0aWNOb2RlTGlzdDo6
YWRvcHQobmFtZWRJdGVtcyk7CkBAIC0xOTgsMTcgKzI1MywxMyBAQCBQYXNzUmVmUHRyPE5vZGVM
aXN0PiBIVE1MUHJvcGVydGllc0NvbGxlCiAKIGJvb2wgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9u
OjpoYXNOYW1lZEl0ZW0oY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKSBjb25zdAogewotICAgIGlm
ICghYmFzZSgpLT5pc0hUTUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFz
dEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKKyAgICBpZiAoIXRvSFRNTEVsZW1lbnQoYmFz
ZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogCi0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgZmluZFByb3BldGllc09mQW5J
dGVtKGJhc2UoKSk7CisgICAgdXBkYXRlTmFtZUNhY2hlKCk7CiAKLSAgICAvLyBGb3IgZWFjaCBp
dGVtIHByb3BlcnRpZXMsIHNwbGl0IHRoZSB2YWx1ZSBvZiB0aGF0IGl0ZW1wcm9wIGF0dHJpYnV0
ZSBvbiBzcGFjZXMuCi0gICAgLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudCBjb250YWlucyBhIHBy
b3BlcnR5IG5hbWVkIG5hbWUuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Byb3BlcnRp
ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9w
ZXJ0eSA9IG1fcHJvcGVydGllc1tpXS0+aXRlbVByb3AoKTsKLSAgICAgICAgaWYgKGl0ZW1Qcm9w
ZXJ0eS0+dG9rZW5zKCkuY29udGFpbnMobmFtZSkpCisgICAgaWYgKFZlY3RvcjxFbGVtZW50Kj4q
IHByb3BlcnR5Q2FjaGUgPSBtX2NhY2hlLnByb3BlcnR5Q2FjaGUuZ2V0KG5hbWUuaW1wbCgpKSkg
eworICAgICAgICBpZiAoIXByb3BlcnR5Q2FjaGUtPmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVy
dGllc0NvbGxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQ
cm9wZXJ0aWVzQ29sbGVjdGlvbi5oCShyZXZpc2lvbiAxMTI1MjgpCisrKyBTb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niwx
MSArNTYsMTQgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBIVE1MUHJvcGVydGllc0NvbGxlY3Rp
b24oTm9kZSopOwogCi0gICAgdm9pZCBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oTm9kZSogY3VycmVu
dCkgY29uc3Q7Ci0gICAgdm9pZCBnZXROYW1lZEl0ZW1zKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYs
IGNvbnN0IFN0cmluZyYpIGNvbnN0OworICAgIHVuc2lnbmVkIGNhbGNMZW5ndGgoKSBjb25zdDsK
KyAgICB2b2lkIGZpbmRQcm9wZXJ0aWVzKEVsZW1lbnQqIGJhc2UpIGNvbnN0OwogCi0gICAgbXV0
YWJsZSBWZWN0b3I8Tm9kZSo+IG1fcHJvcGVydGllczsKLSAgICBtdXRhYmxlIFJlZlB0cjxET01T
dHJpbmdMaXN0PiBtX3Byb3BlcnR5TmFtZXM7CisgICAgRWxlbWVudCogZmlyc3RQcm9wZXJ0eSgp
IGNvbnN0OworICAgIEVsZW1lbnQqIGl0ZW1BZnRlcihFbGVtZW50KiBiYXNlLCBFbGVtZW50KiBw
cmV2aW91cykgY29uc3Q7CisKKyAgICB2b2lkIHVwZGF0ZU5hbWVDYWNoZSgpIGNvbnN0OworICAg
IHZvaWQgdXBkYXRlUmVmRWxlbWVudHMoKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136059</attachid>
            <date>2012-04-06 13:40:16 -0700</date>
            <delta_ts>2012-04-11 08:20:23 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>patch_80490_modified.diff</filename>
            <type>text/plain</type>
            <size>19038</size>
            <attacher name="Arko Saha">arko</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMzQ5MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQyIEBACisyMDEyLTA0LTA2ICAgQXJrbyBT
YWhhICA8YXJrb0Btb3Rvcm9sYS5jb20+CisKKyAgICAgICAgTWljcm9kYXRhOiBJbXBsZW1lbnQg
Y2FjaGUgbWVjaGFuaXNtIGZvciBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MDQ5MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxlbWVudGVkIGNhY2hpbmcg
bWVjaGFuaXNtIGZvciBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uCisgICAgICAgIHByb3BlcnR5
Q2FjaGUgLSBjb250YWlucyBtaWNyb2RhdGEgaXRlbSBwcm9wZXJ0aWVzLgorICAgICAgICBpdGVt
UmVmRWxlbWVudHMgLSBjb250YWlucyBzb3J0ZWQgbWljcm9kYXRhIGl0ZW0gYW5kIGl0ZW1yZWYg
ZWxlbWVudHMuCisgICAgICAgIHByb3BlcnR5TmFtZXMgLSBjb250YWlucyBtaWNyb2RhdGEgcHJv
cGVydHkgbmFtZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICBp
dGVtUmVmRWxlbWVudFBvc2l0aW9uIC0gc3RvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgaXRl
bVJlZkVsZW1lbnRzLgorICAgICAgICBoYXNJdGVtUmVmRWxlbWVudHMgLSBzZXQgdG8gdHVyZSBv
bmNlIHdlIGhhdmUgc29ydGVkIG1pY3JvZGF0YSBpdGVtIGFuZCBpdGVtcmVmIGVsZW1lbnRzIGxp
c3QgaS5lLCBpdGVtUmVmRWxlbWVudHMuCisgICAgICAgIENhY2hlIGlzIGludmFsaWRhdGVkIG9u
bHkgd2hlbiBkb20gdHJlZSBtb2RpZmllZC4gV2hlbmV2ZXIgYW55IHF1ZXJ5IGlzIG1hZGUgb24g
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uLAorICAgICAgICByZXN1bHQgaXMgcmV0dXJuZWQgZnJv
bSB0aGUgY2FjaGUuIEVhcmxpYXIgd2UgdXNlZCB0byBjYWxjdWxhdGUgcHJvcGVydGllcyBub2Rl
IGxpc3QgZXZlcnkgdGltZSBhIHF1ZXJ5IGlzIG1hZGUuCisKKyAgICAgICAgKiBodG1sL0hUTUxQ
cm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6aW52YWxpZGF0
ZUNhY2hlSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uOjp1cGRhdGVSZWZFbGVtZW50cyk6IEFwcGVuZHMgbWljcm9kYXRhIGl0ZW0gZWxlbWVudCBh
bmQgZWxlbWVudHMgd2hpY2gKKyAgICAgICAgYXJlIGFkZGVkIHRocm91Z2ggaXRlbXJlZiBhdHRy
aWJ1dGUgaW4gaXRlbVJlZkVsZW1lbnRzIChpbiB0cmVlIG9yZGVyKS4KKyAgICAgICAgKFdlYkNv
cmU6Om5leHROb2RlV2l0aFByb3BlcnR5KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0
aWVzQ29sbGVjdGlvbjo6aXRlbUFmdGVyKTogVGFrZXMgcGFyZW50IGJhc2UgYW5kIHByZXZpb3Vz
IGl0ZW0gcHJvcGVydHkgYXMgYXJndW1lbnQuCisgICAgICAgIEZpbmRzIHRoZSBuZXh0IGl0ZW0g
cHJvcGVydHkgaW4gYmFzZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQcm9wZXJ0aWVzQ29sbGVj
dGlvbjo6Y2FsY0xlbmd0aCk6IENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBwcm9wZXJ0aWVzIGNv
bGxlY3Rpb24gaWYgbGVuZ3RoCisgICAgICAgIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGNhY2hl
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpsZW5ndGgpOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpmaXJzdFByb3BlcnR5
KTogUmV0dXJucyB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAg
IChXZWJDb3JlOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Oml0ZW0pOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpmaW5kUHJvcGVydGllcyk6IEZpbmRzIG1p
Y3JvZGF0YSBpdGVtIHByb3BlcnRpZXMgaW4gdGhlIGJhc2UgZWxlbWVudC4KKyAgICAgICAgQXBw
ZW5kcyB0aGUgcHJvcGVydGllcyBpbiBwcm9wZXJ0eUNhY2hlIGFuZCBwcm9wZXJ0eSBuYW1lcyBp
biBwcm9wZXJ0eU5hbWVzLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uOjp1cGRhdGVOYW1lQ2FjaGUpOiAgSXQgdXBkYXRlcyB0aGUgcHJvcGVydHlDYWNoZSBhbmQg
cHJvcGVydHlOYW1lcyBpZiBoYXNOYW1lQ2FjaGUgaXMgZmFsc2UuCisgICAgICAgIChXZWJDb3Jl
OjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Om5hbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6bmFtZWRJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6aGFzTmFtZWRJdGVtKToKKyAgICAgICAgKiBodG1sL0hU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5oOgorICAgICAgICAoSFRNTFByb3BlcnRpZXNDb2xsZWN0
aW9uKToKKwogMjAxMi0wNC0wNiAgQmV0aCBEYWtpbiAgPGJkYWtpbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgxOTM5CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3Bw
CShyZXZpc2lvbiAxMTM0NTMpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVz
Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDExICs0NSw2IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotc3RhdGljIGlubGlu
ZSBib29sIGNvbXBhcmVUcmVlT3JkZXIoTm9kZSogbm9kZTEsIE5vZGUqIG5vZGUyKQotewotICAg
IHJldHVybiAobm9kZTItPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUxKSAmIChOb2RlOjpE
T0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcgfCBOb2RlOjpET0NVTUVOVF9QT1NJVElPTl9ESVND
T05ORUNURUQpKSA9PSBOb2RlOjpET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkc7Ci19Ci0KIFBh
c3NPd25QdHI8SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uPiBIVE1MUHJvcGVydGllc0NvbGxlY3Rp
b246OmNyZWF0ZShOb2RlKiBpdGVtTm9kZSkKIHsKICAgICByZXR1cm4gYWRvcHRQdHIobmV3IEhU
TUxQcm9wZXJ0aWVzQ29sbGVjdGlvbihpdGVtTm9kZSkpOwpAQCAtNTcsNyArNTIsNiBAQCBQYXNz
T3duUHRyPEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbj4gSFRNCiAKIEhUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbjo6SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uKE5vZGUqIGl0ZW1Ob2RlKQogICAgIDog
SFRNTENvbGxlY3Rpb24oaXRlbU5vZGUsIEl0ZW1Qcm9wZXJ0aWVzKQotICAgICwgbV9wcm9wZXJ0
eU5hbWVzKERPTVN0cmluZ0xpc3Q6OmNyZWF0ZSgpKQogewogfQogCkBAIC02NSwxMzIgKzU5LDIx
NyBAQCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246On5IVE1MUHJvcGVydGllCiB7CiB9CiAKLXZv
aWQgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oTm9kZSog
cm9vdCkgY29uc3QKK3ZvaWQgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjppbnZhbGlkYXRlQ2Fj
aGVJZk5lZWRlZCgpIGNvbnN0CiB7Ci0gICAgLy8gNS4yLjUgQXNzb2NpYXRpbmcgbmFtZXMgd2l0
aCBpdGVtcy4KLSAgICBWZWN0b3I8Tm9kZSo+IG1lbW9yeTsKKyAgICB1aW50NjRfdCBkb2N2ZXJz
aW9uID0gYmFzZSgpLT5kb2N1bWVudCgpLT5kb21UcmVlVmVyc2lvbigpOwogCi0gICAgbWVtb3J5
LmFwcGVuZChyb290KTsKKyAgICBpZiAobV9jYWNoZS52ZXJzaW9uID09IGRvY3ZlcnNpb24pCisg
ICAgICAgIHJldHVybjsKIAotICAgIFZlY3RvcjxOb2RlKj4gcGVuZGluZzsKLSAgICAvLyBBZGQg
dGhlIGNoaWxkIGVsZW1lbnRzIG9mIHJvb3QsIGlmIGFueSwgdG8gcGVuZGluZy4KLSAgICBmb3Ig
KE5vZGUqIGNoaWxkID0gcm9vdC0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+
bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKGNoaWxkLT5pc0hUTUxFbGVtZW50KCkpCi0gICAg
ICAgICAgICBwZW5kaW5nLmFwcGVuZChjaGlsZCk7Ci0KLSAgICAvLyBJZiByb290IGhhcyBhbiBp
dGVtcmVmIGF0dHJpYnV0ZSwgc3BsaXQgdGhlIHZhbHVlIG9mIHRoYXQgaXRlbXJlZiBhdHRyaWJ1
dGUgb24gc3BhY2VzLgotICAgIC8vIEZvciBlYWNoIHJlc3VsdGluZyB0b2tlbiBJRCwgaWYgdGhl
cmUgaXMgYW4gZWxlbWVudCBpbiB0aGUgaG9tZSBzdWJ0cmVlIG9mIHJvb3Qgd2l0aCB0aGUgSUQg
SUQsCi0gICAgLy8gdGhlbiBhZGQgdGhlIGZpcnN0IHN1Y2ggZWxlbWVudCB0byBwZW5kaW5nLgot
ICAgIGlmICh0b0hUTUxFbGVtZW50KHJvb3QpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1yZWZBdHRy
KSkgewotICAgICAgICBET01TZXR0YWJsZVRva2VuTGlzdCogaXRlbVJlZiA9IHJvb3QtPml0ZW1S
ZWYoKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1SZWYtPmxlbmd0aCgp
OyArK2kpIHsKLSAgICAgICAgICAgIEF0b21pY1N0cmluZyBpZCA9IGl0ZW1SZWYtPml0ZW0oaSk7
Ci0KLSAgICAgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSByb290LT5kb2N1bWVudCgpLT5nZXRF
bGVtZW50QnlJZChpZCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LT5pc0hU
TUxFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcGVuZGluZy5hcHBlbmQoZWxlbWVudCk7Ci0g
ICAgICAgIH0KKyAgICBtX2NhY2hlLmNsZWFyKCk7CisgICAgbV9jYWNoZS52ZXJzaW9uID0gZG9j
dmVyc2lvbjsKK30KKwordm9pZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246OnVwZGF0ZVJlZkVs
ZW1lbnRzKCkgY29uc3QKK3sKKyAgICBpZiAobV9jYWNoZS5oYXNJdGVtUmVmRWxlbWVudHMpCisg
ICAgICAgIHJldHVybjsKKworICAgIFZlY3RvcjxFbGVtZW50Kj4gaXRlbVJlZkVsZW1lbnRzOwor
ICAgIEhUTUxFbGVtZW50KiBiYXNlRWxlbWVudCA9IHRvSFRNTEVsZW1lbnQoYmFzZSgpKTsKKwor
ICAgIGlmICghYmFzZUVsZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXJlZkF0dHIpKSB7Cisg
ICAgICAgIGl0ZW1SZWZFbGVtZW50cy5hcHBlbmQoYmFzZUVsZW1lbnQpOworICAgICAgICBtX2Nh
Y2hlLnNldEl0ZW1SZWZFbGVtZW50cyhpdGVtUmVmRWxlbWVudHMpOworICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgLy8gTG9vcCB0aWxsIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBwZW5kaW5n
IGVsZW1lbnRzCi0gICAgd2hpbGUgKCFwZW5kaW5nLmlzRW1wdHkoKSkgeworICAgIERPTVNldHRh
YmxlVG9rZW5MaXN0KiBpdGVtUmVmID0gYmFzZUVsZW1lbnQtPml0ZW1SZWYoKTsKKyAgICBSZWZQ
dHI8RE9NU2V0dGFibGVUb2tlbkxpc3Q+IHByb2Nlc3NlZEl0ZW1SZWYgPSBET01TZXR0YWJsZVRv
a2VuTGlzdDo6Y3JlYXRlKCk7CisgICAgTm9kZSogcm9vdE5vZGUgPSBiYXNlRWxlbWVudC0+dHJl
ZVNjb3BlKCktPnJvb3ROb2RlKCk7CiAKLSAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IGVsZW1lbnQg
ZnJvbSBwZW5kaW5nIGFuZCBsZXQgY3VycmVudCBiZSB0aGF0IGVsZW1lbnQuCi0gICAgICAgIE5v
ZGUqIGN1cnJlbnQgPSBwZW5kaW5nWzBdOwotICAgICAgICBwZW5kaW5nLnJlbW92ZSgwKTsKLQot
ICAgICAgICAvLyBJZiBjdXJyZW50IGlzIGFscmVhZHkgaW4gbWVtb3J5LCB0aGVyZSBpcyBhIG1p
Y3JvZGF0YSBlcnJvcjsKLSAgICAgICAgaWYgKG1lbW9yeS5jb250YWlucyhjdXJyZW50KSkgewot
ICAgICAgICAgICAgLy8gbWljcm9kYXRhIGVycm9yOworICAgIGZvciAoTm9kZSogY3VycmVudCA9
IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT50cmF2
ZXJzZU5leHROb2RlKHJvb3ROb2RlKSkgeworICAgICAgICBpZiAoIWN1cnJlbnQtPmlzSFRNTEVs
ZW1lbnQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBIVE1MRWxlbWVudCogZWxl
bWVudCA9IHRvSFRNTEVsZW1lbnQoY3VycmVudCk7CisKKyAgICAgICAgaWYgKGVsZW1lbnQgPT0g
YmFzZUVsZW1lbnQpIHsKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50cy5hcHBlbmQoZWxlbWVu
dCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIG1lbW9yeS5h
cHBlbmQoY3VycmVudCk7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgaWQgPSBlbGVtZW50
LT5nZXRJZEF0dHJpYnV0ZSgpOworICAgICAgICBpZiAoIXByb2Nlc3NlZEl0ZW1SZWYtPnRva2Vu
cygpLmNvbnRhaW5zKGlkKSAmJiBpdGVtUmVmLT50b2tlbnMoKS5jb250YWlucyhpZCkpIHsKKyAg
ICAgICAgICAgIHByb2Nlc3NlZEl0ZW1SZWYtPnNldFZhbHVlKGlkKTsKKyAgICAgICAgICAgIGlm
ICghZWxlbWVudC0+aXNEZXNjZW5kYW50T2YoYmFzZUVsZW1lbnQpKQorICAgICAgICAgICAgICAg
IGl0ZW1SZWZFbGVtZW50cy5hcHBlbmQoZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAg
ICAgICAgLy8gSWYgY3VycmVudCBkb2VzIG5vdCBoYXZlIGFuIGl0ZW1zY29wZSBhdHRyaWJ1dGUs
IHRoZW46IGFkZCBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIGN1cnJlbnQgdG8gcGVuZGluZy4K
KyAgICBtX2NhY2hlLnNldEl0ZW1SZWZFbGVtZW50cyhpdGVtUmVmRWxlbWVudHMpOworfQorCitz
dGF0aWMgTm9kZSogbmV4dE5vZGVXaXRoUHJvcGVydHkoTm9kZSogYmFzZSwgTm9kZSogbm9kZSkK
K3sKKyAgICAvLyBBbiBNaWNyb2RhdGEgaXRlbSBtYXkgY29udGFpbiBwcm9wZXJ0aWVzIHdoaWNo
IGluIHR1cm4gYXJlIGl0ZW1zIHRoZW1zZWx2ZXMuIFByb3BlcnRpZXMgY2FuCisgICAgLy8gYWxz
byB0aGVtc2VsdmVzIGJlIGdyb3VwcyBvZiBuYW1lLXZhbHVlIHBhaXJzLCBieSBwdXR0aW5nIHRo
ZSBpdGVtc2NvcGUgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50CisgICAgLy8gdGhhdCBkZWNsYXJl
cyB0aGUgcHJvcGVydHkuIElmIHRoZSBwcm9wZXJ0eSBoYXMgYW4gaXRlbXNjb3BlIGF0dHJpYnV0
ZSBzcGVjaWZpZWQgdGhlbiB3ZSBuZWVkCisgICAgLy8gdG8gdHJhdmVyc2UgdGhlIG5leHQgc2li
bGluZy4KKyAgICByZXR1cm4gbm9kZSA9PSBiYXNlIHx8IChub2RlLT5pc0hUTUxFbGVtZW50KCkg
JiYgIXRvSFRNTEVsZW1lbnQobm9kZSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikp
CisgICAgICAgICAgICA/IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoYmFzZSkgOiBub2RlLT50cmF2
ZXJzZU5leHRTaWJsaW5nKGJhc2UpOworfQorCitFbGVtZW50KiBIVE1MUHJvcGVydGllc0NvbGxl
Y3Rpb246Oml0ZW1BZnRlcihFbGVtZW50KiBiYXNlLCBFbGVtZW50KiBwcmV2aW91cykgY29uc3QK
K3sKKyAgICBOb2RlKiBjdXJyZW50OworICAgIGN1cnJlbnQgPSBwcmV2aW91cyA/IG5leHROb2Rl
V2l0aFByb3BlcnR5KGJhc2UsIHByZXZpb3VzKSA6IGJhc2U7CisKKyAgICBmb3IgKDsgY3VycmVu
dDsgY3VycmVudCA9IG5leHROb2RlV2l0aFByb3BlcnR5KGJhc2UsIGN1cnJlbnQpKSB7CisgICAg
ICAgIGlmICghY3VycmVudC0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAgICAgY29udGludWU7
CiAgICAgICAgIEhUTUxFbGVtZW50KiBlbGVtZW50ID0gdG9IVE1MRWxlbWVudChjdXJyZW50KTsK
LSAgICAgICAgaWYgKCFlbGVtZW50LT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0dHIpKSB7
Ci0gICAgICAgICAgICBmb3IgKE5vZGUqIGNoaWxkID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOyBj
aGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICBpZiAo
Y2hpbGQtPmlzSFRNTEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5hcHBl
bmQoY2hpbGQpOworICAgICAgICBpZiAoZWxlbWVudC0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtcHJv
cEF0dHIpKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICAgfQorICAgIH0K
KworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246
OmNhbGNMZW5ndGgoKSBjb25zdAoreworICAgIHVuc2lnbmVkIGxlbmd0aCA9IDA7CisgICAgdXBk
YXRlUmVmRWxlbWVudHMoKTsKIAotICAgICAgICAvLyBJZiBjdXJyZW50IGhhcyBhbiBpdGVtcHJv
cCBhdHRyaWJ1dGUgc3BlY2lmaWVkLCBhZGQgaXQgdG8gcmVzdWx0cy4KLSAgICAgICAgaWYgKGVs
ZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXByb3BBdHRyKSkKLSAgICAgICAgICAgICBtX3By
b3BlcnRpZXMuYXBwZW5kKGN1cnJlbnQpOworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0
ZW1SZWZFbGVtZW50cyA9IG1fY2FjaGUuZ2V0SXRlbVJlZkVsZW1lbnRzKCk7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1SZWZFbGVtZW50cy5zaXplKCk7ICsraSkgeworICAgICAg
ICBmb3IgKEVsZW1lbnQqIGVsZW1lbnQgPSBpdGVtQWZ0ZXIoaXRlbVJlZkVsZW1lbnRzW2ldLCAw
KTsgZWxlbWVudDsgZWxlbWVudCA9IGl0ZW1BZnRlcihpdGVtUmVmRWxlbWVudHNbaV0sIGVsZW1l
bnQpKQorICAgICAgICAgICAgKytsZW5ndGg7CiAgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsK
IH0KIAogdW5zaWduZWQgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpsZW5ndGgoKSBjb25zdAog
ewotICAgIGlmICghYmFzZSgpLT5pc0hUTUxFbGVtZW50KCkgfHwgIXRvSFRNTEVsZW1lbnQoYmFz
ZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKKyAgICBpZiAoIXRvSFRNTEVs
ZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKICAgICAgICAg
cmV0dXJuIDA7CiAKLSAgICBtX3Byb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBmaW5kUHJvcGV0aWVz
T2ZBbkl0ZW0oYmFzZSgpKTsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBp
bnZhbGlkYXRlQ2FjaGVJZk5lZWRlZCgpOworCisgICAgaWYgKCFtX2NhY2hlLmhhc0xlbmd0aCkK
KyAgICAgICAgbV9jYWNoZS51cGRhdGVMZW5ndGgoY2FsY0xlbmd0aCgpKTsKKworICAgIHJldHVy
biBtX2NhY2hlLmxlbmd0aDsKK30KKworRWxlbWVudCogSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9u
OjpmaXJzdFByb3BlcnR5KCkgY29uc3QKK3sKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gMDsKKyAg
ICBtX2NhY2hlLnJlc2V0UG9zaXRpb24oKTsKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBp
dGVtUmVmRWxlbWVudHMgPSBtX2NhY2hlLmdldEl0ZW1SZWZFbGVtZW50cygpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtUmVmRWxlbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgZWxlbWVudCA9IGl0ZW1BZnRlcihpdGVtUmVmRWxlbWVudHNbaV0sIDApOworICAgICAgICBp
ZiAoZWxlbWVudCkgeworICAgICAgICAgICAgbV9jYWNoZS5pdGVtUmVmRWxlbWVudFBvc2l0aW9u
ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IGVsZW1lbnQ7CiB9CiAKIE5vZGUqIEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6aXRlbSh1bnNp
Z25lZCBpbmRleCkgY29uc3QKIHsKLSAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVudCgpIHx8
ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikp
CisgICAgaWYgKCF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNj
b3BlQXR0cikpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgbV9wcm9wZXJ0aWVzLmNsZWFyKCk7
Ci0gICAgZmluZFByb3BldGllc09mQW5JdGVtKGJhc2UoKSk7CisgICAgaW52YWxpZGF0ZUNhY2hl
SWZOZWVkZWQoKTsKKyAgICBpZiAobV9jYWNoZS5jdXJyZW50ICYmIG1fY2FjaGUucG9zaXRpb24g
PT0gaW5kZXgpCisgICAgICAgIHJldHVybiBtX2NhY2hlLmN1cnJlbnQ7CiAKLSAgICBpZiAobV9w
cm9wZXJ0aWVzLnNpemUoKSA8PSBpbmRleCkKKyAgICBpZiAobV9jYWNoZS5oYXNMZW5ndGggJiYg
bV9jYWNoZS5sZW5ndGggPD0gaW5kZXgpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgc3RkOjpz
b3J0KG1fcHJvcGVydGllcy5iZWdpbigpLCBtX3Byb3BlcnRpZXMuZW5kKCksIGNvbXBhcmVUcmVl
T3JkZXIpOwotICAgIHJldHVybiBtX3Byb3BlcnRpZXNbaW5kZXhdOworICAgIHVwZGF0ZVJlZkVs
ZW1lbnRzKCk7CisgICAgaWYgKCFtX2NhY2hlLmN1cnJlbnQgfHwgbV9jYWNoZS5wb3NpdGlvbiA+
IGluZGV4KSB7CisgICAgICAgIG1fY2FjaGUuY3VycmVudCA9IGZpcnN0UHJvcGVydHkoKTsKKyAg
ICAgICAgaWYgKCFtX2NhY2hlLmN1cnJlbnQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSBtX2NhY2hlLnBvc2l0aW9uOworICAg
IEVsZW1lbnQqIGVsZW1lbnQgPSBtX2NhY2hlLmN1cnJlbnQ7CisgICAgdW5zaWduZWQgaXRlbVJl
ZkVsZW1lbnRQb3MgPSBtX2NhY2hlLml0ZW1SZWZFbGVtZW50UG9zaXRpb247CisgICAgY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgaXRlbVJlZkVsZW1lbnRzID0gbV9jYWNoZS5nZXRJdGVtUmVmRWxl
bWVudHMoKTsKKworICAgIGJvb2wgZm91bmQgPSAobV9jYWNoZS5wb3NpdGlvbiA9PSBpbmRleCk7
CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBpdGVtUmVmRWxlbWVudFBvczsgaSA8IGl0ZW1SZWZF
bGVtZW50cy5zaXplKCkgJiYgIWZvdW5kOyArK2kpIHsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRQ
b3NpdGlvbiA8IGluZGV4KSB7CisgICAgICAgICAgICBlbGVtZW50ID0gaXRlbUFmdGVyKGl0ZW1S
ZWZFbGVtZW50c1tpXSwgZWxlbWVudCk7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnQpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24rKzsKKworICAg
ICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA9PSBpbmRleCkgeworICAgICAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpdGVtUmVmRWxlbWVudFBvcyA9IGk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBtX2NhY2hlLnVwZGF0ZUN1cnJlbnRJdGVtKGVsZW1lbnQsIGluZGV4LCBpdGVtUmVmRWxl
bWVudFBvcyk7CisgICAgcmV0dXJuIG1fY2FjaGUuY3VycmVudDsKIH0KIAotUGFzc1JlZlB0cjxE
T01TdHJpbmdMaXN0PiBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Om5hbWVzKCkgY29uc3QKK3Zv
aWQgSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpmaW5kUHJvcGVydGllcyhFbGVtZW50KiBiYXNl
KSBjb25zdAogewotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwotICAgIG1fcHJvcGVydHlOYW1l
cy0+Y2xlYXIoKTsKKyAgICBmb3IgKEVsZW1lbnQqIGVsZW1lbnQgPSBpdGVtQWZ0ZXIoYmFzZSwg
MCk7IGVsZW1lbnQ7IGVsZW1lbnQgPSBpdGVtQWZ0ZXIoYmFzZSwgZWxlbWVudCkpIHsKKyAgICAg
ICAgRE9NU2V0dGFibGVUb2tlbkxpc3QqIGl0ZW1Qcm9wZXJ0eSA9IGVsZW1lbnQtPml0ZW1Qcm9w
KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtUHJvcGVydHktPmxlbmd0
aCgpOyArK2kpCisgICAgICAgICAgICBtX2NhY2hlLnVwZGF0ZVByb3BlcnR5Q2FjaGUoZWxlbWVu
dCwgaXRlbVByb3BlcnR5LT5pdGVtKGkpKTsKKyAgICB9Cit9CiAKLSAgICBpZiAoIWJhc2UoKS0+
aXNIVE1MRWxlbWVudCgpIHx8ICF0b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1
dGUoaXRlbXNjb3BlQXR0cikpCi0gICAgICAgIHJldHVybiBtX3Byb3BlcnR5TmFtZXM7Cit2b2lk
IEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbjo6dXBkYXRlTmFtZUNhY2hlKCkgY29uc3QKK3sKKyAg
ICBpbnZhbGlkYXRlQ2FjaGVJZk5lZWRlZCgpOworICAgIGlmIChtX2NhY2hlLmhhc05hbWVDYWNo
ZSkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgZmluZFByb3BldGllc09mQW5JdGVtKGJhc2UoKSk7
CisgICAgdXBkYXRlUmVmRWxlbWVudHMoKTsKIAotICAgIHN0ZDo6c29ydChtX3Byb3BlcnRpZXMu
YmVnaW4oKSwgbV9wcm9wZXJ0aWVzLmVuZCgpLCBjb21wYXJlVHJlZU9yZGVyKTsKLQotICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IC8vIEZvciBlYWNoIGl0ZW0gcHJvcGVydGllcywgc3BsaXQgdGhlIHZhbHVlIG9mIHRoYXQgaXRl
bXByb3AgYXR0cmlidXRlIG9uIHNwYWNlcy4KLSAgICAgICAgLy8gQWRkIGFsbCB0b2tlbnMgdG8g
cHJvcGVydHkgbmFtZXMsIHdpdGggdGhlIG9yZGVyIHByZXNlcnZlZCBidXQgd2l0aCBkdXBsaWNh
dGVzIHJlbW92ZWQuCi0gICAgICAgIERPTVNldHRhYmxlVG9rZW5MaXN0KiBpdGVtUHJvcGVydHkg
PSBtX3Byb3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgaXRlbVByb3BlcnR5LT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICBBdG9taWNT
dHJpbmcgcHJvcGVydHlOYW1lID0gaXRlbVByb3BlcnR5LT5pdGVtKGkpOwotICAgICAgICAgICAg
aWYgKG1fcHJvcGVydHlOYW1lcy0+aXNFbXB0eSgpIHx8ICFtX3Byb3BlcnR5TmFtZXMtPmNvbnRh
aW5zKHByb3BlcnR5TmFtZSkpCi0gICAgICAgICAgICAgICAgbV9wcm9wZXJ0eU5hbWVzLT5hcHBl
bmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBjb25zdCBWZWN0b3I8RWxl
bWVudCo+JiBpdGVtUmVmRWxlbWVudHMgPSBtX2NhY2hlLmdldEl0ZW1SZWZFbGVtZW50cygpOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtUmVmRWxlbWVudHMuc2l6ZSgpOyArK2kp
CisgICAgICAgIGZpbmRQcm9wZXJ0aWVzKGl0ZW1SZWZFbGVtZW50c1tpXSk7CiAKLSAgICByZXR1
cm4gbV9wcm9wZXJ0eU5hbWVzOworICAgIG1fY2FjaGUuaGFzTmFtZUNhY2hlID0gdHJ1ZTsKK30K
KworUGFzc1JlZlB0cjxET01TdHJpbmdMaXN0PiBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb246Om5h
bWVzKCkgY29uc3QKK3sKKyAgICBpZiAoIXRvSFRNTEVsZW1lbnQoYmFzZSgpKS0+ZmFzdEhhc0F0
dHJpYnV0ZShpdGVtc2NvcGVBdHRyKSkKKyAgICAgICAgcmV0dXJuIERPTVN0cmluZ0xpc3Q6OmNy
ZWF0ZSgpOworCisgICAgdXBkYXRlTmFtZUNhY2hlKCk7CisKKyAgICByZXR1cm4gbV9jYWNoZS5w
cm9wZXJ0eU5hbWVzOwogfQogCiBQYXNzUmVmUHRyPE5vZGVMaXN0PiBIVE1MUHJvcGVydGllc0Nv
bGxlY3Rpb246Om5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0CiB7Ci0gICAgaWYg
KCFiYXNlKCktPmlzSFRNTEVsZW1lbnQoKSB8fCAhdG9IVE1MRWxlbWVudChiYXNlKCkpLT5mYXN0
SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0dHIpKQorICAgIGlmICghdG9IVE1MRWxlbWVudChiYXNl
KCkpLT5mYXN0SGFzQXR0cmlidXRlKGl0ZW1zY29wZUF0dHIpKQogICAgICAgcmV0dXJuIDA7CiAK
LSAgICBtX3Byb3BlcnRpZXMuY2xlYXIoKTsKICAgICBWZWN0b3I8UmVmUHRyPE5vZGU+ID4gbmFt
ZWRJdGVtczsKLSAgICBmaW5kUHJvcGV0aWVzT2ZBbkl0ZW0oYmFzZSgpKTsKIAotICAgIHN0ZDo6
c29ydChtX3Byb3BlcnRpZXMuYmVnaW4oKSwgbV9wcm9wZXJ0aWVzLmVuZCgpLCBjb21wYXJlVHJl
ZU9yZGVyKTsKKyAgICB1cGRhdGVOYW1lQ2FjaGUoKTsKIAotICAgIC8vIEZvciBlYWNoIGl0ZW0g
cHJvcGVydGllcywgc3BsaXQgdGhlIHZhbHVlIG9mIHRoYXQgaXRlbXByb3AgYXR0cmlidXRlIG9u
IHNwYWNlcy4KLSAgICAvLyBBZGQgZWxlbWVudCB0byBuYW1lZEl0ZW0gdGhhdCBjb250YWlucyBh
IHByb3BlcnR5IG5hbWVkIG5hbWUsIHdpdGggdGhlIG9yZGVyIHByZXNlcnZlZC4KLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fcHJvcGVydGllcy5zaXplKCk7ICsraSkgewotICAgICAgICBE
T01TZXR0YWJsZVRva2VuTGlzdCogaXRlbVByb3BlcnR5ID0gbV9wcm9wZXJ0aWVzW2ldLT5pdGVt
UHJvcCgpOwotICAgICAgICBpZiAoaXRlbVByb3BlcnR5LT50b2tlbnMoKS5jb250YWlucyhuYW1l
KSkKLSAgICAgICAgICAgIG5hbWVkSXRlbXMuYXBwZW5kKG1fcHJvcGVydGllc1tpXSk7Ci0gICAg
fQorICAgIFZlY3RvcjxFbGVtZW50Kj4qIHByb3BlcnR5UmVzdWx0cyA9IG1fY2FjaGUucHJvcGVy
dHlDYWNoZS5nZXQoQXRvbWljU3RyaW5nKG5hbWUpLmltcGwoKSk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgcHJvcGVydHlSZXN1bHRzICYmIGkgPCBwcm9wZXJ0eVJlc3VsdHMtPnNpemUoKTsg
KytpKQorICAgICAgICBuYW1lZEl0ZW1zLmFwcGVuZChwcm9wZXJ0eVJlc3VsdHMtPmF0KGkpKTsK
IAogICAgIC8vIEZJWE1FOiBIVE1MNSBzcGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4g
UHJvcGVydHlOb2RlTGlzdC4KICAgICByZXR1cm4gbmFtZWRJdGVtcy5pc0VtcHR5KCkgPyAwIDog
U3RhdGljTm9kZUxpc3Q6OmFkb3B0KG5hbWVkSXRlbXMpOwpAQCAtMTk4LDE3ICsyNzcsMTMgQEAg
UGFzc1JlZlB0cjxOb2RlTGlzdD4gSFRNTFByb3BlcnRpZXNDb2xsZQogCiBib29sIEhUTUxQcm9w
ZXJ0aWVzQ29sbGVjdGlvbjo6aGFzTmFtZWRJdGVtKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkg
Y29uc3QKIHsKLSAgICBpZiAoIWJhc2UoKS0+aXNIVE1MRWxlbWVudCgpIHx8ICF0b0hUTUxFbGVt
ZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpCisgICAgaWYgKCF0
b0hUTUxFbGVtZW50KGJhc2UoKSktPmZhc3RIYXNBdHRyaWJ1dGUoaXRlbXNjb3BlQXR0cikpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIG1fcHJvcGVydGllcy5jbGVhcigpOwotICAgIGZp
bmRQcm9wZXRpZXNPZkFuSXRlbShiYXNlKCkpOworICAgIHVwZGF0ZU5hbWVDYWNoZSgpOwogCi0g
ICAgLy8gRm9yIGVhY2ggaXRlbSBwcm9wZXJ0aWVzLCBzcGxpdCB0aGUgdmFsdWUgb2YgdGhhdCBp
dGVtcHJvcCBhdHRyaWJ1dGUgb24gc3BhY2VzLgotICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1l
bnQgY29udGFpbnMgYSBwcm9wZXJ0eSBuYW1lZCBuYW1lLgotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbV9wcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIERPTVNldHRhYmxlVG9r
ZW5MaXN0KiBpdGVtUHJvcGVydHkgPSBtX3Byb3BlcnRpZXNbaV0tPml0ZW1Qcm9wKCk7Ci0gICAg
ICAgIGlmIChpdGVtUHJvcGVydHktPnRva2VucygpLmNvbnRhaW5zKG5hbWUpKQorICAgIGlmIChW
ZWN0b3I8RWxlbWVudCo+KiBwcm9wZXJ0eUNhY2hlID0gbV9jYWNoZS5wcm9wZXJ0eUNhY2hlLmdl
dChuYW1lLmltcGwoKSkpIHsKKyAgICAgICAgaWYgKCFwcm9wZXJ0eUNhY2hlLT5pc0VtcHR5KCkp
CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uaAkocmV2aXNpb24gMTEzNDUzKQor
KysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzMsNiArMzMsNyBAQAogCiAjaWYgRU5BQkxFKE1JQ1JPREFUQSkKIAorI2lu
Y2x1ZGUgIkRPTVN0cmluZ0xpc3QuaCIKICNpbmNsdWRlICJIVE1MQ29sbGVjdGlvbi5oIgogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CkBAIC01NiwxMSArNTcsOTMgQEAgcHVibGljOgogcHJpdmF0ZToK
ICAgICBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24oTm9kZSopOwogCi0gICAgdm9pZCBmaW5kUHJv
cGV0aWVzT2ZBbkl0ZW0oTm9kZSogY3VycmVudCkgY29uc3Q7Ci0gICAgdm9pZCBnZXROYW1lZEl0
ZW1zKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYsIGNvbnN0IFN0cmluZyYpIGNvbnN0OworICAgIHVu
c2lnbmVkIGNhbGNMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkIGZpbmRQcm9wZXJ0aWVzKEVsZW1l
bnQqIGJhc2UpIGNvbnN0OworCisgICAgTm9kZSogZmluZFJlZkVsZW1lbnRzKE5vZGUqIHByZXZp
b3VzKSBjb25zdDsKKworICAgIEVsZW1lbnQqIGZpcnN0UHJvcGVydHkoKSBjb25zdDsKKyAgICBF
bGVtZW50KiBpdGVtQWZ0ZXIoRWxlbWVudCogYmFzZSwgRWxlbWVudCogcHJldmlvdXMpIGNvbnN0
OworCisgICAgdm9pZCB1cGRhdGVOYW1lQ2FjaGUoKSBjb25zdDsKKyAgICB2b2lkIHVwZGF0ZVJl
ZkVsZW1lbnRzKCkgY29uc3Q7CisKKyAgICB2b2lkIGludmFsaWRhdGVDYWNoZUlmTmVlZGVkKCkg
Y29uc3Q7CisKKyAgICBtdXRhYmxlIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHZlcnNpb247
CisgICAgICAgIEVsZW1lbnQqIGN1cnJlbnQ7CisgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uOwor
ICAgICAgICB1bnNpZ25lZCBsZW5ndGg7CisgICAgICAgIGJvb2wgaGFzTGVuZ3RoOworICAgICAg
ICBib29sIGhhc05hbWVDYWNoZTsKKyAgICAgICAgTm9kZUNhY2hlTWFwIHByb3BlcnR5Q2FjaGU7
CisgICAgICAgIFZlY3RvcjxFbGVtZW50Kj4gaXRlbVJlZkVsZW1lbnRzOworICAgICAgICBSZWZQ
dHI8RE9NU3RyaW5nTGlzdD4gcHJvcGVydHlOYW1lczsKKyAgICAgICAgdW5zaWduZWQgaXRlbVJl
ZkVsZW1lbnRQb3NpdGlvbjsKKyAgICAgICAgYm9vbCBoYXNJdGVtUmVmRWxlbWVudHM7CisKKyAg
ICAgICAgdm9pZCBjbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcnNpb24gPSAwOwor
ICAgICAgICAgICAgY3VycmVudCA9IDA7CisgICAgICAgICAgICBwb3NpdGlvbiA9IDA7CisgICAg
ICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAgICAgaGFzTGVuZ3RoID0gZmFsc2U7CisgICAg
ICAgICAgICBoYXNOYW1lQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUu
Y2xlYXIoKTsKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVtZW50cy5jbGVhcigpOworICAgICAgICAg
ICAgcHJvcGVydHlOYW1lcy5jbGVhcigpOworICAgICAgICAgICAgaXRlbVJlZkVsZW1lbnRQb3Np
dGlvbiA9IDA7CisgICAgICAgICAgICBoYXNJdGVtUmVmRWxlbWVudHMgPSBmYWxzZTsKKyAgICAg
ICAgfQorCisgICAgICAgIHZvaWQgc2V0SXRlbVJlZkVsZW1lbnRzKGNvbnN0IFZlY3RvcjxFbGVt
ZW50Kj4mIGVsZW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUmVmRWxlbWVudHMg
PSBlbGVtZW50czsKKyAgICAgICAgICAgIGhhc0l0ZW1SZWZFbGVtZW50cyA9IHRydWU7CisgICAg
ICAgIH0KKworICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBnZXRJdGVtUmVmRWxlbWVu
dHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlbVJlZkVsZW1lbnRzOworICAg
ICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVMZW5ndGgodW5zaWduZWQgbGVuKQorICAgICAg
ICB7CisgICAgICAgICAgICBsZW5ndGggPSBsZW47CisgICAgICAgICAgICBoYXNMZW5ndGggPSB0
cnVlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVQcm9wZXJ0eUNhY2hlKEVsZW1l
bnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJvcGVydHlOYW1lKQorICAgICAgICB7
CisgICAgICAgICAgICBpZiAoIXByb3BlcnR5TmFtZXMpCisgICAgICAgICAgICAgICAgcHJvcGVy
dHlOYW1lcyA9IERPTVN0cmluZ0xpc3Q6OmNyZWF0ZSgpOworCisgICAgICAgICAgICBpZiAoIXBy
b3BlcnR5TmFtZXMtPmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpCisgICAgICAgICAgICAgICAgcHJv
cGVydHlOYW1lcy0+YXBwZW5kKHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgICAgIFZlY3RvcjxF
bGVtZW50Kj4qIHByb3BlcnR5UmVzdWx0cyA9IHByb3BlcnR5Q2FjaGUuZ2V0KHByb3BlcnR5TmFt
ZS5pbXBsKCkpOworICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVJlc3VsdHMgfHwgIXByb3BlcnR5
UmVzdWx0cy0+Y29udGFpbnMoZWxlbWVudCkpCisgICAgICAgICAgICAgICAgYXBwZW5kKHByb3Bl
cnR5Q2FjaGUsIHByb3BlcnR5TmFtZSwgZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICB2
b2lkIHVwZGF0ZUN1cnJlbnRJdGVtKEVsZW1lbnQqIGVsZW1lbnQsIHVuc2lnbmVkIHBvcywgdW5z
aWduZWQgaXRlbVJlZkVsZW1lbnRQb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnQg
PSBlbGVtZW50OworICAgICAgICAgICAgcG9zaXRpb24gPSBwb3M7CisgICAgICAgICAgICBpdGVt
UmVmRWxlbWVudFBvc2l0aW9uID0gaXRlbVJlZkVsZW1lbnRQb3M7CisgICAgICAgIH0KKworICAg
ICAgICB2b2lkIHJlc2V0UG9zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50
ID0gMDsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIGl0ZW1SZWZFbGVt
ZW50UG9zaXRpb24gPSAwOworICAgICAgICB9CisKKyAgICB9IG1fY2FjaGU7CiAKLSAgICBtdXRh
YmxlIFZlY3RvcjxOb2RlKj4gbV9wcm9wZXJ0aWVzOwotICAgIG11dGFibGUgUmVmUHRyPERPTVN0
cmluZ0xpc3Q+IG1fcHJvcGVydHlOYW1lczsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
      

    </bug>

</bugzilla>