<?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>223901</bug_id>
          
          <creation_ts>2021-03-29 13:29:13 -0700</creation_ts>
          <short_desc>Generalize ColorComponents to support an arbritrary number of components (though really we will only ever want 3, 4, or 5)</short_desc>
          <delta_ts>2021-03-30 09:32:15 -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>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>glenn</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1744878</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-03-29 13:29:13 -0700</bug_when>
    <thetext>Generalize ColorComponents to support an arbritrary number of components (though really we will only ever want 3, 4, or 5)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1744881</commentid>
    <comment_count>1</comment_count>
      <attachid>424571</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-03-29 13:31:49 -0700</bug_when>
    <thetext>Created attachment 424571
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1744991</commentid>
    <comment_count>2</comment_count>
      <attachid>424571</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-03-29 17:19:51 -0700</bug_when>
    <thetext>Comment on attachment 424571
Patch

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

&gt; Source/WebCore/platform/graphics/ColorComponents.h:66
&gt; +    template&lt;size_t I&gt;
&gt;      constexpr T get() const;

Classic example that I would find more readable on a single line instead of split across two. But maybe this is a losing battle since so many template lines get too long if you do that.

&gt; Source/WebCore/platform/graphics/ColorComponents.h:71
&gt; +    std::array&lt;T, N&gt; components;

Funny that this really is &quot;just an array&quot; yet can you even construct it from an array?

&gt; Source/WebCore/platform/graphics/ColorMatrix.h:125
&gt; +    static_assert(ColorComponents&lt;float, 4&gt;::Size &gt;= RowCount);

Seems like we might need a typedef for ColorComponents&lt;float, 4&gt;. Honestly, ColorComponents&lt;float, 4&gt;::Size is a funny way to write &quot;4&quot;; with a typedef short name in this function it might read nicely.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:98
&gt; +    return PackedColor::RGBA { makeFromComponents&lt;SRGBA&lt;uint8_t&gt;&gt;(components) };

Do you have to write the type name here? Can’t we just use braces?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1745141</commentid>
    <comment_count>3</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-03-30 09:12:38 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #2)
&gt; Comment on attachment 424571 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=424571&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ColorComponents.h:66
&gt; &gt; +    template&lt;size_t I&gt;
&gt; &gt;      constexpr T get() const;
&gt; 
&gt; Classic example that I would find more readable on a single line instead of
&gt; split across two. But maybe this is a losing battle since so many template
&gt; lines get too long if you do that.

I keep wavering on this one. I went in pretty hard for it in ColorTypes.h, but sometimes it just looks weird.

    template&lt;size_t I&gt;
    constexpr T get() const;

    template&lt;size_t Start, size_t End&gt;
    constexpr ColorComponents&lt;T, End - Start&gt; subset() const;

vs

    template&lt;size_t I&gt; constexpr T get() const;

    template&lt;size_t Start, size_t End&gt; constexpr ColorComponents&lt;T, End - Start&gt; subset() const;

I think maybe it&apos;s the return types not lining up? There is also the problem of template functions in template classes, like:

template&lt;typename T, size_t N&gt;
template&lt;size_t Start, size_t End&gt;
constexpr ColorComponents&lt;T, End - Start&gt; ColorComponents&lt;T, N&gt;::subset() const
{
    ColorComponents&lt;T, End - Start&gt; result;
    for (std::remove_const_t&lt;decltype(T::Size)&gt; i = Start; i &lt; End; ++i)
        result[i - Start] = components[i];
    return result;
}

where splitting the two templates onto separate lines helps (in my view) to clarify the structure.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ColorComponents.h:71
&gt; &gt; +    std::array&lt;T, N&gt; components;
&gt; 
&gt; Funny that this really is &quot;just an array&quot; yet can you even construct it from
&gt; an array?

the point of this class is to avoid ever having color components in a raw std::array, so thankfully that hasn&apos;t come up yet.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ColorMatrix.h:125
&gt; &gt; +    static_assert(ColorComponents&lt;float, 4&gt;::Size &gt;= RowCount);
&gt; 
&gt; Seems like we might need a typedef for ColorComponents&lt;float, 4&gt;. Honestly,
&gt; ColorComponents&lt;float, 4&gt;::Size is a funny way to write &quot;4&quot;; with a typedef
&gt; short name in this function it might read nicely.

Yeah, but in a follow up this function will be generalized to work with non-4 component ColorComponents, so that will go away.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:98
&gt; &gt; +    return PackedColor::RGBA { makeFromComponents&lt;SRGBA&lt;uint8_t&gt;&gt;(components) };
&gt; 
&gt; Do you have to write the type name here? Can’t we just use braces?

Yeah, it&apos;s required since the constructor is explicit, which I did on purpose to make sure people have to specify which type it is. It&apos;s a bit redundant in cases where you are returning, but overall I think being more explicit here is better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1745149</commentid>
    <comment_count>4</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-03-30 09:31:27 -0700</bug_when>
    <thetext>Committed r275206: &lt;https://commits.webkit.org/r275206&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 424571.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1745152</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-03-30 09:32:15 -0700</bug_when>
    <thetext>&lt;rdar://problem/76006720&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>424571</attachid>
            <date>2021-03-29 13:31:49 -0700</date>
            <delta_ts>2021-03-30 09:31:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-223901-20210329133148.patch</filename>
            <type>text/plain</type>
            <size>35164</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3NTE3MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDczIEBACisyMDIxLTAzLTI5ICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBHZW5lcmFsaXplIENvbG9yQ29tcG9u
ZW50cyB0byBzdXBwb3J0IGFuIGFyYnJpdHJhcnkgbnVtYmVyIG9mIGNvbXBvbmVudHMgKHRob3Vn
aCByZWFsbHkgd2Ugd2lsbCBvbmx5IGV2ZXIgd2FudCAzLCA0LCBvciA1KQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjIzOTAxCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIGEgbGVuZ3RoIHRvIENvbG9y
Q29tcG9uZW50cyB0byBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNvbXBvbmVudHMuIFRo
aXMKKyAgICAgICAgd2lsbCBiZSB1c2VkIHRvIHN1cHBvcnQgY2FzZXMgd2hlcmUgd2Ugb25seSB3
YW50IHRvIGNhcnJ5IHRoZSB0aHJlZSBjb2xvciBjb21wb25lbnRzCisgICAgICAgIChub3QgYWxw
aGEpIGFuZCB3aWxsIGJlIHVzZWZ1bCBpZiB3ZSBldmVyIG5lZWQgdG8gYWRkIGJhY2sgQ01ZS0Eg
c3VwcG9ydC4KKworICAgICAgICBBIG5ldyBkZWRlY3V0aW9uIGd1aWRlIGFkZGVkIGFsbG93cyBm
b3IgY2FzZXMgdGhhdCBjdXJyZW50bHkgZGVkdWNlIHRvIHJlbWFpbi4KKworICAgICAgICAqIGNz
cy9wYXJzZXIvQ1NTUHJvcGVydHlQYXJzZXJIZWxwZXJzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNTU1Byb3BlcnR5UGFyc2VySGVscGVyczo6bWFrZUNvbG9yVHlwZUJ5Tm9ybWFsaXppbmdDb21w
b25lbnRzQWZ0ZXJNaXgpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUHJvcGVydHlQYXJzZXJIZWxw
ZXJzOjptYWtlQ29sb3JUeXBlQnlOb3JtYWxpemluZ0NvbXBvbmVudHNBZnRlck1peDxIV0JBPGZs
b2F0Pj4pOgorICAgICAgICAoV2ViQ29yZTo6Q1NTUHJvcGVydHlQYXJzZXJIZWxwZXJzOjptYWtl
Q29sb3JUeXBlQnlOb3JtYWxpemluZ0NvbXBvbmVudHNBZnRlck1peDxIU0xBPGZsb2F0Pj4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q1NTUHJvcGVydHlQYXJzZXJIZWxwZXJzOjpmaXh1cEh1ZUNvbXBv
bmVudHNQcmlvclRvTWl4KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDb2xvcjo6Y29sb3JTcGFjZUFuZENvbXBvbmVudHMgY29uc3Qp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmg6CisgICAgICAgIChXZWJDb3Jl
OjpDb2xvcjo6T3V0T2ZMaW5lQ29tcG9uZW50czo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbG9yOjpPdXRPZkxpbmVDb21wb25lbnRzOjpjb21wb25lbnRzIGNvbnN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbG9yOjpPdXRPZkxpbmVDb21wb25lbnRzOjpPdXRPZkxpbmVDb21wb25lbnRz
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Db2xvckNvbXBvbmVudHMuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbG9yQ29tcG9uZW50czo6Q29sb3JDb21wb25lbnRzKToKKyAgICAgICAg
KFdlYkNvcmU6Om1hcENvbG9yQ29tcG9uZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpOPjo6bWFw
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6Oj0pOgorICAgICAgICAoV2ViQ29yZTo6Tj46Om9w
ZXJhdG9yIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok4+OjphYnMgY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6Tj46OmdldCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpOPjo6c3Vic2V0
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OnBlckNvbXBvbmVudE1heCk6CisgICAgICAgIChX
ZWJDb3JlOjpwZXJDb21wb25lbnRNaW4pOgorICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3I9PSk6
CisgICAgICAgIChXZWJDb3JlOjpvcGVyYXRvciE9KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbG9y
Q29tcG9uZW50czxUPjo6bWFwIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bG9yQ29tcG9uZW50czxUPjo6b3BlcmF0b3IgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Q29sb3JDb21wb25lbnRzPFQ+OjphYnMgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q29sb3JDb21wb25lbnRzPFQ+OjpnZXQgY29uc3QpOiBEZWxldGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yTWF0cml4Lmg6CisgICAgICAgIChXZWJDb3JlOjpS
b3dDb3VudD46OnRyYW5zZm9ybWVkQ29sb3JDb21wb25lbnRzIGNvbnN0KToKKyAgICAgICAgKFdl
YkNvcmU6OmFwcGx5TWF0cmljZXNUb0NvbG9yQ29tcG9uZW50cyk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvQ29sb3JTcGFjZS5oOgorICAgICAgICAoV2ViQ29yZTo6Y2FsbFdpdGhDb2xv
clR5cGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yVHlwZXMuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Om1ha2VGcm9tQ29tcG9uZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpjbGFt
cGVkQ29tcG9uZW50KToKKyAgICAgICAgKFdlYkNvcmU6OmNsYW1wZWRDb21wb25lbnRzKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNsYW1wZWRDb21wb25lbnRzRXhjZXB0QWxwaGEpOgorICAgICAgICAo
V2ViQ29yZTo6bWFrZUZyb21Db21wb25lbnRzQ2xhbXBpbmcpOgorICAgICAgICAoV2ViQ29yZTo6
bWFrZUZyb21Db21wb25lbnRzQ2xhbXBpbmdFeGNlcHRBbHBoYSk6CisgICAgICAgIChXZWJDb3Jl
Ojphc0NvbG9yQ29tcG9uZW50cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVy
cy9GRUNvbG9yTWF0cml4LmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0ZFTW9ycGhvbG9neS5jcHA6CisgICAgICAgIChXZWJDb3JlOjptYWtlQ29sb3JDb21wb25lbnRz
ZnJvbVBpeGVsVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6bWFrZVBpeGVsVmFsdWVGcm9tQ29s
b3JDb21wb25lbnRzKToKKyAgICAgICAgKFdlYkNvcmU6Om1pbk9yTWF4KToKKyAgICAgICAgKFdl
YkNvcmU6OmNvbHVtbkV4dHJlbXVtKToKKyAgICAgICAgKFdlYkNvcmU6Omtlcm5lbEV4dHJlbXVt
KToKKyAgICAgICAgKFdlYkNvcmU6OkZFTW9ycGhvbG9neTo6cGxhdGZvcm1BcHBseUdlbmVyaWMp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVUdXJidWxlbmNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkZFVHVyYnVsZW5jZTo6bm9pc2UyRCBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjp0b0ludEJhc2VkQ29sb3JDb21wb25lbnRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkZFVHVyYnVsZW5jZTo6Y2FsY3VsYXRlVHVyYnVsZW5jZVZhbHVlRm9yUG9pbnQgY29uc3QpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVUdXJidWxlbmNlLmg6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXJPcGVyYXRpb24uY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6aHVlUm90YXRlKToKKwogMjAyMS0wMy0yOSAgRXJpYyBDYXJsc29uICA8
ZXJpYy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBbbWFjT1NdIEFkZCByZW1vdGUgTWVk
aWFTZXNzaW9uQ29vcmRpbmF0b3IKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NT
UHJvcGVydHlQYXJzZXJIZWxwZXJzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9j
c3MvcGFyc2VyL0NTU1Byb3BlcnR5UGFyc2VySGVscGVycy5jcHAJKHJldmlzaW9uIDI3NTE2NSkK
KysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUHJvcGVydHlQYXJzZXJIZWxwZXJzLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTY2MiwxMiArMTY2MiwxMiBAQCBzdGF0aWMgQ29sb3JNaXhQ
ZXJjZW50YWdlcyBub3JtYWxpemVkTWl4CiAvLyBOb3JtYWxpemF0aW9uIGlzIHNwZWNpYWwgY2Fz
ZWQgZm9yIEhXQkEsIHdoaWNoIG5lZWRzIHRvIG5vcm1hbGl6ZSB0aGUgd2hpdGVuZXNzIGFuZCBi
bGFja25lc3MgY29tcG9uZW50cyBhbmQgY29udmVydCB0byBzUkdCCiAvLyBhbmQgSFNMQSwgd2hp
Y2gganVzdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gc1JHQi4gQWxsIG90aGVyIGNvbG9yIHR5
cGVzIGNhbiBnbyB0aHJvdWdoIHRoaXMgbm9uLXNwZWNpYWxpemVkIGNhc2UuCiAKLXRlbXBsYXRl
PHR5cGVuYW1lIENvbG9yVHlwZT4gaW5saW5lIENvbG9yIG1ha2VDb2xvclR5cGVCeU5vcm1hbGl6
aW5nQ29tcG9uZW50c0FmdGVyTWl4KGNvbnN0IENvbG9yQ29tcG9uZW50czxmbG9hdD4mIGNvbG9y
Q29tcG9uZW50cykKK3RlbXBsYXRlPHR5cGVuYW1lIENvbG9yVHlwZT4gaW5saW5lIENvbG9yIG1h
a2VDb2xvclR5cGVCeU5vcm1hbGl6aW5nQ29tcG9uZW50c0FmdGVyTWl4KGNvbnN0IENvbG9yQ29t
cG9uZW50czxmbG9hdCwgND4mIGNvbG9yQ29tcG9uZW50cykKIHsKICAgICByZXR1cm4gbWFrZUZy
b21Db21wb25lbnRzPENvbG9yVHlwZT4oY29sb3JDb21wb25lbnRzKTsKIH0KIAotdGVtcGxhdGU8
PiBpbmxpbmUgQ29sb3IgbWFrZUNvbG9yVHlwZUJ5Tm9ybWFsaXppbmdDb21wb25lbnRzQWZ0ZXJN
aXg8SFdCQTxmbG9hdD4+KGNvbnN0IENvbG9yQ29tcG9uZW50czxmbG9hdD4mIGNvbG9yQ29tcG9u
ZW50cykKK3RlbXBsYXRlPD4gaW5saW5lIENvbG9yIG1ha2VDb2xvclR5cGVCeU5vcm1hbGl6aW5n
Q29tcG9uZW50c0FmdGVyTWl4PEhXQkE8ZmxvYXQ+Pihjb25zdCBDb2xvckNvbXBvbmVudHM8Zmxv
YXQsIDQ+JiBjb2xvckNvbXBvbmVudHMpCiB7CiAgICAgYXV0byBbaHVlLCB3aGl0ZW5lc3MsIGJs
YWNrbmVzcywgYWxwaGFdID0gY29sb3JDb21wb25lbnRzOwogICAgIGF1dG8gW25vcm1hbGl6ZWRX
aGl0bmVzcywgbm9ybWFsaXplZEJsYWNrbmVzc10gPSBub3JtYWxpemVXaGl0ZW5lc3NCbGFja25l
c3Mod2hpdGVuZXNzLCBibGFja25lc3MpOwpAQCAtMTY3NSwxMiArMTY3NSwxMiBAQCB0ZW1wbGF0
ZTw+IGlubGluZSBDb2xvciBtYWtlQ29sb3JUeXBlQnlOCiAgICAgcmV0dXJuIGNvbnZlcnRDb2xv
cjxTUkdCQTx1aW50OF90Pj4oSFdCQTxmbG9hdD4geyBodWUsIG5vcm1hbGl6ZWRXaGl0bmVzcywg
bm9ybWFsaXplZEJsYWNrbmVzcywgYWxwaGEgfSk7CiB9CiAKLXRlbXBsYXRlPD4gaW5saW5lIENv
bG9yIG1ha2VDb2xvclR5cGVCeU5vcm1hbGl6aW5nQ29tcG9uZW50c0FmdGVyTWl4PEhTTEE8Zmxv
YXQ+Pihjb25zdCBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+JiBjb2xvckNvbXBvbmVudHMpCit0ZW1w
bGF0ZTw+IGlubGluZSBDb2xvciBtYWtlQ29sb3JUeXBlQnlOb3JtYWxpemluZ0NvbXBvbmVudHNB
ZnRlck1peDxIU0xBPGZsb2F0Pj4oY29uc3QgQ29sb3JDb21wb25lbnRzPGZsb2F0LCA0PiYgY29s
b3JDb21wb25lbnRzKQogewogICAgIHJldHVybiBjb252ZXJ0Q29sb3I8U1JHQkE8dWludDhfdD4+
KG1ha2VGcm9tQ29tcG9uZW50czxIU0xBPGZsb2F0Pj4oY29sb3JDb21wb25lbnRzKSk7CiB9CiAK
LXRlbXBsYXRlPHNpemVfdCBJLCB0eXBlbmFtZSBDb21wb25lbnRUeXBlPiBzdGF0aWMgdm9pZCBm
aXh1cEh1ZUNvbXBvbmVudHNQcmlvclRvTWl4KENvbG9yQ29tcG9uZW50czxDb21wb25lbnRUeXBl
PiYgY29sb3JDb21wb25lbnRzMSwgQ29sb3JDb21wb25lbnRzPENvbXBvbmVudFR5cGU+JiBjb2xv
ckNvbXBvbmVudHMyKQordGVtcGxhdGU8c2l6ZV90IEksIHR5cGVuYW1lIENvbXBvbmVudFR5cGU+
IHN0YXRpYyB2b2lkIGZpeHVwSHVlQ29tcG9uZW50c1ByaW9yVG9NaXgoQ29sb3JDb21wb25lbnRz
PENvbXBvbmVudFR5cGUsIDQ+JiBjb2xvckNvbXBvbmVudHMxLCBDb2xvckNvbXBvbmVudHM8Q29t
cG9uZW50VHlwZSwgND4mIGNvbG9yQ29tcG9uZW50czIpCiB7CiAgICAgYXV0byBub3JtYWxpemVB
bmdsZXNVc2luZ1Nob3J0ZXJBbGdvcml0aG0gPSBbXSAoYXV0byB0aGV0YTEsIGF1dG8gdGhldGEy
KSAtPiBzdGQ6OnBhaXI8Q29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZT4gewogICAgICAgICAv
LyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWNvbG9yLTQvI2h1ZS1zaG9ydGVyCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwCShyZXZpc2lvbiAy
NzUxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE3MSw3ICsxNzEsNyBAQCBDb2xvciBDb2xvcjo6c2VtYW50aWNDb2xv
cigpIGNvbnN0CiAgICAgcmV0dXJuIHsgYXNJbmxpbmUoKSwgRmxhZ3M6OlNlbWFudGljIH07CiB9
CiAKLXN0ZDo6cGFpcjxDb2xvclNwYWNlLCBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+PiBDb2xvcjo6
Y29sb3JTcGFjZUFuZENvbXBvbmVudHMoKSBjb25zdAorc3RkOjpwYWlyPENvbG9yU3BhY2UsIENv
bG9yQ29tcG9uZW50czxmbG9hdCwgND4+IENvbG9yOjpjb2xvclNwYWNlQW5kQ29tcG9uZW50cygp
IGNvbnN0CiB7CiAgICAgaWYgKGlzT3V0T2ZMaW5lKCkpCiAgICAgICAgIHJldHVybiB7IGNvbG9y
U3BhY2UoKSwgYXNPdXRPZkxpbmUoKS5jb21wb25lbnRzKCkgfTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAkocmV2aXNpb24gMjc1MTY1KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAkod29ya2luZyBjb3B5KQpAQCAtMTIx
LDcgKzEyMSw3IEBAIHB1YmxpYzoKICAgICAvLyB3cmFwcGVyIGFyb3VuZCB0b0NvbG9yVHlwZUxv
c3N5PD4oKS4KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTUkdCQTxUPiB0b1NSR0JBTG9zc3ko
KSBjb25zdCB7IHJldHVybiB0b0NvbG9yVHlwZUxvc3N5PFNSR0JBPFQ+PigpOyB9CiAKLSAgICBX
RUJDT1JFX0VYUE9SVCBzdGQ6OnBhaXI8Q29sb3JTcGFjZSwgQ29sb3JDb21wb25lbnRzPGZsb2F0
Pj4gY29sb3JTcGFjZUFuZENvbXBvbmVudHMoKSBjb25zdDsKKyAgICBXRUJDT1JFX0VYUE9SVCBz
dGQ6OnBhaXI8Q29sb3JTcGFjZSwgQ29sb3JDb21wb25lbnRzPGZsb2F0LCA0Pj4gY29sb3JTcGFj
ZUFuZENvbXBvbmVudHMoKSBjb25zdDsKIAogICAgIFdFQkNPUkVfRVhQT1JUIENvbG9yIGxpZ2h0
ZW5lZCgpIGNvbnN0OwogICAgIFdFQkNPUkVfRVhQT1JUIENvbG9yIGRhcmtlbmVkKCkgY29uc3Q7
CkBAIC0xODcsMjEgKzE4NywyMSBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIGNsYXNzIE91dE9m
TGluZUNvbXBvbmVudHMgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8T3V0T2ZMaW5lQ29t
cG9uZW50cz4gewogICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFJlZjxPdXRPZkxpbmVDb21w
b25lbnRzPiBjcmVhdGUoQ29sb3JDb21wb25lbnRzPGZsb2F0PiBjb21wb25lbnRzKQorICAgICAg
ICBzdGF0aWMgUmVmPE91dE9mTGluZUNvbXBvbmVudHM+IGNyZWF0ZShDb2xvckNvbXBvbmVudHM8
ZmxvYXQsIDQ+IGNvbXBvbmVudHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IE91dE9mTGluZUNvbXBvbmVudHMoY29tcG9uZW50cykpOwogICAgICAgICB9CiAK
ICAgICAgICAgZmxvYXQgYWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2NvbXBvbmVudHNbM107IH0K
LSAgICAgICAgQ29sb3JDb21wb25lbnRzPGZsb2F0PiBjb21wb25lbnRzKCkgY29uc3QgeyByZXR1
cm4gbV9jb21wb25lbnRzOyB9CisgICAgICAgIENvbG9yQ29tcG9uZW50czxmbG9hdCwgND4gY29t
cG9uZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fY29tcG9uZW50czsgfQogCiAgICAgcHJpdmF0ZToK
LSAgICAgICAgT3V0T2ZMaW5lQ29tcG9uZW50cyhDb2xvckNvbXBvbmVudHM8ZmxvYXQ+IGNvbXBv
bmVudHMpCisgICAgICAgIE91dE9mTGluZUNvbXBvbmVudHMoQ29sb3JDb21wb25lbnRzPGZsb2F0
LCA0PiBjb21wb25lbnRzKQogICAgICAgICAgICAgOiBtX2NvbXBvbmVudHMoY29tcG9uZW50cykK
ICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgQ29sb3JDb21wb25lbnRzPGZsb2F0PiBt
X2NvbXBvbmVudHM7CisgICAgICAgIENvbG9yQ29tcG9uZW50czxmbG9hdCwgND4gbV9jb21wb25l
bnRzOwogICAgIH07CiAgICAgQ29sb3IoUmVmPE91dE9mTGluZUNvbXBvbmVudHM+JiYsIENvbG9y
U3BhY2UsIE9wdGlvblNldDxGbGFncz4gPSB7IH0pOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckNvbXBvbmVudHMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvckNvbXBvbmVudHMuaAkocmV2aXNpb24gMjc1
MTY1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JDb21wb25lbnRz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAy
MDE3LCAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxNy0yMDIxIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzIsMTcgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVf
dCBOPgogc3RydWN0IENvbG9yQ29tcG9uZW50cyB7Ci0gICAgY29uc3RleHByIHN0YXRpYyBzaXpl
X3QgU2l6ZSA9IDQ7CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3QgU2l6ZSA9IE47CiAKLSAg
ICBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzKFQgYSA9IDAsIFQgYiA9IDAsIFQgYyA9IDAsIFQg
ZCA9IDApCi0gICAgICAgIDogY29tcG9uZW50cyB7IGEsIGIsIGMsIGQgfQorICAgIGNvbnN0ZXhw
ciBDb2xvckNvbXBvbmVudHMoKQorICAgICAgICA6IGNvbXBvbmVudHMgeyB9CiAgICAgewogICAg
IH0KIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlRzPgorICAgIGNvbnN0ZXhwciBDb2xvckNv
bXBvbmVudHMoVHMgLi4uaW5wdXQpCisgICAgICAgIDogY29tcG9uZW50cyB7eyBpbnB1dCAuLi4g
fX0KKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKFRzKSA9PSBOKTsKKyAg
ICB9CisKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPgotICAgIGNvbnN0ZXhwciBhdXRvIG1hcChG
JiYgZnVuY3Rpb24pIGNvbnN0IC0+IENvbG9yQ29tcG9uZW50czxkZWNsdHlwZShmdW5jdGlvbihz
dGQ6OmRlY2x2YWw8VD4oKSkpPjsKKyAgICBjb25zdGV4cHIgYXV0byBtYXAoRiYmIGZ1bmN0aW9u
KSBjb25zdCAtPiBDb2xvckNvbXBvbmVudHM8ZGVjbHR5cGUoZnVuY3Rpb24oc3RkOjpkZWNsdmFs
PFQ+KCkpKSwgTj47CiAKICAgICBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzJiBvcGVyYXRvcis9
KGNvbnN0IENvbG9yQ29tcG9uZW50cyYpOwogCkBAIC01NSw4OCArNjIsMTA0IEBAIHN0cnVjdCBD
b2xvckNvbXBvbmVudHMgewogICAgIGNvbnN0ZXhwciBUJiBvcGVyYXRvcltdKHNpemVfdCBpKSB7
IHJldHVybiBjb21wb25lbnRzW2ldOyB9CiAgICAgY29uc3RleHByIGNvbnN0IFQmIG9wZXJhdG9y
W10oc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudHNbaV07IH0KIAotICAgIHRlbXBs
YXRlPHN0ZDo6c2l6ZV90IE4+CisgICAgdGVtcGxhdGU8c2l6ZV90IEk+CiAgICAgY29uc3RleHBy
IFQgZ2V0KCkgY29uc3Q7CiAKLSAgICBzdGQ6OmFycmF5PFQsIFNpemU+IGNvbXBvbmVudHM7Cisg
ICAgdGVtcGxhdGU8c2l6ZV90IFN0YXJ0LCBzaXplX3QgRW5kPgorICAgIGNvbnN0ZXhwciBDb2xv
ckNvbXBvbmVudHM8VCwgRW5kIC0gU3RhcnQ+IHN1YnNldCgpIGNvbnN0OworCisgICAgc3RkOjph
cnJheTxULCBOPiBjb21wb25lbnRzOwogfTsKIAordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5h
bWUgLi4uVHM+CitDb2xvckNvbXBvbmVudHMoVCwgVHMuLi4pIC0+IENvbG9yQ29tcG9uZW50czxU
LCAxICsgc2l6ZW9mLi4uKFRzKT47CisKIHRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFQs
IHR5cGVuYW1lLi4uIFRzPgotY29uc3RleHByIGF1dG8gbWFwQ29sb3JDb21wb25lbnRzKEYmJiBm
dW5jdGlvbiwgVCBjb21wb25lbnQsIFRzLi4uIGNvbXBvbmVudHMpIC0+IENvbG9yQ29tcG9uZW50
czxkZWNsdHlwZShmdW5jdGlvbihjb21wb25lbnRbMF0sIGNvbXBvbmVudHNbMF0uLi4pKT4KK2Nv
bnN0ZXhwciBhdXRvIG1hcENvbG9yQ29tcG9uZW50cyhGJiYgZnVuY3Rpb24sIFQgY29tcG9uZW50
LCBUcy4uLiBjb21wb25lbnRzKSAtPiBDb2xvckNvbXBvbmVudHM8ZGVjbHR5cGUoZnVuY3Rpb24o
Y29tcG9uZW50WzBdLCBjb21wb25lbnRzWzBdLi4uKSksIFQ6OlNpemU+CiB7CiAgICAgc3RhdGlj
X2Fzc2VydChzdGQ6OmNvbmp1bmN0aW9uX3Y8c3RkOjpib29sX2NvbnN0YW50PFRzOjpTaXplID09
IFQ6OlNpemU+Li4uPiwgIkFsbCBDb2xvckNvbXBvbmVudHMgcGFzc2VkIHRvIG1hcENvbG9yQ29t
cG9uZW50cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIpOwogCi0gICAgQ29sb3JDb21wb25lbnRz
PGRlY2x0eXBlKGZ1bmN0aW9uKGNvbXBvbmVudFswXSwgY29tcG9uZW50c1swXS4uLikpPiByZXN1
bHQ7CisgICAgQ29sb3JDb21wb25lbnRzPGRlY2x0eXBlKGZ1bmN0aW9uKGNvbXBvbmVudFswXSwg
Y29tcG9uZW50c1swXS4uLikpLCBUOjpTaXplPiByZXN1bHQ7CiAgICAgZm9yIChzdGQ6OnJlbW92
ZV9jb25zdF90PGRlY2x0eXBlKFQ6OlNpemUpPiBpID0gMDsgaSA8IFQ6OlNpemU7ICsraSkKICAg
ICAgICAgcmVzdWx0W2ldID0gZnVuY3Rpb24oY29tcG9uZW50W2ldLCBjb21wb25lbnRzW2ldLi4u
KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxh
dGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CiB0ZW1wbGF0ZTx0eXBlbmFtZSBGPgotY29uc3RleHBy
IGF1dG8gQ29sb3JDb21wb25lbnRzPFQ+OjptYXAoRiYmIGZ1bmN0aW9uKSBjb25zdCAtPiBDb2xv
ckNvbXBvbmVudHM8ZGVjbHR5cGUoZnVuY3Rpb24oc3RkOjpkZWNsdmFsPFQ+KCkpKT4KK2NvbnN0
ZXhwciBhdXRvIENvbG9yQ29tcG9uZW50czxULCBOPjo6bWFwKEYmJiBmdW5jdGlvbikgY29uc3Qg
LT4gQ29sb3JDb21wb25lbnRzPGRlY2x0eXBlKGZ1bmN0aW9uKHN0ZDo6ZGVjbHZhbDxUPigpKSks
IE4+CiB7CiAgICAgcmV0dXJuIG1hcENvbG9yQ29tcG9uZW50cyhzdGQ6OmZvcndhcmQ8Rj4oZnVu
Y3Rpb24pLCAqdGhpcyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgQ29s
b3JDb21wb25lbnRzPFQ+JiBDb2xvckNvbXBvbmVudHM8VD46Om9wZXJhdG9yKz0oY29uc3QgQ29s
b3JDb21wb25lbnRzJiByaHMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0
ZXhwciBDb2xvckNvbXBvbmVudHM8VCwgTj4mIENvbG9yQ29tcG9uZW50czxULCBOPjo6b3BlcmF0
b3IrPShjb25zdCBDb2xvckNvbXBvbmVudHMmIHJocykKIHsKICAgICAqdGhpcyA9IG1hcENvbG9y
Q29tcG9uZW50cyhbXShUIGMxLCBUIGMyKSB7IHJldHVybiBjMSArIGMyOyB9LCAqdGhpcywgcmhz
KTsKICAgICByZXR1cm4gKnRoaXM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4
cHIgQ29sb3JDb21wb25lbnRzPFQ+IENvbG9yQ29tcG9uZW50czxUPjo6b3BlcmF0b3IrKFQgcmhz
KSBjb25zdAordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgQ29sb3JD
b21wb25lbnRzPFQsIE4+IENvbG9yQ29tcG9uZW50czxULCBOPjo6b3BlcmF0b3IrKFQgcmhzKSBj
b25zdAogewogICAgIHJldHVybiBtYXAoW3Joc10oVCBjKSB7IHJldHVybiBjICsgcmhzOyB9KTsK
IH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8VD4g
Q29sb3JDb21wb25lbnRzPFQ+OjpvcGVyYXRvci8oVCBkZW5vbWluYXRvcikgY29uc3QKK3RlbXBs
YXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIENvbG9yQ29tcG9uZW50czxULCBO
PiBDb2xvckNvbXBvbmVudHM8VCwgTj46Om9wZXJhdG9yLyhUIGRlbm9taW5hdG9yKSBjb25zdAog
ewogICAgIHJldHVybiBtYXAoW2Rlbm9taW5hdG9yXShUIGMpIHsgcmV0dXJuIGMgLyBkZW5vbWlu
YXRvcjsgfSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgQ29sb3JDb21w
b25lbnRzPFQ+IENvbG9yQ29tcG9uZW50czxUPjo6b3BlcmF0b3IqKFQgZmFjdG9yKSBjb25zdAor
dGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgQ29sb3JDb21wb25lbnRz
PFQsIE4+IENvbG9yQ29tcG9uZW50czxULCBOPjo6b3BlcmF0b3IqKFQgZmFjdG9yKSBjb25zdAog
ewogICAgIHJldHVybiBtYXAoW2ZhY3Rvcl0oVCBjKSB7IHJldHVybiBjICogZmFjdG9yOyB9KTsK
IH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8VD4g
Q29sb3JDb21wb25lbnRzPFQ+OjphYnMoKSBjb25zdAordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6
ZV90IE4+Citjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPFQsIE4+IENvbG9yQ29tcG9uZW50czxU
LCBOPjo6YWJzKCkgY29uc3QKIHsKICAgICByZXR1cm4gbWFwKFtdKFQgYykgeyByZXR1cm4gc3Rk
OjphYnMoYyk7IH0pOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdGVtcGxhdGU8c3RkOjpz
aXplX3QgTj4KLWNvbnN0ZXhwciBUIENvbG9yQ29tcG9uZW50czxUPjo6Z2V0KCkgY29uc3QKK3Rl
bXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPgordGVtcGxhdGU8c2l6ZV90IEk+Citjb25zdGV4
cHIgVCBDb2xvckNvbXBvbmVudHM8VCwgTj46OmdldCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGNv
bXBvbmVudHNbTl07CisgICAgcmV0dXJuIGNvbXBvbmVudHNbSV07Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFQsIHNpemVfdCBOPgordGVtcGxhdGU8c2l6ZV90IFN0YXJ0LCBzaXplX3QgRW5kPgor
Y29uc3RleHByIENvbG9yQ29tcG9uZW50czxULCBFbmQgLSBTdGFydD4gQ29sb3JDb21wb25lbnRz
PFQsIE4+OjpzdWJzZXQoKSBjb25zdAoreworICAgIENvbG9yQ29tcG9uZW50czxULCBFbmQgLSBT
dGFydD4gcmVzdWx0OworICAgIGZvciAoc3RkOjpyZW1vdmVfY29uc3RfdDxkZWNsdHlwZShUOjpT
aXplKT4gaSA9IFN0YXJ0OyBpIDwgRW5kOyArK2kpCisgICAgICAgIHJlc3VsdFtpIC0gU3RhcnRd
ID0gY29tcG9uZW50c1tpXTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZTx0eXBl
bmFtZSBUPgotY29uc3RleHByIENvbG9yQ29tcG9uZW50czxUPiBwZXJDb21wb25lbnRNYXgoY29u
c3QgQ29sb3JDb21wb25lbnRzPFQ+JiBhLCBjb25zdCBDb2xvckNvbXBvbmVudHM8VD4mIGIpCit0
ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8
VCwgTj4gcGVyQ29tcG9uZW50TWF4KGNvbnN0IENvbG9yQ29tcG9uZW50czxULCBOPiYgYSwgY29u
c3QgQ29sb3JDb21wb25lbnRzPFQsIE4+JiBiKQogewogICAgIHJldHVybiBtYXBDb2xvckNvbXBv
bmVudHMoW10oVCBjMSwgVCBjMikgeyByZXR1cm4gc3RkOjptYXgoYzEsIGMyKTsgfSwgYSwgYik7
CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPFQ+
IHBlckNvbXBvbmVudE1pbihjb25zdCBDb2xvckNvbXBvbmVudHM8VD4mIGEsIGNvbnN0IENvbG9y
Q29tcG9uZW50czxUPiYgYikKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3Rl
eHByIENvbG9yQ29tcG9uZW50czxULCBOPiBwZXJDb21wb25lbnRNaW4oY29uc3QgQ29sb3JDb21w
b25lbnRzPFQsIE4+JiBhLCBjb25zdCBDb2xvckNvbXBvbmVudHM8VCwgTj4mIGIpCiB7CiAgICAg
cmV0dXJuIG1hcENvbG9yQ29tcG9uZW50cyhbXShUIGMxLCBUIGMyKSB7IHJldHVybiBzdGQ6Om1p
bihjMSwgYzIpOyB9LCBhLCBiKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhw
ciBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29sb3JDb21wb25lbnRzPFQ+JiBhLCBjb25zdCBDb2xv
ckNvbXBvbmVudHM8VD4mIGIpCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0
ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29sb3JDb21wb25lbnRzPFQsIE4+JiBhLCBjb25z
dCBDb2xvckNvbXBvbmVudHM8VCwgTj4mIGIpCiB7CiAgICAgcmV0dXJuIGEuY29tcG9uZW50cyA9
PSBiLmNvbXBvbmVudHM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IENvbG9yQ29tcG9uZW50czxUPiYgYSwgY29uc3QgQ29sb3JDb21w
b25lbnRzPFQ+JiBiKQordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IENvbG9yQ29tcG9uZW50czxULCBOPiYgYSwgY29uc3QgQ29s
b3JDb21wb25lbnRzPFQsIE4+JiBiKQogewogICAgIHJldHVybiAhKGEgPT0gYik7CiB9CkBAIC0x
NDUsMTIgKzE2OCwxMiBAQCBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbG9yQ29t
CiAKIG5hbWVzcGFjZSBzdGQgewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgdHVwbGVf
c2l6ZTxXZWJDb3JlOjpDb2xvckNvbXBvbmVudHM8VD4+IDogcHVibGljIHN0ZDo6aW50ZWdyYWxf
Y29uc3RhbnQ8c3RkOjpzaXplX3QsIFdlYkNvcmU6OkNvbG9yQ29tcG9uZW50czxUPjo6U2l6ZT4g
ewordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjbGFzcyB0dXBsZV9zaXplPFdlYkNv
cmU6OkNvbG9yQ29tcG9uZW50czxULCBOPj4gOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFu
dDxzaXplX3QsIE4+IHsKIH07CiAKLXRlbXBsYXRlPHN0ZDo6c2l6ZV90IE4sIHR5cGVuYW1lIFQ+
Ci1jbGFzcyB0dXBsZV9lbGVtZW50PE4sIFdlYkNvcmU6OkNvbG9yQ29tcG9uZW50czxUPj4gewor
dGVtcGxhdGU8c2l6ZV90IEksIHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2xhc3MgdHVwbGVfZWxl
bWVudDxJLCBXZWJDb3JlOjpDb2xvckNvbXBvbmVudHM8VCwgTj4+IHsKIHB1YmxpYzoKICAgICB1
c2luZyB0eXBlID0gVDsKIH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Db2xvck1hdHJpeC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yTWF0cml4LmgJKHJldmlzaW9uIDI3NTE2NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yTWF0cml4LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcg
KzMwLDcgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi10ZW1wbGF0ZTx0eXBlbmFtZT4gc3Ry
dWN0IENvbG9yQ29tcG9uZW50czsKK3RlbXBsYXRlPHR5cGVuYW1lLCBzaXplX3Q+IHN0cnVjdCBD
b2xvckNvbXBvbmVudHM7CiAKIHRlbXBsYXRlPHNpemVfdCBDb2x1bW5Db3VudCwgc2l6ZV90IFJv
d0NvdW50PgogY2xhc3MgQ29sb3JNYXRyaXggewpAQCAtNDIsNyArNDIsNyBAQCBwdWJsaWM6CiAg
ICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKFRzKSA9PSBSb3dDb3VudCAqIENvbHVtbkNv
dW50KTsKICAgICB9CiAKLSAgICBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPGZsb2F0PiB0cmFu
c2Zvcm1lZENvbG9yQ29tcG9uZW50cyhjb25zdCBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+JikgY29u
c3Q7CisgICAgY29uc3RleHByIENvbG9yQ29tcG9uZW50czxmbG9hdCwgND4gdHJhbnNmb3JtZWRD
b2xvckNvbXBvbmVudHMoY29uc3QgQ29sb3JDb21wb25lbnRzPGZsb2F0LCA0PiYpIGNvbnN0Owog
CiAgICAgY29uc3RleHByIGZsb2F0IGF0KHNpemVfdCByb3csIHNpemVfdCBjb2x1bW4pIGNvbnN0
CiAgICAgewpAQCAtMTIwLDM2ICsxMjAsMzYgQEAgaW5saW5lIENvbG9yTWF0cml4PDMsIDM+IGh1
ZVJvdGF0ZUNvbG9yTQogfQogCiB0ZW1wbGF0ZTxzaXplX3QgQ29sdW1uQ291bnQsIHNpemVfdCBS
b3dDb3VudD4KLWNvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+IENvbG9yTWF0cml4PENv
bHVtbkNvdW50LCBSb3dDb3VudD46OnRyYW5zZm9ybWVkQ29sb3JDb21wb25lbnRzKGNvbnN0IENv
bG9yQ29tcG9uZW50czxmbG9hdD4mIGlucHV0VmVjdG9yKSBjb25zdAorY29uc3RleHByIENvbG9y
Q29tcG9uZW50czxmbG9hdCwgND4gQ29sb3JNYXRyaXg8Q29sdW1uQ291bnQsIFJvd0NvdW50Pjo6
dHJhbnNmb3JtZWRDb2xvckNvbXBvbmVudHMoY29uc3QgQ29sb3JDb21wb25lbnRzPGZsb2F0LCA0
PiYgaW5wdXRWZWN0b3IpIGNvbnN0CiB7Ci0gICAgc3RhdGljX2Fzc2VydChDb2xvckNvbXBvbmVu
dHM8ZmxvYXQ+OjpTaXplID49IFJvd0NvdW50KTsKKyAgICBzdGF0aWNfYXNzZXJ0KENvbG9yQ29t
cG9uZW50czxmbG9hdCwgND46OlNpemUgPj0gUm93Q291bnQpOwogICAgIAotICAgIENvbG9yQ29t
cG9uZW50czxmbG9hdD4gcmVzdWx0OworICAgIENvbG9yQ29tcG9uZW50czxmbG9hdCwgND4gcmVz
dWx0OwogICAgIGZvciAoc2l6ZV90IHJvdyA9IDA7IHJvdyA8IFJvd0NvdW50OyArK3Jvdykgewot
ICAgICAgICBpZiBjb25zdGV4cHIgKENvbHVtbkNvdW50IDw9IENvbG9yQ29tcG9uZW50czxmbG9h
dD46OlNpemUpIHsKKyAgICAgICAgaWYgY29uc3RleHByIChDb2x1bW5Db3VudCA8PSBDb2xvckNv
bXBvbmVudHM8ZmxvYXQsIDQ+OjpTaXplKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1
bW4gPSAwOyBjb2x1bW4gPCBDb2x1bW5Db3VudDsgKytjb2x1bW4pCiAgICAgICAgICAgICAgICAg
cmVzdWx0W3Jvd10gKz0gYXQocm93LCBjb2x1bW4pICogaW5wdXRWZWN0b3JbY29sdW1uXTsKLSAg
ICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoQ29sdW1uQ291bnQgPiBDb2xvckNvbXBvbmVudHM8
ZmxvYXQ+OjpTaXplKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW4gPSAwOyBjb2x1
bW4gPCBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+OjpTaXplOyArK2NvbHVtbikKKyAgICAgICAgfSBl
bHNlIGlmIGNvbnN0ZXhwciAoQ29sdW1uQ291bnQgPiBDb2xvckNvbXBvbmVudHM8ZmxvYXQsIDQ+
OjpTaXplKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBD
b2xvckNvbXBvbmVudHM8ZmxvYXQsIDQ+OjpTaXplOyArK2NvbHVtbikKICAgICAgICAgICAgICAg
ICByZXN1bHRbcm93XSArPSBhdChyb3csIGNvbHVtbikgKiBpbnB1dFZlY3Rvcltjb2x1bW5dOwot
ICAgICAgICAgICAgZm9yIChzaXplX3QgYWRkaXRpb25hbENvbHVtbiA9IENvbG9yQ29tcG9uZW50
czxmbG9hdD46OlNpemU7IGFkZGl0aW9uYWxDb2x1bW4gPCBDb2x1bW5Db3VudDsgKythZGRpdGlv
bmFsQ29sdW1uKQorICAgICAgICAgICAgZm9yIChzaXplX3QgYWRkaXRpb25hbENvbHVtbiA9IENv
bG9yQ29tcG9uZW50czxmbG9hdCwgND46OlNpemU7IGFkZGl0aW9uYWxDb2x1bW4gPCBDb2x1bW5D
b3VudDsgKythZGRpdGlvbmFsQ29sdW1uKQogICAgICAgICAgICAgICAgIHJlc3VsdFtyb3ddICs9
IGF0KHJvdywgYWRkaXRpb25hbENvbHVtbik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgY29u
c3RleHByIChDb2xvckNvbXBvbmVudHM8ZmxvYXQ+OjpTaXplID4gUm93Q291bnQpIHsKLSAgICAg
ICAgZm9yIChzaXplX3QgYWRkaXRpb25hbFJvdyA9IFJvd0NvdW50OyBhZGRpdGlvbmFsUm93IDwg
Q29sb3JDb21wb25lbnRzPGZsb2F0Pjo6U2l6ZTsgKythZGRpdGlvbmFsUm93KQorICAgIGlmIGNv
bnN0ZXhwciAoQ29sb3JDb21wb25lbnRzPGZsb2F0LCA0Pjo6U2l6ZSA+IFJvd0NvdW50KSB7Cisg
ICAgICAgIGZvciAoc2l6ZV90IGFkZGl0aW9uYWxSb3cgPSBSb3dDb3VudDsgYWRkaXRpb25hbFJv
dyA8IENvbG9yQ29tcG9uZW50czxmbG9hdCwgND46OlNpemU7ICsrYWRkaXRpb25hbFJvdykKICAg
ICAgICAgICAgIHJlc3VsdFthZGRpdGlvbmFsUm93XSA9IGlucHV0VmVjdG9yW2FkZGl0aW9uYWxS
b3ddOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1l
IFQsIHR5cGVuYW1lIE0+IGlubGluZSBjb25zdGV4cHIgYXV0byBhcHBseU1hdHJpY2VzVG9Db2xv
ckNvbXBvbmVudHMoY29uc3QgQ29sb3JDb21wb25lbnRzPFQ+JiBjb21wb25lbnRzLCBNIG1hdHJp
eCkgLT4gQ29sb3JDb21wb25lbnRzPFQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBN
PiBpbmxpbmUgY29uc3RleHByIGF1dG8gYXBwbHlNYXRyaWNlc1RvQ29sb3JDb21wb25lbnRzKGNv
bnN0IENvbG9yQ29tcG9uZW50czxULCA0PiYgY29tcG9uZW50cywgTSBtYXRyaXgpIC0+IENvbG9y
Q29tcG9uZW50czxULCA0PgogewogICAgIHJldHVybiBtYXRyaXgudHJhbnNmb3JtZWRDb2xvckNv
bXBvbmVudHMoY29tcG9uZW50cyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1l
IE0sIHR5cGVuYW1lLi4uIE1hdHJpY2VzPiBpbmxpbmUgY29uc3RleHByIGF1dG8gYXBwbHlNYXRy
aWNlc1RvQ29sb3JDb21wb25lbnRzKGNvbnN0IENvbG9yQ29tcG9uZW50czxUPiYgY29tcG9uZW50
cywgTSBtYXRyaXgsIE1hdHJpY2VzLi4uIG1hdHJpY2VzKSAtPiBDb2xvckNvbXBvbmVudHM8VD4K
K3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0sIHR5cGVuYW1lLi4uIE1hdHJpY2VzPiBp
bmxpbmUgY29uc3RleHByIGF1dG8gYXBwbHlNYXRyaWNlc1RvQ29sb3JDb21wb25lbnRzKGNvbnN0
IENvbG9yQ29tcG9uZW50czxULCA0PiYgY29tcG9uZW50cywgTSBtYXRyaXgsIE1hdHJpY2VzLi4u
IG1hdHJpY2VzKSAtPiBDb2xvckNvbXBvbmVudHM8VCwgND4KIHsKICAgICByZXR1cm4gYXBwbHlN
YXRyaWNlc1RvQ29sb3JDb21wb25lbnRzKG1hdHJpeC50cmFuc2Zvcm1lZENvbG9yQ29tcG9uZW50
cyhjb21wb25lbnRzKSwgbWF0cmljZXMuLi4pOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvQ29sb3JTcGFjZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yU3BhY2UuaAkocmV2aXNpb24gMjc1MTY1KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JTcGFjZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC03MCw3ICs3MCw3IEBAIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBDb2xvclNwYWNl
TWEKIHRlbXBsYXRlPHR5cGVuYW1lIENvbG9yVHlwZT4gY29uc3RleHByIENvbG9yU3BhY2UgQ29s
b3JTcGFjZUZvciA9IENvbG9yU3BhY2VNYXBwaW5nPENvbG9yVHlwZT46OmNvbG9yU3BhY2U7CiAK
IAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRnVuY3Rvcj4gY29uc3RleHByIGRlY2x0
eXBlKGF1dG8pIGNhbGxXaXRoQ29sb3JUeXBlKGNvbnN0IENvbG9yQ29tcG9uZW50czxUPiYgY29t
cG9uZW50cywgQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBGdW5jdG9yJiYgZnVuY3RvcikKK3RlbXBs
YXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZ1bmN0b3I+IGNvbnN0ZXhwciBkZWNsdHlwZShhdXRv
KSBjYWxsV2l0aENvbG9yVHlwZShjb25zdCBDb2xvckNvbXBvbmVudHM8VCwgND4mIGNvbXBvbmVu
dHMsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgRnVuY3RvciYmIGZ1bmN0b3IpCiB7CiAgICAgc3dp
dGNoIChjb2xvclNwYWNlKSB7CiAgICAgY2FzZSBDb2xvclNwYWNlOjpBOThSR0I6CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvclR5cGVzLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JUeXBlcy5oCShyZXZpc2lv
biAyNzUxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvclR5cGVz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDExICs0MiwxMyBAQCB0ZW1wbGF0ZTx0eXBlbmFtZT4g
c3RydWN0IEhTTEE7CiB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IEhXQkE7CiB0ZW1wbGF0ZTx0
eXBlbmFtZT4gc3RydWN0IExDSEE7CiB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IExhYjsKK3Rl
bXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgT2tsYWI7Cit0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0
IE9rbGNoOwogdGVtcGxhdGU8dHlwZW5hbWUsIFdoaXRlUG9pbnQ+IHN0cnVjdCBYWVpBOwogCiAv
LyBNQVJLOiBNYWtlIGZ1bmN0aW9ucy4KIAotdGVtcGxhdGU8dHlwZW5hbWUgQ29sb3JUeXBlLCB0
eXBlbmFtZSBUPiBjb25zdGV4cHIgQ29sb3JUeXBlIG1ha2VGcm9tQ29tcG9uZW50cyhjb25zdCBD
b2xvckNvbXBvbmVudHM8VD4mIGMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xvclR5cGUsIHR5cGVu
YW1lIFQ+IGNvbnN0ZXhwciBDb2xvclR5cGUgbWFrZUZyb21Db21wb25lbnRzKGNvbnN0IENvbG9y
Q29tcG9uZW50czxULCA0PiYgYykKIHsKICAgICByZXR1cm4gQ29sb3JUeXBlIHsgY1swXSwgY1sx
XSwgY1syXSwgY1szXSB9OwogfQpAQCAtNzUsNyArNzcsNyBAQCB0ZW1wbGF0ZTx0eXBlbmFtZSBD
b2xvclR5cGUsIHVuc2lnbmVkIEluCiAgICAgcmV0dXJuIHN0ZDo6Y2xhbXAoYywgY29tcG9uZW50
SW5mby5taW4sIGNvbXBvbmVudEluZm8ubWF4KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQ29s
b3JUeXBlLCB1bnNpZ25lZCBJbmRleCwgdHlwZW5hbWUgVD4gY29uc3RleHByIFQgY2xhbXBlZENv
bXBvbmVudChjb25zdCBDb2xvckNvbXBvbmVudHM8VD4mIGMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBD
b2xvclR5cGUsIHVuc2lnbmVkIEluZGV4LCB0eXBlbmFtZSBUPiBjb25zdGV4cHIgVCBjbGFtcGVk
Q29tcG9uZW50KGNvbnN0IENvbG9yQ29tcG9uZW50czxULCA0PiYgYykKIHsKICAgICByZXR1cm4g
Y2xhbXBlZENvbXBvbmVudDxDb2xvclR5cGUsIEluZGV4PihjW0luZGV4XSk7CiB9CkBAIC04NSwx
NyArODcsMTcgQEAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29tcG9uZW50VAogICAg
IHJldHVybiBzdGQ6OmNsYW1wPFQ+KGFscGhhLCBBbHBoYVRyYWl0czxDb21wb25lbnRUeXBlPjo6
dHJhbnNwYXJlbnQsIEFscGhhVHJhaXRzPENvbXBvbmVudFR5cGU+OjpvcGFxdWUpOwogfQogCi10
ZW1wbGF0ZTx0eXBlbmFtZSBDb2xvclR5cGUsIHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBDb2xvckNv
bXBvbmVudHM8VD4gY2xhbXBlZENvbXBvbmVudHMoY29uc3QgQ29sb3JDb21wb25lbnRzPFQ+JiBj
b21wb25lbnRzKQordGVtcGxhdGU8dHlwZW5hbWUgQ29sb3JUeXBlLCB0eXBlbmFtZSBUPiBjb25z
dGV4cHIgQ29sb3JDb21wb25lbnRzPFQsIDQ+IGNsYW1wZWRDb21wb25lbnRzKGNvbnN0IENvbG9y
Q29tcG9uZW50czxULCA0PiYgY29tcG9uZW50cykKIHsKICAgICByZXR1cm4geyBjbGFtcGVkQ29t
cG9uZW50PENvbG9yVHlwZSwgMD4oY29tcG9uZW50cyksIGNsYW1wZWRDb21wb25lbnQ8Q29sb3JU
eXBlLCAxPihjb21wb25lbnRzKSwgY2xhbXBlZENvbXBvbmVudDxDb2xvclR5cGUsIDI+KGNvbXBv
bmVudHMpLCBjbGFtcGVkQWxwaGEoY29tcG9uZW50c1szXSkgfTsKIH0KIAotdGVtcGxhdGU8dHlw
ZW5hbWUgQ29sb3JUeXBlLCB0eXBlbmFtZSBUPiBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPFQ+
IGNsYW1wZWRDb21wb25lbnRzRXhjZXB0QWxwaGEoY29uc3QgQ29sb3JDb21wb25lbnRzPFQ+JiBj
b21wb25lbnRzKQordGVtcGxhdGU8dHlwZW5hbWUgQ29sb3JUeXBlLCB0eXBlbmFtZSBUPiBjb25z
dGV4cHIgQ29sb3JDb21wb25lbnRzPFQsIDQ+IGNsYW1wZWRDb21wb25lbnRzRXhjZXB0QWxwaGEo
Y29uc3QgQ29sb3JDb21wb25lbnRzPFQsIDQ+JiBjb21wb25lbnRzKQogewogICAgIHJldHVybiB7
IGNsYW1wZWRDb21wb25lbnQ8Q29sb3JUeXBlLCAwPihjb21wb25lbnRzKSwgY2xhbXBlZENvbXBv
bmVudDxDb2xvclR5cGUsIDE+KGNvbXBvbmVudHMpLCBjbGFtcGVkQ29tcG9uZW50PENvbG9yVHlw
ZSwgMj4oY29tcG9uZW50cyksIGNvbXBvbmVudHNbM10gfTsKIH0KIAotdGVtcGxhdGU8dHlwZW5h
bWUgQ29sb3JUeXBlLCB0eXBlbmFtZSBUPiBjb25zdGV4cHIgQ29sb3JUeXBlIG1ha2VGcm9tQ29t
cG9uZW50c0NsYW1waW5nKGNvbnN0IENvbG9yQ29tcG9uZW50czxUPiYgY29tcG9uZW50cykKK3Rl
bXBsYXRlPHR5cGVuYW1lIENvbG9yVHlwZSwgdHlwZW5hbWUgVD4gY29uc3RleHByIENvbG9yVHlw
ZSBtYWtlRnJvbUNvbXBvbmVudHNDbGFtcGluZyhjb25zdCBDb2xvckNvbXBvbmVudHM8VCwgND4m
IGNvbXBvbmVudHMpCiB7CiAgICAgcmV0dXJuIG1ha2VGcm9tQ29tcG9uZW50czxDb2xvclR5cGU+
KGNsYW1wZWRDb21wb25lbnRzPENvbG9yVHlwZT4oY29tcG9uZW50cykpOwogfQpAQCAtMTEwLDcg
KzExMiw3IEBAIHRlbXBsYXRlPHR5cGVuYW1lIENvbG9yVHlwZSwgdHlwZW5hbWUgVD4KICAgICBy
ZXR1cm4gbWFrZUZyb21Db21wb25lbnRzPENvbG9yVHlwZT4oQ29sb3JDb21wb25lbnRzIHsgY2xh
bXBlZENvbXBvbmVudDxDb2xvclR5cGUsIDA+KGMxKSwgY2xhbXBlZENvbXBvbmVudDxDb2xvclR5
cGUsIDE+KGMyKSwgY2xhbXBlZENvbXBvbmVudDxDb2xvclR5cGUsIDI+KGMzKSwgY2xhbXBlZEFs
cGhhPFQsIHR5cGVuYW1lIENvbG9yVHlwZTo6Q29tcG9uZW50VHlwZT4oYWxwaGEpIH0pOwogfQog
Ci10ZW1wbGF0ZTx0eXBlbmFtZSBDb2xvclR5cGUsIHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBDb2xv
clR5cGUgbWFrZUZyb21Db21wb25lbnRzQ2xhbXBpbmdFeGNlcHRBbHBoYShjb25zdCBDb2xvckNv
bXBvbmVudHM8VD4mIGNvbXBvbmVudHMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xvclR5cGUsIHR5
cGVuYW1lIFQ+IGNvbnN0ZXhwciBDb2xvclR5cGUgbWFrZUZyb21Db21wb25lbnRzQ2xhbXBpbmdF
eGNlcHRBbHBoYShjb25zdCBDb2xvckNvbXBvbmVudHM8VCwgND4mIGNvbXBvbmVudHMpCiB7CiAg
ICAgcmV0dXJuIG1ha2VGcm9tQ29tcG9uZW50czxDb2xvclR5cGU+KGNsYW1wZWRDb21wb25lbnRz
RXhjZXB0QWxwaGE8Q29sb3JUeXBlPihjb21wb25lbnRzKSk7CiB9CkBAIC0yMTIsNyArMjE0LDcg
QEAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRCwgdHlwZW5hbQogICAgIFQgYWxwaGE7
CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBELCB0eXBlbmFtZSBDb2xvclR5
cGUsIHR5cGVuYW1lIE0sIHR5cGVuYW1lIFRGPiBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPFQ+
IGFzQ29sb3JDb21wb25lbnRzKGNvbnN0IFJHQkFUeXBlPFQsIEQsIENvbG9yVHlwZSwgTSwgVEY+
JiBjKQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRCwgdHlwZW5hbWUgQ29sb3JUeXBl
LCB0eXBlbmFtZSBNLCB0eXBlbmFtZSBURj4gY29uc3RleHByIENvbG9yQ29tcG9uZW50czxULCA0
PiBhc0NvbG9yQ29tcG9uZW50cyhjb25zdCBSR0JBVHlwZTxULCBELCBDb2xvclR5cGUsIE0sIFRG
PiYgYykKIHsKICAgICByZXR1cm4geyBjLnJlZCwgYy5ncmVlbiwgYy5ibHVlLCBjLmFscGhhIH07
CiB9CkBAIC00MTgsNyArNDIwLDcgQEAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IExhYiA6
IENvbG9yVwogICAgIFQgYWxwaGE7CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdGV4
cHIgQ29sb3JDb21wb25lbnRzPFQ+IGFzQ29sb3JDb21wb25lbnRzKGNvbnN0IExhYjxUPiYgYykK
K3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8VCwgND4gYXND
b2xvckNvbXBvbmVudHMoY29uc3QgTGFiPFQ+JiBjKQogewogICAgIHJldHVybiB7IGMubGlnaHRu
ZXNzLCBjLmEsIGMuYiwgYy5hbHBoYSB9OwogfQpAQCAtNDUzLDcgKzQ1NSw3IEBAIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+IHN0cnVjdCBMQ0hBIDogQ29sb3IKICAgICBUIGFscGhhOwogfTsKIAotdGVt
cGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHByIENvbG9yQ29tcG9uZW50czxUPiBhc0NvbG9yQ29t
cG9uZW50cyhjb25zdCBMQ0hBPFQ+JiBjKQordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHBy
IENvbG9yQ29tcG9uZW50czxULCA0PiBhc0NvbG9yQ29tcG9uZW50cyhjb25zdCBMQ0hBPFQ+JiBj
KQogewogICAgIHJldHVybiB7IGMubGlnaHRuZXNzLCBjLmNocm9tYSwgYy5odWUsIGMuYWxwaGEg
fTsKIH0KQEAgLTQ4OSw3ICs0OTEsNyBAQCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgSFNM
QSA6IENvbG9yCiAgICAgVCBhbHBoYTsKIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0
ZXhwciBDb2xvckNvbXBvbmVudHM8VD4gYXNDb2xvckNvbXBvbmVudHMoY29uc3QgSFNMQTxUPiYg
YykKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBDb2xvckNvbXBvbmVudHM8VCwgND4g
YXNDb2xvckNvbXBvbmVudHMoY29uc3QgSFNMQTxUPiYgYykKIHsKICAgICByZXR1cm4geyBjLmh1
ZSwgYy5zYXR1cmF0aW9uLCBjLmxpZ2h0bmVzcywgYy5hbHBoYSB9OwogfQpAQCAtNTI0LDcgKzUy
Niw3IEBAIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBIV0JBIDogQ29sb3IKICAgICBUIGFs
cGhhOwogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHByIENvbG9yQ29tcG9uZW50
czxUPiBhc0NvbG9yQ29tcG9uZW50cyhjb25zdCBIV0JBPFQ+JiBjKQordGVtcGxhdGU8dHlwZW5h
bWUgVD4gY29uc3RleHByIENvbG9yQ29tcG9uZW50czxULCA0PiBhc0NvbG9yQ29tcG9uZW50cyhj
b25zdCBIV0JBPFQ+JiBjKQogewogICAgIHJldHVybiB7IGMuaHVlLCBjLndoaXRlbmVzcywgYy5i
bGFja25lc3MsIGMuYWxwaGEgfTsKIH0KQEAgLTU1OSw3ICs1NjEsNyBAQCB0ZW1wbGF0ZTx0eXBl
bmFtZSBULCBXaGl0ZVBvaW50IFc+IHN0cnVjCiAgICAgVCBhbHBoYTsKIH07CiAKLXRlbXBsYXRl
PHR5cGVuYW1lIFQsIFdoaXRlUG9pbnQgVz4gY29uc3RleHByIENvbG9yQ29tcG9uZW50czxUPiBh
c0NvbG9yQ29tcG9uZW50cyhjb25zdCBYWVpBPFQsIFc+JiBjKQordGVtcGxhdGU8dHlwZW5hbWUg
VCwgV2hpdGVQb2ludCBXPiBjb25zdGV4cHIgQ29sb3JDb21wb25lbnRzPFQsIDQ+IGFzQ29sb3JD
b21wb25lbnRzKGNvbnN0IFhZWkE8VCwgVz4mIGMpCiB7CiAgICAgcmV0dXJuIHsgYy54LCBjLnks
IGMueiwgYy5hbHBoYSB9OwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZmlsdGVycy9GRUNvbG9yTWF0cml4LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFQ29sb3JNYXRyaXguY3BwCShyZXZpc2lvbiAy
NzUxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFQ29s
b3JNYXRyaXguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Nyw3ICs4Nyw3IEBAIGlubGluZSB2b2lk
IHNhdHVyYXRlQW5kSHVlUm90YXRlKGZsb2F0JiAKICAgICBibHVlICAgID0gciAqIGNvbXBvbmVu
dHNbNl0gKyBnICogY29tcG9uZW50c1s3XSArIGIgKiBjb21wb25lbnRzWzhdOwogfQogCi0vLyBG
SVhNRTogdGhpcyBzaG91bGQgdXNlIGx1bWluYW5jZShjb25zdCBDb2xvckNvbXBvbmVudHM8Zmxv
YXQ+JiBzUkdCQ29tcG9udGVudHMpLgorLy8gRklYTUU6IHRoaXMgc2hvdWxkIHVzZSB0aGUgbHVt
aW5hbmNlKC4uLikgZnVuY3Rpb24gaW4gQ29sb3JMdW1pbmFuY2UuaC4KIGlubGluZSB2b2lkIGx1
bWluYW5jZShmbG9hdCYgcmVkLCBmbG9hdCYgZ3JlZW4sIGZsb2F0JiBibHVlLCBmbG9hdCYgYWxw
aGEpCiB7CiAgICAgYWxwaGEgPSAwLjIxMjUgKiByZWQgKyAwLjcxNTQgKiBncmVlbiArIDAuMDcy
MSAqIGJsdWU7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0ZFTW9ycGhvbG9neS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZmlsdGVycy9GRU1vcnBob2xvZ3kuY3BwCShyZXZpc2lvbiAyNzUxNjUpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFTW9ycGhvbG9neS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTg4LDE5ICs4OCwxOCBAQCBzdGF0aWMgaW5saW5lIGludCBwaXhl
bEFycmF5SW5kZXgoaW50IHgsCiAgICAgcmV0dXJuICh5ICogd2lkdGggKyB4KSAqIDQ7CiB9CiAK
LWlubGluZSBDb2xvckNvbXBvbmVudHM8dWludDhfdD4gbWFrZUNvbG9yQ29tcG9uZW50c2Zyb21Q
aXhlbFZhbHVlKHVuc2lnbmVkIHBpeGVsKQoraW5saW5lIENvbG9yQ29tcG9uZW50czx1aW50OF90
LCA0PiBtYWtlQ29sb3JDb21wb25lbnRzZnJvbVBpeGVsVmFsdWUoUGFja2VkQ29sb3I6OlJHQkEg
cGl4ZWwpCiB7Ci0gICAgcmV0dXJuIENvbG9yQ29tcG9uZW50czx1aW50OF90PigocGl4ZWwgPj4g
MjQpICYgMHhGRiwgKHBpeGVsID4+IDE2KSAmIDB4RkYsIChwaXhlbCA+PiA4KSAmIDB4RkYsIHBp
eGVsICYgMHhGRik7CisgICAgcmV0dXJuIGFzQ29sb3JDb21wb25lbnRzKGFzU1JHQkEocGl4ZWwp
KTsKIH0KIAotaW5saW5lIHVuc2lnbmVkIG1ha2VQaXhlbFZhbHVlRnJvbUNvbG9yQ29tcG9uZW50
cyhjb25zdCBDb2xvckNvbXBvbmVudHM8dWludDhfdD4mIGNvbXBvbmVudHMpCitpbmxpbmUgUGFj
a2VkQ29sb3I6OlJHQkEgbWFrZVBpeGVsVmFsdWVGcm9tQ29sb3JDb21wb25lbnRzKGNvbnN0IENv
bG9yQ29tcG9uZW50czx1aW50OF90LCA0PiYgY29tcG9uZW50cykKIHsKLSAgICBhdXRvIFtyLCBn
LCBiLCBhXSA9IGNvbXBvbmVudHM7Ci0gICAgcmV0dXJuIHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8
PCA4IHwgYTsKKyAgICByZXR1cm4gUGFja2VkQ29sb3I6OlJHQkEgeyBtYWtlRnJvbUNvbXBvbmVu
dHM8U1JHQkE8dWludDhfdD4+KGNvbXBvbmVudHMpIH07CiB9CiAKIHRlbXBsYXRlPE1vcnBob2xv
Z3lPcGVyYXRvclR5cGUgdHlwZT4KLUFMV0FZU19JTkxJTkUgQ29sb3JDb21wb25lbnRzPHVpbnQ4
X3Q+IG1pbk9yTWF4KGNvbnN0IENvbG9yQ29tcG9uZW50czx1aW50OF90PiYgYSwgY29uc3QgQ29s
b3JDb21wb25lbnRzPHVpbnQ4X3Q+JiBiKQorQUxXQVlTX0lOTElORSBDb2xvckNvbXBvbmVudHM8
dWludDhfdCwgND4gbWluT3JNYXgoY29uc3QgQ29sb3JDb21wb25lbnRzPHVpbnQ4X3QsIDQ+JiBh
LCBjb25zdCBDb2xvckNvbXBvbmVudHM8dWludDhfdCwgND4mIGIpCiB7CiAgICAgaWYgKHR5cGUg
PT0gRkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFKQogICAgICAgICByZXR1cm4gcGVyQ29tcG9u
ZW50TWluKGEsIGIpOwpAQCAtMTA5LDE4ICsxMDgsMTggQEAgQUxXQVlTX0lOTElORSBDb2xvckNv
bXBvbmVudHM8dWludDhfdD4gbQogfQogCiB0ZW1wbGF0ZTxNb3JwaG9sb2d5T3BlcmF0b3JUeXBl
IHR5cGU+Ci1BTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50czx1aW50OF90PiBjb2x1bW5FeHRy
ZW11bShjb25zdCBVaW50OENsYW1wZWRBcnJheSYgc3JjUGl4ZWxBcnJheSwgaW50IHgsIGludCB5
U3RhcnQsIGludCB5RW5kLCBpbnQgd2lkdGgpCitBTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50
czx1aW50OF90LCA0PiBjb2x1bW5FeHRyZW11bShjb25zdCBVaW50OENsYW1wZWRBcnJheSYgc3Jj
UGl4ZWxBcnJheSwgaW50IHgsIGludCB5U3RhcnQsIGludCB5RW5kLCBpbnQgd2lkdGgpCiB7Ci0g
ICAgYXV0byBleHRyZW11bSA9IG1ha2VDb2xvckNvbXBvbmVudHNmcm9tUGl4ZWxWYWx1ZSgqcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCo+KHNyY1BpeGVsQXJyYXkuZGF0YSgpICsgcGl4
ZWxBcnJheUluZGV4KHgsIHlTdGFydCwgd2lkdGgpKSk7CisgICAgYXV0byBleHRyZW11bSA9IG1h
a2VDb2xvckNvbXBvbmVudHNmcm9tUGl4ZWxWYWx1ZShQYWNrZWRDb2xvcjo6UkdCQSB7ICpyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkKj4oc3JjUGl4ZWxBcnJheS5kYXRhKCkgKyBwaXhl
bEFycmF5SW5kZXgoeCwgeVN0YXJ0LCB3aWR0aCkpIH0pOwogCiAgICAgZm9yIChpbnQgeSA9IHlT
dGFydCArIDE7IHkgPCB5RW5kOyArK3kpIHsKLSAgICAgICAgYXV0byBwaXhlbCA9IG1ha2VDb2xv
ckNvbXBvbmVudHNmcm9tUGl4ZWxWYWx1ZSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25l
ZCo+KHNyY1BpeGVsQXJyYXkuZGF0YSgpICsgcGl4ZWxBcnJheUluZGV4KHgsIHksIHdpZHRoKSkp
OworICAgICAgICBhdXRvIHBpeGVsID0gbWFrZUNvbG9yQ29tcG9uZW50c2Zyb21QaXhlbFZhbHVl
KFBhY2tlZENvbG9yOjpSR0JBIHsgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihz
cmNQaXhlbEFycmF5LmRhdGEoKSArIHBpeGVsQXJyYXlJbmRleCh4LCB5LCB3aWR0aCkpIH0pOwog
ICAgICAgICBleHRyZW11bSA9IG1pbk9yTWF4PHR5cGU+KGV4dHJlbXVtLCBwaXhlbCk7CiAgICAg
fQogICAgIHJldHVybiBleHRyZW11bTsKIH0KIAotQUxXQVlTX0lOTElORSBDb2xvckNvbXBvbmVu
dHM8dWludDhfdD4gY29sdW1uRXh0cmVtdW0oY29uc3QgVWludDhDbGFtcGVkQXJyYXkmIHNyY1Bp
eGVsQXJyYXksIGludCB4LCBpbnQgeVN0YXJ0LCBpbnQgeUVuZCwgaW50IHdpZHRoLCBNb3JwaG9s
b2d5T3BlcmF0b3JUeXBlIHR5cGUpCitBTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50czx1aW50
OF90LCA0PiBjb2x1bW5FeHRyZW11bShjb25zdCBVaW50OENsYW1wZWRBcnJheSYgc3JjUGl4ZWxB
cnJheSwgaW50IHgsIGludCB5U3RhcnQsIGludCB5RW5kLCBpbnQgd2lkdGgsIE1vcnBob2xvZ3lP
cGVyYXRvclR5cGUgdHlwZSkKIHsKICAgICBpZiAodHlwZSA9PSBGRU1PUlBIT0xPR1lfT1BFUkFU
T1JfRVJPREUpCiAgICAgICAgIHJldHVybiBjb2x1bW5FeHRyZW11bTxGRU1PUlBIT0xPR1lfT1BF
UkFUT1JfRVJPREU+KHNyY1BpeGVsQXJyYXksIHgsIHlTdGFydCwgeUVuZCwgd2lkdGgpOwpAQCAt
MTI4LDEwICsxMjcsMTAgQEAgQUxXQVlTX0lOTElORSBDb2xvckNvbXBvbmVudHM8dWludDhfdD4g
YwogICAgIHJldHVybiBjb2x1bW5FeHRyZW11bTxGRU1PUlBIT0xPR1lfT1BFUkFUT1JfRElMQVRF
PihzcmNQaXhlbEFycmF5LCB4LCB5U3RhcnQsIHlFbmQsIHdpZHRoKTsKIH0KIAotdXNpbmcgQ29s
dW1uRXh0cmVtYSA9IFZlY3RvcjxDb2xvckNvbXBvbmVudHM8dWludDhfdD4sIDE2PjsKK3VzaW5n
IENvbHVtbkV4dHJlbWEgPSBWZWN0b3I8Q29sb3JDb21wb25lbnRzPHVpbnQ4X3QsIDQ+LCAxNj47
CiAKIHRlbXBsYXRlPE1vcnBob2xvZ3lPcGVyYXRvclR5cGUgdHlwZT4KLUFMV0FZU19JTkxJTkUg
Q29sb3JDb21wb25lbnRzPHVpbnQ4X3Q+IGtlcm5lbEV4dHJlbXVtKGNvbnN0IENvbHVtbkV4dHJl
bWEmIGtlcm5lbCkKK0FMV0FZU19JTkxJTkUgQ29sb3JDb21wb25lbnRzPHVpbnQ4X3QsIDQ+IGtl
cm5lbEV4dHJlbXVtKGNvbnN0IENvbHVtbkV4dHJlbWEmIGtlcm5lbCkKIHsKICAgICBhdXRvIGV4
dHJlbXVtID0ga2VybmVsWzBdOwogICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwga2VybmVsLnNp
emUoKTsgKytpKQpAQCAtMTQwLDcgKzEzOSw3IEBAIEFMV0FZU19JTkxJTkUgQ29sb3JDb21wb25l
bnRzPHVpbnQ4X3Q+IGsKICAgICByZXR1cm4gZXh0cmVtdW07CiB9CiAKLUFMV0FZU19JTkxJTkUg
Q29sb3JDb21wb25lbnRzPHVpbnQ4X3Q+IGtlcm5lbEV4dHJlbXVtKGNvbnN0IENvbHVtbkV4dHJl
bWEmIGtlcm5lbCwgTW9ycGhvbG9neU9wZXJhdG9yVHlwZSB0eXBlKQorQUxXQVlTX0lOTElORSBD
b2xvckNvbXBvbmVudHM8dWludDhfdCwgND4ga2VybmVsRXh0cmVtdW0oY29uc3QgQ29sdW1uRXh0
cmVtYSYga2VybmVsLCBNb3JwaG9sb2d5T3BlcmF0b3JUeXBlIHR5cGUpCiB7CiAgICAgaWYgKHR5
cGUgPT0gRkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFKQogICAgICAgICByZXR1cm4ga2VybmVs
RXh0cmVtdW08RkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFPihrZXJuZWwpOwpAQCAtMTg1LDcg
KzE4NCw3IEBAIHZvaWQgRkVNb3JwaG9sb2d5OjpwbGF0Zm9ybUFwcGx5R2VuZXJpYygKICAgICAg
ICAgICAgICAgICBleHRyZW1hLnJlbW92ZSgwKTsKIAogICAgICAgICAgICAgdW5zaWduZWQqIGRl
c3RQaXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihkc3RQaXhlbEFycmF5LmRhdGEo
KSArIHBpeGVsQXJyYXlJbmRleCh4LCB5LCB3aWR0aCkpOwotICAgICAgICAgICAgKmRlc3RQaXhl
bCA9IG1ha2VQaXhlbFZhbHVlRnJvbUNvbG9yQ29tcG9uZW50cyhrZXJuZWxFeHRyZW11bShleHRy
ZW1hLCBtX3R5cGUpKTsKKyAgICAgICAgICAgICpkZXN0UGl4ZWwgPSBtYWtlUGl4ZWxWYWx1ZUZy
b21Db2xvckNvbXBvbmVudHMoa2VybmVsRXh0cmVtdW0oZXh0cmVtYSwgbV90eXBlKSkudmFsdWU7
CiAgICAgICAgIH0KICAgICB9CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9maWx0ZXJzL0ZFVHVyYnVsZW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GRVR1cmJ1bGVuY2UuY3BwCShyZXZpc2lvbiAy
NzUxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFVHVy
YnVsZW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxNyw3ICsyMTcsNyBAQCBGRVR1cmJ1bGVu
Y2U6OlN0aXRjaERhdGEgRkVUdXJidWxlbmNlOjpjCiB9CiAKIC8vIFRoaXMgaXMgdGFrZW4gMTox
IGZyb20gU1ZHIHNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZpbHRlcnMuaHRtbCNm
ZVR1cmJ1bGVuY2VFbGVtZW50LgotQ29sb3JDb21wb25lbnRzPGZsb2F0PiBGRVR1cmJ1bGVuY2U6
Om5vaXNlMkQoY29uc3QgUGFpbnRpbmdEYXRhJiBwYWludGluZ0RhdGEsIGNvbnN0IFN0aXRjaERh
dGEmIHN0aXRjaERhdGEsIGNvbnN0IEZsb2F0UG9pbnQmIG5vaXNlVmVjdG9yKSBjb25zdAorQ29s
b3JDb21wb25lbnRzPGZsb2F0LCA0PiBGRVR1cmJ1bGVuY2U6Om5vaXNlMkQoY29uc3QgUGFpbnRp
bmdEYXRhJiBwYWludGluZ0RhdGEsIGNvbnN0IFN0aXRjaERhdGEmIHN0aXRjaERhdGEsIGNvbnN0
IEZsb2F0UG9pbnQmIG5vaXNlVmVjdG9yKSBjb25zdAogewogICAgIHN0cnVjdCBOb2lzZVBvc2l0
aW9uIHsKICAgICAgICAgaW50IGluZGV4OyAvLyBieDAsIGJ5MCBpbiB0aGUgc3BlYyB0ZXh0LgpA
QCAtMzIyLDcgKzMyMiw4IEBAIENvbG9yQ29tcG9uZW50czxmbG9hdD4gRkVUdXJidWxlbmNlOjpu
b2kKIH0KIAogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9maWx0ZXJzLmh0bWwjZmVUdXJi
dWxlbmNlRWxlbWVudCBkZXNjcmliZXMgdGhpcyBjb252ZXJzaW9uIHRvIGNvbG9yIGNvbXBvbmVu
dHMuCi1zdGF0aWMgaW5saW5lIENvbG9yQ29tcG9uZW50czx1aW50OF90PiB0b0ludEJhc2VkQ29s
b3JDb21wb25lbnRzKGNvbnN0IENvbG9yQ29tcG9uZW50czxmbG9hdD4mIGZsb2F0Q29tcG9uZW50
cykKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgY29sb3JDb252ZXJ0PFNSR0JBPHVpbnQ4Pj4o
U1JHQkE8ZmxvYXQ+KSB0byBnZXQgdGhlIHNhbWUgYmVoYXZpb3IuCitzdGF0aWMgaW5saW5lIENv
bG9yQ29tcG9uZW50czx1aW50OF90LCA0PiB0b0ludEJhc2VkQ29sb3JDb21wb25lbnRzKGNvbnN0
IENvbG9yQ29tcG9uZW50czxmbG9hdCwgND4mIGZsb2F0Q29tcG9uZW50cykKIHsKICAgICByZXR1
cm4gewogICAgICAgICBzdGQ6OmNsYW1wPHVpbnQ4X3Q+KHN0YXRpY19jYXN0PGludD4oZmxvYXRD
b21wb25lbnRzWzBdICogMjU1KSwgMCwgMjU1KSwKQEAgLTMzMiw5ICszMzMsOSBAQCBzdGF0aWMg
aW5saW5lIENvbG9yQ29tcG9uZW50czx1aW50OF90PiB0CiAgICAgfTsKIH0KIAotQ29sb3JDb21w
b25lbnRzPHVpbnQ4X3Q+IEZFVHVyYnVsZW5jZTo6Y2FsY3VsYXRlVHVyYnVsZW5jZVZhbHVlRm9y
UG9pbnQoY29uc3QgUGFpbnRpbmdEYXRhJiBwYWludGluZ0RhdGEsIFN0aXRjaERhdGEgc3RpdGNo
RGF0YSwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0CitDb2xvckNvbXBvbmVudHM8dWlu
dDhfdCwgND4gRkVUdXJidWxlbmNlOjpjYWxjdWxhdGVUdXJidWxlbmNlVmFsdWVGb3JQb2ludChj
b25zdCBQYWludGluZ0RhdGEmIHBhaW50aW5nRGF0YSwgU3RpdGNoRGF0YSBzdGl0Y2hEYXRhLCBj
b25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKIHsKLSAgICBDb2xvckNvbXBvbmVudHM8Zmxv
YXQ+IHR1cmJ1bGVuY2VGdW5jdGlvblJlc3VsdDsKKyAgICBDb2xvckNvbXBvbmVudHM8ZmxvYXQs
IDQ+IHR1cmJ1bGVuY2VGdW5jdGlvblJlc3VsdDsKICAgICBGbG9hdFBvaW50IG5vaXNlVmVjdG9y
KHBvaW50LngoKSAqIHBhaW50aW5nRGF0YS5iYXNlRnJlcXVlbmN5WCwgcG9pbnQueSgpICogcGFp
bnRpbmdEYXRhLmJhc2VGcmVxdWVuY3lZKTsKICAgICBmbG9hdCByYXRpbyA9IDE7CiAgICAgZm9y
IChpbnQgb2N0YXZlID0gMDsgb2N0YXZlIDwgbV9udW1PY3RhdmVzOyArK29jdGF2ZSkgewpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GRVR1cmJ1bGVuY2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0ZFVHVyYnVsZW5jZS5oCShyZXZpc2lvbiAyNzUxNjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFVHVyYnVsZW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
MTYsOCArMTE2LDggQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgaW5pdFBhaW50KFBhaW50aW5nRGF0
YSYpOwogICAgIFN0aXRjaERhdGEgY29tcHV0ZVN0aXRjaGluZyhJbnRTaXplIHRpbGVTaXplLCBm
bG9hdCYgYmFzZUZyZXF1ZW5jeVgsIGZsb2F0JiBiYXNlRnJlcXVlbmN5WSkgY29uc3Q7Ci0gICAg
Q29sb3JDb21wb25lbnRzPGZsb2F0PiBub2lzZTJEKGNvbnN0IFBhaW50aW5nRGF0YSYsIGNvbnN0
IFN0aXRjaERhdGEmLCBjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7Ci0gICAgQ29sb3JDb21wb25l
bnRzPHVpbnQ4X3Q+IGNhbGN1bGF0ZVR1cmJ1bGVuY2VWYWx1ZUZvclBvaW50KGNvbnN0IFBhaW50
aW5nRGF0YSYsIFN0aXRjaERhdGEsIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdDsKKyAgICBDb2xv
ckNvbXBvbmVudHM8ZmxvYXQsIDQ+IG5vaXNlMkQoY29uc3QgUGFpbnRpbmdEYXRhJiwgY29uc3Qg
U3RpdGNoRGF0YSYsIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdDsKKyAgICBDb2xvckNvbXBvbmVu
dHM8dWludDhfdCwgND4gY2FsY3VsYXRlVHVyYnVsZW5jZVZhbHVlRm9yUG9pbnQoY29uc3QgUGFp
bnRpbmdEYXRhJiwgU3RpdGNoRGF0YSwgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0OwogICAgIHZv
aWQgZmlsbFJlZ2lvbihVaW50OENsYW1wZWRBcnJheSYsIGNvbnN0IFBhaW50aW5nRGF0YSYsIFN0
aXRjaERhdGEsIGludCBzdGFydFksIGludCBlbmRZKSBjb25zdDsKIAogICAgIHN0YXRpYyB2b2lk
IGZpbGxSZWdpb25Xb3JrZXIodm9pZCopOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZmlsdGVycy9GaWx0ZXJPcGVyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNwcAko
cmV2aXNpb24gMjc1MTY1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmls
dGVycy9GaWx0ZXJPcGVyYXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjgsNyArMjI4LDcg
QEAgUmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gSW52ZXJ0TGlnaHRuZXNzRgogLy8gb24gY29sb3Ig
dmFsdWVzIG91dHNpZGUgb2YgdGhlIG5vbi1leHRlbmRlZCBTUkdCIHZhbHVlIHJhbmdlICgwLTEp
IHRvIG1haW50YWluIHRoZSBiZWhhdmlvciBvZiBjb2xvcnMKIC8vIHByaW9yIHRvIGNsYW1waW5n
IGJlaW5nIGVuZm9yY2VkLiBJdCBzaG91bGQgbGlrZWx5IGp1c3QgdXNlIHRoZSBleGlzdGluZyBo
dWVSb3RhdGVDb2xvck1hdHJpeChhbW91bnQpCiAvLyBpbiBDb2xvck1hdHJpeC5oCi1zdGF0aWMg
Q29sb3JDb21wb25lbnRzPGZsb2F0PiBodWVSb3RhdGUoY29uc3QgQ29sb3JDb21wb25lbnRzPGZs
b2F0PiYgY29sb3IsIGZsb2F0IGFtb3VudCkKK3N0YXRpYyBDb2xvckNvbXBvbmVudHM8ZmxvYXQs
IDQ+IGh1ZVJvdGF0ZShjb25zdCBDb2xvckNvbXBvbmVudHM8ZmxvYXQsIDQ+JiBjb2xvciwgZmxv
YXQgYW1vdW50KQogewogICAgIGF1dG8gW3IsIGcsIGIsIGFscGhhXSA9IGNvbG9yOwogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>