<?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>212231</bug_id>
          
          <creation_ts>2020-05-21 14:17:19 -0700</creation_ts>
          <short_desc>Extended Color Cleanup: Remove trivial uses of Color::rgb()</short_desc>
          <delta_ts>2020-05-24 13:38:19 -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>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=198628</see_also>
          <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>
          
          <blocked>212184</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>calvaris</cc>
    
    <cc>cdumez</cc>
    
    <cc>changseok</cc>
    
    <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fmalita</cc>
    
    <cc>glenn</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>mifenton</cc>
    
    <cc>pdr</cc>
    
    <cc>philipj</cc>
    
    <cc>sabouhallawa</cc>
    
    <cc>schenney</cc>
    
    <cc>sergio</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1655075</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-05-21 14:17:19 -0700</bug_when>
    <thetext>Extended Color Cleanup: Remove trivial uses of Color::rgb()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655082</commentid>
    <comment_count>1</comment_count>
      <attachid>399980</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-05-21 14:29:13 -0700</bug_when>
    <thetext>Created attachment 399980
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655094</commentid>
    <comment_count>2</comment_count>
      <attachid>399980</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-05-21 15:12:47 -0700</bug_when>
    <thetext>Comment on attachment 399980
Patch

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

&gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:381
&gt; +        if (style.hasOverrideAlpha())
&gt; +            style = CanvasStyle(currentColor(canvasBase()).colorWithAlphaUsingAlternativeRounding(style.overrideAlpha()));
&gt; +        else
&gt;              style = CanvasStyle(currentColor(canvasBase()));

If colorWithAlphaUsingAlternativeRounding took an Optional then we could write this code in a more straightforward way. The style could give us an optional overriding value for the alpha.

&gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:407
&gt; +        if (style.hasOverrideAlpha())
&gt; +            style = CanvasStyle(currentColor(canvasBase()).colorWithAlphaUsingAlternativeRounding(style.overrideAlpha()));
&gt; +        else
&gt;              style = CanvasStyle(currentColor(canvasBase()));

Would be nice here.

&gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:1313
&gt; +    if (alpha)
&gt; +        color = color.colorWithAlphaUsingAlternativeRounding(*alpha);
&gt; +    setShadow(FloatSize(width, height), blur, color);

And here the code is getting less simple because we don’t have that.

I wish we were keeping it.

&gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:126
&gt; +    if (equalIgnoringSemanticColor(color, Color::transparent)) {

I hope performance is still great. The old version was pleasantly bit-twiddly and inlined in a way that gave me confidence it was efficient.

&gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:130
&gt; +    if (Color::isBlackColor(color)) {

I find this Color::isBlackColor function vexing. Should it return true when an extended color is black? For the use here, I think we’d want the super-fast one even if it gets false negatives.

&gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:134
&gt; +    if (Color::isWhiteColor(color)) {

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655105</commentid>
    <comment_count>3</comment_count>
      <attachid>399986</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-05-21 15:26:41 -0700</bug_when>
    <thetext>Created attachment 399986
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655109</commentid>
    <comment_count>4</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-05-21 15:28:46 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #2)
&gt; Comment on attachment 399980 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=399980&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:381
&gt; &gt; +        if (style.hasOverrideAlpha())
&gt; &gt; +            style = CanvasStyle(currentColor(canvasBase()).colorWithAlphaUsingAlternativeRounding(style.overrideAlpha()));
&gt; &gt; +        else
&gt; &gt;              style = CanvasStyle(currentColor(canvasBase()));
&gt; 
&gt; If colorWithAlphaUsingAlternativeRounding took an Optional then we could
&gt; write this code in a more straightforward way. The style could give us an
&gt; optional overriding value for the alpha.
&gt; 
&gt; &gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:407
&gt; &gt; +        if (style.hasOverrideAlpha())
&gt; &gt; +            style = CanvasStyle(currentColor(canvasBase()).colorWithAlphaUsingAlternativeRounding(style.overrideAlpha()));
&gt; &gt; +        else
&gt; &gt;              style = CanvasStyle(currentColor(canvasBase()));
&gt; 
&gt; Would be nice here.
&gt; 
&gt; &gt; Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp:1313
&gt; &gt; +    if (alpha)
&gt; &gt; +        color = color.colorWithAlphaUsingAlternativeRounding(*alpha);
&gt; &gt; +    setShadow(FloatSize(width, height), blur, color);
&gt; 
&gt; And here the code is getting less simple because we don’t have that.

Added. Made the code simplifications.

&gt; 
&gt; I wish we were keeping it.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:126
&gt; &gt; +    if (equalIgnoringSemanticColor(color, Color::transparent)) {
&gt; 
&gt; I hope performance is still great. The old version was pleasantly
&gt; bit-twiddly and inlined in a way that gave me confidence it was efficient.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:130
&gt; &gt; +    if (Color::isBlackColor(color)) {
&gt; 
&gt; I find this Color::isBlackColor function vexing. Should it return true when
&gt; an extended color is black? For the use here, I think we’d want the
&gt; super-fast one even if it gets false negatives.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:134
&gt; &gt; +    if (Color::isWhiteColor(color)) {
&gt; 
&gt; Ditto.

Removed this change. It&apos;s a use of rgb() that is local to Color family of files so we can make it a friend / member of Color when needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655138</commentid>
    <comment_count>5</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-05-21 16:33:21 -0700</bug_when>
    <thetext>Committed r262035: &lt;https://trac.webkit.org/changeset/262035&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 399986.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1655139</commentid>
    <comment_count>6</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-05-21 16:34:14 -0700</bug_when>
    <thetext>&lt;rdar://problem/63516688&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>399980</attachid>
            <date>2020-05-21 14:29:13 -0700</date>
            <delta_ts>2020-05-21 15:26:39 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-212231-20200521142912.patch</filename>
            <type>text/plain</type>
            <size>26339</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY1IEBACisyMDIwLTA1LTIxICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBFeHRlbmRlZCBDb2xvciBDbGVhbnVw
OiBSZW1vdmUgdHJpdmlhbCB1c2VzIG9mIENvbG9yOjpyZ2IoKQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMjMxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVwbGFjZXMgYSBmZXcgdW5uZWNlc3Nhcnkg
dXNlcyBvZiBDb2xvcjo6cmdiKCk6CisgICAgICAgIC0gVXNlcyBvZiBhbiBpZGlvbSB3aGVyZSBj
b2RlIHJvdW5kLXRyaXBwZWQgYSBDb2xvciB2aWEgQ29sb3IobXlDb2xvci5yZ2IoKSkuIFRoaXMg
aXMKKyAgICAgICAgICBub3QgY29tcGF0aWJsZSB3aXRoIGV4dGVuZGVkIGNvbG9ycyBhbmQgc2Vl
bXMgdG8gYmUgdW5uZWNlc3NhcnkuCisgICAgICAgIC0gVXNlcyBvZiBjb2xvcldpdGhPdmVycmlk
ZUFscGhhKCkuIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgYSBTaW1wbGVDb2xvciwgc28gcmVxdWly
ZWQKKyAgICAgICAgICB1c2luZyBjb2xvci5yZ2IoKS4gV2UgY2FuJ3QgdHJhbnNpdGlvbiB0byBD
b2xvcjo6Y29sb3JXaXRoQWxwaGEgZHVlIHRvIGEgc2xpZ2h0bHkgCisgICAgICAgICAgZGlmZmVy
ZW50IHJvdW5kaW5nIG9mIHRoZSBhbHBoYSwgc28gYSBuZXcgZnVuY3Rpb24gQ29sb3I6OmNvbG9y
V2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nCisgICAgICAgICAgd2FzIGFkZGVkIHRv
IHdoaWNoIGltcGxlbWVudHMgdGhlIGFsdGVybmF0aXZlIHJvdW5kaW5nLiBBIGxhdGVyIGNoYW5n
ZSBjYW4gcmVjb25jaWxlCisgICAgICAgICAgdGhlIHR3byB2ZXJzaW9ucy4KKyAgICAgICAgLSBB
IHVzZSBvZiBzd2l0Y2hpbmcgZGlyZWN0bHkgb24gcmdiKCkudmFsdWUoKSB3aGVyZSB3ZSBjYW4g
dXNlIGEgc2V0IG9mIGlmLXN0YXRlbWVudHMKKyAgICAgICAgLSBDcmVhdGlvbiBvZiBEMkQxOjpD
b2xvckYuIEQyRDE6OkNvbG9yRiBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgZm91ciBm
bG9hdHMgdGhhdAorICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgICAgLSBDb21wYXJp
bmcgdHdvIGNvbG9ycyB1c2luZyByZ2IoKSBmb3IgZWFjaCB0byBhdm9pZCBjb21wYXJpbmcgdGhl
IHNlbWFudGljIGJpdC4gZXF1YWxJZ25vcmluZ1NlbWFudGljQ29sb3IKKyAgICAgICAgICBleGlz
dHMgZm9yIGp1c3QgdGhpcyB1c2UuCisKKyAgICAgICAgKiBlZGl0aW5nL2NvY29hL0hUTUxDb252
ZXJ0ZXIubW06CisgICAgICAgIChIVE1MQ29udmVydGVyQ2FjaGVzOjpjb2xvclByb3BlcnR5VmFs
dWVGb3JOb2RlKToKKyAgICAgICAgKiBodG1sL0hUTUxFbGVtZW50LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxFbGVtZW50OjphZGRIVE1MQ29sb3JUb1N0eWxlKToKKyAgICAgICAgKiBodG1s
L2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRCYXNlLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyREJhc2U6OnNldFN0cm9rZVN0eWxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyREJhc2U6OnNldEZpbGxTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRCYXNlOjpzZXRTaGFk
b3cpOgorICAgICAgICAqIGh0bWwvY2FudmFzL0NhbnZhc1N0eWxlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkNhbnZhc1N0eWxlOjpjcmVhdGVGcm9tU3RyaW5nV2l0aE92ZXJyaWRlQWxwaGEpOgor
ICAgICAgICAqIGh0bWwvdHJhY2svSW5iYW5kR2VuZXJpY1RleHRUcmFjay5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpJbmJhbmRHZW5lcmljVGV4dFRyYWNrOjp1cGRhdGVDdWVGcm9tQ3VlRGF0YSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Q29sb3I6OmNvbG9yV2l0aEFscGhhTXVsdGlwbGllZEJ5VXNpbmdBbHRlcm5hdGl2ZVJvdW5k
aW5nIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbG9yOjpjb2xvcldpdGhBbHBoYSBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpDb2xvcjo6Y29sb3JXaXRoQWxwaGFVc2luZ0FsdGVybmF0
aXZlUm91bmRpbmcgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Y29sb3JXaXRoT3ZlcnJpZGVB
bHBoYSk6IERlbGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OmNvbG9yV2l0aE92ZXJyaWRlQWxwaGEpOiBEZWxldGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0NhaXJvT3BlcmF0aW9ucy5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpDYWlybzo6cHJlcGFyZUNhaXJvQ29udGV4dFNvdXJjZSk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2cvQ29sb3JDRy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpjYWNo
ZWRDR0NvbG9yKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFRmxvb2Qu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6RkVGbG9vZDo6cGxhdGZvcm1BcHBseVNvZnR3YXJlKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpDb2xvcjo6b3BlcmF0b3IgRDJEMV9DT0xPUl9GIGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbG9yOjpvcGVyYXRvciBEMkQxX1ZFQ1RPUl80RiBjb25zdCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoR2xvYmFsQWxwaGEg
Y29uc3QpOgorICAgICAgICAqIHBsYXRmb3JtL21hYy9UaGVtZU1hYy5tbToKKyAgICAgICAgKFdl
YkNvcmU6OmRyYXdDZWxsRm9jdXNSaW5nV2l0aEZyYW1lQXRUaW1lKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyVGhlbWVJT1MubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUlP
Uzo6cGFpbnRGaWxlVXBsb2FkSWNvbkRlY29yYXRpb25zKToKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyVGhlbWVNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGxh
dGZvcm1Gb2N1c1JpbmdDb2xvciBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRy
ZWVBc1RleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVHJlZUFzVGV4dDo6d3JpdGVS
ZW5kZXJPYmplY3QpOgorICAgICAgICAqIHN2Zy9TVkdTdG9wRWxlbWVudC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpTVkdTdG9wRWxlbWVudDo6c3RvcENvbG9ySW5jbHVkaW5nT3BhY2l0eSBjb25z
dCk6CisKIDIwMjAtMDUtMjAgIEFsZXggQ2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0
Lm9yZz4KIAogICAgICAgICBSZW1vdmUgaW1wbGljaXQgVVJMLT5TdHJpbmcgY29udmVyc2lvbiBv
cGVyYXRvcnMKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvY29jb2EvSFRNTENvbnZlcnRl
ci5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL2NvY29hL0hUTUxDb252
ZXJ0ZXIubW0JKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvY29j
b2EvSFRNTENvbnZlcnRlci5tbQkod29ya2luZyBjb3B5KQpAQCAtODgyLDEzICs4ODIsMTMgQEAg
Q29sb3IgSFRNTENvbnZlcnRlckNhY2hlczo6Y29sb3JQcm9wZXJ0eQogICAgIEVsZW1lbnQmIGVs
ZW1lbnQgPSBkb3duY2FzdDxFbGVtZW50Pihub2RlKTsKICAgICBpZiAoUmVmUHRyPENTU1ZhbHVl
PiB2YWx1ZSA9IGNvbXB1dGVkU3R5bGVQcm9wZXJ0eUZvckVsZW1lbnQoZWxlbWVudCwgcHJvcGVy
dHlJZCkpIHsKICAgICAgICAgaWYgKGlzPENTU1ByaW1pdGl2ZVZhbHVlPigqdmFsdWUpICYmIGRv
d25jYXN0PENTU1ByaW1pdGl2ZVZhbHVlPigqdmFsdWUpLmlzUkdCQ29sb3IoKSkKLSAgICAgICAg
ICAgIHJldHVybiBub3JtYWxpemVkQ29sb3IoQ29sb3IoZG93bmNhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWU+KCp2YWx1ZSkuY29sb3IoKS5yZ2IoKSksIGlnbm9yZURlZmF1bHRDb2xvciwgZWxlbWVudCk7
CisgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZENvbG9yKGRvd25jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlPigqdmFsdWUpLmNvbG9yKCksIGlnbm9yZURlZmF1bHRDb2xvciwgZWxlbWVudCk7CiAg
ICAgfQogCiAgICAgYm9vbCBpbmhlcml0ID0gZmFsc2U7CiAgICAgaWYgKFJlZlB0cjxDU1NWYWx1
ZT4gdmFsdWUgPSBpbmxpbmVTdHlsZVByb3BlcnR5Rm9yRWxlbWVudChlbGVtZW50LCBwcm9wZXJ0
eUlkKSkgewogICAgICAgICBpZiAoaXM8Q1NTUHJpbWl0aXZlVmFsdWU+KCp2YWx1ZSkgJiYgZG93
bmNhc3Q8Q1NTUHJpbWl0aXZlVmFsdWU+KCp2YWx1ZSkuaXNSR0JDb2xvcigpKQotICAgICAgICAg
ICAgcmV0dXJuIG5vcm1hbGl6ZWRDb2xvcihDb2xvcihkb3duY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZT4oKnZhbHVlKS5jb2xvcigpLnJnYigpKSwgaWdub3JlRGVmYXVsdENvbG9yLCBlbGVtZW50KTsK
KyAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkQ29sb3IoZG93bmNhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWU+KCp2YWx1ZSkuY29sb3IoKSwgaWdub3JlRGVmYXVsdENvbG9yLCBlbGVtZW50KTsKICAg
ICAgICAgaWYgKHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpCiAgICAgICAgICAgICBpbmhlcml0
ID0gdHJ1ZTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAkocmV2
aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTEwNTAsNyArMTA1MCw3IEBAIHZvaWQgSFRNTEVsZW1lbnQ6OmFkZEhU
TUxDb2xvclRvU3R5bGUoTXUKICAgICBpZiAoIWNvbG9yLmlzVmFsaWQoKSkKICAgICAgICAgY29s
b3IgPSBDb2xvcihwYXJzZUNvbG9yU3RyaW5nV2l0aENyYXp5TGVnYWN5UnVsZXMoY29sb3JTdHJp
bmcpKTsKIAotICAgIHN0eWxlLnNldFByb3BlcnR5KHByb3BlcnR5SUQsIENTU1ZhbHVlUG9vbDo6
c2luZ2xldG9uKCkuY3JlYXRlQ29sb3JWYWx1ZShjb2xvci5yZ2IoKSkpOworICAgIHN0eWxlLnNl
dFByb3BlcnR5KHByb3BlcnR5SUQsIENTU1ZhbHVlUG9vbDo6c2luZ2xldG9uKCkuY3JlYXRlQ29s
b3JWYWx1ZShjb2xvcikpOwogfQogCiBib29sIEhUTUxFbGVtZW50Ojp3aWxsUmVzcG9uZFRvTW91
c2VNb3ZlRXZlbnRzKCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyREJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0
bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyREJhc2UuY3BwCShyZXZpc2lvbiAyNjE5
NzApCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0
MkRCYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzc1LDEwICszNzUsOSBAQCB2b2lkIENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyREJhc2U6OnNldFN0CiAgICAgICAgIHJldHVybjsKIAogICAgIGlm
IChzdHlsZS5pc0N1cnJlbnRDb2xvcigpKSB7Ci0gICAgICAgIGlmIChzdHlsZS5oYXNPdmVycmlk
ZUFscGhhKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBTaG91bGQgbm90IHVzZSBSR0JBMzIg
aGVyZS4KLSAgICAgICAgICAgIHN0eWxlID0gQ2FudmFzU3R5bGUoY29sb3JXaXRoT3ZlcnJpZGVB
bHBoYShjdXJyZW50Q29sb3IoY2FudmFzQmFzZSgpKS5yZ2IoKSwgc3R5bGUub3ZlcnJpZGVBbHBo
YSgpKSk7Ci0gICAgICAgIH0gZWxzZQorICAgICAgICBpZiAoc3R5bGUuaGFzT3ZlcnJpZGVBbHBo
YSgpKQorICAgICAgICAgICAgc3R5bGUgPSBDYW52YXNTdHlsZShjdXJyZW50Q29sb3IoY2FudmFz
QmFzZSgpKS5jb2xvcldpdGhBbHBoYVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhzdHlsZS5vdmVy
cmlkZUFscGhhKCkpKTsKKyAgICAgICAgZWxzZQogICAgICAgICAgICAgc3R5bGUgPSBDYW52YXNT
dHlsZShjdXJyZW50Q29sb3IoY2FudmFzQmFzZSgpKSk7CiAgICAgfSBlbHNlCiAgICAgICAgIGNo
ZWNrT3JpZ2luKHN0eWxlLmNhbnZhc1BhdHRlcm4oKS5nZXQoKSk7CkBAIC00MDIsMTAgKzQwMSw5
IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQmFzZTo6c2V0RmkKICAgICAgICAgcmV0
dXJuOwogCiAgICAgaWYgKHN0eWxlLmlzQ3VycmVudENvbG9yKCkpIHsKLSAgICAgICAgaWYgKHN0
eWxlLmhhc092ZXJyaWRlQWxwaGEoKSkgewotICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZCBu
b3QgdXNlIFJHQkEzMiBoZXJlLgotICAgICAgICAgICAgc3R5bGUgPSBDYW52YXNTdHlsZShjb2xv
cldpdGhPdmVycmlkZUFscGhhKGN1cnJlbnRDb2xvcihjYW52YXNCYXNlKCkpLnJnYigpLCBzdHls
ZS5vdmVycmlkZUFscGhhKCkpKTsKLSAgICAgICAgfSBlbHNlCisgICAgICAgIGlmIChzdHlsZS5o
YXNPdmVycmlkZUFscGhhKCkpCisgICAgICAgICAgICBzdHlsZSA9IENhbnZhc1N0eWxlKGN1cnJl
bnRDb2xvcihjYW52YXNCYXNlKCkpLmNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5k
aW5nKHN0eWxlLm92ZXJyaWRlQWxwaGEoKSkpOworICAgICAgICBlbHNlCiAgICAgICAgICAgICBz
dHlsZSA9IENhbnZhc1N0eWxlKGN1cnJlbnRDb2xvcihjYW52YXNCYXNlKCkpKTsKICAgICB9IGVs
c2UKICAgICAgICAgY2hlY2tPcmlnaW4oc3R5bGUuY2FudmFzUGF0dGVybigpLmdldCgpKTsKQEAg
LTEzMTAsOCArMTMwOCw5IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQmFzZTo6c2V0
U2gKICAgICAgICAgaWYgKCFjb2xvci5pc1ZhbGlkKCkpCiAgICAgICAgICAgICByZXR1cm47CiAg
ICAgfQotICAgIC8vIEZJWE1FOiBTaG91bGQgbm90IHVzZSBSR0JBMzIgaGVyZS4KLSAgICBzZXRT
aGFkb3coRmxvYXRTaXplKHdpZHRoLCBoZWlnaHQpLCBibHVyLCBjb2xvcldpdGhPdmVycmlkZUFs
cGhhKGNvbG9yLnJnYigpLCBhbHBoYSkpOworICAgIGlmIChhbHBoYSkKKyAgICAgICAgY29sb3Ig
PSBjb2xvci5jb2xvcldpdGhBbHBoYVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZygqYWxwaGEpOwor
ICAgIHNldFNoYWRvdyhGbG9hdFNpemUod2lkdGgsIGhlaWdodCksIGJsdXIsIGNvbG9yKTsKIH0K
IAogdm9pZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRCYXNlOjpzZXRTaGFkb3coZmxvYXQgd2lk
dGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgYmx1ciwgZmxvYXQgZ3JheUxldmVsLCBmbG9hdCBhbHBo
YSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1N0eWxlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNTdHlsZS5jcHAJKHJl
dmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1N0eWxl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ1LDcgKzE0NSw3IEBAIENhbnZhc1N0eWxlIENhbnZh
c1N0eWxlOjpjcmVhdGVGcm9tU3RyaW4KICAgICBpZiAoIWNvbG9yLmlzVmFsaWQoKSkKICAgICAg
ICAgcmV0dXJuIHsgfTsKIAotICAgIHJldHVybiBDb2xvciB7IGNvbG9yV2l0aE92ZXJyaWRlQWxw
aGEoY29sb3IucmdiKCksIGFscGhhKSB9OworICAgIHJldHVybiBjb2xvci5jb2xvcldpdGhBbHBo
YVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhhbHBoYSk7CiB9CiAKIGJvb2wgQ2FudmFzU3R5bGU6
OmlzRXF1aXZhbGVudENvbG9yKGNvbnN0IENhbnZhc1N0eWxlJiBvdGhlcikgY29uc3QKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svSW5iYW5kR2VuZXJpY1RleHRUcmFjay5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9JbmJhbmRHZW5lcmljVGV4dFRy
YWNrLmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9J
bmJhbmRHZW5lcmljVGV4dFRyYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTcsMTEgKzk3LDEx
IEBAIHZvaWQgSW5iYW5kR2VuZXJpY1RleHRUcmFjazo6dXBkYXRlQ3VlRnIKICAgICBpZiAoaW5i
YW5kQ3VlLnNpemUoKSA+IDApCiAgICAgICAgIGN1ZS5zZXRTaXplKHN0ZDo6cm91bmQoaW5iYW5k
Q3VlLnNpemUoKSkpOwogICAgIGlmIChpbmJhbmRDdWUuYmFja2dyb3VuZENvbG9yKCkuaXNWYWxp
ZCgpKQotICAgICAgICBjdWUuc2V0QmFja2dyb3VuZENvbG9yKGluYmFuZEN1ZS5iYWNrZ3JvdW5k
Q29sb3IoKS5yZ2IoKSk7CisgICAgICAgIGN1ZS5zZXRCYWNrZ3JvdW5kQ29sb3IoaW5iYW5kQ3Vl
LmJhY2tncm91bmRDb2xvcigpKTsKICAgICBpZiAoaW5iYW5kQ3VlLmZvcmVncm91bmRDb2xvcigp
LmlzVmFsaWQoKSkKLSAgICAgICAgY3VlLnNldEZvcmVncm91bmRDb2xvcihpbmJhbmRDdWUuZm9y
ZWdyb3VuZENvbG9yKCkucmdiKCkpOworICAgICAgICBjdWUuc2V0Rm9yZWdyb3VuZENvbG9yKGlu
YmFuZEN1ZS5mb3JlZ3JvdW5kQ29sb3IoKSk7CiAgICAgaWYgKGluYmFuZEN1ZS5oaWdobGlnaHRD
b2xvcigpLmlzVmFsaWQoKSkKLSAgICAgICAgY3VlLnNldEhpZ2hsaWdodENvbG9yKGluYmFuZEN1
ZS5oaWdobGlnaHRDb2xvcigpLnJnYigpKTsKKyAgICAgICAgY3VlLnNldEhpZ2hsaWdodENvbG9y
KGluYmFuZEN1ZS5oaWdobGlnaHRDb2xvcigpKTsKIAogICAgIGlmIChpbmJhbmRDdWUuYWxpZ24o
KSA9PSBHZW5lcmljQ3VlRGF0YTo6QWxpZ25tZW50OjpTdGFydCkKICAgICAgICAgY3VlLnNldEFs
aWduKCJzdGFydCJfcyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9D
b2xvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Q29sb3IuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Db2xvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcxLDExICs3MSw2IEBAIFJHQkEz
MiBtYWtlUkdCQTMyRnJvbUZsb2F0cyhmbG9hdCByLCBmbG8KICAgICByZXR1cm4gbWFrZVJHQkEo
Y29sb3JGbG9hdFRvUkdCQUJ5dGUociksIGNvbG9yRmxvYXRUb1JHQkFCeXRlKGcpLCBjb2xvckZs
b2F0VG9SR0JBQnl0ZShiKSwgY29sb3JGbG9hdFRvUkdCQUJ5dGUoYSkpOwogfQogCi1SR0JBMzIg
Y29sb3JXaXRoT3ZlcnJpZGVBbHBoYShSR0JBMzIgY29sb3IsIGZsb2F0IG92ZXJyaWRlQWxwaGEp
Ci17Ci0gICAgcmV0dXJuIHsgKGNvbG9yLnZhbHVlKCkgJiAweDAwRkZGRkZGKSB8IGNvbG9yRmxv
YXRUb1JHQkFCeXRlKG92ZXJyaWRlQWxwaGEpIDw8IDI0IH07Ci19Ci0KIFJHQkEzMiBtYWtlUkdC
QUZyb21IU0xBKGZsb2F0IGh1ZSwgZmxvYXQgc2F0dXJhdGlvbiwgZmxvYXQgbGlnaHRuZXNzLCBm
bG9hdCBhbHBoYSkKIHsKICAgICBjb25zdCBmbG9hdCBzY2FsZUZhY3RvciA9IDI1NS4wOwpAQCAt
NDYwLDEyICs0NTUsMTkgQEAgQ29sb3IgQ29sb3I6OmNvbG9yV2l0aEFscGhhTXVsdGlwbGllZEJ5
KAogICAgIHJldHVybiBjb2xvcldpdGhBbHBoYShuZXdBbHBoYSk7CiB9CiAKK0NvbG9yIENvbG9y
Ojpjb2xvcldpdGhBbHBoYU11bHRpcGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhmbG9h
dCBhbW91bnQpIGNvbnN0Cit7CisgICAgZmxvYXQgbmV3QWxwaGEgPSBhbW91bnQgKiAoaXNFeHRl
bmRlZCgpID8gbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+YWxwaGEoKSA6IHN0YXRpY19jYXN0
PGZsb2F0PihhbHBoYSgpKSAvIDI1NSk7CisgICAgcmV0dXJuIGNvbG9yV2l0aEFscGhhVXNpbmdB
bHRlcm5hdGl2ZVJvdW5kaW5nKG5ld0FscGhhKTsKK30KKwogQ29sb3IgQ29sb3I6OmNvbG9yV2l0
aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdAogewogICAgIGlmIChpc0V4dGVuZGVkKCkpCiAgICAg
ICAgIHJldHVybiBDb2xvciB7IG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPnJlZCgpLCBtX2Nv
bG9yRGF0YS5leHRlbmRlZENvbG9yLT5ncmVlbigpLCBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9y
LT5ibHVlKCksIGFscGhhLCBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5jb2xvclNwYWNlKCkg
fTsKIAotICAgIGludCBuZXdBbHBoYSA9IGFscGhhICogMjU1OyAvLyBXaHkgZG9lc24ndCB0aGlz
IHVzZSBjb2xvckZsb2F0VG9SR0JBQnl0ZSgpIGxpa2UgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYSgp
PworICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdoZXJlIHRoaXMgZnVuY3Rpb24gZGlmZmVycyBmcm9t
IGNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nLgorICAgIGludCBuZXdBbHBo
YSA9IGFscGhhICogMjU1OwogCiAgICAgQ29sb3IgcmVzdWx0ID0geyByZWQoKSwgZ3JlZW4oKSwg
Ymx1ZSgpLCBuZXdBbHBoYSB9OwogICAgIGlmIChpc1NlbWFudGljKCkpCkBAIC00NzMsNiArNDc1
LDE3IEBAIENvbG9yIENvbG9yOjpjb2xvcldpdGhBbHBoYShmbG9hdCBhbHBoYSkKICAgICByZXR1
cm4gcmVzdWx0OwogfQogCitDb2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGFVc2luZ0FsdGVybmF0
aXZlUm91bmRpbmcoZmxvYXQgYWxwaGEpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkK
KyAgICAgICAgcmV0dXJuIENvbG9yIHsgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+cmVkKCks
IG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPmdyZWVuKCksIG1fY29sb3JEYXRhLmV4dGVuZGVk
Q29sb3ItPmJsdWUoKSwgYWxwaGEsIG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPmNvbG9yU3Bh
Y2UoKSB9OworCisgICAgQ29sb3IgcmVzdWx0ID0gU2ltcGxlQ29sb3IgeyAocmdiKCkudmFsdWUo
KSAmIDB4MDBGRkZGRkYpIHwgY29sb3JGbG9hdFRvUkdCQUJ5dGUoYWxwaGEpIDw8IDI0IH07Cisg
ICAgaWYgKGlzU2VtYW50aWMoKSkKKyAgICAgICAgcmVzdWx0LnNldElzU2VtYW50aWMoKTsKKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCiBzdGQ6OnBhaXI8Q29sb3JTcGFjZSwgRmxvYXRDb21wb25l
bnRzPiBDb2xvcjo6Y29sb3JTcGFjZUFuZENvbXBvbmVudHMoKSBjb25zdAogewogICAgIGlmIChp
c0V4dGVuZGVkKCkpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Nv
bG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29s
b3IuaAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvQ29sb3IuaAkod29ya2luZyBjb3B5KQpAQCAtOTIsOSArOTIsNiBAQCBjb25zdGV4cHIgUkdC
QTMyIG1ha2VSR0JBKGludCByLCBpbnQgZywgCiBSR0JBMzIgbWFrZVByZW11bHRpcGxpZWRSR0JB
KGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBib29sIGNlaWxpbmcgPSB0cnVlKTsKIFJHQkEz
MiBtYWtlVW5QcmVtdWx0aXBsaWVkUkdCQShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSk7CiAK
LVdFQkNPUkVfRVhQT1JUIFJHQkEzMiBjb2xvcldpdGhPdmVycmlkZUFscGhhKFJHQkEzMiBjb2xv
ciwgZmxvYXQgb3ZlcnJpZGVBbHBoYSk7Ci1SR0JBMzIgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShS
R0JBMzIgY29sb3IsIE9wdGlvbmFsPGZsb2F0PiBvdmVycmlkZUFscGhhKTsKLQogV0VCQ09SRV9F
WFBPUlQgUkdCQTMyIG1ha2VSR0JBMzJGcm9tRmxvYXRzKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0
IGIsIGZsb2F0IGEpOwogV0VCQ09SRV9FWFBPUlQgUkdCQTMyIG1ha2VSR0JBRnJvbUhTTEEoZmxv
YXQgaCwgZmxvYXQgcywgZmxvYXQgbCwgZmxvYXQgYSk7CiBSR0JBMzIgbWFrZVJHQkFGcm9tQ01Z
S0EoZmxvYXQgYywgZmxvYXQgbSwgZmxvYXQgeSwgZmxvYXQgaywgZmxvYXQgYSk7CkBAIC0yMjQs
OSArMjIxLDEyIEBAIHB1YmxpYzoKICAgICBDb2xvciBibGVuZFdpdGhXaGl0ZSgpIGNvbnN0Owog
CiAgICAgQ29sb3IgY29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnkoZmxvYXQpIGNvbnN0OwotCi0g
ICAgLy8gUmV0dXJucyBhIGNvbG9yIHRoYXQgaGFzIHRoZSBzYW1lIFJHQiB2YWx1ZXMsIGJ1dCB3
aXRoIHRoZSBnaXZlbiBBLgogICAgIENvbG9yIGNvbG9yV2l0aEFscGhhKGZsb2F0KSBjb25zdDsK
KworICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhlIG5lZWQgZm9yIEFsdGVybmF0aXZlUm91bmRpbmcg
dmFyaWFudHMgYnkgc2V0dGxpbmcgb24gYSByb3VuZGluZyBiZWhhdmlvci4KKyAgICBDb2xvciBj
b2xvcldpdGhBbHBoYU11bHRpcGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhmbG9hdCkg
Y29uc3Q7CisgICAgV0VCQ09SRV9FWFBPUlQgQ29sb3IgY29sb3JXaXRoQWxwaGFVc2luZ0FsdGVy
bmF0aXZlUm91bmRpbmcoZmxvYXQpIGNvbnN0OworCiAgICAgQ29sb3Igb3BhcXVlQ29sb3IoKSBj
b25zdCB7IHJldHVybiBjb2xvcldpdGhBbHBoYSgxLjBmKTsgfQogCiAgICAgLy8gVHJ1ZSBpZiB0
aGUgY29sb3Igb3JpZ2luYXRlZCBmcm9tIGEgQ1NTIHNlbWFudGljIGNvbG9yIG5hbWUuCkBAIC0z
OTMsMTEgKzM5Myw2IEBAIGlubGluZSB1aW50MTZfdCBmYXN0RGl2aWRlQnkyNTUodWludDE2X3QK
ICAgICByZXR1cm4gYXBwcm94aW1hdGlvbiArIChyZW1haW5kZXIgPj4gOCk7CiB9CiAKLWlubGlu
ZSBSR0JBMzIgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShSR0JBMzIgY29sb3IsIE9wdGlvbmFsPGZs
b2F0PiBvdmVycmlkZUFscGhhKQotewotICAgIHJldHVybiBvdmVycmlkZUFscGhhID8gY29sb3JX
aXRoT3ZlcnJpZGVBbHBoYShjb2xvciwgb3ZlcnJpZGVBbHBoYS52YWx1ZSgpKSA6IGNvbG9yOwot
fQotCiBpbmxpbmUgUkdCQTMyIENvbG9yOjpyZ2IoKSBjb25zdAogewogICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgQVNTRVJUKCFpc0V4dGVuZGVkKCkpIGhlcmUsIG9yIHByb2R1Y2UKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0NhaXJvT3BlcmF0aW9ucy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vQ2Fp
cm9PcGVyYXRpb25zLmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2Fpcm8vQ2Fpcm9PcGVyYXRpb25zLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNzgsNyArNzgsNyBAQCBzdGF0aWMgdm9pZCBwcmVwYXJlQ2Fpcm9Db250ZXh0U291cmNlKGNh
CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gU29saWQgY29sb3Igc291cmNlCiAgICAgICAgIGlm
IChnbG9iYWxBbHBoYSA8IDEpCi0gICAgICAgICAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNy
LCBjb2xvcldpdGhPdmVycmlkZUFscGhhKGNvbG9yLnJnYigpLCBjb2xvci5hbHBoYSgpIC8gMjU1
LmYgKiBnbG9iYWxBbHBoYSkpOworICAgICAgICAgICAgc2V0U291cmNlUkdCQUZyb21Db2xvcihj
ciwgY29sb3IuY29sb3JXaXRoQWxwaGFVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcoY29sb3IuYWxw
aGEoKSAvIDI1NS5mICogZ2xvYmFsQWxwaGEpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAg
c2V0U291cmNlUkdCQUZyb21Db2xvcihjciwgY29sb3IpOwogICAgIH0KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0NvbG9yQ0cuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0NvbG9yQ0cuY3BwCShyZXZpc2lvbiAy
NjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9Db2xvckNHLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTIzLDI0ICsxMjMsMTggQEAgc3RhdGljIENHQ29sb3JSZWYg
bGVha0NHQ29sb3IoY29uc3QgQ29sbwogCiBDR0NvbG9yUmVmIGNhY2hlZENHQ29sb3IoY29uc3Qg
Q29sb3ImIGNvbG9yKQogewotICAgIGlmICghY29sb3IuaXNFeHRlbmRlZCgpKSB7Ci0gICAgICAg
IHN3aXRjaCAoY29sb3IucmdiKCkudmFsdWUoKSkgewotICAgICAgICBjYXNlIENvbG9yOjp0cmFu
c3BhcmVudC52YWx1ZSgpOiB7Ci0gICAgICAgICAgICBzdGF0aWMgQ0dDb2xvclJlZiB0cmFuc3Bh
cmVudENHQ29sb3IgPSBsZWFrQ0dDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJh
bnNwYXJlbnRDR0NvbG9yOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ29sb3I6OmJsYWNrLnZh
bHVlKCk6IHsKLSAgICAgICAgICAgIHN0YXRpYyBDR0NvbG9yUmVmIGJsYWNrQ0dDb2xvciA9IGxl
YWtDR0NvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgIHJldHVybiBibGFja0NHQ29sb3I7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBDb2xvcjo6d2hpdGUudmFsdWUoKTogewotICAgICAgICAgICAg
c3RhdGljIENHQ29sb3JSZWYgd2hpdGVDR0NvbG9yID0gbGVha0NHQ29sb3IoY29sb3IpOwotICAg
ICAgICAgICAgcmV0dXJuIHdoaXRlQ0dDb2xvcjsKLSAgICAgICAgfQotICAgICAgICB9CisgICAg
aWYgKGVxdWFsSWdub3JpbmdTZW1hbnRpY0NvbG9yKGNvbG9yLCBDb2xvcjo6dHJhbnNwYXJlbnQp
KSB7CisgICAgICAgIHN0YXRpYyBDR0NvbG9yUmVmIHRyYW5zcGFyZW50Q0dDb2xvciA9IGxlYWtD
R0NvbG9yKGNvbG9yKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zcGFyZW50Q0dDb2xvcjsKKyAgICB9
CisgICAgaWYgKENvbG9yOjppc0JsYWNrQ29sb3IoY29sb3IpKSB7CisgICAgICAgIHN0YXRpYyBD
R0NvbG9yUmVmIGJsYWNrQ0dDb2xvciA9IGxlYWtDR0NvbG9yKGNvbG9yKTsKKyAgICAgICAgcmV0
dXJuIGJsYWNrQ0dDb2xvcjsKKyAgICB9CisgICAgaWYgKENvbG9yOjppc1doaXRlQ29sb3IoY29s
b3IpKSB7CisgICAgICAgIHN0YXRpYyBDR0NvbG9yUmVmIHdoaXRlQ0dDb2xvciA9IGxlYWtDR0Nv
bG9yKGNvbG9yKTsKKyAgICAgICAgcmV0dXJuIHdoaXRlQ0dDb2xvcjsKICAgICB9Ci0KLSAgICBB
U1NFUlQoY29sb3IuaXNFeHRlbmRlZCgpIHx8IGNvbG9yLnJnYigpLnZhbHVlKCkpOwogCiAgICAg
c3RhdGljIE5ldmVyRGVzdHJveWVkPFRpbnlMUlVDYWNoZTxDb2xvciwgUmV0YWluUHRyPENHQ29s
b3JSZWY+LCAzMj4+IGNhY2hlOwogICAgIHJldHVybiBjYWNoZS5nZXQoKS5nZXQoY29sb3IpLmdl
dCgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GRUZs
b29kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9m
aWx0ZXJzL0ZFRmxvb2QuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFRmxvb2QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02
Myw5ICs2Myw3IEBAIHZvaWQgRkVGbG9vZDo6cGxhdGZvcm1BcHBseVNvZnR3YXJlKCkKICAgICBp
ZiAoIXJlc3VsdEltYWdlKQogICAgICAgICByZXR1cm47CiAKLSAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGQgdXNlIGNvbG9yV2l0aEFscGhhTXVsdGlwbGllZEJ5KCkgYnV0IHRoYXQgaGFzIGRpZmZl
cmVudCByb3VuZGluZyBvZiB0aGUgYWxwaGEgY29tcG9uZW50IHRoYXQgYnJlYWtzIHNvbWUgdGVz
dHMuCi0gICAgZmxvYXQgY29sb3JBbHBoYSA9IGZsb29kQ29sb3IoKS5hbHBoYSgpIC8gMjU1LjA7
Ci0gICAgYXV0byBjb2xvciA9IGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoZmxvb2RDb2xvcigpLnJn
YigpLCBjb2xvckFscGhhICogZmxvb2RPcGFjaXR5KCkpOworICAgIGF1dG8gY29sb3IgPSBmbG9v
ZENvbG9yKCkuY29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnlVc2luZ0FsdGVybmF0aXZlUm91bmRp
bmcoZmxvb2RPcGFjaXR5KCkpOwogICAgIHJlc3VsdEltYWdlLT5jb250ZXh0KCkuZmlsbFJlY3Qo
RmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgYWJzb2x1dGVQYWludFJlY3QoKS5zaXplKCkpLCBjb2xv
cik7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Db2xv
ckRpcmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Db2xvckRpcmVjdDJELmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDEsMTkgKzQxLDE0IEBAIENvbG9yOjpDb2xvcihEMkQxX0NPTE9SX0YgY29sb3Ip
CiAKIENvbG9yOjpvcGVyYXRvciBEMkQxX0NPTE9SX0YoKSBjb25zdAogewotICAgIGlmIChpc0V4
dGVuZGVkKCkpIHsKLSAgICAgICAgYXV0byBhc1JHQkEgPSB0b1NSR0JBQ29tcG9uZW50c0xvc3N5
KCk7Ci0gICAgICAgIHJldHVybiBEMkQxOjpDb2xvckYoYXNSR0JBLmNvbXBvbmVudHNbMF0sIGFz
UkdCQS5jb21wb25lbnRzWzFdLCBhc1JHQkEuY29tcG9uZW50c1syXSwgYXNSR0JBLmNvbXBvbmVu
dHNbM10pOwotICAgIH0KLQotICAgIGZsb2F0IGNvbG9yQWxwaGEgPSBhbHBoYSgpIC8gMjU1LjBm
OwotICAgIHJldHVybiBEMkQxOjpDb2xvckYocmdiKCkudmFsdWUoKSwgY29sb3JBbHBoYSk7Cisg
ICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBQ29tcG9uZW50c0xvc3N5KCk7CisgICAgcmV0
dXJuIEQyRDE6OkNvbG9yRihyLCBnLCBiLCBhKTsKIH0KIAogQ29sb3I6Om9wZXJhdG9yIEQyRDFf
VkVDVE9SXzRGKCkgY29uc3QKIHsKLSAgICBhdXRvIGFzUkdCQSA9IHRvU1JHQkFDb21wb25lbnRz
TG9zc3koKTsKLSAgICByZXR1cm4gRDJEMTo6VmVjdG9yNEYoYXNSR0JBLmNvbXBvbmVudHNbMF0s
IGFzUkdCQS5jb21wb25lbnRzWzFdLCBhc1JHQkEuY29tcG9uZW50c1syXSwgYXNSR0JBLmNvbXBv
bmVudHNbM10pOworICAgIGF1dG8gW3IsIGcsIGIsIGFdID0gdG9TUkdCQUNvbXBvbmVudHNMb3Nz
eSgpOworICAgIHJldHVybiBEMkQxOjpWZWN0b3I0RihyLCBnLCBiLCBhKTsKIH0KIAogfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERp
cmVjdDJELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0MkQuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0RGlyZWN0
MkQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNzksMTAgKzM3OSw4IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3QKIAogRDJEMV9DT0xPUl9GIEdyYXBoaWNzQ29udGV4
dDo6Y29sb3JXaXRoR2xvYmFsQWxwaGEoY29uc3QgQ29sb3ImIGNvbG9yKSBjb25zdAogewotICAg
IGZsb2F0IGNvbG9yQWxwaGEgPSBjb2xvci5hbHBoYUFzRmxvYXQoKTsKLSAgICBmbG9hdCBnbG9i
YWxBbHBoYSA9IG1fZGF0YS0+Y3VycmVudEdsb2JhbEFscGhhKCk7Ci0KLSAgICByZXR1cm4gRDJE
MTo6Q29sb3JGKGNvbG9yLnJnYigpLCBnbG9iYWxBbHBoYSAqIGNvbG9yQWxwaGEpOworICAgIGF1
dG8gW3IsIGcsIGIsIGFdID0gY29sb3IudG9TUkdCQUNvbXBvbmVudHNMb3NzeSgpOworICAgIHJl
dHVybiBEMkQxOjpDb2xvckYociwgZywgYiwgYSAqIG1fZGF0YS0+Y3VycmVudEdsb2JhbEFscGhh
KCkpOwogfQogCiBJRDJEMUJydXNoKiBHcmFwaGljc0NvbnRleHQ6OnNvbGlkU3Ryb2tlQnJ1c2go
KSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1RoZW1lTWFjLm1tCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9UaGVtZU1hYy5tbQkocmV2
aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1RoZW1lTWFjLm1t
CSh3b3JraW5nIGNvcHkpCkBAIC00MDIsNyArNDAyLDcgQEAgc3RhdGljIGJvb2wgZHJhd0NlbGxG
b2N1c1JpbmdXaXRoRnJhbWVBdAogCiAgICAgLy8gRklYTUU6IFRoaXMgY29sb3Igc2hvdWxkIGJl
IHNoYXJlZCB3aXRoIFJlbmRlclRoZW1lTWFjLiBGb3Igbm93IGp1c3QgdXNlIHRoZSBzYW1lIE5T
Q29sb3IgY29sb3IuCiAgICAgLy8gVGhlIGNvbG9yIGlzIGV4cGVjdGVkIHRvIGJlIG9wYXF1ZSwg
c2luY2UgQ29yZUdyYXBoaWNzIHdpbGwgYXBwbHkgb3BhY2l0eSB3aGVuIGRyYXdpbmcgKGJlY2F1
c2Ugb3BhY2l0eSBpcyBub3JtYWxseSBhbmltYXRlZCkuCi0gICAgYXV0byBjb2xvciA9IGNvbG9y
V2l0aE92ZXJyaWRlQWxwaGEoY29sb3JGcm9tTlNDb2xvcihbTlNDb2xvciBrZXlib2FyZEZvY3Vz
SW5kaWNhdG9yQ29sb3JdKS5yZ2IoKSwgMSk7CisgICAgYXV0byBjb2xvciA9IGNvbG9yRnJvbU5T
Q29sb3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSkub3BhcXVlQ29sb3Io
KTsKICAgICBhdXRvIHN0eWxlID0gYWRvcHRDRihDR1N0eWxlQ3JlYXRlRm9jdXNSaW5nV2l0aENv
bG9yKCZmb2N1c1JpbmdTdHlsZSwgY2FjaGVkQ0dDb2xvcihjb2xvcikpKTsKICAgICBDR0NvbnRl
eHRTZXRTdHlsZShjZ0NvbnRleHQsIHN0eWxlLmdldCgpKTsKIApJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lSU9TLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUlPUy5tbQkocmV2aXNpb24gMjYxOTcwKQorKysgU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lSU9TLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDkzLDcgKzEwOTMsNyBAQCBib29sIFJlbmRlclRoZW1lSU9TOjpwYWludEZpbGVVcGxvYWRJ
Y29uCiAgICAgICAgIHRodW1ibmFpbFJlY3QuY29udHJhY3Qoa011bHRpcGxlVGh1bWJuYWlsU2hy
aW5rU2l6ZSwga011bHRpcGxlVGh1bWJuYWlsU2hyaW5rU2l6ZSk7CiAKICAgICAgICAgLy8gQmFj
a2dyb3VuZCBwaWN0dXJlIGZyYW1lIGFuZCBzaW1wbGUgYmFja2dyb3VuZCBpY29uIHdpdGggYSBn
cmFkaWVudCBtYXRjaGluZyB0aGUgYnV0dG9uLgotICAgICAgICBDb2xvciBiYWNrZ3JvdW5kSW1h
Z2VDb2xvciA9IENvbG9yKGJ1dHRvblJlbmRlcmVyLnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENv
bG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKS5yZ2IoKSk7CisgICAgICAgIENvbG9yIGJh
Y2tncm91bmRJbWFnZUNvbG9yID0gYnV0dG9uUmVuZGVyZXIuc3R5bGUoKS52aXNpdGVkRGVwZW5k
ZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOwogICAgICAgICBwYWludEluZm8u
Y29udGV4dCgpLmZpbGxSb3VuZGVkUmVjdChGbG9hdFJvdW5kZWRSZWN0KHRodW1ibmFpbFBpY3R1
cmVGcmFtZVJlY3QsIGNvcm5lclNpemUsIGNvcm5lclNpemUsIGNvcm5lclNpemUsIGNvcm5lclNp
emUpLCBwaWN0dXJlRnJhbWVDb2xvcik7CiAgICAgICAgIHBhaW50SW5mby5jb250ZXh0KCkuZmls
bFJlY3QodGh1bWJuYWlsUmVjdCwgYmFja2dyb3VuZEltYWdlQ29sb3IpOwogICAgICAgICB7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCShyZXZpc2lv
biAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0J
KHdvcmtpbmcgY29weSkKQEAgLTQ2OSw3ICs0NjksNyBAQCBDb2xvciBSZW5kZXJUaGVtZU1hYzo6
cGxhdGZvcm1Gb2N1c1JpbmdDCiAgICAgICAgIHJldHVybiBvbGRBcXVhRm9jdXNSaW5nQ29sb3Io
KTsKICAgICBMb2NhbERlZmF1bHRTeXN0ZW1BcHBlYXJhbmNlIGxvY2FsQXBwZWFyYW5jZShvcHRp
b25zLmNvbnRhaW5zKFN0eWxlQ29sb3I6Ok9wdGlvbnM6OlVzZURhcmtBcHBlYXJhbmNlKSk7CiAg
ICAgLy8gVGhlIGNvbG9yIGlzIGV4cGVjdGVkIHRvIGJlIG9wYXF1ZSwgc2luY2UgQ29yZUdyYXBo
aWNzIHdpbGwgYXBwbHkgb3BhY2l0eSB3aGVuIGRyYXdpbmcgKGJlY2F1c2Ugb3BhY2l0eSBpcyBu
b3JtYWxseSBhbmltYXRlZCkuCi0gICAgcmV0dXJuIGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoY29s
b3JGcm9tTlNDb2xvcihbTlNDb2xvciBrZXlib2FyZEZvY3VzSW5kaWNhdG9yQ29sb3JdKS5yZ2Io
KSwgMSk7CisgICAgcmV0dXJuIGNvbG9yRnJvbU5TQ29sb3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1
c0luZGljYXRvckNvbG9yXSkub3BhcXVlQ29sb3IoKTsKIH0KIAogQ29sb3IgUmVuZGVyVGhlbWVN
YWM6OnBsYXRmb3JtVGV4dFNlYXJjaEhpZ2hsaWdodENvbG9yKE9wdGlvblNldDxTdHlsZUNvbG9y
OjpPcHRpb25zPiBvcHRpb25zKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRyZWVBc1RleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJUcmVlQXNUZXh0LmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRyZWVBc1RleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
MzgsMjMgKzIzOCwyMyBAQCB2b2lkIFJlbmRlclRyZWVBc1RleHQ6OndyaXRlUmVuZGVyT2JqZWN0
CiAKICAgICAgICAgaWYgKG8ucGFyZW50KCkpIHsKICAgICAgICAgICAgIENvbG9yIGNvbG9yID0g
by5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUNvbG9yKTsKLSAgICAg
ICAgICAgIGlmIChvLnBhcmVudCgpLT5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQ
cm9wZXJ0eUNvbG9yKS5yZ2IoKSAhPSBjb2xvci5yZ2IoKSkKKyAgICAgICAgICAgIGlmICghZXF1
YWxJZ25vcmluZ1NlbWFudGljQ29sb3Ioby5wYXJlbnQoKS0+c3R5bGUoKS52aXNpdGVkRGVwZW5k
ZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvciksIGNvbG9yKSkKICAgICAgICAgICAgICAgICB0cyA8
PCAiIFtjb2xvcj0iIDw8IGNvbG9yLm5hbWVGb3JSZW5kZXJUcmVlQXNUZXh0KCkgPDwgIl0iOwog
CiAgICAgICAgICAgICAvLyBEbyBub3QgZHVtcCBpbnZhbGlkIG9yIHRyYW5zcGFyZW50IGJhY2tn
cm91bmRzLCBzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0LgogICAgICAgICAgICAgQ29sb3IgYmFj
a2dyb3VuZENvbG9yID0gby5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0
eUJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICBpZiAoby5wYXJlbnQoKS0+c3R5bGUoKS52
aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLnJnYigpICE9
IGJhY2tncm91bmRDb2xvci5yZ2IoKQotICAgICAgICAgICAgICAgICYmIGJhY2tncm91bmRDb2xv
ci5yZ2IoKSAhPSBDb2xvcjo6dHJhbnNwYXJlbnQpCisgICAgICAgICAgICBpZiAoIWVxdWFsSWdu
b3JpbmdTZW1hbnRpY0NvbG9yKG8ucGFyZW50KCktPnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENv
bG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKSwgYmFja2dyb3VuZENvbG9yKQorICAgICAg
ICAgICAgICAgICYmIGJhY2tncm91bmRDb2xvciAhPSBDb2xvcjo6dHJhbnNwYXJlbnQpCiAgICAg
ICAgICAgICAgICAgdHMgPDwgIiBbYmdjb2xvcj0iIDw8IGJhY2tncm91bmRDb2xvci5uYW1lRm9y
UmVuZGVyVHJlZUFzVGV4dCgpIDw8ICJdIjsKICAgICAgICAgICAgIAogICAgICAgICAgICAgQ29s
b3IgdGV4dEZpbGxDb2xvciA9IG8uc3R5bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJv
cGVydHlXZWJraXRUZXh0RmlsbENvbG9yKTsKLSAgICAgICAgICAgIGlmIChvLnBhcmVudCgpLT5z
dHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29s
b3IpLnJnYigpICE9IHRleHRGaWxsQ29sb3IucmdiKCkgIAotICAgICAgICAgICAgICAgICYmIHRl
eHRGaWxsQ29sb3IucmdiKCkgIT0gY29sb3IucmdiKCkgJiYgdGV4dEZpbGxDb2xvci5yZ2IoKSAh
PSBDb2xvcjo6dHJhbnNwYXJlbnQpCisgICAgICAgICAgICBpZiAoIWVxdWFsSWdub3JpbmdTZW1h
bnRpY0NvbG9yKG8ucGFyZW50KCktPnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1By
b3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvciksIHRleHRGaWxsQ29sb3IpCisgICAgICAgICAgICAg
ICAgJiYgdGV4dEZpbGxDb2xvciAhPSBjb2xvciAmJiB0ZXh0RmlsbENvbG9yICE9IENvbG9yOjp0
cmFuc3BhcmVudCkKICAgICAgICAgICAgICAgICB0cyA8PCAiIFt0ZXh0RmlsbENvbG9yPSIgPDwg
dGV4dEZpbGxDb2xvci5uYW1lRm9yUmVuZGVyVHJlZUFzVGV4dCgpIDw8ICJdIjsKIAogICAgICAg
ICAgICAgQ29sb3IgdGV4dFN0cm9rZUNvbG9yID0gby5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRD
b2xvcihDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcik7Ci0gICAgICAgICAgICBpZiAo
by5wYXJlbnQoKS0+c3R5bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlXZWJr
aXRUZXh0U3Ryb2tlQ29sb3IpLnJnYigpICE9IHRleHRTdHJva2VDb2xvci5yZ2IoKQotICAgICAg
ICAgICAgICAgICYmIHRleHRTdHJva2VDb2xvci5yZ2IoKSAhPSBjb2xvci5yZ2IoKSAmJiB0ZXh0
U3Ryb2tlQ29sb3IucmdiKCkgIT0gQ29sb3I6OnRyYW5zcGFyZW50KQorICAgICAgICAgICAgaWYg
KCFlcXVhbElnbm9yaW5nU2VtYW50aWNDb2xvcihvLnBhcmVudCgpLT5zdHlsZSgpLnZpc2l0ZWRE
ZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvciksIHRleHRTdHJv
a2VDb2xvcikKKyAgICAgICAgICAgICAgICAmJiB0ZXh0U3Ryb2tlQ29sb3IgIT0gY29sb3IgJiYg
dGV4dFN0cm9rZUNvbG9yICE9IENvbG9yOjp0cmFuc3BhcmVudCkKICAgICAgICAgICAgICAgICB0
cyA8PCAiIFt0ZXh0U3Ryb2tlQ29sb3I9IiA8PCB0ZXh0U3Ryb2tlQ29sb3IubmFtZUZvclJlbmRl
clRyZWVBc1RleHQoKSA8PCAiXSI7CiAKICAgICAgICAgICAgIGlmIChvLnBhcmVudCgpLT5zdHls
ZSgpLnRleHRTdHJva2VXaWR0aCgpICE9IG8uc3R5bGUoKS50ZXh0U3Ryb2tlV2lkdGgoKSAmJiBv
LnN0eWxlKCkudGV4dFN0cm9rZVdpZHRoKCkgPiAwKQpJbmRleDogU291cmNlL1dlYkNvcmUvc3Zn
L1NWR1N0b3BFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
U3RvcEVsZW1lbnQuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcv
U1ZHU3RvcEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCw5ICs5NCw3IEBAIENvbG9y
IFNWR1N0b3BFbGVtZW50OjpzdG9wQ29sb3JJbmNsdWRpbmcKICAgICBhdXRvJiBzdmdTdHlsZSA9
IHN0eWxlLnN2Z1N0eWxlKCk7CiAgICAgYXV0byBzdG9wQ29sb3IgPSBzdHlsZS5jb2xvclJlc29s
dmluZ0N1cnJlbnRDb2xvcihzdmdTdHlsZS5zdG9wQ29sb3IoKSk7CiAKLSAgICBmbG9hdCBjb2xv
ckFscGhhID0gc3RvcENvbG9yLmFscGhhKCkgLyAyNTUuMDsKLSAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGQgdXNlIGNvbG9yV2l0aEFscGhhTXVsdGlwbGllZEJ5KCkgYnV0IHRoYXQgaGFzIGRpZmZl
cmVudCByb3VuZGluZyBvZiB0aGUgYWxwaGEgY29tcG9uZW50LgotICAgIHJldHVybiBjb2xvcldp
dGhPdmVycmlkZUFscGhhKHN0b3BDb2xvci5yZ2IoKSwgY29sb3JBbHBoYSAqIHN2Z1N0eWxlLnN0
b3BPcGFjaXR5KCkpOworICAgIHJldHVybiBzdG9wQ29sb3IuY29sb3JXaXRoQWxwaGFNdWx0aXBs
aWVkQnlVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcoc3ZnU3R5bGUuc3RvcE9wYWNpdHkoKSk7CiB9
CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNjIwMjYpCisrKyBTb3VyY2UvV2ViS2l0L0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDIwLTA1LTIxICBTYW0g
V2VpbmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBFeHRlbmRlZCBDb2xvciBDbGVh
bnVwOiBSZW1vdmUgdHJpdmlhbCB1c2VzIG9mIENvbG9yOjpyZ2IoKQorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMjMxCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2lvcy9XS1dl
YlZpZXdJT1MubW06CisgICAgICAgIChzY3JvbGxWaWV3QmFja2dyb3VuZENvbG9yKToKKyAgICAg
ICAgUmVwbGFjZSBjb2xvcldpdGhPdmVycmlkZUFscGhhKCkgd2l0aCBDb2xvcjo6Y29sb3JXaXRo
QWxwaGFVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcoKSB0byBhdm9pZAorICAgICAgICB1bm5lY2Vz
c2FyeSB1c2Ugb2YgQ29sb3I6OnJnYigpCisKIDIwMjAtMDUtMjEgIEpvaG4gV2lsYW5kZXIgIDx3
aWxhbmRlckBhcHBsZS5jb20+CiAKICAgICAgICAgU3RvcmFnZSBBY2Nlc3MgQVBJOiBBbGxvdyBj
b25maWd1cmFibGUgc3RvcmFnZSBhY2Nlc3Mgc2NvcGUKSW5kZXg6IFNvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL0FQSS9pb3MvV0tXZWJWaWV3SU9TLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL0FQSS9pb3MvV0tXZWJWaWV3SU9TLm1tCShyZXZpc2lvbiAyNjE5NzApCisr
KyBTb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvaW9zL1dLV2ViVmlld0lPUy5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtNTEzLDcgKzUxMyw3IEBAIHN0YXRpYyBXZWJDb3JlOjpDb2xvciBzY3JvbGxW
aWV3QmFja2dyb3UKICAgICBpZiAoem9vbVNjYWxlIDwgbWluaW11bVpvb21TY2FsZSkgewogICAg
ICAgICBDR0Zsb2F0IHNsb3BlID0gMTI7CiAgICAgICAgIENHRmxvYXQgb3BhY2l0eSA9IHN0ZDo6
bWF4PENHRmxvYXQ+KDEgLSBzbG9wZSAqIChtaW5pbXVtWm9vbVNjYWxlIC0gem9vbVNjYWxlKSwg
MCk7Ci0gICAgICAgIGNvbG9yID0gV2ViQ29yZTo6Y29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xv
ci5yZ2IoKSwgb3BhY2l0eSk7CisgICAgICAgIGNvbG9yID0gY29sb3IuY29sb3JXaXRoQWxwaGFV
c2luZ0FsdGVybmF0aXZlUm91bmRpbmcob3BhY2l0eSk7CiAgICAgfQogCiAgICAgcmV0dXJuIGNv
bG9yOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>399986</attachid>
            <date>2020-05-21 15:26:41 -0700</date>
            <delta_ts>2020-05-21 16:33:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-212231-20200521152640.patch</filename>
            <type>text/plain</type>
            <size>26053</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYyIEBACisyMDIwLTA1LTIxICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBFeHRlbmRlZCBDb2xvciBDbGVhbnVw
OiBSZW1vdmUgdHJpdmlhbCB1c2VzIG9mIENvbG9yOjpyZ2IoKQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMjMxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIKKworICAgICAgICBSZXBsYWNlcyBhIGZldyB1bm5lY2Vzc2FyeSB1c2Vz
IG9mIENvbG9yOjpyZ2IoKToKKyAgICAgICAgLSBVc2VzIG9mIGFuIGlkaW9tIHdoZXJlIGNvZGUg
cm91bmQtdHJpcHBlZCBhIENvbG9yIHZpYSBDb2xvcihteUNvbG9yLnJnYigpKS4gVGhpcyBpcwor
ICAgICAgICAgIG5vdCBjb21wYXRpYmxlIHdpdGggZXh0ZW5kZWQgY29sb3JzIGFuZCBzZWVtcyB0
byBiZSB1bm5lY2Vzc2FyeS4KKyAgICAgICAgLSBVc2VzIG9mIGNvbG9yV2l0aE92ZXJyaWRlQWxw
aGEoKS4gVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBhIFNpbXBsZUNvbG9yLCBzbyByZXF1aXJlZAor
ICAgICAgICAgIHVzaW5nIGNvbG9yLnJnYigpLiBXZSBjYW4ndCB0cmFuc2l0aW9uIHRvIENvbG9y
Ojpjb2xvcldpdGhBbHBoYSBkdWUgdG8gYSBzbGlnaHRseSAKKyAgICAgICAgICBkaWZmZXJlbnQg
cm91bmRpbmcgb2YgdGhlIGFscGhhLCBzbyBhIG5ldyBmdW5jdGlvbiBDb2xvcjo6Y29sb3JXaXRo
QWxwaGFVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcKKyAgICAgICAgICB3YXMgYWRkZWQgdG8gd2hp
Y2ggaW1wbGVtZW50cyB0aGUgYWx0ZXJuYXRpdmUgcm91bmRpbmcuIEEgbGF0ZXIgY2hhbmdlIGNh
biByZWNvbmNpbGUKKyAgICAgICAgICB0aGUgdHdvIHZlcnNpb25zLgorICAgICAgICAtIENyZWF0
aW9uIG9mIEQyRDE6OkNvbG9yRi4gRDJEMTo6Q29sb3JGIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQg
dGFrZXMgYSBmb3VyIGZsb2F0cyB0aGF0CisgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkLgorICAg
ICAgICAtIENvbXBhcmluZyB0d28gY29sb3JzIHVzaW5nIHJnYigpIGZvciBlYWNoIHRvIGF2b2lk
IGNvbXBhcmluZyB0aGUgc2VtYW50aWMgYml0LiBlcXVhbElnbm9yaW5nU2VtYW50aWNDb2xvcgor
ICAgICAgICAgIGV4aXN0cyBmb3IganVzdCB0aGlzIHVzZS4KKworICAgICAgICAqIGVkaXRpbmcv
Y29jb2EvSFRNTENvbnZlcnRlci5tbToKKyAgICAgICAgKEhUTUxDb252ZXJ0ZXJDYWNoZXM6OmNv
bG9yUHJvcGVydHlWYWx1ZUZvck5vZGUpOgorICAgICAgICAqIGh0bWwvSFRNTEVsZW1lbnQuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTEVsZW1lbnQ6OmFkZEhUTUxDb2xvclRvU3R5bGUpOgor
ICAgICAgICAqIGh0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyREJhc2UuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQmFzZTo6c2V0U3Ryb2tl
U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQmFzZTo6
c2V0RmlsbFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQy
REJhc2U6OnNldFNoYWRvdyk6CisgICAgICAgICogaHRtbC9jYW52YXMvQ2FudmFzU3R5bGUuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzU3R5bGU6OmNyZWF0ZUZyb21TdHJpbmdXaXRoT3Zl
cnJpZGVBbHBoYSk6CisgICAgICAgICogaHRtbC90cmFjay9JbmJhbmRHZW5lcmljVGV4dFRyYWNr
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkluYmFuZEdlbmVyaWNUZXh0VHJhY2s6OnVwZGF0ZUN1
ZUZyb21DdWVEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDb2xvcjo6Y29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnlVc2luZ0Fs
dGVybmF0aXZlUm91bmRpbmcgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29sb3I6OmNvbG9y
V2l0aEFscGhhIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbG9yOjpjb2xvcldpdGhBbHBo
YVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpjb2xv
cldpdGhPdmVycmlkZUFscGhhKTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9Db2xvci5oOgorICAgICAgICAoV2ViQ29yZTo6Y29sb3JXaXRoT3ZlcnJpZGVBbHBoYSk6IERl
bGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vQ2Fpcm9PcGVyYXRpb25z
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhaXJvOjpwcmVwYXJlQ2Fpcm9Db250ZXh0U291cmNl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFRmxvb2QuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6RkVGbG9vZDo6cGxhdGZvcm1BcHBseVNvZnR3YXJlKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQ29sb3JEaXJlY3QyRC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpDb2xvcjo6b3BlcmF0b3IgRDJEMV9DT0xPUl9GIGNvbnN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkNvbG9yOjpvcGVyYXRvciBEMkQxX1ZFQ1RPUl80RiBjb25zdCk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dERpcmVjdDJELmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y29sb3JXaXRoR2xvYmFsQWxwaGEgY29uc3QpOgor
ICAgICAgICAqIHBsYXRmb3JtL21hYy9UaGVtZU1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6OmRy
YXdDZWxsRm9jdXNSaW5nV2l0aEZyYW1lQXRUaW1lKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVyVGhlbWVJT1MubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUlPUzo6cGFpbnRG
aWxlVXBsb2FkSWNvbkRlY29yYXRpb25zKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhl
bWVNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1Gb2N1
c1JpbmdDb2xvciBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRyZWVBc1RleHQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVHJlZUFzVGV4dDo6d3JpdGVSZW5kZXJPYmpl
Y3QpOgorICAgICAgICAqIHN2Zy9TVkdTdG9wRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpTVkdTdG9wRWxlbWVudDo6c3RvcENvbG9ySW5jbHVkaW5nT3BhY2l0eSBjb25zdCk6CisKIDIw
MjAtMDUtMjAgIEFsZXggQ2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAog
ICAgICAgICBSZW1vdmUgaW1wbGljaXQgVVJMLT5TdHJpbmcgY29udmVyc2lvbiBvcGVyYXRvcnMK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvY29jb2EvSFRNTENvbnZlcnRlci5tbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL2NvY29hL0hUTUxDb252ZXJ0ZXIubW0J
KHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvY29jb2EvSFRNTENv
bnZlcnRlci5tbQkod29ya2luZyBjb3B5KQpAQCAtODgyLDEzICs4ODIsMTMgQEAgQ29sb3IgSFRN
TENvbnZlcnRlckNhY2hlczo6Y29sb3JQcm9wZXJ0eQogICAgIEVsZW1lbnQmIGVsZW1lbnQgPSBk
b3duY2FzdDxFbGVtZW50Pihub2RlKTsKICAgICBpZiAoUmVmUHRyPENTU1ZhbHVlPiB2YWx1ZSA9
IGNvbXB1dGVkU3R5bGVQcm9wZXJ0eUZvckVsZW1lbnQoZWxlbWVudCwgcHJvcGVydHlJZCkpIHsK
ICAgICAgICAgaWYgKGlzPENTU1ByaW1pdGl2ZVZhbHVlPigqdmFsdWUpICYmIGRvd25jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlPigqdmFsdWUpLmlzUkdCQ29sb3IoKSkKLSAgICAgICAgICAgIHJldHVy
biBub3JtYWxpemVkQ29sb3IoQ29sb3IoZG93bmNhc3Q8Q1NTUHJpbWl0aXZlVmFsdWU+KCp2YWx1
ZSkuY29sb3IoKS5yZ2IoKSksIGlnbm9yZURlZmF1bHRDb2xvciwgZWxlbWVudCk7CisgICAgICAg
ICAgICByZXR1cm4gbm9ybWFsaXplZENvbG9yKGRvd25jYXN0PENTU1ByaW1pdGl2ZVZhbHVlPigq
dmFsdWUpLmNvbG9yKCksIGlnbm9yZURlZmF1bHRDb2xvciwgZWxlbWVudCk7CiAgICAgfQogCiAg
ICAgYm9vbCBpbmhlcml0ID0gZmFsc2U7CiAgICAgaWYgKFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWUg
PSBpbmxpbmVTdHlsZVByb3BlcnR5Rm9yRWxlbWVudChlbGVtZW50LCBwcm9wZXJ0eUlkKSkgewog
ICAgICAgICBpZiAoaXM8Q1NTUHJpbWl0aXZlVmFsdWU+KCp2YWx1ZSkgJiYgZG93bmNhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWU+KCp2YWx1ZSkuaXNSR0JDb2xvcigpKQotICAgICAgICAgICAgcmV0dXJu
IG5vcm1hbGl6ZWRDb2xvcihDb2xvcihkb3duY2FzdDxDU1NQcmltaXRpdmVWYWx1ZT4oKnZhbHVl
KS5jb2xvcigpLnJnYigpKSwgaWdub3JlRGVmYXVsdENvbG9yLCBlbGVtZW50KTsKKyAgICAgICAg
ICAgIHJldHVybiBub3JtYWxpemVkQ29sb3IoZG93bmNhc3Q8Q1NTUHJpbWl0aXZlVmFsdWU+KCp2
YWx1ZSkuY29sb3IoKSwgaWdub3JlRGVmYXVsdENvbG9yLCBlbGVtZW50KTsKICAgICAgICAgaWYg
KHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpCiAgICAgICAgICAgICBpbmhlcml0ID0gdHJ1ZTsK
ICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxFbGVtZW50LmNwcAkocmV2aXNpb24gMjYx
OTcwKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEwNTAsNyArMTA1MCw3IEBAIHZvaWQgSFRNTEVsZW1lbnQ6OmFkZEhUTUxDb2xvclRv
U3R5bGUoTXUKICAgICBpZiAoIWNvbG9yLmlzVmFsaWQoKSkKICAgICAgICAgY29sb3IgPSBDb2xv
cihwYXJzZUNvbG9yU3RyaW5nV2l0aENyYXp5TGVnYWN5UnVsZXMoY29sb3JTdHJpbmcpKTsKIAot
ICAgIHN0eWxlLnNldFByb3BlcnR5KHByb3BlcnR5SUQsIENTU1ZhbHVlUG9vbDo6c2luZ2xldG9u
KCkuY3JlYXRlQ29sb3JWYWx1ZShjb2xvci5yZ2IoKSkpOworICAgIHN0eWxlLnNldFByb3BlcnR5
KHByb3BlcnR5SUQsIENTU1ZhbHVlUG9vbDo6c2luZ2xldG9uKCkuY3JlYXRlQ29sb3JWYWx1ZShj
b2xvcikpOwogfQogCiBib29sIEhUTUxFbGVtZW50Ojp3aWxsUmVzcG9uZFRvTW91c2VNb3ZlRXZl
bnRzKCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyREJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFz
L0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyREJhc2UuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBT
b3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRCYXNlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzc0LDEzICszNzQsOSBAQCB2b2lkIENhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyREJhc2U6OnNldFN0CiAgICAgaWYgKHN0YXRlKCkuc3Ryb2tlU3R5bGUuaXNWYWxp
ZCgpICYmIHN0YXRlKCkuc3Ryb2tlU3R5bGUuaXNFcXVpdmFsZW50Q29sb3Ioc3R5bGUpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICBpZiAoc3R5bGUuaXNDdXJyZW50Q29sb3IoKSkgewotICAgICAg
ICBpZiAoc3R5bGUuaGFzT3ZlcnJpZGVBbHBoYSgpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTog
U2hvdWxkIG5vdCB1c2UgUkdCQTMyIGhlcmUuCi0gICAgICAgICAgICBzdHlsZSA9IENhbnZhc1N0
eWxlKGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoY3VycmVudENvbG9yKGNhbnZhc0Jhc2UoKSkucmdi
KCksIHN0eWxlLm92ZXJyaWRlQWxwaGEoKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
IHN0eWxlID0gQ2FudmFzU3R5bGUoY3VycmVudENvbG9yKGNhbnZhc0Jhc2UoKSkpOwotICAgIH0g
ZWxzZQorICAgIGlmIChzdHlsZS5pc0N1cnJlbnRDb2xvcigpKQorICAgICAgICBzdHlsZSA9IENh
bnZhc1N0eWxlKGN1cnJlbnRDb2xvcihjYW52YXNCYXNlKCkpLmNvbG9yV2l0aEFscGhhVXNpbmdB
bHRlcm5hdGl2ZVJvdW5kaW5nKHN0eWxlLm92ZXJyaWRlQWxwaGEoKSkpOworICAgIGVsc2UKICAg
ICAgICAgY2hlY2tPcmlnaW4oc3R5bGUuY2FudmFzUGF0dGVybigpLmdldCgpKTsKIAogICAgIHJl
YWxpemVTYXZlcygpOwpAQCAtNDAxLDEzICszOTcsOSBAQCB2b2lkIENhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyREJhc2U6OnNldEZpCiAgICAgaWYgKHN0YXRlKCkuZmlsbFN0eWxlLmlzVmFsaWQoKSAm
JiBzdGF0ZSgpLmZpbGxTdHlsZS5pc0VxdWl2YWxlbnRDb2xvcihzdHlsZSkpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIGlmIChzdHlsZS5pc0N1cnJlbnRDb2xvcigpKSB7Ci0gICAgICAgIGlmIChz
dHlsZS5oYXNPdmVycmlkZUFscGhhKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBTaG91bGQg
bm90IHVzZSBSR0JBMzIgaGVyZS4KLSAgICAgICAgICAgIHN0eWxlID0gQ2FudmFzU3R5bGUoY29s
b3JXaXRoT3ZlcnJpZGVBbHBoYShjdXJyZW50Q29sb3IoY2FudmFzQmFzZSgpKS5yZ2IoKSwgc3R5
bGUub3ZlcnJpZGVBbHBoYSgpKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3R5bGUg
PSBDYW52YXNTdHlsZShjdXJyZW50Q29sb3IoY2FudmFzQmFzZSgpKSk7Ci0gICAgfSBlbHNlCisg
ICAgaWYgKHN0eWxlLmlzQ3VycmVudENvbG9yKCkpCisgICAgICAgIHN0eWxlID0gQ2FudmFzU3R5
bGUoY3VycmVudENvbG9yKGNhbnZhc0Jhc2UoKSkuY29sb3JXaXRoQWxwaGFVc2luZ0FsdGVybmF0
aXZlUm91bmRpbmcoc3R5bGUub3ZlcnJpZGVBbHBoYSgpKSk7CisgICAgZWxzZQogICAgICAgICBj
aGVja09yaWdpbihzdHlsZS5jYW52YXNQYXR0ZXJuKCkuZ2V0KCkpOwogCiAgICAgcmVhbGl6ZVNh
dmVzKCk7CkBAIC0xMzEwLDggKzEzMDIsNyBAQCB2b2lkIENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
REJhc2U6OnNldFNoCiAgICAgICAgIGlmICghY29sb3IuaXNWYWxpZCgpKQogICAgICAgICAgICAg
cmV0dXJuOwogICAgIH0KLSAgICAvLyBGSVhNRTogU2hvdWxkIG5vdCB1c2UgUkdCQTMyIGhlcmUu
Ci0gICAgc2V0U2hhZG93KEZsb2F0U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgYmx1ciwgY29sb3JXaXRo
T3ZlcnJpZGVBbHBoYShjb2xvci5yZ2IoKSwgYWxwaGEpKTsKKyAgICBzZXRTaGFkb3coRmxvYXRT
aXplKHdpZHRoLCBoZWlnaHQpLCBibHVyLCBjb2xvci5jb2xvcldpdGhBbHBoYVVzaW5nQWx0ZXJu
YXRpdmVSb3VuZGluZyhhbHBoYSkpOwogfQogCiB2b2lkIENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
REJhc2U6OnNldFNoYWRvdyhmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBibHVyLCBm
bG9hdCBncmF5TGV2ZWwsIGZsb2F0IGFscGhhKQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9j
YW52YXMvQ2FudmFzU3R5bGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwv
Y2FudmFzL0NhbnZhc1N0eWxlLmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9jYW52YXMvQ2FudmFzU3R5bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDUsNyAr
MTQ1LDcgQEAgQ2FudmFzU3R5bGUgQ2FudmFzU3R5bGU6OmNyZWF0ZUZyb21TdHJpbgogICAgIGlm
ICghY29sb3IuaXNWYWxpZCgpKQogICAgICAgICByZXR1cm4geyB9OwogCi0gICAgcmV0dXJuIENv
bG9yIHsgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvci5yZ2IoKSwgYWxwaGEpIH07CisgICAg
cmV0dXJuIGNvbG9yLmNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nKGFscGhh
KTsKIH0KIAogYm9vbCBDYW52YXNTdHlsZTo6aXNFcXVpdmFsZW50Q29sb3IoY29uc3QgQ2FudmFz
U3R5bGUmIG90aGVyKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2Fu
dmFzU3R5bGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52
YXNTdHlsZS5oCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZh
cy9DYW52YXNTdHlsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Miw4ICs1Miw4IEBAIHB1YmxpYzoK
IAogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuICFXVEY6OmhvbGRzX2FsdGVybmF0
aXZlPEludmFsaWQ+KG1fc3R5bGUpOyB9CiAgICAgYm9vbCBpc0N1cnJlbnRDb2xvcigpIGNvbnN0
IHsgcmV0dXJuIFdURjo6aG9sZHNfYWx0ZXJuYXRpdmU8Q3VycmVudENvbG9yPihtX3N0eWxlKTsg
fQotICAgIGJvb2wgaGFzT3ZlcnJpZGVBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIGlzQ3VycmVudENv
bG9yKCkgJiYgV1RGOjpnZXQ8Q3VycmVudENvbG9yPihtX3N0eWxlKS5vdmVycmlkZUFscGhhOyB9
Ci0gICAgZmxvYXQgb3ZlcnJpZGVBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIFdURjo6Z2V0PEN1cnJl
bnRDb2xvcj4obV9zdHlsZSkub3ZlcnJpZGVBbHBoYS52YWx1ZSgpOyB9CisgICAgT3B0aW9uYWw8
ZmxvYXQ+IG92ZXJyaWRlQWxwaGEoKSBjb25zdCB7IHJldHVybiBXVEY6OmdldDxDdXJyZW50Q29s
b3I+KG1fc3R5bGUpLm92ZXJyaWRlQWxwaGE7IH0KKyAgICAKIAogICAgIFN0cmluZyBjb2xvcigp
IGNvbnN0OwogICAgIFJlZlB0cjxDYW52YXNHcmFkaWVudD4gY2FudmFzR3JhZGllbnQoKSBjb25z
dDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svSW5iYW5kR2VuZXJpY1RleHRUcmFj
ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9JbmJhbmRHZW5l
cmljVGV4dFRyYWNrLmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvaHRt
bC90cmFjay9JbmJhbmRHZW5lcmljVGV4dFRyYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTcs
MTEgKzk3LDExIEBAIHZvaWQgSW5iYW5kR2VuZXJpY1RleHRUcmFjazo6dXBkYXRlQ3VlRnIKICAg
ICBpZiAoaW5iYW5kQ3VlLnNpemUoKSA+IDApCiAgICAgICAgIGN1ZS5zZXRTaXplKHN0ZDo6cm91
bmQoaW5iYW5kQ3VlLnNpemUoKSkpOwogICAgIGlmIChpbmJhbmRDdWUuYmFja2dyb3VuZENvbG9y
KCkuaXNWYWxpZCgpKQotICAgICAgICBjdWUuc2V0QmFja2dyb3VuZENvbG9yKGluYmFuZEN1ZS5i
YWNrZ3JvdW5kQ29sb3IoKS5yZ2IoKSk7CisgICAgICAgIGN1ZS5zZXRCYWNrZ3JvdW5kQ29sb3Io
aW5iYW5kQ3VlLmJhY2tncm91bmRDb2xvcigpKTsKICAgICBpZiAoaW5iYW5kQ3VlLmZvcmVncm91
bmRDb2xvcigpLmlzVmFsaWQoKSkKLSAgICAgICAgY3VlLnNldEZvcmVncm91bmRDb2xvcihpbmJh
bmRDdWUuZm9yZWdyb3VuZENvbG9yKCkucmdiKCkpOworICAgICAgICBjdWUuc2V0Rm9yZWdyb3Vu
ZENvbG9yKGluYmFuZEN1ZS5mb3JlZ3JvdW5kQ29sb3IoKSk7CiAgICAgaWYgKGluYmFuZEN1ZS5o
aWdobGlnaHRDb2xvcigpLmlzVmFsaWQoKSkKLSAgICAgICAgY3VlLnNldEhpZ2hsaWdodENvbG9y
KGluYmFuZEN1ZS5oaWdobGlnaHRDb2xvcigpLnJnYigpKTsKKyAgICAgICAgY3VlLnNldEhpZ2hs
aWdodENvbG9yKGluYmFuZEN1ZS5oaWdobGlnaHRDb2xvcigpKTsKIAogICAgIGlmIChpbmJhbmRD
dWUuYWxpZ24oKSA9PSBHZW5lcmljQ3VlRGF0YTo6QWxpZ25tZW50OjpTdGFydCkKICAgICAgICAg
Y3VlLnNldEFsaWduKCJzdGFydCJfcyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Db2xvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3IuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcxLDExICs3MSw2
IEBAIFJHQkEzMiBtYWtlUkdCQTMyRnJvbUZsb2F0cyhmbG9hdCByLCBmbG8KICAgICByZXR1cm4g
bWFrZVJHQkEoY29sb3JGbG9hdFRvUkdCQUJ5dGUociksIGNvbG9yRmxvYXRUb1JHQkFCeXRlKGcp
LCBjb2xvckZsb2F0VG9SR0JBQnl0ZShiKSwgY29sb3JGbG9hdFRvUkdCQUJ5dGUoYSkpOwogfQog
Ci1SR0JBMzIgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShSR0JBMzIgY29sb3IsIGZsb2F0IG92ZXJy
aWRlQWxwaGEpCi17Ci0gICAgcmV0dXJuIHsgKGNvbG9yLnZhbHVlKCkgJiAweDAwRkZGRkZGKSB8
IGNvbG9yRmxvYXRUb1JHQkFCeXRlKG92ZXJyaWRlQWxwaGEpIDw8IDI0IH07Ci19Ci0KIFJHQkEz
MiBtYWtlUkdCQUZyb21IU0xBKGZsb2F0IGh1ZSwgZmxvYXQgc2F0dXJhdGlvbiwgZmxvYXQgbGln
aHRuZXNzLCBmbG9hdCBhbHBoYSkKIHsKICAgICBjb25zdCBmbG9hdCBzY2FsZUZhY3RvciA9IDI1
NS4wOwpAQCAtNDYwLDEyICs0NTUsMTkgQEAgQ29sb3IgQ29sb3I6OmNvbG9yV2l0aEFscGhhTXVs
dGlwbGllZEJ5KAogICAgIHJldHVybiBjb2xvcldpdGhBbHBoYShuZXdBbHBoYSk7CiB9CiAKK0Nv
bG9yIENvbG9yOjpjb2xvcldpdGhBbHBoYU11bHRpcGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3Vu
ZGluZyhmbG9hdCBhbW91bnQpIGNvbnN0Cit7CisgICAgZmxvYXQgbmV3QWxwaGEgPSBhbW91bnQg
KiAoaXNFeHRlbmRlZCgpID8gbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+YWxwaGEoKSA6IHN0
YXRpY19jYXN0PGZsb2F0PihhbHBoYSgpKSAvIDI1NSk7CisgICAgcmV0dXJuIGNvbG9yV2l0aEFs
cGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nKG5ld0FscGhhKTsKK30KKwogQ29sb3IgQ29sb3I6
OmNvbG9yV2l0aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdAogewogICAgIGlmIChpc0V4dGVuZGVk
KCkpCiAgICAgICAgIHJldHVybiBDb2xvciB7IG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPnJl
ZCgpLCBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5ncmVlbigpLCBtX2NvbG9yRGF0YS5leHRl
bmRlZENvbG9yLT5ibHVlKCksIGFscGhhLCBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5jb2xv
clNwYWNlKCkgfTsKIAotICAgIGludCBuZXdBbHBoYSA9IGFscGhhICogMjU1OyAvLyBXaHkgZG9l
c24ndCB0aGlzIHVzZSBjb2xvckZsb2F0VG9SR0JBQnl0ZSgpIGxpa2UgY29sb3JXaXRoT3ZlcnJp
ZGVBbHBoYSgpPworICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdoZXJlIHRoaXMgZnVuY3Rpb24gZGlm
ZmVycyBmcm9tIGNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nLgorICAgIGlu
dCBuZXdBbHBoYSA9IGFscGhhICogMjU1OwogCiAgICAgQ29sb3IgcmVzdWx0ID0geyByZWQoKSwg
Z3JlZW4oKSwgYmx1ZSgpLCBuZXdBbHBoYSB9OwogICAgIGlmIChpc1NlbWFudGljKCkpCkBAIC00
NzMsNiArNDc1LDE3IEBAIENvbG9yIENvbG9yOjpjb2xvcldpdGhBbHBoYShmbG9hdCBhbHBoYSkK
ICAgICByZXR1cm4gcmVzdWx0OwogfQogCitDb2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGFVc2lu
Z0FsdGVybmF0aXZlUm91bmRpbmcoZmxvYXQgYWxwaGEpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0
ZW5kZWQoKSkKKyAgICAgICAgcmV0dXJuIENvbG9yIHsgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xv
ci0+cmVkKCksIG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPmdyZWVuKCksIG1fY29sb3JEYXRh
LmV4dGVuZGVkQ29sb3ItPmJsdWUoKSwgYWxwaGEsIG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3It
PmNvbG9yU3BhY2UoKSB9OworCisgICAgQ29sb3IgcmVzdWx0ID0gU2ltcGxlQ29sb3IgeyAocmdi
KCkudmFsdWUoKSAmIDB4MDBGRkZGRkYpIHwgY29sb3JGbG9hdFRvUkdCQUJ5dGUoYWxwaGEpIDw8
IDI0IH07CisgICAgaWYgKGlzU2VtYW50aWMoKSkKKyAgICAgICAgcmVzdWx0LnNldElzU2VtYW50
aWMoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzdGQ6OnBhaXI8Q29sb3JTcGFjZSwgRmxv
YXRDb21wb25lbnRzPiBDb2xvcjo6Y29sb3JTcGFjZUFuZENvbXBvbmVudHMoKSBjb25zdAogewog
ICAgIGlmIChpc0V4dGVuZGVkKCkpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvQ29sb3IuaAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvQ29sb3IuaAkod29ya2luZyBjb3B5KQpAQCAtOTIsOSArOTIsNiBAQCBjb25z
dGV4cHIgUkdCQTMyIG1ha2VSR0JBKGludCByLCBpbnQgZywgCiBSR0JBMzIgbWFrZVByZW11bHRp
cGxpZWRSR0JBKGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBib29sIGNlaWxpbmcgPSB0cnVl
KTsKIFJHQkEzMiBtYWtlVW5QcmVtdWx0aXBsaWVkUkdCQShpbnQgciwgaW50IGcsIGludCBiLCBp
bnQgYSk7CiAKLVdFQkNPUkVfRVhQT1JUIFJHQkEzMiBjb2xvcldpdGhPdmVycmlkZUFscGhhKFJH
QkEzMiBjb2xvciwgZmxvYXQgb3ZlcnJpZGVBbHBoYSk7Ci1SR0JBMzIgY29sb3JXaXRoT3ZlcnJp
ZGVBbHBoYShSR0JBMzIgY29sb3IsIE9wdGlvbmFsPGZsb2F0PiBvdmVycmlkZUFscGhhKTsKLQog
V0VCQ09SRV9FWFBPUlQgUkdCQTMyIG1ha2VSR0JBMzJGcm9tRmxvYXRzKGZsb2F0IHIsIGZsb2F0
IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwogV0VCQ09SRV9FWFBPUlQgUkdCQTMyIG1ha2VSR0JBRnJv
bUhTTEEoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgbCwgZmxvYXQgYSk7CiBSR0JBMzIgbWFrZVJH
QkFGcm9tQ01ZS0EoZmxvYXQgYywgZmxvYXQgbSwgZmxvYXQgeSwgZmxvYXQgaywgZmxvYXQgYSk7
CkBAIC0yMjQsOSArMjIxLDE0IEBAIHB1YmxpYzoKICAgICBDb2xvciBibGVuZFdpdGhXaGl0ZSgp
IGNvbnN0OwogCiAgICAgQ29sb3IgY29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnkoZmxvYXQpIGNv
bnN0OwotCi0gICAgLy8gUmV0dXJucyBhIGNvbG9yIHRoYXQgaGFzIHRoZSBzYW1lIFJHQiB2YWx1
ZXMsIGJ1dCB3aXRoIHRoZSBnaXZlbiBBLgogICAgIENvbG9yIGNvbG9yV2l0aEFscGhhKGZsb2F0
KSBjb25zdDsKKworICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhlIG5lZWQgZm9yIEFsdGVybmF0aXZl
Um91bmRpbmcgdmFyaWFudHMgYnkgc2V0dGxpbmcgb24gYSByb3VuZGluZyBiZWhhdmlvci4KKyAg
ICBDb2xvciBjb2xvcldpdGhBbHBoYU11bHRpcGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGlu
ZyhPcHRpb25hbDxmbG9hdD4pIGNvbnN0OworICAgIENvbG9yIGNvbG9yV2l0aEFscGhhTXVsdGlw
bGllZEJ5VXNpbmdBbHRlcm5hdGl2ZVJvdW5kaW5nKGZsb2F0KSBjb25zdDsKKyAgICBDb2xvciBj
b2xvcldpdGhBbHBoYVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhPcHRpb25hbDxmbG9hdD4pIGNv
bnN0OworICAgIFdFQkNPUkVfRVhQT1JUIENvbG9yIGNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5h
dGl2ZVJvdW5kaW5nKGZsb2F0KSBjb25zdDsKKwogICAgIENvbG9yIG9wYXF1ZUNvbG9yKCkgY29u
c3QgeyByZXR1cm4gY29sb3JXaXRoQWxwaGEoMS4wZik7IH0KIAogICAgIC8vIFRydWUgaWYgdGhl
IGNvbG9yIG9yaWdpbmF0ZWQgZnJvbSBhIENTUyBzZW1hbnRpYyBjb2xvciBuYW1lLgpAQCAtMzkz
LDkgKzM5NSwxNCBAQCBpbmxpbmUgdWludDE2X3QgZmFzdERpdmlkZUJ5MjU1KHVpbnQxNl90CiAg
ICAgcmV0dXJuIGFwcHJveGltYXRpb24gKyAocmVtYWluZGVyID4+IDgpOwogfQogCi1pbmxpbmUg
UkdCQTMyIGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoUkdCQTMyIGNvbG9yLCBPcHRpb25hbDxmbG9h
dD4gb3ZlcnJpZGVBbHBoYSkKK2lubGluZSBDb2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGFNdWx0
aXBsaWVkQnlVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcoT3B0aW9uYWw8ZmxvYXQ+IGFscGhhKSBj
b25zdAoreworICAgIHJldHVybiBhbHBoYSA/IGNvbG9yV2l0aEFscGhhTXVsdGlwbGllZEJ5VXNp
bmdBbHRlcm5hdGl2ZVJvdW5kaW5nKGFscGhhLnZhbHVlKCkpIDogKnRoaXM7Cit9CisKK2lubGlu
ZSBDb2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGFVc2luZ0FsdGVybmF0aXZlUm91bmRpbmcoT3B0
aW9uYWw8ZmxvYXQ+IGFscGhhKSBjb25zdAogewotICAgIHJldHVybiBvdmVycmlkZUFscGhhID8g
Y29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvciwgb3ZlcnJpZGVBbHBoYS52YWx1ZSgpKSA6IGNv
bG9yOworICAgIHJldHVybiBhbHBoYSA/IGNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5hdGl2ZVJv
dW5kaW5nKGFscGhhLnZhbHVlKCkpIDogKnRoaXM7CiB9CiAKIGlubGluZSBSR0JBMzIgQ29sb3I6
OnJnYigpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9DYWlyb09wZXJhdGlvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0NhaXJvT3BlcmF0aW9ucy5jcHAJKHJldmlzaW9uIDI2MTk3MCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0NhaXJvT3BlcmF0aW9u
cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4LDcgKzc4LDcgQEAgc3RhdGljIHZvaWQgcHJlcGFy
ZUNhaXJvQ29udGV4dFNvdXJjZShjYQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFNvbGlkIGNv
bG9yIHNvdXJjZQogICAgICAgICBpZiAoZ2xvYmFsQWxwaGEgPCAxKQotICAgICAgICAgICAgc2V0
U291cmNlUkdCQUZyb21Db2xvcihjciwgY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvci5yZ2Io
KSwgY29sb3IuYWxwaGEoKSAvIDI1NS5mICogZ2xvYmFsQWxwaGEpKTsKKyAgICAgICAgICAgIHNl
dFNvdXJjZVJHQkFGcm9tQ29sb3IoY3IsIGNvbG9yLmNvbG9yV2l0aEFscGhhVXNpbmdBbHRlcm5h
dGl2ZVJvdW5kaW5nKGNvbG9yLmFscGhhKCkgLyAyNTUuZiAqIGdsb2JhbEFscGhhKSk7CiAgICAg
ICAgIGVsc2UKICAgICAgICAgICAgIHNldFNvdXJjZVJHQkFGcm9tQ29sb3IoY3IsIGNvbG9yKTsK
ICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZF
Rmxvb2QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2ZpbHRlcnMvRkVGbG9vZC5jcHAJKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVGbG9vZC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTYzLDkgKzYzLDcgQEAgdm9pZCBGRUZsb29kOjpwbGF0Zm9ybUFwcGx5U29mdHdhcmUoKQogICAg
IGlmICghcmVzdWx0SW1hZ2UpCiAgICAgICAgIHJldHVybjsKIAotICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZCB1c2UgY29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnkoKSBidXQgdGhhdCBoYXMgZGlm
ZmVyZW50IHJvdW5kaW5nIG9mIHRoZSBhbHBoYSBjb21wb25lbnQgdGhhdCBicmVha3Mgc29tZSB0
ZXN0cy4KLSAgICBmbG9hdCBjb2xvckFscGhhID0gZmxvb2RDb2xvcigpLmFscGhhKCkgLyAyNTUu
MDsKLSAgICBhdXRvIGNvbG9yID0gY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShmbG9vZENvbG9yKCku
cmdiKCksIGNvbG9yQWxwaGEgKiBmbG9vZE9wYWNpdHkoKSk7CisgICAgYXV0byBjb2xvciA9IGZs
b29kQ29sb3IoKS5jb2xvcldpdGhBbHBoYU11bHRpcGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3Vu
ZGluZyhmbG9vZE9wYWNpdHkoKSk7CiAgICAgcmVzdWx0SW1hZ2UtPmNvbnRleHQoKS5maWxsUmVj
dChGbG9hdFJlY3QoRmxvYXRQb2ludCgpLCBhYnNvbHV0ZVBhaW50UmVjdCgpLnNpemUoKSksIGNv
bG9yKTsKIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Nv
bG9yRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Db2xvckRpcmVjdDJELmNwcAkocmV2aXNpb24gMjYxOTcwKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0NvbG9yRGlyZWN0MkQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MSwxOSArNDEsMTQgQEAgQ29sb3I6OkNvbG9yKEQyRDFfQ09MT1JfRiBjb2xv
cikKIAogQ29sb3I6Om9wZXJhdG9yIEQyRDFfQ09MT1JfRigpIGNvbnN0CiB7Ci0gICAgaWYgKGlz
RXh0ZW5kZWQoKSkgewotICAgICAgICBhdXRvIGFzUkdCQSA9IHRvU1JHQkFDb21wb25lbnRzTG9z
c3koKTsKLSAgICAgICAgcmV0dXJuIEQyRDE6OkNvbG9yRihhc1JHQkEuY29tcG9uZW50c1swXSwg
YXNSR0JBLmNvbXBvbmVudHNbMV0sIGFzUkdCQS5jb21wb25lbnRzWzJdLCBhc1JHQkEuY29tcG9u
ZW50c1szXSk7Ci0gICAgfQotCi0gICAgZmxvYXQgY29sb3JBbHBoYSA9IGFscGhhKCkgLyAyNTUu
MGY7Ci0gICAgcmV0dXJuIEQyRDE6OkNvbG9yRihyZ2IoKS52YWx1ZSgpLCBjb2xvckFscGhhKTsK
KyAgICBhdXRvIFtyLCBnLCBiLCBhXSA9IHRvU1JHQkFDb21wb25lbnRzTG9zc3koKTsKKyAgICBy
ZXR1cm4gRDJEMTo6Q29sb3JGKHIsIGcsIGIsIGEpOwogfQogCiBDb2xvcjo6b3BlcmF0b3IgRDJE
MV9WRUNUT1JfNEYoKSBjb25zdAogewotICAgIGF1dG8gYXNSR0JBID0gdG9TUkdCQUNvbXBvbmVu
dHNMb3NzeSgpOwotICAgIHJldHVybiBEMkQxOjpWZWN0b3I0Rihhc1JHQkEuY29tcG9uZW50c1sw
XSwgYXNSR0JBLmNvbXBvbmVudHNbMV0sIGFzUkdCQS5jb21wb25lbnRzWzJdLCBhc1JHQkEuY29t
cG9uZW50c1szXSk7CisgICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBQ29tcG9uZW50c0xv
c3N5KCk7CisgICAgcmV0dXJuIEQyRDE6OlZlY3RvcjRGKHIsIGcsIGIsIGEpOwogfQogCiB9Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
RGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJlY3QyRC5jcHAJKHJldmlzaW9uIDI2MTk3MCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHREaXJl
Y3QyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3OSwxMCArMzc5LDggQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJvdAogCiBEMkQxX0NPTE9SX0YgR3JhcGhpY3NDb250
ZXh0Ojpjb2xvcldpdGhHbG9iYWxBbHBoYShjb25zdCBDb2xvciYgY29sb3IpIGNvbnN0CiB7Ci0g
ICAgZmxvYXQgY29sb3JBbHBoYSA9IGNvbG9yLmFscGhhQXNGbG9hdCgpOwotICAgIGZsb2F0IGds
b2JhbEFscGhhID0gbV9kYXRhLT5jdXJyZW50R2xvYmFsQWxwaGEoKTsKLQotICAgIHJldHVybiBE
MkQxOjpDb2xvckYoY29sb3IucmdiKCksIGdsb2JhbEFscGhhICogY29sb3JBbHBoYSk7CisgICAg
YXV0byBbciwgZywgYiwgYV0gPSBjb2xvci50b1NSR0JBQ29tcG9uZW50c0xvc3N5KCk7CisgICAg
cmV0dXJuIEQyRDE6OkNvbG9yRihyLCBnLCBiLCBhICogbV9kYXRhLT5jdXJyZW50R2xvYmFsQWxw
aGEoKSk7CiB9CiAKIElEMkQxQnJ1c2gqIEdyYXBoaWNzQ29udGV4dDo6c29saWRTdHJva2VCcnVz
aCgpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvVGhlbWVNYWMubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1RoZW1lTWFjLm1tCShy
ZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvVGhlbWVNYWMu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTQwMiw3ICs0MDIsNyBAQCBzdGF0aWMgYm9vbCBkcmF3Q2Vs
bEZvY3VzUmluZ1dpdGhGcmFtZUF0CiAKICAgICAvLyBGSVhNRTogVGhpcyBjb2xvciBzaG91bGQg
YmUgc2hhcmVkIHdpdGggUmVuZGVyVGhlbWVNYWMuIEZvciBub3cganVzdCB1c2UgdGhlIHNhbWUg
TlNDb2xvciBjb2xvci4KICAgICAvLyBUaGUgY29sb3IgaXMgZXhwZWN0ZWQgdG8gYmUgb3BhcXVl
LCBzaW5jZSBDb3JlR3JhcGhpY3Mgd2lsbCBhcHBseSBvcGFjaXR5IHdoZW4gZHJhd2luZyAoYmVj
YXVzZSBvcGFjaXR5IGlzIG5vcm1hbGx5IGFuaW1hdGVkKS4KLSAgICBhdXRvIGNvbG9yID0gY29s
b3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvckZyb21OU0NvbG9yKFtOU0NvbG9yIGtleWJvYXJkRm9j
dXNJbmRpY2F0b3JDb2xvcl0pLnJnYigpLCAxKTsKKyAgICBhdXRvIGNvbG9yID0gY29sb3JGcm9t
TlNDb2xvcihbTlNDb2xvciBrZXlib2FyZEZvY3VzSW5kaWNhdG9yQ29sb3JdKS5vcGFxdWVDb2xv
cigpOwogICAgIGF1dG8gc3R5bGUgPSBhZG9wdENGKENHU3R5bGVDcmVhdGVGb2N1c1JpbmdXaXRo
Q29sb3IoJmZvY3VzUmluZ1N0eWxlLCBjYWNoZWRDR0NvbG9yKGNvbG9yKSkpOwogICAgIENHQ29u
dGV4dFNldFN0eWxlKGNnQ29udGV4dCwgc3R5bGUuZ2V0KCkpOwogCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVJT1MubW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lSU9TLm1tCShyZXZpc2lvbiAyNjE5NzApCisrKyBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVJT1MubW0JKHdvcmtpbmcgY29weSkK
QEAgLTEwOTMsNyArMTA5Myw3IEBAIGJvb2wgUmVuZGVyVGhlbWVJT1M6OnBhaW50RmlsZVVwbG9h
ZEljb24KICAgICAgICAgdGh1bWJuYWlsUmVjdC5jb250cmFjdChrTXVsdGlwbGVUaHVtYm5haWxT
aHJpbmtTaXplLCBrTXVsdGlwbGVUaHVtYm5haWxTaHJpbmtTaXplKTsKIAogICAgICAgICAvLyBC
YWNrZ3JvdW5kIHBpY3R1cmUgZnJhbWUgYW5kIHNpbXBsZSBiYWNrZ3JvdW5kIGljb24gd2l0aCBh
IGdyYWRpZW50IG1hdGNoaW5nIHRoZSBidXR0b24uCi0gICAgICAgIENvbG9yIGJhY2tncm91bmRJ
bWFnZUNvbG9yID0gQ29sb3IoYnV0dG9uUmVuZGVyZXIuc3R5bGUoKS52aXNpdGVkRGVwZW5kZW50
Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLnJnYigpKTsKKyAgICAgICAgQ29sb3Ig
YmFja2dyb3VuZEltYWdlQ29sb3IgPSBidXR0b25SZW5kZXJlci5zdHlsZSgpLnZpc2l0ZWREZXBl
bmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcik7CiAgICAgICAgIHBhaW50SW5m
by5jb250ZXh0KCkuZmlsbFJvdW5kZWRSZWN0KEZsb2F0Um91bmRlZFJlY3QodGh1bWJuYWlsUGlj
dHVyZUZyYW1lUmVjdCwgY29ybmVyU2l6ZSwgY29ybmVyU2l6ZSwgY29ybmVyU2l6ZSwgY29ybmVy
U2l6ZSksIHBpY3R1cmVGcmFtZUNvbG9yKTsKICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQoKS5m
aWxsUmVjdCh0aHVtYm5haWxSZWN0LCBiYWNrZ3JvdW5kSW1hZ2VDb2xvcik7CiAgICAgICAgIHsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0JKHJldmlz
aW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5t
bQkod29ya2luZyBjb3B5KQpAQCAtNDY5LDcgKzQ2OSw3IEBAIENvbG9yIFJlbmRlclRoZW1lTWFj
OjpwbGF0Zm9ybUZvY3VzUmluZ0MKICAgICAgICAgcmV0dXJuIG9sZEFxdWFGb2N1c1JpbmdDb2xv
cigpOwogICAgIExvY2FsRGVmYXVsdFN5c3RlbUFwcGVhcmFuY2UgbG9jYWxBcHBlYXJhbmNlKG9w
dGlvbnMuY29udGFpbnMoU3R5bGVDb2xvcjo6T3B0aW9uczo6VXNlRGFya0FwcGVhcmFuY2UpKTsK
ICAgICAvLyBUaGUgY29sb3IgaXMgZXhwZWN0ZWQgdG8gYmUgb3BhcXVlLCBzaW5jZSBDb3JlR3Jh
cGhpY3Mgd2lsbCBhcHBseSBvcGFjaXR5IHdoZW4gZHJhd2luZyAoYmVjYXVzZSBvcGFjaXR5IGlz
IG5vcm1hbGx5IGFuaW1hdGVkKS4KLSAgICByZXR1cm4gY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShj
b2xvckZyb21OU0NvbG9yKFtOU0NvbG9yIGtleWJvYXJkRm9jdXNJbmRpY2F0b3JDb2xvcl0pLnJn
YigpLCAxKTsKKyAgICByZXR1cm4gY29sb3JGcm9tTlNDb2xvcihbTlNDb2xvciBrZXlib2FyZEZv
Y3VzSW5kaWNhdG9yQ29sb3JdKS5vcGFxdWVDb2xvcigpOwogfQogCiBDb2xvciBSZW5kZXJUaGVt
ZU1hYzo6cGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoT3B0aW9uU2V0PFN0eWxlQ29s
b3I6Ok9wdGlvbnM+IG9wdGlvbnMpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyVHJlZUFzVGV4dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRyZWVBc1RleHQuY3BwCShyZXZpc2lvbiAyNjE5NzApCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVHJlZUFzVGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIzOCwyMyArMjM4LDIzIEBAIHZvaWQgUmVuZGVyVHJlZUFzVGV4dDo6d3JpdGVSZW5kZXJPYmpl
Y3QKIAogICAgICAgICBpZiAoby5wYXJlbnQoKSkgewogICAgICAgICAgICAgQ29sb3IgY29sb3Ig
PSBvLnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpOwotICAg
ICAgICAgICAgaWYgKG8ucGFyZW50KCktPnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENT
U1Byb3BlcnR5Q29sb3IpLnJnYigpICE9IGNvbG9yLnJnYigpKQorICAgICAgICAgICAgaWYgKCFl
cXVhbElnbm9yaW5nU2VtYW50aWNDb2xvcihvLnBhcmVudCgpLT5zdHlsZSgpLnZpc2l0ZWREZXBl
bmRlbnRDb2xvcihDU1NQcm9wZXJ0eUNvbG9yKSwgY29sb3IpKQogICAgICAgICAgICAgICAgIHRz
IDw8ICIgW2NvbG9yPSIgPDwgY29sb3IubmFtZUZvclJlbmRlclRyZWVBc1RleHQoKSA8PCAiXSI7
CiAKICAgICAgICAgICAgIC8vIERvIG5vdCBkdW1wIGludmFsaWQgb3IgdHJhbnNwYXJlbnQgYmFj
a2dyb3VuZHMsIHNpbmNlIHRoYXQgaXMgdGhlIGRlZmF1bHQuCiAgICAgICAgICAgICBDb2xvciBi
YWNrZ3JvdW5kQ29sb3IgPSBvLnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3Bl
cnR5QmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIGlmIChvLnBhcmVudCgpLT5zdHlsZSgp
LnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcikucmdiKCkg
IT0gYmFja2dyb3VuZENvbG9yLnJnYigpCi0gICAgICAgICAgICAgICAgJiYgYmFja2dyb3VuZENv
bG9yLnJnYigpICE9IENvbG9yOjp0cmFuc3BhcmVudCkKKyAgICAgICAgICAgIGlmICghZXF1YWxJ
Z25vcmluZ1NlbWFudGljQ29sb3Ioby5wYXJlbnQoKS0+c3R5bGUoKS52aXNpdGVkRGVwZW5kZW50
Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLCBiYWNrZ3JvdW5kQ29sb3IpCisgICAg
ICAgICAgICAgICAgJiYgYmFja2dyb3VuZENvbG9yICE9IENvbG9yOjp0cmFuc3BhcmVudCkKICAg
ICAgICAgICAgICAgICB0cyA8PCAiIFtiZ2NvbG9yPSIgPDwgYmFja2dyb3VuZENvbG9yLm5hbWVG
b3JSZW5kZXJUcmVlQXNUZXh0KCkgPDwgIl0iOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBD
b2xvciB0ZXh0RmlsbENvbG9yID0gby5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3IpOwotICAgICAgICAgICAgaWYgKG8ucGFyZW50KCkt
PnN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxD
b2xvcikucmdiKCkgIT0gdGV4dEZpbGxDb2xvci5yZ2IoKSAgCi0gICAgICAgICAgICAgICAgJiYg
dGV4dEZpbGxDb2xvci5yZ2IoKSAhPSBjb2xvci5yZ2IoKSAmJiB0ZXh0RmlsbENvbG9yLnJnYigp
ICE9IENvbG9yOjp0cmFuc3BhcmVudCkKKyAgICAgICAgICAgIGlmICghZXF1YWxJZ25vcmluZ1Nl
bWFudGljQ29sb3Ioby5wYXJlbnQoKS0+c3R5bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NT
UHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yKSwgdGV4dEZpbGxDb2xvcikKKyAgICAgICAgICAg
ICAgICAmJiB0ZXh0RmlsbENvbG9yICE9IGNvbG9yICYmIHRleHRGaWxsQ29sb3IgIT0gQ29sb3I6
OnRyYW5zcGFyZW50KQogICAgICAgICAgICAgICAgIHRzIDw8ICIgW3RleHRGaWxsQ29sb3I9IiA8
PCB0ZXh0RmlsbENvbG9yLm5hbWVGb3JSZW5kZXJUcmVlQXNUZXh0KCkgPDwgIl0iOwogCiAgICAg
ICAgICAgICBDb2xvciB0ZXh0U3Ryb2tlQ29sb3IgPSBvLnN0eWxlKCkudmlzaXRlZERlcGVuZGVu
dENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yKTsKLSAgICAgICAgICAgIGlm
IChvLnBhcmVudCgpLT5zdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eVdl
YmtpdFRleHRTdHJva2VDb2xvcikucmdiKCkgIT0gdGV4dFN0cm9rZUNvbG9yLnJnYigpCi0gICAg
ICAgICAgICAgICAgJiYgdGV4dFN0cm9rZUNvbG9yLnJnYigpICE9IGNvbG9yLnJnYigpICYmIHRl
eHRTdHJva2VDb2xvci5yZ2IoKSAhPSBDb2xvcjo6dHJhbnNwYXJlbnQpCisgICAgICAgICAgICBp
ZiAoIWVxdWFsSWdub3JpbmdTZW1hbnRpY0NvbG9yKG8ucGFyZW50KCktPnN0eWxlKCkudmlzaXRl
ZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yKSwgdGV4dFN0
cm9rZUNvbG9yKQorICAgICAgICAgICAgICAgICYmIHRleHRTdHJva2VDb2xvciAhPSBjb2xvciAm
JiB0ZXh0U3Ryb2tlQ29sb3IgIT0gQ29sb3I6OnRyYW5zcGFyZW50KQogICAgICAgICAgICAgICAg
IHRzIDw8ICIgW3RleHRTdHJva2VDb2xvcj0iIDw8IHRleHRTdHJva2VDb2xvci5uYW1lRm9yUmVu
ZGVyVHJlZUFzVGV4dCgpIDw8ICJdIjsKIAogICAgICAgICAgICAgaWYgKG8ucGFyZW50KCktPnN0
eWxlKCkudGV4dFN0cm9rZVdpZHRoKCkgIT0gby5zdHlsZSgpLnRleHRTdHJva2VXaWR0aCgpICYm
IG8uc3R5bGUoKS50ZXh0U3Ryb2tlV2lkdGgoKSA+IDApCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9z
dmcvU1ZHU3RvcEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9T
VkdTdG9wRWxlbWVudC5jcHAJKHJldmlzaW9uIDI2MTk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2
Zy9TVkdTdG9wRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk0LDkgKzk0LDcgQEAgQ29s
b3IgU1ZHU3RvcEVsZW1lbnQ6OnN0b3BDb2xvckluY2x1ZGluZwogICAgIGF1dG8mIHN2Z1N0eWxl
ID0gc3R5bGUuc3ZnU3R5bGUoKTsKICAgICBhdXRvIHN0b3BDb2xvciA9IHN0eWxlLmNvbG9yUmVz
b2x2aW5nQ3VycmVudENvbG9yKHN2Z1N0eWxlLnN0b3BDb2xvcigpKTsKIAotICAgIGZsb2F0IGNv
bG9yQWxwaGEgPSBzdG9wQ29sb3IuYWxwaGEoKSAvIDI1NS4wOwotICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZCB1c2UgY29sb3JXaXRoQWxwaGFNdWx0aXBsaWVkQnkoKSBidXQgdGhhdCBoYXMgZGlm
ZmVyZW50IHJvdW5kaW5nIG9mIHRoZSBhbHBoYSBjb21wb25lbnQuCi0gICAgcmV0dXJuIGNvbG9y
V2l0aE92ZXJyaWRlQWxwaGEoc3RvcENvbG9yLnJnYigpLCBjb2xvckFscGhhICogc3ZnU3R5bGUu
c3RvcE9wYWNpdHkoKSk7CisgICAgcmV0dXJuIHN0b3BDb2xvci5jb2xvcldpdGhBbHBoYU11bHRp
cGxpZWRCeVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhzdmdTdHlsZS5zdG9wT3BhY2l0eSgpKTsK
IH0KIAogfQpJbmRleDogU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdC9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2MjAyNikKKysrIFNvdXJjZS9XZWJLaXQv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMjAtMDUtMjEgIFNh
bSBXZWluaWcgIDx3ZWluaWdAYXBwbGUuY29tPgorCisgICAgICAgIEV4dGVuZGVkIENvbG9yIENs
ZWFudXA6IFJlbW92ZSB0cml2aWFsIHVzZXMgb2YgQ29sb3I6OnJnYigpCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTIyMzEKKworICAgICAgICBSZXZp
ZXdlZCBieSBEYXJpbiBBZGxlci4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvaW9zL1dLV2Vi
Vmlld0lPUy5tbToKKyAgICAgICAgKHNjcm9sbFZpZXdCYWNrZ3JvdW5kQ29sb3IpOgorICAgICAg
ICBSZXBsYWNlIGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoKSB3aXRoIENvbG9yOjpjb2xvcldpdGhB
bHBoYVVzaW5nQWx0ZXJuYXRpdmVSb3VuZGluZygpIHRvIGF2b2lkCisgICAgICAgIHVubmVjZXNz
YXJ5IHVzZSBvZiBDb2xvcjo6cmdiKCkKKwogMjAyMC0wNS0yMSAgSm9obiBXaWxhbmRlciAgPHdp
bGFuZGVyQGFwcGxlLmNvbT4KIAogICAgICAgICBTdG9yYWdlIEFjY2VzcyBBUEk6IEFsbG93IGNv
bmZpZ3VyYWJsZSBzdG9yYWdlIGFjY2VzcyBzY29wZQpJbmRleDogU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvQVBJL2lvcy9XS1dlYlZpZXdJT1MubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvQVBJL2lvcy9XS1dlYlZpZXdJT1MubW0JKHJldmlzaW9uIDI2MTk3MCkKKysr
IFNvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9pb3MvV0tXZWJWaWV3SU9TLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC01MTMsNyArNTEzLDcgQEAgc3RhdGljIFdlYkNvcmU6OkNvbG9yIHNjcm9sbFZp
ZXdCYWNrZ3JvdQogICAgIGlmICh6b29tU2NhbGUgPCBtaW5pbXVtWm9vbVNjYWxlKSB7CiAgICAg
ICAgIENHRmxvYXQgc2xvcGUgPSAxMjsKICAgICAgICAgQ0dGbG9hdCBvcGFjaXR5ID0gc3RkOjpt
YXg8Q0dGbG9hdD4oMSAtIHNsb3BlICogKG1pbmltdW1ab29tU2NhbGUgLSB6b29tU2NhbGUpLCAw
KTsKLSAgICAgICAgY29sb3IgPSBXZWJDb3JlOjpjb2xvcldpdGhPdmVycmlkZUFscGhhKGNvbG9y
LnJnYigpLCBvcGFjaXR5KTsKKyAgICAgICAgY29sb3IgPSBjb2xvci5jb2xvcldpdGhBbHBoYVVz
aW5nQWx0ZXJuYXRpdmVSb3VuZGluZyhvcGFjaXR5KTsKICAgICB9CiAKICAgICByZXR1cm4gY29s
b3I7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>