<?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>135701</bug_id>
          
          <creation_ts>2014-08-07 07:45:31 -0700</creation_ts>
          <short_desc>[CSS Grid Layout] Sort items by span when resolving content-based track sizing functions</short_desc>
          <delta_ts>2014-10-15 04:44:55 -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>New Bugs</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>60731</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Sergio Villar Senin">svillar</reporter>
          <assigned_to name="Sergio Villar Senin">svillar</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>jfernandez</cc>
    
    <cc>kling</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>rego</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1027487</commentid>
    <comment_count>0</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-07 07:45:31 -0700</bug_when>
    <thetext>[CSS Grid Layout] Sort items by span when resolving content-based track sizing functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1027499</commentid>
    <comment_count>1</comment_count>
      <attachid>236190</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-07 09:13:33 -0700</bug_when>
    <thetext>Created attachment 236190
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1029777</commentid>
    <comment_count>2</comment_count>
      <attachid>236190</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-08-18 09:24:15 -0700</bug_when>
    <thetext>Comment on attachment 236190
Patch

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

Looks fine.

Test coverage doesn’t seem to be sufficient; it missed the fact that the sort is not stable, and instead incorrectly is dependent on the pointer values of the grid item renderers. That tells me that we did not check the stability constraint for complex enough grids.

&gt; Source/WebCore/rendering/RenderGrid.cpp:534
&gt; +size_t RenderGrid::gridItemSpan(const RenderBox* child, GridTrackSizingDirection direction)

This should take a RenderBox&amp; rather than a RenderBox* since it takes an argument that can’t be null.

&gt; Source/WebCore/rendering/RenderGrid.cpp:536
&gt; +    GridCoordinate childCoordinate = cachedGridCoordinate(child);

Seems this could just be called coordinate, since this is a local variable and the child context is clear.

&gt; Source/WebCore/rendering/RenderGrid.cpp:537
&gt; +    GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCoordinate.columns;

I suggest using the type GridSpan&amp; or auto&amp; for this instead of making a copy. And also call it just span instead of childSpan.

&gt; Source/WebCore/rendering/RenderGrid.cpp:539
&gt; +    return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPosition.toInt() + 1;

Do we have a guarantee this will not be negative?

&gt; Source/WebCore/rendering/RenderGrid.cpp:542
&gt; +typedef std::pair&lt;RenderBox*, size_t&gt; GridItemWithSpan;

Might be easier to read the code if this was a class or struct instead of a pair. It’s not at all clear that “first” is the grid item and “second” is the span.

It doesn’t make sense to use size_t for a span, since a span is not a memory-object-size concept. I’m not sure why the existing code does this; it should not. The type should be unsigned unless there is some reason it needs to be 64-bit. I think that generally this file is overusing the size_t type a lot. But especially for the span value, since we are using toInt to compute the values here, this is an unwanted mix of types, since int is 32-bit and size_t is often 64-bit.

&gt; Source/WebCore/rendering/RenderGrid.cpp:546
&gt; +static bool gridItemWithSpanSorter(const GridItemWithSpan&amp; item1, const GridItemWithSpan&amp; item2)

This function should only compare the span values. It should not compare the RenderBox pointers. It should be named isSpanLessThan, not “grid item with span sorter”, because this comparison function is neither something that returns a “grid item” nor a “sorter”; the current item makes it sound like it returns a “grid item” that has a “span sorter”. Or we could use the naming scheme we use elsewhere with stable_sort and call this compareSpans; not great but better than this name.

&gt; Source/WebCore/rendering/RenderGrid.cpp:551
&gt; +    return item1.first &lt; item2.first;

It is incorrect to sort by comparing pointers. In fact, it can even be a security problem to sort things by pointer value.

&gt; Source/WebCore/rendering/RenderGrid.cpp:554
&gt; +static bool uniquePointerInPair(const GridItemWithSpan&amp; item1, const GridItemWithSpan&amp; item2)

A function named “unique pointer in pair” should return a “unique pointer”. Since it’s a predicate it should have a different name, an adjective phrase instead of noun phrase. Maybe arePointersEqual.

&gt; Source/WebCore/rendering/RenderGrid.cpp:563
&gt;      for (size_t i = 0; i &lt; sizingData.contentSizedTracksIndex.size(); ++i) {

Should change this to a modern for loop.

&gt; Source/WebCore/rendering/RenderGrid.cpp:569
&gt; +        std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end(), gridItemWithSpanSorter);

With the comparison function in this patch, stable_sort is not needed because the comparison function fully orders the values. So if that function was correct, I’d say we should switch to std::sort, since it can be more efficient and we gain nothing from the more complex stable sort.

However, I think the intent here may in fact be to sort in a stable fashion. We want to preserve the ordering of the grid items from the iterator when the spans are equal, so I suppose it’s OK to use stable_sort and fix the comparison function as described above.

&gt; Source/WebCore/rendering/RenderGrid.cpp:570
&gt; +        Vector&lt;GridItemWithSpan&gt;::iterator end = std::unique(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair);

The type here should be auto as with the iterator in the loop below.

&gt; Source/WebCore/rendering/RenderGrid.cpp:572
&gt; +        for (auto it = itemsSortedByIncreasingSpan.begin(); it != end; ++it) {

If I was writing this I would probably use a shrink call and then a modern for loop instead, but this way is also OK.

&gt; Source/WebCore/rendering/RenderGrid.cpp:573
&gt; +            RenderBox* gridItem = it-&gt;first;

Since this can never be null, I suggest we make it a RenderBox&amp; instead.

&gt; LayoutTests/fast/css-grid-layout/grid-item-order-in-content-sized-columns-resolution-expected.txt:8
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.
&gt; +PASS grid-template-columns are identical after grid row swap.

It’s better to write tests so they make clear in the output what is being tested. It’s not so good to just right out “success” over and over again. Easier to see what’s failing. That’s why the standard functions write out what is being tested as well as the test results.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1029784</commentid>
    <comment_count>3</comment_count>
      <attachid>236190</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-18 09:40:14 -0700</bug_when>
    <thetext>Comment on attachment 236190
Patch

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

Thanks for the detailed review

&gt;&gt; Source/WebCore/rendering/RenderGrid.cpp:546
&gt;&gt; +static bool gridItemWithSpanSorter(const GridItemWithSpan&amp; item1, const GridItemWithSpan&amp; item2)
&gt; 
&gt; This function should only compare the span values. It should not compare the RenderBox pointers. It should be named isSpanLessThan, not “grid item with span sorter”, because this comparison function is neither something that returns a “grid item” nor a “sorter”; the current item makes it sound like it returns a “grid item” that has a “span sorter”. Or we could use the naming scheme we use elsewhere with stable_sort and call this compareSpans; not great but better than this name.

See bellow...

&gt;&gt; Source/WebCore/rendering/RenderGrid.cpp:551
&gt;&gt; +    return item1.first &lt; item2.first;
&gt; 
&gt; It is incorrect to sort by comparing pointers. In fact, it can even be a security problem to sort things by pointer value.

Note that the only reason to have that comparison is to place duplicated pointers together so that std::unique() could remove them later. Maybe I should use a different approach then...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1029988</commentid>
    <comment_count>4</comment_count>
      <attachid>236190</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-19 02:19:00 -0700</bug_when>
    <thetext>Comment on attachment 236190
Patch

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

&gt;&gt; Source/WebCore/rendering/RenderGrid.cpp:542
&gt;&gt; +typedef std::pair&lt;RenderBox*, size_t&gt; GridItemWithSpan;
&gt; 
&gt; Might be easier to read the code if this was a class or struct instead of a pair. It’s not at all clear that “first” is the grid item and “second” is the span.
&gt; 
&gt; It doesn’t make sense to use size_t for a span, since a span is not a memory-object-size concept. I’m not sure why the existing code does this; it should not. The type should be unsigned unless there is some reason it needs to be 64-bit. I think that generally this file is overusing the size_t type a lot. But especially for the span value, since we are using toInt to compute the values here, this is an unwanted mix of types, since int is 32-bit and size_t is often 64-bit.

I think the reason why size_t was initially used is because we deal with Vectors and indexes into Vectors. Those indexes are size_t (the same as vector sizes) so even if we use unsigned we&apos;ll have to deal with those mix of types.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1030102</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-08-19 14:01:42 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; I think the reason why size_t was initially used is because we deal with Vectors and indexes into Vectors. Those indexes are size_t (the same as vector sizes) so even if we use unsigned we&apos;ll have to deal with those mix of types.

Is a span integer used as an index into a Vector?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1030253</commentid>
    <comment_count>6</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-20 03:51:56 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; I think the reason why size_t was initially used is because we deal with Vectors and indexes into Vectors. Those indexes are size_t (the same as vector sizes) so even if we use unsigned we&apos;ll have to deal with those mix of types.
&gt; 
&gt; Is a span integer used as an index into a Vector?

The span integer can be arbitrary large, as long as the number of columns/rows in the grid. Since we use vectors internally to represent the grid it can be indeed understood as a difference between indexes in a vector.

Apart from that there are many other places using size_t due to the fact that we use vectors, for example the number of columns/rows is computed as vector.size() which is a size_t as well.

The spec does not define any limit to the number of tracks (columns/rows) in a grid. What we could do is to suggest the grid editors to allow implementors to set a cap. That is already allowed for the repeat() function so it seems sensible to me to extend it to grid track definitions that do not use repeat(). For example in the case of repeat() we have 10000 as a limit. Knowing that we have some kind of limit will allow us to safely use unsigned types keeping the internal representation using in Vectors. What do you think?

In any case, can we move this discussion to a different bug? Seems like the size_t vs unsigned issue is orthogonal to the problem this bug is trying to fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1030278</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-08-20 09:00:21 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; In any case, can we move this discussion to a different bug?

Sure thing, you can move it wherever you like.

It’s a bad pattern to use data types that are based on the memory model of the computer in a way that produces observable web-page-visible differences.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1030288</commentid>
    <comment_count>8</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-08-20 09:46:39 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; In any case, can we move this discussion to a different bug?
&gt; 
&gt; Sure thing, you can move it wherever you like.

Cool, I think it&apos;d be nice to have a different bug to replace the usage of size_t by unsigned.
 
&gt; It’s a bad pattern to use data types that are based on the memory model of the computer in a way that produces observable web-page-visible differences.

Sure thing. I mean, although I&apos;m maintaining that code right now, the fact is that I was not the original implementor so I was just guessing, not sure about the exact reasons.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1034861</commentid>
    <comment_count>9</comment_count>
      <attachid>238028</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-09-12 08:02:17 -0700</bug_when>
    <thetext>Created attachment 238028
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1035038</commentid>
    <comment_count>10</comment_count>
      <attachid>238028</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-09-12 18:01:16 -0700</bug_when>
    <thetext>Comment on attachment 238028
Patch

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

&gt; Source/WebCore/rendering/RenderGrid.cpp:544
&gt; +    RenderBox* gridItem() const { return m_gridItem; }

This should return RenderBox&amp;.

&gt; Source/WebCore/rendering/RenderGrid.cpp:553
&gt; +    RenderBox* m_gridItem;

This could also be std::reference_wrapper&lt;RenderBox&gt;.

&gt; Source/WebCore/rendering/RenderGrid.cpp:563
&gt;      for (size_t i = 0; i &lt; sizingData.contentSizedTracksIndex.size(); ++i) {
&gt;          GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]);

This loop should be a modern for loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1035240</commentid>
    <comment_count>11</comment_count>
      <attachid>238028</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-09-15 07:05:28 -0700</bug_when>
    <thetext>Comment on attachment 238028
Patch

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

&gt;&gt; Source/WebCore/rendering/RenderGrid.cpp:553
&gt;&gt; +    RenderBox* m_gridItem;
&gt; 
&gt; This could also be std::reference_wrapper&lt;RenderBox&gt;.

Oh didn&apos;t know about it. Thanks for pointing out.

&gt;&gt; Source/WebCore/rendering/RenderGrid.cpp:563
&gt;&gt;          GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]);
&gt; 
&gt; This loop should be a modern for loop.

The thing is that we use i to access another vectors at the end of the for loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1035243</commentid>
    <comment_count>12</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-09-15 07:21:03 -0700</bug_when>
    <thetext>Committed r173620: &lt;http://trac.webkit.org/changeset/173620&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>236190</attachid>
            <date>2014-08-07 09:13:33 -0700</date>
            <delta_ts>2014-09-12 08:02:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-135701-20140807181320.patch</filename>
            <type>text/plain</type>
            <size>12378</size>
            <attacher name="Sergio Villar Senin">svillar</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTcyMjA2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmQ3NzM5N2I5OTk5ZmYy
YTBjODZiYmJlMzVjMGEzNjQ1NGFkNDk0NS4uZTk2YmIzMjM0OGJmZjFjNDNjYzI4MTk4NTdlZjMz
MWMyMTQzZWIyMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI4IEBACisyMDE0LTA4LTA3ICBTZXJn
aW8gVmlsbGFyIFNlbmluICA8c3ZpbGxhckBpZ2FsaWEuY29tPgorCisgICAgICAgIFtDU1MgR3Jp
ZCBMYXlvdXRdIFNvcnQgaXRlbXMgYnkgc3BhbiB3aGVuIHJlc29sdmluZyBjb250ZW50LWJhc2Vk
IHRyYWNrIHNpemluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTEzNTcwMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFNlY3Rpb24gMTAuNCBvZiB0aGUgc3BlY3MgbWVudGlvbnMgdGhhdCB3
ZSBzaG91bGQgZmlyc3QgdHJlYXQgbm9uCisgICAgICAgIHNwYW5uaW5nIGl0ZW1zIGFuZCB0aGVu
IGluY3JlbWVudGFsbHkgcHJvY2VlZCB3aXRoIGl0ZW1zIHdpdGgKKyAgICAgICAgZ3JlYXRlciBz
cGFucyB3aGVuIHJlc29sdmluZyB0aGUgdHJhY2sgYnJlYXRocyBpbiB0aGUgVHJhY2sgU2l6aW5n
CisgICAgICAgIEFsZ29yaXRobS4KKworICAgICAgICBBcyBhIG5pY2Ugc2lkZSBlZmZlY3Qgd2Un
cmUgcmVtb3ZpbmcgdGhlIG11bHRpcGxlIHByb2Nlc3Npbmcgb2YKKyAgICAgICAgc3Bhbm5pbmcg
Z3JpZCBpdGVtcyBjYXVzZWQgYnkgR3JpZEl0ZXJhdG9yIChpdCByZXR1cm5zIHRoZSBzYW1lCisg
ICAgICAgIGl0ZW0gYXMgbWFueSB0aW1lcyBhcyB0aGUgbnVtYmVyIG9mIGNlbGxzIGl0IHNwYW5z
KS4KKworICAgICAgICBUZXN0OiBmYXN0L2Nzcy1ncmlkLWxheW91dC9ncmlkLWl0ZW0tb3JkZXIt
aW4tY29udGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24uaHRtbAorCisgICAgICAgICogcmVu
ZGVyaW5nL1JlbmRlckdyaWQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyR3JpZDo6Z3Jp
ZEl0ZW1TcGFuKToKKyAgICAgICAgKFdlYkNvcmU6OmdyaWRJdGVtV2l0aFNwYW5Tb3J0ZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6dW5pcXVlUG9pbnRlckluUGFpcik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJHcmlkOjpyZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnMpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJHcmlkLmg6CisKIDIwMTQtMDgtMDYgIEJyZW50IEZ1
bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAKICAgICAgICAgW1dpbl0gQ29ycmVjdCBidWls
ZCBlcnJvcnMgd2hlbiBXZWJHTCBEaXNhYmxlZApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckdyaWQuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckdyaWQuY3BwCmluZGV4IDk1N2ZlZWM1NmQ3ZjFkNzlmZWU0YzgwZjIxZGYwOTFkMTc2ZWQ3NDIu
LmM3Zjk1MmUwZGM4ODY1Mzg1ODA3ODM2ZTcwZDMzZWExZDFjYmNiYmQgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyR3JpZC5jcHAKQEAgLTUzMSwxMyArNTMxLDQ2IEBAIExheW91dFVu
aXQgUmVuZGVyR3JpZDo6bWF4Q29udGVudEZvckNoaWxkKFJlbmRlckJveCogY2hpbGQsIEdyaWRU
cmFja1NpemluZ0RpcmVjCiAgICAgcmV0dXJuIGxvZ2ljYWxDb250ZW50SGVpZ2h0Rm9yQ2hpbGQo
Y2hpbGQsIGNvbHVtblRyYWNrcyk7CiB9CiAKK3NpemVfdCBSZW5kZXJHcmlkOjpncmlkSXRlbVNw
YW4oY29uc3QgUmVuZGVyQm94KiBjaGlsZCwgR3JpZFRyYWNrU2l6aW5nRGlyZWN0aW9uIGRpcmVj
dGlvbikKK3sKKyAgICBHcmlkQ29vcmRpbmF0ZSBjaGlsZENvb3JkaW5hdGUgPSBjYWNoZWRHcmlk
Q29vcmRpbmF0ZShjaGlsZCk7CisgICAgR3JpZFNwYW4gY2hpbGRTcGFuID0gKGRpcmVjdGlvbiA9
PSBGb3JSb3dzKSA/IGNoaWxkQ29vcmRpbmF0ZS5yb3dzIDogY2hpbGRDb29yZGluYXRlLmNvbHVt
bnM7CisKKyAgICByZXR1cm4gY2hpbGRTcGFuLnJlc29sdmVkRmluYWxQb3NpdGlvbi50b0ludCgp
IC0gY2hpbGRTcGFuLnJlc29sdmVkSW5pdGlhbFBvc2l0aW9uLnRvSW50KCkgKyAxOworfQorCit0
eXBlZGVmIHN0ZDo6cGFpcjxSZW5kZXJCb3gqLCBzaXplX3Q+IEdyaWRJdGVtV2l0aFNwYW47CisK
Ky8vIFRoaXMgZnVuY3Rpb24gc29ydHMgYnkgc3BhbiAoLnNlY29uZCBpbiB0aGUgcGFpcikgYnV0
IGFsc28gcGxhY2VzIHBvaW50ZXJzICguZmlyc3QgaW4gdGhlIHBhaXIpIHRvIHRoZSBzYW1lIG9i
amVjdCBpbgorLy8gY29uc2VjdXRpdmUgcG9zaXRpb25zIHNvIGR1cGxpY2F0ZXMgY291bGQgYmUg
ZWFzaWx5IHJlbW92ZWQgd2l0aCBzdGQ6OnVuaXF1ZSgpIGZvciBleGFtcGxlLgorc3RhdGljIGJv
b2wgZ3JpZEl0ZW1XaXRoU3BhblNvcnRlcihjb25zdCBHcmlkSXRlbVdpdGhTcGFuJiBpdGVtMSwg
Y29uc3QgR3JpZEl0ZW1XaXRoU3BhbiYgaXRlbTIpCit7CisgICAgaWYgKGl0ZW0xLnNlY29uZCAh
PSBpdGVtMi5zZWNvbmQpCisgICAgICAgIHJldHVybiBpdGVtMS5zZWNvbmQgPCBpdGVtMi5zZWNv
bmQ7CisKKyAgICByZXR1cm4gaXRlbTEuZmlyc3QgPCBpdGVtMi5maXJzdDsKK30KKworc3RhdGlj
IGJvb2wgdW5pcXVlUG9pbnRlckluUGFpcihjb25zdCBHcmlkSXRlbVdpdGhTcGFuJiBpdGVtMSwg
Y29uc3QgR3JpZEl0ZW1XaXRoU3BhbiYgaXRlbTIpCit7CisgICAgcmV0dXJuIGl0ZW0xLmZpcnN0
ID09IGl0ZW0yLmZpcnN0OworfQorCiB2b2lkIFJlbmRlckdyaWQ6OnJlc29sdmVDb250ZW50QmFz
ZWRUcmFja1NpemluZ0Z1bmN0aW9ucyhHcmlkVHJhY2tTaXppbmdEaXJlY3Rpb24gZGlyZWN0aW9u
LCBHcmlkU2l6aW5nRGF0YSYgc2l6aW5nRGF0YSkKIHsKICAgICAvLyBGSVhNRTogU3BsaXQgdGhl
IGdyaWQgdHJhY2tzIGludG8gZ3JvdXBzIHRoYXQgZG9lc24ndCBvdmVybGFwIGEgPGZsZXg+IGdy
aWQgdHJhY2suCiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemluZ0RhdGEuY29udGVu
dFNpemVkVHJhY2tzSW5kZXguc2l6ZSgpOyArK2kpIHsKICAgICAgICAgR3JpZEl0ZXJhdG9yIGl0
ZXJhdG9yKG1fZ3JpZCwgZGlyZWN0aW9uLCBzaXppbmdEYXRhLmNvbnRlbnRTaXplZFRyYWNrc0lu
ZGV4W2ldKTsKLSAgICAgICAgd2hpbGUgKFJlbmRlckJveCogZ3JpZEl0ZW0gPSBpdGVyYXRvci5u
ZXh0R3JpZEl0ZW0oKSkgeworICAgICAgICBWZWN0b3I8R3JpZEl0ZW1XaXRoU3Bhbj4gaXRlbXNT
b3J0ZWRCeUluY3JlYXNpbmdTcGFuOworCisgICAgICAgIHdoaWxlIChSZW5kZXJCb3gqIGdyaWRJ
dGVtID0gaXRlcmF0b3IubmV4dEdyaWRJdGVtKCkpCisgICAgICAgICAgICBpdGVtc1NvcnRlZEJ5
SW5jcmVhc2luZ1NwYW4uYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGdyaWRJdGVtLCBncmlkSXRlbVNw
YW4oZ3JpZEl0ZW0sIGRpcmVjdGlvbikpKTsKKyAgICAgICAgc3RkOjpzdGFibGVfc29ydChpdGVt
c1NvcnRlZEJ5SW5jcmVhc2luZ1NwYW4uYmVnaW4oKSwgaXRlbXNTb3J0ZWRCeUluY3JlYXNpbmdT
cGFuLmVuZCgpLCBncmlkSXRlbVdpdGhTcGFuU29ydGVyKTsKKyAgICAgICAgVmVjdG9yPEdyaWRJ
dGVtV2l0aFNwYW4+OjppdGVyYXRvciBlbmQgPSBzdGQ6OnVuaXF1ZShpdGVtc1NvcnRlZEJ5SW5j
cmVhc2luZ1NwYW4uYmVnaW4oKSwgaXRlbXNTb3J0ZWRCeUluY3JlYXNpbmdTcGFuLmVuZCgpLCB1
bmlxdWVQb2ludGVySW5QYWlyKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgPSBpdGVtc1NvcnRl
ZEJ5SW5jcmVhc2luZ1NwYW4uYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAg
ICBSZW5kZXJCb3gqIGdyaWRJdGVtID0gaXQtPmZpcnN0OwogICAgICAgICAgICAgcmVzb2x2ZUNv
bnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXMoZGlyZWN0aW9uLCBzaXppbmdE
YXRhLCBncmlkSXRlbSwgJkdyaWRUcmFja1NpemU6Omhhc01pbk9yTWF4Q29udGVudE1pblRyYWNr
QnJlYWR0aCwgJlJlbmRlckdyaWQ6Om1pbkNvbnRlbnRGb3JDaGlsZCwgJkdyaWRUcmFjazo6dXNl
ZEJyZWFkdGgsICZHcmlkVHJhY2s6Omdyb3dVc2VkQnJlYWR0aCk7CiAgICAgICAgICAgICByZXNv
bHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyhkaXJlY3Rpb24sIHNp
emluZ0RhdGEsIGdyaWRJdGVtLCAmR3JpZFRyYWNrU2l6ZTo6aGFzTWF4Q29udGVudE1pblRyYWNr
QnJlYWR0aCwgJlJlbmRlckdyaWQ6Om1heENvbnRlbnRGb3JDaGlsZCwgJkdyaWRUcmFjazo6dXNl
ZEJyZWFkdGgsICZHcmlkVHJhY2s6Omdyb3dVc2VkQnJlYWR0aCk7CiAgICAgICAgICAgICByZXNv
bHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyhkaXJlY3Rpb24sIHNp
emluZ0RhdGEsIGdyaWRJdGVtLCAmR3JpZFRyYWNrU2l6ZTo6aGFzTWluT3JNYXhDb250ZW50TWF4
VHJhY2tCcmVhZHRoLCAmUmVuZGVyR3JpZDo6bWluQ29udGVudEZvckNoaWxkLCAmR3JpZFRyYWNr
OjptYXhCcmVhZHRoSWZOb3RJbmZpbml0ZSwgJkdyaWRUcmFjazo6Z3Jvd01heEJyZWFkdGgpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQuaCBiL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmgKaW5kZXggOTgyNjc4ZTBjZGJmZDQ1N2Nl
ZDQzYjc3N2UwOTBiY2RhZGY1YWExMS4uYjFiZjlhZGIyZDc0NWMwMjBhZDk4OTMyM2MwMjFmZjMz
ODNjYWVhNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdyaWQu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyR3JpZC5oCkBAIC0xMTIsNiAr
MTEyLDggQEAgcHJpdmF0ZToKICAgICBib29sIGdyaWRXYXNQb3B1bGF0ZWQoKSBjb25zdCB7IHJl
dHVybiAhbV9ncmlkLmlzRW1wdHkoKSAmJiAhbV9ncmlkWzBdLmlzRW1wdHkoKTsgfQogI2VuZGlm
CiAKKyAgICBzaXplX3QgZ3JpZEl0ZW1TcGFuKGNvbnN0IFJlbmRlckJveCosIEdyaWRUcmFja1Np
emluZ0RpcmVjdGlvbik7CisKICAgICBzaXplX3QgZ3JpZENvbHVtbkNvdW50KCkgY29uc3QKICAg
ICB7CiAgICAgICAgIEFTU0VSVChncmlkV2FzUG9wdWxhdGVkKCkpOwpkaWZmIC0tZ2l0IGEvTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4IGI0YTU5MDAx
NjVjZDRjNzlmNGQ2OTRkNmZkMWM4MWI5ODVjMzgzM2UuLjdjOGJkOGI5NGE1M2QzMjE5MWJiYmJi
NjE1ZjAyOTI0MjdhYzBkY2YgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5nZUxvZworKysg
Yi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxNC0wOC0wNyAgU2Vy
Z2lvIFZpbGxhciBTZW5pbiAgPHN2aWxsYXJAaWdhbGlhLmNvbT4KKworICAgICAgICBbQ1NTIEdy
aWQgTGF5b3V0XSBTb3J0IGl0ZW1zIGJ5IHNwYW4gd2hlbiByZXNvbHZpbmcgY29udGVudC1iYXNl
ZCB0cmFjayBzaXppbmcgZnVuY3Rpb25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMzU3MDEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUZXN0cyB0aGF0IGNoZWNrIHRoYXQgaXRlbXMgYXJlIHNvcnRlZCBi
eSBzcGFuIHRvIHJlc29sdmUgY29udGVudAorICAgICAgICBiYXNlZCB0cmFjayBzaXppbmcgZnVu
Y3Rpb25zIGluc3RlYWQgb2YgZGlyZWN0bHkgdXNpbmcgRE9NIG9yZGVyLgorCisgICAgICAgICog
ZmFzdC9jc3MtZ3JpZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29s
dW1ucy1yZXNvbHV0aW9uLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogZmFzdC9jc3Mt
Z3JpZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29sdW1ucy1yZXNv
bHV0aW9uLmh0bWw6IEFkZGVkLgorCiAyMDE0LTA4LTA2ICBNYXJrIExhbSAgPG1hcmsubGFtQGFw
cGxlLmNvbT4KIAogICAgICAgICBHYXJkZW5pbmc6IGFkZGluZyBmYWlsZWQgdGVzdHMgdG8gVGVz
dEV4cGVjdGF0aW9ucy4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvY3NzLWdyaWQtbGF5
b3V0L2dyaWQtaXRlbS1vcmRlci1pbi1jb250ZW50LXNpemVkLWNvbHVtbnMtcmVzb2x1dGlvbi1l
eHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91dC9ncmlkLWl0ZW0t
b3JkZXItaW4tY29udGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24tZXhwZWN0ZWQudHh0Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmIzY2ZiMzI1NjNkY2ZmZDE5OWMwNmI3YjQ1NmQ4ZWY5Y2Q5YjViZjgKLS0tIC9k
ZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91dC9ncmlkLWl0ZW0t
b3JkZXItaW4tY29udGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24tZXhwZWN0ZWQudHh0CkBA
IC0wLDAgKzEsMjcgQEAKK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFyZSBpZGVudGljYWwg
YWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFyZSBpZGVu
dGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFy
ZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1
bW5zIGFyZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0
ZS1jb2x1bW5zIGFyZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10
ZW1wbGF0ZS1jb2x1bW5zIGFyZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1Mg
Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFyZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cgc3dhcC4K
K1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFyZSBpZGVudGljYWwgYWZ0ZXIgZ3JpZCByb3cg
c3dhcC4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQor
WFhYWFgKK1hYWCBYWFgKK1hYWFhYCitYWFggWFhYCitYWFhYWAorWFhYIFhYWAorWFhYWFgKK1hY
WCBYWFgKK1hYWFhYCitYWFggWFhYCitYWFhYWAorWFhYIFhYWAorWFhYWFgKK1hYWCBYWFgKK1hY
WFhYCitYWFggWFhYCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91
dC9ncmlkLWl0ZW0tb3JkZXItaW4tY29udGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24uaHRt
bCBiL0xheW91dFRlc3RzL2Zhc3QvY3NzLWdyaWQtbGF5b3V0L2dyaWQtaXRlbS1vcmRlci1pbi1j
b250ZW50LXNpemVkLWNvbHVtbnMtcmVzb2x1dGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkyNTQ5ODkz
NDRmYWU3ZWJiN2VmODAzYzUwYjJiNDRmZjJiNTE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlv
dXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91dC9ncmlkLWl0ZW0tb3JkZXItaW4tY29udGVudC1z
aXplZC1jb2x1bW5zLXJlc29sdXRpb24uaHRtbApAQCAtMCwwICsxLDEyMiBAQAorPCFET0NUWVBF
IGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPGxpbmsgaHJlZj0icmVzb3VyY2VzL2dyaWQuY3NzIiBy
ZWw9InN0eWxlc2hlZXQiLz4KKzxzdHlsZT4KKy5ncmlkRml4ZWRNaW5Db250ZW50QW5kRml4ZWRN
YXhDb250ZW50IHsKKyAgICAgLXdlYmtpdC1ncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgy
MHB4LCAtd2Via2l0LW1pbi1jb250ZW50KSBtaW5tYXgoMjBweCwgLXdlYmtpdC1tYXgtY29udGVu
dCk7Cit9CisuZ3JpZE1heENvbnRlbnRGaXhlZEFuZE1pbkNvbnRlbnRGaXhlZCB7CisgICAgIC13
ZWJraXQtZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoLXdlYmtpdC1tYXgtY29udGVudCwg
NTBweCkgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsIDUwcHgpOworfQorLmdyaWRGaXhlZE1p
bkNvbnRlbnRBbmRBdXRvIHsKKyAgICAgLXdlYmtpdC1ncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1p
bm1heCgyMHB4LCAtd2Via2l0LW1pbi1jb250ZW50KSBhdXRvOworfQorLmdyaWRGaXhlZE1heENv
bnRlbnRBbmRBdXRvIHsKKyAgICAgLXdlYmtpdC1ncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1h
eCgyMHB4LCAtd2Via2l0LW1heC1jb250ZW50KSBhdXRvOworfQorLmdyaWRNYXhDb250ZW50QW5k
QXV0byB7CisgICAgIC13ZWJraXQtZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAtd2Via2l0LW1heC1j
b250ZW50IGF1dG87Cit9CisuZ3JpZEF1dG9BbmRNYXhDb250ZW50IHsKKyAgICAgLXdlYmtpdC1n
cmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gLXdlYmtpdC1tYXgtY29udGVudDsKK30KKy5ncmlk
TWluQ29udGVudEFuZEF1dG8geworICAgICAtd2Via2l0LWdyaWQtdGVtcGxhdGUtY29sdW1uczog
LXdlYmtpdC1taW4tY29udGVudCBhdXRvOworfQorLmdyaWRBdXRvQW5kTWluQ29udGVudCB7Cisg
ICAgIC13ZWJraXQtZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAtd2Via2l0LW1pbi1jb250ZW50IGF1
dG87Cit9Cisuc3BhblR3byB7CisgICAgIC13ZWJraXQtZ3JpZC1jb2x1bW46IDEgLyAzOworfQor
PC9zdHlsZT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC5qcyI+PC9zY3Jp
cHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSI+Cisg
ICAgPGRpdiBpZD0iZ3JpZEZpeGVkTWluQ29udGVudEFuZEZpeGVkTWF4Q29udGVudCIgY2xhc3M9
ImdyaWQgZ3JpZEZpeGVkTWluQ29udGVudEFuZEZpeGVkTWF4Q29udGVudCI+CisJPGRpdiBjbGFz
cz0iZmlyc3RSb3dGaXJzdENvbHVtbiI+WFhYWFg8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJzcGFuVHdv
IHNlY29uZFJvd0ZpcnN0Q29sdW1uIj5YWFggWFhYPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4K
KworPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4KKyAgICA8ZGl2IGlkPSJncmlkTWF4
Q29udGVudEZpeGVkQW5kTWluQ29udGVudEZpeGVkIiBjbGFzcz0iZ3JpZCBncmlkTWF4Q29udGVu
dEZpeGVkQW5kTWluQ29udGVudEZpeGVkIj4KKwk8ZGl2IGNsYXNzPSJmaXJzdFJvd0ZpcnN0Q29s
dW1uIj5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5Ud28gc2Vjb25kUm93Rmlyc3RDb2x1
bW4iPlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3Np
dGlvbjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRGaXhlZE1pbkNvbnRlbnRBbmRBdXRv
IiBjbGFzcz0iZ3JpZCBncmlkRml4ZWRNaW5Db250ZW50QW5kQXV0byI+CisJPGRpdiBjbGFzcz0i
Zmlyc3RSb3dGaXJzdENvbHVtbiI+WFhYWFg8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJzcGFuVHdvIHNl
Y29uZFJvd0ZpcnN0Q29sdW1uIj5YWFggWFhYPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKwor
PGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4KKyAgICA8ZGl2IGlkPSJncmlkRml4ZWRN
YXhDb250ZW50QW5kQXV0byIgY2xhc3M9ImdyaWQgZ3JpZEZpeGVkTWF4Q29udGVudEFuZEF1dG8i
PgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhYWFhYPC9kaXY+CisJPGRpdiBj
bGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhYIFhYWDwvZGl2PgorICAgIDwv
ZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSI+CisgICAgPGRp
diBpZD0iZ3JpZE1heENvbnRlbnRBbmRBdXRvIiBjbGFzcz0iZ3JpZCBncmlkTWF4Q29udGVudEFu
ZEF1dG8iPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhYWFhYPC9kaXY+CisJ
PGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhYIFhYWDwvZGl2Pgor
ICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSI+Cisg
ICAgPGRpdiBpZD0iZ3JpZEF1dG9BbmRNYXhDb250ZW50IiBjbGFzcz0iZ3JpZCBncmlkQXV0b0Fu
ZE1heENvbnRlbnQiPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhYWFhYPC9k
aXY+CisJPGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhYIFhYWDwv
ZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2
ZSI+CisgICAgPGRpdiBpZD0iZ3JpZE1pbkNvbnRlbnRBbmRBdXRvIiBjbGFzcz0iZ3JpZCBncmlk
TWluQ29udGVudEFuZEF1dG8iPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhY
WFhYPC9kaXY+CisJPGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhY
IFhYWDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiBy
ZWxhdGl2ZSI+CisgICAgPGRpdiBpZD0iZ3JpZEF1dG9BbmRNaW5Db250ZW50IiBjbGFzcz0iZ3Jp
ZCBncmlkQXV0b0FuZE1pbkNvbnRlbnQiPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1
bW4iPlhYWFhYPC9kaXY+CisJPGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVt
biI+WFhYIFhYWDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzwvYm9keT4KKzxzY3JpcHQg
c3JjPSJyZXNvdXJjZXMvZ3JpZC1kZWZpbml0aW9ucy1wYXJzaW5nLXV0aWxzLmpzIj48L3Njcmlw
dD4KKzxzY3JpcHQ+CisKK2Z1bmN0aW9uIGNoZWNrVHJhY2tCcmVhZHRoQWZ0ZXJJdGVtUm93U3dh
cChncmlkSWQpCit7CisgICAgIHdpbmRvdy5ncmlkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKGdyaWRJZCk7CisgICAgIHZhciBvbGRWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUoZ3Jp
ZEVsZW1lbnQsICcnKS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LWdyaWQtdGVtcGxhdGUtY29s
dW1ucycpOworICAgICB2YXIgZmlyc3RDaGlsZFJvdyA9IGdldENvbXB1dGVkU3R5bGUoZ3JpZEVs
ZW1lbnQuY2hpbGRyZW5bMF0sJycpLmdldFByb3BlcnR5VmFsdWUoJy13ZWJraXQtZ3JpZC1yb3cn
KTsKKyAgICAgZ3JpZEVsZW1lbnQuY2hpbGRyZW5bMF0uc3R5bGUud2Via2l0R3JpZFJvdyA9IGdl
dENvbXB1dGVkU3R5bGUoZ3JpZEVsZW1lbnQuY2hpbGRyZW5bMV0sJycpLmdldFByb3BlcnR5VmFs
dWUoJy13ZWJraXQtZ3JpZC1yb3cnKTsKKyAgICAgZ3JpZEVsZW1lbnQuY2hpbGRyZW5bMV0uc3R5
bGUud2Via2l0R3JpZFJvdyA9IGZpcnN0Q2hpbGRSb3c7CisgICAgIHZhciBuZXdWYWx1ZSA9IGdl
dENvbXB1dGVkU3R5bGUoZ3JpZEVsZW1lbnQsICcnKS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0
LWdyaWQtdGVtcGxhdGUtY29sdW1ucycpOworCisgICAgIGlmIChuZXdWYWx1ZSA9PSBvbGRWYWx1
ZSkKKyAgICAgICAgIHRlc3RQYXNzZWQoImdyaWQtdGVtcGxhdGUtY29sdW1ucyBhcmUgaWRlbnRp
Y2FsIGFmdGVyIGdyaWQgcm93IHN3YXAuIik7CisgICAgIGVsc2UKKyAgICAgICAgIHRlc3RGYWls
ZWQoImdyaWQtdGVtcGxhdGUtY29sdW1ucyBzaG91bGQgYmUgIiArIG9sZFZhbHVlICsgIi4gV2Fz
ICIgKyBuZXdWYWx1ZSArICIuIik7Cit9CisKK2NoZWNrVHJhY2tCcmVhZHRoQWZ0ZXJJdGVtUm93
U3dhcCgiZ3JpZEZpeGVkTWluQ29udGVudEFuZEZpeGVkTWF4Q29udGVudCIpOworY2hlY2tUcmFj
a0JyZWFkdGhBZnRlckl0ZW1Sb3dTd2FwKCJncmlkTWF4Q29udGVudEZpeGVkQW5kTWluQ29udGVu
dEZpeGVkIik7CitjaGVja1RyYWNrQnJlYWR0aEFmdGVySXRlbVJvd1N3YXAoImdyaWRGaXhlZE1p
bkNvbnRlbnRBbmRBdXRvIik7CitjaGVja1RyYWNrQnJlYWR0aEFmdGVySXRlbVJvd1N3YXAoImdy
aWRGaXhlZE1heENvbnRlbnRBbmRBdXRvIik7CitjaGVja1RyYWNrQnJlYWR0aEFmdGVySXRlbVJv
d1N3YXAoImdyaWRNYXhDb250ZW50QW5kQXV0byIpOworY2hlY2tUcmFja0JyZWFkdGhBZnRlckl0
ZW1Sb3dTd2FwKCJncmlkQXV0b0FuZE1heENvbnRlbnQiKTsKK2NoZWNrVHJhY2tCcmVhZHRoQWZ0
ZXJJdGVtUm93U3dhcCgiZ3JpZE1pbkNvbnRlbnRBbmRBdXRvIik7CitjaGVja1RyYWNrQnJlYWR0
aEFmdGVySXRlbVJvd1N3YXAoImdyaWRBdXRvQW5kTWluQ29udGVudCIpOworCis8L3NjcmlwdD4K
KzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>238028</attachid>
            <date>2014-09-12 08:02:17 -0700</date>
            <delta_ts>2014-09-15 07:05:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-135701-20140912170212.patch</filename>
            <type>text/plain</type>
            <size>16282</size>
            <attacher name="Sergio Villar Senin">svillar</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTczNTU3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjc0NDY0MGNjYmQ3M2Yw
YjZhYTQyZGQzOWMxMDkzNzE4MjUzYWZkOC4uZWRkMzZhYjEyYjE1MGI0YjQ5NWQ5OGNmNWI5NWY5
NzhjZjdhMTczYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMwIEBACisyMDE0LTA4LTA3ICBTZXJn
aW8gVmlsbGFyIFNlbmluICA8c3ZpbGxhckBpZ2FsaWEuY29tPgorCisgICAgICAgIFtDU1MgR3Jp
ZCBMYXlvdXRdIFNvcnQgaXRlbXMgYnkgc3BhbiB3aGVuIHJlc29sdmluZyBjb250ZW50LWJhc2Vk
IHRyYWNrIHNpemluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTEzNTcwMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFNlY3Rpb24gMTAuNCBvZiB0aGUgc3BlY3MgbWVudGlvbnMgdGhhdCB3
ZSBzaG91bGQgZmlyc3QgdHJlYXQgbm9uCisgICAgICAgIHNwYW5uaW5nIGl0ZW1zIGFuZCB0aGVu
IGluY3JlbWVudGFsbHkgcHJvY2VlZCB3aXRoIGl0ZW1zIHdpdGgKKyAgICAgICAgZ3JlYXRlciBz
cGFucyB3aGVuIHJlc29sdmluZyB0aGUgdHJhY2sgYnJlYXRocyBpbiB0aGUgVHJhY2sgU2l6aW5n
CisgICAgICAgIEFsZ29yaXRobS4KKworICAgICAgICBBcyBhIG5pY2Ugc2lkZSBlZmZlY3Qgd2Un
cmUgcmVtb3ZpbmcgdGhlIG11bHRpcGxlIHByb2Nlc3Npbmcgb2YKKyAgICAgICAgc3Bhbm5pbmcg
Z3JpZCBpdGVtcyBjYXVzZWQgYnkgR3JpZEl0ZXJhdG9yIChpdCByZXR1cm5zIHRoZSBzYW1lCisg
ICAgICAgIGl0ZW0gYXMgbWFueSB0aW1lcyBhcyB0aGUgbnVtYmVyIG9mIGNlbGxzIGl0IHNwYW5z
KS4gVGhpcyBhZGRzIGEKKyAgICAgICAgfjQlIHBlcmZvcm1hbmNlIHBlbmFsdHkgaW4gYXV0by1n
cmlkLWxvdHMtb2YtZGF0YS5odG1sIG1haW5seSBkdWUKKyAgICAgICAgdG8gdGhlIHVzZSBvZiBh
IGhhc2ggdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuCisKKyAgICAgICAgVGVzdDogZmFzdC9jc3MtZ3Jp
ZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29sdW1ucy1yZXNvbHV0
aW9uLmh0bWwKKworICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJHcmlkLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckdyaWQ6OmdyaWRJdGVtU3Bhbik6CisgICAgICAgIChXZWJDb3JlOjpn
cmlkSXRlbVdpdGhTcGFuU29ydGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnVuaXF1ZVBvaW50ZXJJ
blBhaXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNl
ZFRyYWNrU2l6aW5nRnVuY3Rpb25zKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyR3JpZC5o
OgorCiAyMDE0LTA5LTExICBSeXVhbiBDaG9pICA8cnl1YW4uY2hvaUBnbWFpbC5jb20+CiAKICAg
ICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXggYXR0ZW1wdCBvbiB3aW5kb3dzIHBvcnQgc2luY2Ug
cjE3MzU1My4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlk
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmNwcAppbmRleCA0OTNk
MWQwNTMzOGIzZGI4YmMxN2QwODNjYzNmMjIzZGE2YzYxOGQ0Li40YjdlNDcwZDYyZmNmYWRhYWI3
NmRhMzZkMWUxZjViYmY5OTIwYzI2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyR3JpZC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckdy
aWQuY3BwCkBAIC01MzEsMTcgKzUzMSw1MCBAQCBMYXlvdXRVbml0IFJlbmRlckdyaWQ6Om1heENv
bnRlbnRGb3JDaGlsZChSZW5kZXJCb3gmIGNoaWxkLCBHcmlkVHJhY2tTaXppbmdEaXJlYwogICAg
IHJldHVybiBsb2dpY2FsQ29udGVudEhlaWdodEZvckNoaWxkKGNoaWxkLCBjb2x1bW5UcmFja3Mp
OwogfQogCitjbGFzcyBHcmlkSXRlbVdpdGhTcGFuIHsKK3B1YmxpYzoKKyAgICBHcmlkSXRlbVdp
dGhTcGFuKFJlbmRlckJveCYgZ3JpZEl0ZW0sIEdyaWRDb29yZGluYXRlIGNvb3JkaW5hdGUsIEdy
aWRUcmFja1NpemluZ0RpcmVjdGlvbiBkaXJlY3Rpb24pCisgICAgICAgIDogbV9ncmlkSXRlbSgm
Z3JpZEl0ZW0pCisgICAgICAgICwgbV9jb29yZGluYXRlKGNvb3JkaW5hdGUpCisgICAgeworICAg
ICAgICBjb25zdCBHcmlkU3BhbiYgc3BhbiA9IChkaXJlY3Rpb24gPT0gRm9yUm93cykgPyBjb29y
ZGluYXRlLnJvd3MgOiBjb29yZGluYXRlLmNvbHVtbnM7CisgICAgICAgIG1fc3BhbiA9IHNwYW4u
cmVzb2x2ZWRGaW5hbFBvc2l0aW9uLnRvSW50KCkgLSBzcGFuLnJlc29sdmVkSW5pdGlhbFBvc2l0
aW9uLnRvSW50KCkgKyAxOworICAgIH0KKworICAgIFJlbmRlckJveCogZ3JpZEl0ZW0oKSBjb25z
dCB7IHJldHVybiBtX2dyaWRJdGVtOyB9CisgICAgR3JpZENvb3JkaW5hdGUgY29vcmRpbmF0ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fY29vcmRpbmF0ZTsgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29u
c3QgR3JpZEl0ZW1XaXRoU3BhbiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X3NwYW4gPCBvdGhlci5tX3NwYW47CisgICAgfQorCitwcml2YXRlOgorICAgIFJlbmRlckJveCog
bV9ncmlkSXRlbTsKKyAgICBHcmlkQ29vcmRpbmF0ZSBtX2Nvb3JkaW5hdGU7CisgICAgc2l6ZV90
IG1fc3BhbjsKK307CisKIHZvaWQgUmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNr
U2l6aW5nRnVuY3Rpb25zKEdyaWRUcmFja1NpemluZ0RpcmVjdGlvbiBkaXJlY3Rpb24sIEdyaWRT
aXppbmdEYXRhJiBzaXppbmdEYXRhKQogewogICAgIC8vIEZJWE1FOiBTcGxpdCB0aGUgZ3JpZCB0
cmFja3MgaW50byBncm91cHMgdGhhdCBkb2Vzbid0IG92ZXJsYXAgYSA8ZmxleD4gZ3JpZCB0cmFj
ay4KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6aW5nRGF0YS5jb250ZW50U2l6ZWRU
cmFja3NJbmRleC5zaXplKCk7ICsraSkgewogICAgICAgICBHcmlkSXRlcmF0b3IgaXRlcmF0b3Io
bV9ncmlkLCBkaXJlY3Rpb24sIHNpemluZ0RhdGEuY29udGVudFNpemVkVHJhY2tzSW5kZXhbaV0p
OworICAgICAgICBIYXNoU2V0PFJlbmRlckJveCo+IGl0ZW1zU2V0OworICAgICAgICBWZWN0b3I8
R3JpZEl0ZW1XaXRoU3Bhbj4gaXRlbXNTb3J0ZWRCeUluY3JlYXNpbmdTcGFuOworCiAgICAgICAg
IHdoaWxlIChSZW5kZXJCb3gqIGdyaWRJdGVtID0gaXRlcmF0b3IubmV4dEdyaWRJdGVtKCkpIHsK
LSAgICAgICAgICAgIHJlc29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9uc0Zvckl0
ZW1zKGRpcmVjdGlvbiwgc2l6aW5nRGF0YSwgKmdyaWRJdGVtLCAmR3JpZFRyYWNrU2l6ZTo6aGFz
TWluT3JNYXhDb250ZW50TWluVHJhY2tCcmVhZHRoLCAmUmVuZGVyR3JpZDo6bWluQ29udGVudEZv
ckNoaWxkLCAmR3JpZFRyYWNrOjp1c2VkQnJlYWR0aCwgJkdyaWRUcmFjazo6Z3Jvd1VzZWRCcmVh
ZHRoKTsKLSAgICAgICAgICAgIHJlc29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9u
c0Zvckl0ZW1zKGRpcmVjdGlvbiwgc2l6aW5nRGF0YSwgKmdyaWRJdGVtLCAmR3JpZFRyYWNrU2l6
ZTo6aGFzTWF4Q29udGVudE1pblRyYWNrQnJlYWR0aCwgJlJlbmRlckdyaWQ6Om1heENvbnRlbnRG
b3JDaGlsZCwgJkdyaWRUcmFjazo6dXNlZEJyZWFkdGgsICZHcmlkVHJhY2s6Omdyb3dVc2VkQnJl
YWR0aCk7Ci0gICAgICAgICAgICByZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlv
bnNGb3JJdGVtcyhkaXJlY3Rpb24sIHNpemluZ0RhdGEsICpncmlkSXRlbSwgJkdyaWRUcmFja1Np
emU6Omhhc01pbk9yTWF4Q29udGVudE1heFRyYWNrQnJlYWR0aCwgJlJlbmRlckdyaWQ6Om1pbkNv
bnRlbnRGb3JDaGlsZCwgJkdyaWRUcmFjazo6bWF4QnJlYWR0aElmTm90SW5maW5pdGUsICZHcmlk
VHJhY2s6Omdyb3dNYXhCcmVhZHRoKTsKLSAgICAgICAgICAgIHJlc29sdmVDb250ZW50QmFzZWRU
cmFja1NpemluZ0Z1bmN0aW9uc0Zvckl0ZW1zKGRpcmVjdGlvbiwgc2l6aW5nRGF0YSwgKmdyaWRJ
dGVtLCAmR3JpZFRyYWNrU2l6ZTo6aGFzTWF4Q29udGVudE1heFRyYWNrQnJlYWR0aCwgJlJlbmRl
ckdyaWQ6Om1heENvbnRlbnRGb3JDaGlsZCwgJkdyaWRUcmFjazo6bWF4QnJlYWR0aElmTm90SW5m
aW5pdGUsICZHcmlkVHJhY2s6Omdyb3dNYXhCcmVhZHRoKTsKKyAgICAgICAgICAgIGlmIChpdGVt
c1NldC5hZGQoZ3JpZEl0ZW0pLmlzTmV3RW50cnkpCisgICAgICAgICAgICAgICAgaXRlbXNTb3J0
ZWRCeUluY3JlYXNpbmdTcGFuLmFwcGVuZChHcmlkSXRlbVdpdGhTcGFuKCpncmlkSXRlbSwgY2Fj
aGVkR3JpZENvb3JkaW5hdGUoKmdyaWRJdGVtKSwgZGlyZWN0aW9uKSk7CisgICAgICAgIH0KKyAg
ICAgICAgc3RkOjpzdGFibGVfc29ydChpdGVtc1NvcnRlZEJ5SW5jcmVhc2luZ1NwYW4uYmVnaW4o
KSwgaXRlbXNTb3J0ZWRCeUluY3JlYXNpbmdTcGFuLmVuZCgpKTsKKworICAgICAgICBmb3IgKGF1
dG8mIGl0ZW1XaXRoU3BhbiA6IGl0ZW1zU29ydGVkQnlJbmNyZWFzaW5nU3BhbikgeworICAgICAg
ICAgICAgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXMoZGly
ZWN0aW9uLCBzaXppbmdEYXRhLCBpdGVtV2l0aFNwYW4sICZHcmlkVHJhY2tTaXplOjpoYXNNaW5P
ck1heENvbnRlbnRNaW5UcmFja0JyZWFkdGgsICZSZW5kZXJHcmlkOjptaW5Db250ZW50Rm9yQ2hp
bGQsICZHcmlkVHJhY2s6OnVzZWRCcmVhZHRoLCAmR3JpZFRyYWNrOjpncm93VXNlZEJyZWFkdGgp
OworICAgICAgICAgICAgcmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9y
SXRlbXMoZGlyZWN0aW9uLCBzaXppbmdEYXRhLCBpdGVtV2l0aFNwYW4sICZHcmlkVHJhY2tTaXpl
OjpoYXNNYXhDb250ZW50TWluVHJhY2tCcmVhZHRoLCAmUmVuZGVyR3JpZDo6bWF4Q29udGVudEZv
ckNoaWxkLCAmR3JpZFRyYWNrOjp1c2VkQnJlYWR0aCwgJkdyaWRUcmFjazo6Z3Jvd1VzZWRCcmVh
ZHRoKTsKKyAgICAgICAgICAgIHJlc29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9u
c0Zvckl0ZW1zKGRpcmVjdGlvbiwgc2l6aW5nRGF0YSwgaXRlbVdpdGhTcGFuLCAmR3JpZFRyYWNr
U2l6ZTo6aGFzTWluT3JNYXhDb250ZW50TWF4VHJhY2tCcmVhZHRoLCAmUmVuZGVyR3JpZDo6bWlu
Q29udGVudEZvckNoaWxkLCAmR3JpZFRyYWNrOjptYXhCcmVhZHRoSWZOb3RJbmZpbml0ZSwgJkdy
aWRUcmFjazo6Z3Jvd01heEJyZWFkdGgpOworICAgICAgICAgICAgcmVzb2x2ZUNvbnRlbnRCYXNl
ZFRyYWNrU2l6aW5nRnVuY3Rpb25zRm9ySXRlbXMoZGlyZWN0aW9uLCBzaXppbmdEYXRhLCBpdGVt
V2l0aFNwYW4sICZHcmlkVHJhY2tTaXplOjpoYXNNYXhDb250ZW50TWF4VHJhY2tCcmVhZHRoLCAm
UmVuZGVyR3JpZDo6bWF4Q29udGVudEZvckNoaWxkLCAmR3JpZFRyYWNrOjptYXhCcmVhZHRoSWZO
b3RJbmZpbml0ZSwgJkdyaWRUcmFjazo6Z3Jvd01heEJyZWFkdGgpOwogICAgICAgICB9CiAKICAg
ICAgICAgR3JpZFRyYWNrJiB0cmFjayA9IChkaXJlY3Rpb24gPT0gRm9yQ29sdW1ucykgPyBzaXpp
bmdEYXRhLmNvbHVtblRyYWNrc1tpXSA6IHNpemluZ0RhdGEucm93VHJhY2tzW2ldOwpAQCAtNTUw
LDkgKzU4Myw5IEBAIHZvaWQgUmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6
aW5nRnVuY3Rpb25zKEdyaWRUcmFja1NpemluZ0RpcmVjdGlvCiAgICAgfQogfQogCi12b2lkIFJl
bmRlckdyaWQ6OnJlc29sdmVDb250ZW50QmFzZWRUcmFja1NpemluZ0Z1bmN0aW9uc0Zvckl0ZW1z
KEdyaWRUcmFja1NpemluZ0RpcmVjdGlvbiBkaXJlY3Rpb24sIEdyaWRTaXppbmdEYXRhJiBzaXpp
bmdEYXRhLCBSZW5kZXJCb3gmIGdyaWRJdGVtLCBGaWx0ZXJGdW5jdGlvbiBmaWx0ZXJGdW5jdGlv
biwgU2l6aW5nRnVuY3Rpb24gc2l6aW5nRnVuY3Rpb24sIEFjY3VtdWxhdG9yR2V0dGVyIHRyYWNr
R2V0dGVyLCBBY2N1bXVsYXRvckdyb3dGdW5jdGlvbiB0cmFja0dyb3d0aEZ1bmN0aW9uKQordm9p
ZCBSZW5kZXJHcmlkOjpyZXNvbHZlQ29udGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJ
dGVtcyhHcmlkVHJhY2tTaXppbmdEaXJlY3Rpb24gZGlyZWN0aW9uLCBHcmlkU2l6aW5nRGF0YSYg
c2l6aW5nRGF0YSwgR3JpZEl0ZW1XaXRoU3BhbiYgZ3JpZEl0ZW1XaXRoU3BhbiwgRmlsdGVyRnVu
Y3Rpb24gZmlsdGVyRnVuY3Rpb24sIFNpemluZ0Z1bmN0aW9uIHNpemluZ0Z1bmN0aW9uLCBBY2N1
bXVsYXRvckdldHRlciB0cmFja0dldHRlciwgQWNjdW11bGF0b3JHcm93RnVuY3Rpb24gdHJhY2tH
cm93dGhGdW5jdGlvbikKIHsKLSAgICBjb25zdCBHcmlkQ29vcmRpbmF0ZSBjb29yZGluYXRlID0g
Y2FjaGVkR3JpZENvb3JkaW5hdGUoZ3JpZEl0ZW0pOworICAgIGNvbnN0IEdyaWRDb29yZGluYXRl
JiBjb29yZGluYXRlID0gZ3JpZEl0ZW1XaXRoU3Bhbi5jb29yZGluYXRlKCk7CiAgICAgY29uc3Qg
R3JpZFJlc29sdmVkUG9zaXRpb24gaW5pdGlhbFRyYWNrUG9zaXRpb24gPSAoZGlyZWN0aW9uID09
IEZvckNvbHVtbnMpID8gY29vcmRpbmF0ZS5jb2x1bW5zLnJlc29sdmVkSW5pdGlhbFBvc2l0aW9u
IDogY29vcmRpbmF0ZS5yb3dzLnJlc29sdmVkSW5pdGlhbFBvc2l0aW9uOwogICAgIGNvbnN0IEdy
aWRSZXNvbHZlZFBvc2l0aW9uIGZpbmFsVHJhY2tQb3NpdGlvbiA9IChkaXJlY3Rpb24gPT0gRm9y
Q29sdW1ucykgPyBjb29yZGluYXRlLmNvbHVtbnMucmVzb2x2ZWRGaW5hbFBvc2l0aW9uIDogY29v
cmRpbmF0ZS5yb3dzLnJlc29sdmVkRmluYWxQb3NpdGlvbjsKIApAQCAtNTY5LDcgKzYwMiw3IEBA
IHZvaWQgUmVuZGVyR3JpZDo6cmVzb2x2ZUNvbnRlbnRCYXNlZFRyYWNrU2l6aW5nRnVuY3Rpb25z
Rm9ySXRlbXMoR3JpZFRyYWNrU2l6aW5nCiAgICAgaWYgKHNpemluZ0RhdGEuZmlsdGVyZWRUcmFj
a3MuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBMYXlvdXRVbml0IGFkZGl0aW9u
YWxCcmVhZHRoU3BhY2UgPSAodGhpcy0+KnNpemluZ0Z1bmN0aW9uKShncmlkSXRlbSwgZGlyZWN0
aW9uLCBzaXppbmdEYXRhLmNvbHVtblRyYWNrcyk7CisgICAgTGF5b3V0VW5pdCBhZGRpdGlvbmFs
QnJlYWR0aFNwYWNlID0gKHRoaXMtPipzaXppbmdGdW5jdGlvbikoKmdyaWRJdGVtV2l0aFNwYW4u
Z3JpZEl0ZW0oKSwgZGlyZWN0aW9uLCBzaXppbmdEYXRhLmNvbHVtblRyYWNrcyk7CiAgICAgZm9y
IChHcmlkUmVzb2x2ZWRQb3NpdGlvbiB0cmFja1Bvc2l0aW9uRm9yU3BhY2UgPSBpbml0aWFsVHJh
Y2tQb3NpdGlvbjsgdHJhY2tQb3NpdGlvbkZvclNwYWNlIDw9IGZpbmFsVHJhY2tQb3NpdGlvbjsg
Kyt0cmFja1Bvc2l0aW9uRm9yU3BhY2UpIHsKICAgICAgICAgR3JpZFRyYWNrJiB0cmFjayA9IChk
aXJlY3Rpb24gPT0gRm9yQ29sdW1ucykgPyBzaXppbmdEYXRhLmNvbHVtblRyYWNrc1t0cmFja1Bv
c2l0aW9uRm9yU3BhY2UudG9JbnQoKV0gOiBzaXppbmdEYXRhLnJvd1RyYWNrc1t0cmFja1Bvc2l0
aW9uRm9yU3BhY2UudG9JbnQoKV07CiAgICAgICAgIGFkZGl0aW9uYWxCcmVhZHRoU3BhY2UgLT0g
KHRyYWNrLip0cmFja0dldHRlcikoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJHcmlkLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyR3JpZC5o
CmluZGV4IDkwZjNkMGY5ZWQ5OWI0MGFjZDM3OGE1YWJkODU4MjY5YjdhZTlmNDkuLjk3ZjQ3NGM0
ODYyNzQ2YjkxMGE4MTM5MmI2ODhkYWUzMWY5YjUyMzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJHcmlkLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckdyaWQuaApAQCAtMzgsNiArMzgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFz
cyBHcmlkQ29vcmRpbmF0ZTsKIGNsYXNzIEdyaWRTcGFuOwogY2xhc3MgR3JpZFRyYWNrOworY2xh
c3MgR3JpZEl0ZW1XaXRoU3BhbjsKIAogY2xhc3MgUmVuZGVyR3JpZCBmaW5hbCA6IHB1YmxpYyBS
ZW5kZXJCbG9jayB7CiBwdWJsaWM6CkBAIC05MCw3ICs5MSw3IEBAIHByaXZhdGU6CiAgICAgdHlw
ZWRlZiBMYXlvdXRVbml0IChHcmlkVHJhY2s6OiogQWNjdW11bGF0b3JHZXR0ZXIpKCkgY29uc3Q7
CiAgICAgdHlwZWRlZiB2b2lkIChHcmlkVHJhY2s6OiogQWNjdW11bGF0b3JHcm93RnVuY3Rpb24p
KExheW91dFVuaXQpOwogICAgIHR5cGVkZWYgYm9vbCAoR3JpZFRyYWNrU2l6ZTo6KiBGaWx0ZXJG
dW5jdGlvbikoKSBjb25zdDsKLSAgICB2b2lkIHJlc29sdmVDb250ZW50QmFzZWRUcmFja1Npemlu
Z0Z1bmN0aW9uc0Zvckl0ZW1zKEdyaWRUcmFja1NpemluZ0RpcmVjdGlvbiwgR3JpZFNpemluZ0Rh
dGEmLCBSZW5kZXJCb3gmLCBGaWx0ZXJGdW5jdGlvbiwgU2l6aW5nRnVuY3Rpb24sIEFjY3VtdWxh
dG9yR2V0dGVyLCBBY2N1bXVsYXRvckdyb3dGdW5jdGlvbik7CisgICAgdm9pZCByZXNvbHZlQ29u
dGVudEJhc2VkVHJhY2tTaXppbmdGdW5jdGlvbnNGb3JJdGVtcyhHcmlkVHJhY2tTaXppbmdEaXJl
Y3Rpb24sIEdyaWRTaXppbmdEYXRhJiwgR3JpZEl0ZW1XaXRoU3BhbiYsIEZpbHRlckZ1bmN0aW9u
LCBTaXppbmdGdW5jdGlvbiwgQWNjdW11bGF0b3JHZXR0ZXIsIEFjY3VtdWxhdG9yR3Jvd0Z1bmN0
aW9uKTsKICAgICB2b2lkIGRpc3RyaWJ1dGVTcGFjZVRvVHJhY2tzKFZlY3RvcjxHcmlkVHJhY2sq
PiYsIFZlY3RvcjxHcmlkVHJhY2sqPiogdHJhY2tzRm9yR3Jvd3RoQWJvdmVNYXhCcmVhZHRoLCBB
Y2N1bXVsYXRvckdldHRlciwgQWNjdW11bGF0b3JHcm93RnVuY3Rpb24sIEdyaWRTaXppbmdEYXRh
JiwgTGF5b3V0VW5pdCYgYXZhaWxhYmxlTG9naWNhbFNwYWNlKTsKIAogICAgIGRvdWJsZSBjb21w
dXRlTm9ybWFsaXplZEZyYWN0aW9uQnJlYWR0aChWZWN0b3I8R3JpZFRyYWNrPiYsIGNvbnN0IEdy
aWRTcGFuJiB0cmFja3NTcGFuLCBHcmlkVHJhY2tTaXppbmdEaXJlY3Rpb24sIExheW91dFVuaXQg
YXZhaWxhYmxlTG9naWNhbFNwYWNlKSBjb25zdDsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0No
YW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCAxOTQ4ZmE5Y2JkZjljMzEwYTEz
OTU5ODA0YTc5NmYxOTA1ZDc2ZmFjLi5iNDkwMzgxYTk4MTUwYjhlY2NlMmIzMzAyYThlMTA0YWNl
MzUxMWI3IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTQtMDgtMDcgIFNlcmdpbyBWaWxsYXIg
U2VuaW4gIDxzdmlsbGFyQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0NTUyBHcmlkIExheW91dF0g
U29ydCBpdGVtcyBieSBzcGFuIHdoZW4gcmVzb2x2aW5nIGNvbnRlbnQtYmFzZWQgdHJhY2sgc2l6
aW5nIGZ1bmN0aW9ucworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTM1NzAxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGVzdHMgdGhhdCBjaGVjayB0aGF0IGl0ZW1zIGFyZSBzb3J0ZWQgYnkgc3BhbiB0byBy
ZXNvbHZlIGNvbnRlbnQKKyAgICAgICAgYmFzZWQgdHJhY2sgc2l6aW5nIGZ1bmN0aW9ucyBpbnN0
ZWFkIG9mIGRpcmVjdGx5IHVzaW5nIERPTSBvcmRlci4KKworICAgICAgICAqIGZhc3QvY3NzLWdy
aWQtbGF5b3V0L2dyaWQtaXRlbS1vcmRlci1pbi1jb250ZW50LXNpemVkLWNvbHVtbnMtcmVzb2x1
dGlvbi1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3QvY3NzLWdyaWQtbGF5b3V0
L2dyaWQtaXRlbS1vcmRlci1pbi1jb250ZW50LXNpemVkLWNvbHVtbnMtcmVzb2x1dGlvbi5odG1s
OiBBZGRlZC4KKwogMjAxNC0wOS0xMSAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNv
bT4KIAogICAgICAgICBmYXN0L2Zvcm1zL3N1Ym1pdC10by1ibGFuay1tdWx0aXBsZS10aW1lcy5o
dG1sIGNyYXNoZXMgd2l0aCBKU0Nfc2xvd1BhdGhBbGxvY3NCZXR3ZWVuR0NzCmRpZmYgLS1naXQg
YS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91dC9ncmlkLWl0ZW0tb3JkZXItaW4tY29u
dGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24tZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMv
ZmFzdC9jc3MtZ3JpZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29s
dW1ucy1yZXNvbHV0aW9uLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43Nzc1M2NjYmI3MjA0MGYx
YWU2NjgwNWEyMTY4OTk0ODZhMTJjN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMv
ZmFzdC9jc3MtZ3JpZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29s
dW1ucy1yZXNvbHV0aW9uLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDI3IEBACitQQVNTIGdyaWQt
dGVtcGxhdGUtY29sdW1ucyBpcyA2MHB4IDIwcHggYWZ0ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1Mg
Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGlzIDc2cHggNTBweCBhZnRlciBncmlkIHJvdyBzd2FwLgor
UEFTUyBncmlkLXRlbXBsYXRlLWNvbHVtbnMgaXMgNjBweCAxNnB4IGFmdGVyIGdyaWQgcm93IHN3
YXAuCitQQVNTIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBpcyA2OHB4IDE2cHggYWZ0ZXIgZ3JpZCBy
b3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGlzIDc2cHggOHB4IGFmdGVyIGdy
aWQgcm93IHN3YXAuCitQQVNTIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBpcyA2OHB4IDE2cHggYWZ0
ZXIgZ3JpZCByb3cgc3dhcC4KK1BBU1MgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGlzIDYwcHggMTZw
eCBhZnRlciBncmlkIHJvdyBzd2FwLgorUEFTUyBncmlkLXRlbXBsYXRlLWNvbHVtbnMgaXMgNjBw
eCAxNnB4IGFmdGVyIGdyaWQgcm93IHN3YXAuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0
cnVlCisKK1RFU1QgQ09NUExFVEUKK1hYWFhYCitYWFggWFhYCitYWFhYWAorWFhYIFhYWAorWFhY
WFgKK1hYWCBYWFgKK1hYWFhYCitYWFggWFhYCitYWFhYWAorWFhYIFhYWAorWFhYWFgKK1hYWCBY
WFgKK1hYWFhYCitYWFggWFhYCitYWFhYWAorWFhYIFhYWApkaWZmIC0tZ2l0IGEvTGF5b3V0VGVz
dHMvZmFzdC9jc3MtZ3JpZC1sYXlvdXQvZ3JpZC1pdGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQt
Y29sdW1ucy1yZXNvbHV0aW9uLmh0bWwgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy1ncmlkLWxheW91
dC9ncmlkLWl0ZW0tb3JkZXItaW4tY29udGVudC1zaXplZC1jb2x1bW5zLXJlc29sdXRpb24uaHRt
bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kYjAwMDkxNmU2YzJlYzc0YzU4MDViZGVlMjgyNzA4ZWZlNjE3M2EyCi0t
LSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9jc3MtZ3JpZC1sYXlvdXQvZ3JpZC1p
dGVtLW9yZGVyLWluLWNvbnRlbnQtc2l6ZWQtY29sdW1ucy1yZXNvbHV0aW9uLmh0bWwKQEAgLTAs
MCArMSwxMjIgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIGhyZWY9
InJlc291cmNlcy9ncmlkLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ii8+Cis8c3R5bGU+CisuZ3JpZEZp
eGVkTWluQ29udGVudEFuZEZpeGVkTWF4Q29udGVudCB7CisgICAgIC13ZWJraXQtZ3JpZC10ZW1w
bGF0ZS1jb2x1bW5zOiBtaW5tYXgoMjBweCwgLXdlYmtpdC1taW4tY29udGVudCkgbWlubWF4KDIw
cHgsIC13ZWJraXQtbWF4LWNvbnRlbnQpOworfQorLmdyaWRNYXhDb250ZW50Rml4ZWRBbmRNaW5D
b250ZW50Rml4ZWQgeworICAgICAtd2Via2l0LWdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4
KC13ZWJraXQtbWF4LWNvbnRlbnQsIDUwcHgpIG1pbm1heCgtd2Via2l0LW1pbi1jb250ZW50LCA1
MHB4KTsKK30KKy5ncmlkRml4ZWRNaW5Db250ZW50QW5kQXV0byB7CisgICAgIC13ZWJraXQtZ3Jp
ZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMjBweCwgLXdlYmtpdC1taW4tY29udGVudCkgYXV0
bzsKK30KKy5ncmlkRml4ZWRNYXhDb250ZW50QW5kQXV0byB7CisgICAgIC13ZWJraXQtZ3JpZC10
ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMjBweCwgLXdlYmtpdC1tYXgtY29udGVudCkgYXV0bzsK
K30KKy5ncmlkTWF4Q29udGVudEFuZEF1dG8geworICAgICAtd2Via2l0LWdyaWQtdGVtcGxhdGUt
Y29sdW1uczogLXdlYmtpdC1tYXgtY29udGVudCBhdXRvOworfQorLmdyaWRBdXRvQW5kTWF4Q29u
dGVudCB7CisgICAgIC13ZWJraXQtZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIC13ZWJraXQt
bWF4LWNvbnRlbnQ7Cit9CisuZ3JpZE1pbkNvbnRlbnRBbmRBdXRvIHsKKyAgICAgLXdlYmtpdC1n
cmlkLXRlbXBsYXRlLWNvbHVtbnM6IC13ZWJraXQtbWluLWNvbnRlbnQgYXV0bzsKK30KKy5ncmlk
QXV0b0FuZE1pbkNvbnRlbnQgeworICAgICAtd2Via2l0LWdyaWQtdGVtcGxhdGUtY29sdW1uczog
LXdlYmtpdC1taW4tY29udGVudCBhdXRvOworfQorLnNwYW5Ud28geworICAgICAtd2Via2l0LWdy
aWQtY29sdW1uOiAxIC8gMzsKK30KKzwvc3R5bGU+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3Vy
Y2VzL2pzLXRlc3QuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IHN0eWxlPSJw
b3NpdGlvbjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRGaXhlZE1pbkNvbnRlbnRBbmRG
aXhlZE1heENvbnRlbnQiIGNsYXNzPSJncmlkIGdyaWRGaXhlZE1pbkNvbnRlbnRBbmRGaXhlZE1h
eENvbnRlbnQiPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhYWFhYPC9kaXY+
CisJPGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhYIFhYWDwvZGl2
PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSI+
CisgICAgPGRpdiBpZD0iZ3JpZE1heENvbnRlbnRGaXhlZEFuZE1pbkNvbnRlbnRGaXhlZCIgY2xh
c3M9ImdyaWQgZ3JpZE1heENvbnRlbnRGaXhlZEFuZE1pbkNvbnRlbnRGaXhlZCI+CisJPGRpdiBj
bGFzcz0iZmlyc3RSb3dGaXJzdENvbHVtbiI+WFhYWFg8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJzcGFu
VHdvIHNlY29uZFJvd0ZpcnN0Q29sdW1uIj5YWFggWFhYPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rp
dj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4KKyAgICA8ZGl2IGlkPSJncmlk
Rml4ZWRNaW5Db250ZW50QW5kQXV0byIgY2xhc3M9ImdyaWQgZ3JpZEZpeGVkTWluQ29udGVudEFu
ZEF1dG8iPgorCTxkaXYgY2xhc3M9ImZpcnN0Um93Rmlyc3RDb2x1bW4iPlhYWFhYPC9kaXY+CisJ
PGRpdiBjbGFzcz0ic3BhblR3byBzZWNvbmRSb3dGaXJzdENvbHVtbiI+WFhYIFhYWDwvZGl2Pgor
ICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSI+Cisg
ICAgPGRpdiBpZD0iZ3JpZEZpeGVkTWF4Q29udGVudEFuZEF1dG8iIGNsYXNzPSJncmlkIGdyaWRG
aXhlZE1heENvbnRlbnRBbmRBdXRvIj4KKwk8ZGl2IGNsYXNzPSJmaXJzdFJvd0ZpcnN0Q29sdW1u
Ij5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5Ud28gc2Vjb25kUm93Rmlyc3RDb2x1bW4i
PlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlv
bjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRNYXhDb250ZW50QW5kQXV0byIgY2xhc3M9
ImdyaWQgZ3JpZE1heENvbnRlbnRBbmRBdXRvIj4KKwk8ZGl2IGNsYXNzPSJmaXJzdFJvd0ZpcnN0
Q29sdW1uIj5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5Ud28gc2Vjb25kUm93Rmlyc3RD
b2x1bW4iPlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IHN0eWxlPSJw
b3NpdGlvbjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRBdXRvQW5kTWF4Q29udGVudCIg
Y2xhc3M9ImdyaWQgZ3JpZEF1dG9BbmRNYXhDb250ZW50Ij4KKwk8ZGl2IGNsYXNzPSJmaXJzdFJv
d0ZpcnN0Q29sdW1uIj5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5Ud28gc2Vjb25kUm93
Rmlyc3RDb2x1bW4iPlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IHN0
eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRNaW5Db250ZW50QW5k
QXV0byIgY2xhc3M9ImdyaWQgZ3JpZE1pbkNvbnRlbnRBbmRBdXRvIj4KKwk8ZGl2IGNsYXNzPSJm
aXJzdFJvd0ZpcnN0Q29sdW1uIj5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5Ud28gc2Vj
b25kUm93Rmlyc3RDb2x1bW4iPlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8
ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPgorICAgIDxkaXYgaWQ9ImdyaWRBdXRvQW5k
TWluQ29udGVudCIgY2xhc3M9ImdyaWQgZ3JpZEF1dG9BbmRNaW5Db250ZW50Ij4KKwk8ZGl2IGNs
YXNzPSJmaXJzdFJvd0ZpcnN0Q29sdW1uIj5YWFhYWDwvZGl2PgorCTxkaXYgY2xhc3M9InNwYW5U
d28gc2Vjb25kUm93Rmlyc3RDb2x1bW4iPlhYWCBYWFg8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2
PgorCis8L2JvZHk+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2dyaWQtZGVmaW5pdGlvbnMtcGFy
c2luZy11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgorCitmdW5jdGlvbiBjaGVja1RyYWNr
QnJlYWR0aEFmdGVySXRlbVJvd1N3YXAoZ3JpZElkKQoreworICAgICB3aW5kb3cuZ3JpZEVsZW1l
bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChncmlkSWQpOworICAgICB2YXIgb2xkVmFsdWUg
PSBnZXRDb21wdXRlZFN0eWxlKGdyaWRFbGVtZW50LCAnJykuZ2V0UHJvcGVydHlWYWx1ZSgnLXdl
YmtpdC1ncmlkLXRlbXBsYXRlLWNvbHVtbnMnKTsKKyAgICAgdmFyIGZpcnN0Q2hpbGRSb3cgPSBn
ZXRDb21wdXRlZFN0eWxlKGdyaWRFbGVtZW50LmNoaWxkcmVuWzBdLCcnKS5nZXRQcm9wZXJ0eVZh
bHVlKCctd2Via2l0LWdyaWQtcm93Jyk7CisgICAgIGdyaWRFbGVtZW50LmNoaWxkcmVuWzBdLnN0
eWxlLndlYmtpdEdyaWRSb3cgPSBnZXRDb21wdXRlZFN0eWxlKGdyaWRFbGVtZW50LmNoaWxkcmVu
WzFdLCcnKS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LWdyaWQtcm93Jyk7CisgICAgIGdyaWRF
bGVtZW50LmNoaWxkcmVuWzFdLnN0eWxlLndlYmtpdEdyaWRSb3cgPSBmaXJzdENoaWxkUm93Owor
ICAgICB2YXIgbmV3VmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKGdyaWRFbGVtZW50LCAnJykuZ2V0
UHJvcGVydHlWYWx1ZSgnLXdlYmtpdC1ncmlkLXRlbXBsYXRlLWNvbHVtbnMnKTsKKworICAgICBp
ZiAobmV3VmFsdWUgPT0gb2xkVmFsdWUpCisgICAgICAgICB0ZXN0UGFzc2VkKCJncmlkLXRlbXBs
YXRlLWNvbHVtbnMgaXMgIiArIG5ld1ZhbHVlICsgIiBhZnRlciBncmlkIHJvdyBzd2FwLiIpOwor
ICAgICBlbHNlCisgICAgICAgICB0ZXN0RmFpbGVkKCJncmlkLXRlbXBsYXRlLWNvbHVtbnMgc2hv
dWxkIGJlICIgKyBvbGRWYWx1ZSArICIuIFdhcyAiICsgbmV3VmFsdWUgKyAiLiIpOworfQorCitj
aGVja1RyYWNrQnJlYWR0aEFmdGVySXRlbVJvd1N3YXAoImdyaWRGaXhlZE1pbkNvbnRlbnRBbmRG
aXhlZE1heENvbnRlbnQiKTsKK2NoZWNrVHJhY2tCcmVhZHRoQWZ0ZXJJdGVtUm93U3dhcCgiZ3Jp
ZE1heENvbnRlbnRGaXhlZEFuZE1pbkNvbnRlbnRGaXhlZCIpOworY2hlY2tUcmFja0JyZWFkdGhB
ZnRlckl0ZW1Sb3dTd2FwKCJncmlkRml4ZWRNaW5Db250ZW50QW5kQXV0byIpOworY2hlY2tUcmFj
a0JyZWFkdGhBZnRlckl0ZW1Sb3dTd2FwKCJncmlkRml4ZWRNYXhDb250ZW50QW5kQXV0byIpOwor
Y2hlY2tUcmFja0JyZWFkdGhBZnRlckl0ZW1Sb3dTd2FwKCJncmlkTWF4Q29udGVudEFuZEF1dG8i
KTsKK2NoZWNrVHJhY2tCcmVhZHRoQWZ0ZXJJdGVtUm93U3dhcCgiZ3JpZEF1dG9BbmRNYXhDb250
ZW50Iik7CitjaGVja1RyYWNrQnJlYWR0aEFmdGVySXRlbVJvd1N3YXAoImdyaWRNaW5Db250ZW50
QW5kQXV0byIpOworY2hlY2tUcmFja0JyZWFkdGhBZnRlckl0ZW1Sb3dTd2FwKCJncmlkQXV0b0Fu
ZE1pbkNvbnRlbnQiKTsKKworPC9zY3JpcHQ+Cis8L2h0bWw+Cg==
</data>
<flag name="review"
          id="262793"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>