<?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>34366</bug_id>
          
          <creation_ts>2010-01-29 18:37:12 -0800</creation_ts>
          <short_desc>[OpenVG] Implement support for paths</short_desc>
          <delta_ts>2010-03-01 09:42:09 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>35445</dependson>
          <blocked>33987</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jakob Petsovits">jpetsovits</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>elongbug</cc>
    
    <cc>joone</cc>
    
    <cc>krit</cc>
    
    <cc>mario.bensi</cc>
    
    <cc>skyul</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>186051</commentid>
    <comment_count>0</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-29 18:37:12 -0800</bug_when>
    <thetext>Next patch in my OpenVG graphics backend series, adding a VGPath-based implementation of WebCore::Path (and everything that it comes with). See the commit message for more details. Review and enjoy!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>186054</commentid>
    <comment_count>1</comment_count>
      <attachid>47755</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-29 18:42:58 -0800</bug_when>
    <thetext>Created attachment 47755
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188903</commentid>
    <comment_count>2</comment_count>
      <attachid>47755</attachid>
    <who name="Ariya Hidayat">ariya.hidayat</who>
    <bug_when>2010-02-08 22:46:11 -0800</bug_when>
    <thetext>Comment on attachment 47755
Patch

Some minor remarks.


&gt; +Path* PainterOpenVG::currentPath()
&gt; +{
&gt; +    return m_currentPath;
&gt; +}

Shouldn&apos;t this be a const?

&gt; +bool Path::contains(const FloatPoint&amp; point, WindRule rule) const
&gt; +{
&gt; +    notImplemented();
&gt; +
&gt; +    return boundingRect().contains(point);
&gt; +}

Which one is correct?

&gt; +bool Path::strokeContains(StrokeStyleApplier* applier, const FloatPoint&amp; point) const
&gt; +{
&gt; +    notImplemented();
&gt; +
&gt; +    return (const_cast&lt;Path*&gt;(this))-&gt;strokeBoundingRect().contains(point);
&gt; +}

idem.

&gt; +FloatRect Path::strokeBoundingRect(StrokeStyleApplier* applier)
&gt; +{
&gt; +    notImplemented();
&gt; +
&gt; +    return boundingRect();
&gt; +}

idem.

&gt; +String Path::debugString() const
&gt; +{
&gt; +    String debugString = &quot;&quot;;
&gt; +
&gt; +    /*
&gt; +    m_path-&gt;makeCompatibleContextCurrent();
&gt; +    VGint numSegments = vgGetParameteri(m_path-&gt;vgPath(), VG_PATH_NUM_SEGMENTS);
&gt; +
&gt; +    for (int i = 0; i &lt; numSegments; i++) {
&gt; +        // Hm, OpenVG provides no means to retrieve path segment information?
&gt; +        // This is a bit unfortunate, we might need to store the segments in
&gt; +        // memory if we want to implement this function properly.
&gt; +    }
&gt; +    */
&gt; +
&gt; +    return debugString;
&gt; +}

Maybe just notImplemented() with the said comment?

&gt; +void Path::apply(void* info, PathApplierFunction function) const
&gt; +{
&gt; +    /*
&gt; +    m_path-&gt;makeCompatibleContextCurrent();
&gt; +    VGint numSegments = vgGetParameteri(m_path-&gt;vgPath(), VG_PATH_NUM_SEGMENTS);
&gt; +
&gt; +    for (int i = 0; i &lt; numSegments; i++) {
&gt; +        // Hm, OpenVG provides no means to retrieve path segment information?
&gt; +        // This is *very* unfortunate, we might need to store the segments in
&gt; +        // memory if we want to implement this function properly.
&gt; +        // See http://www.khronos.org/message_boards/viewtopic.php?f=6&amp;t=1887
&gt; +        // Bleh.
&gt; +    }
&gt; +    */
&gt; +}

idem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>191048</commentid>
    <comment_count>3</comment_count>
      <attachid>48904</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-02-17 08:29:37 -0800</bug_when>
    <thetext>Created attachment 48904
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>191050</commentid>
    <comment_count>4</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-02-17 08:39:09 -0800</bug_when>
    <thetext>Thanks Ariya, the updated the patch incorporates the above points. (The questions you brought up are now answered in comments.)

I am aware that the OpenVG backend needs to switch from TransformationMatrix to AffineTransform, my plan was to tackle that after this patch has been landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>191476</commentid>
    <comment_count>5</comment_count>
    <who name="Mun Gwan-gyeong">elongbug</who>
    <bug_when>2010-02-18 00:55:04 -0800</bug_when>
    <thetext>Hi~ Jakob Petsovits. I&apos;m curious about how to build and test OpenVG graphics backend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>192481</commentid>
    <comment_count>6</comment_count>
      <attachid>48904</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-02-22 09:10:10 -0800</bug_when>
    <thetext>Comment on attachment 48904
Patch

&gt; +PlatformPathOpenVG::PlatformPathOpenVG(const PlatformPathOpenVG&amp; other)
&gt; +    : SharedResourceOpenVG()
&gt; +    , m_currentPoint(other.m_currentPoint)
&gt; +    , m_subpathStartPoint(other.m_subpathStartPoint)
&gt; +{
&gt; +    createPath();
&gt; +    // makeCompatibleContextCurrent(); // called by createPath(), not necessary
&gt; +    vgAppendPath(m_vgPath, other.m_vgPath);
&gt; +    ASSERT_VG_NO_ERROR();
&gt; +}
There shouldn&apos;t be two comments in one line.

&gt; +
&gt; +PlatformPathOpenVG&amp; PlatformPathOpenVG::operator=(const PlatformPathOpenVG&amp; other)
&gt; +{
&gt; +    if (&amp;other != this) {
&gt; +        clear();
&gt; +        // makeCompatibleContextCurrent(); // called by clear(), not necessary
&gt; +        vgAppendPath(m_vgPath, other.m_vgPath);
&gt; +        ASSERT_VG_NO_ERROR();
&gt; +    }
&gt; +    return *this;
&gt; +}
The same here.

&gt; +bool Path::contains(const FloatPoint&amp; point, WindRule rule) const
&gt; +{
&gt; +    notImplemented();
&gt; +
&gt; +    // OpenVG has no path-contains function, so for now we approximate by
&gt; +    // using the bounding rect of the path.
&gt; +    return boundingRect().contains(point);
&gt; +}
If I undersand Ariya correctly, ha wants you to either choose noImplemented() or the comment with the immedate code.

Personaly, I would like to see the OpenVG port fixed, so that you can use AffineTransform here. I&apos;m blameable for this breakage with the AffineTransform implementation, so I would like to help on fixing the issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193851</commentid>
    <comment_count>7</comment_count>
      <attachid>48904</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-02-25 12:52:06 -0800</bug_when>
    <thetext>Comment on attachment 48904
Patch

&gt; +PlatformPathOpenVG::PlatformPathOpenVG(const PlatformPathOpenVG&amp; other)
&gt; +    : SharedResourceOpenVG()
&gt; +    , m_currentPoint(other.m_currentPoint)
&gt; +    , m_subpathStartPoint(other.m_subpathStartPoint)
&gt; +{
&gt; +    createPath();
&gt; +    // makeCompatibleContextCurrent(); // called by createPath(), not necessary
&gt; +    vgAppendPath(m_vgPath, other.m_vgPath);
&gt; +    ASSERT_VG_NO_ERROR();
&gt; +}

Either delete the comments or, if you think it is necessary for the explanation, use two lines.


&gt; +void Path::transform(const TransformationMatrix&amp; transform)
&gt; +{
&gt; +    PlatformPathOpenVG* dst = new PlatformPathOpenVG();
&gt; +    // dst-&gt;makeCompatibleContextCurrent(); // done by platform path constructor
&gt; +    PainterOpenVG::transformPath(dst-&gt;vgPath(), m_path-&gt;vgPath(), transform);
&gt; +    delete m_path;
&gt; +    m_path = dst;
&gt; +
&gt; +    m_path-&gt;m_currentPoint = transform.mapPoint(m_path-&gt;m_currentPoint);
&gt; +    m_path-&gt;m_subpathStartPoint = transform.mapPoint(m_path-&gt;m_subpathStartPoint);
&gt; +}

same here

You should also make a explanation why Path::isEmpty is also empty for a moveTo, either with a link to the HTML 5 spec or technical reasons. The current implementation differs from other platforms.

I realy would like to see AffineTransform instead of TransformationMatrix.

r- mainly because of TransformationMatrix and Path:isEmpty.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194265</commentid>
    <comment_count>8</comment_count>
      <attachid>49632</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-02-26 13:38:45 -0800</bug_when>
    <thetext>Created attachment 49632
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194266</commentid>
    <comment_count>9</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-02-26 13:41:55 -0800</bug_when>
    <thetext>Above patch uses AffineTransform (depending on bug 35445 which converts the already landed parts of the OpenVG backend), rewrites the comments so no double-commenting is done, and implements isEmpty() in the same way as other ports do. Hope that&apos;s good enough now :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194720</commentid>
    <comment_count>10</comment_count>
      <attachid>49632</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-03-01 09:17:33 -0800</bug_when>
    <thetext>Comment on attachment 49632
Patch

looks great r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194723</commentid>
    <comment_count>11</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-03-01 09:42:09 -0800</bug_when>
    <thetext>Committed r55371: &lt;http://trac.webkit.org/changeset/55371&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>47755</attachid>
            <date>2010-01-29 18:42:58 -0800</date>
            <delta_ts>2010-02-17 08:29:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34366-20100129214257.patch</filename>
            <type>text/plain</type>
            <size>33539</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZWI1MTkzMy4uZTk3YmMzOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw4NiBAQAorMjAxMC0wMS0zMCAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEltcGxlbWVudCBzdXBwb3J0IGZvciBwYXRocwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNjYKKwor
ICAgICAgICBBZGRzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXRoIGNsYXNzIC0KKyAgICAg
ICAgKmFsbW9zdCogY29tcGxldGUsIGJ1dCBub3QgcXVpdGUgYmVjYXVzZSBPcGVuVkcKKyAgICAg
ICAgZG9lcyBub3QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHBvaW50cyBpbiBhIFZHUGF0aAorICAg
ICAgICB1bmxlc3Mgb25lIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgcG9pbnRzIGJ5CisgICAgICAg
IHRoZW1zZWx2ZXMsIHdoaWNoIHdlIGRlY2lkZWQgbm90IHRvIGRvLgorCisgICAgICAgIEFsc28g
aG9va2VkIHVwIHRvIFBhaW50ZXJPcGVuVkcgYW5kIEdyYXBoaWNzQ29udGV4dC4KKworICAgICAg
ICBGdXJ0aGVyIGludHJvZHVjZWQgaXMgU2hhcmVkUmVzb3VyY2VPcGVuVkcsIHdoaWNoIGlzCisg
ICAgICAgIGludGVuZGVkIGFzIGJhc2UgY2xhc3MgZm9yIHBhdGhzIGFuZCBvdGhlciBPcGVuVkcK
KyAgICAgICAgcmVzb3VyY2VzIChpbWFnZXMsIGZvbnRzKSB0aGF0IFdlYktpdCBjcmVhdGVzIGFz
CisgICAgICAgIGxvbmctbGl2ZWQgb2JqZWN0cy4gV2UgYXJlIGF0IGEgc2xpZ2h0IGRpc2FkdmFu
dGFnZQorICAgICAgICBoZXJlIGFzIFdlYktpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2Yg
cmVzb3VyY2VzCisgICAgICAgIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIChoYXJkd2FyZSBncmFw
aGljcykgY29udGV4dCwKKyAgICAgICAgd2hpY2ggaXMgdGhlIHJlYXNvbiB3aHkgRUdMRGlzcGxh
eU9wZW5WRyBoYWQgdG8KKyAgICAgICAgcHJvdmlkZSBhIGN1cnJlbnQgZGlzcGxheSBzaW5nbGV0
b247IHRoaXMgY2xhc3MgaXMKKyAgICAgICAgd2hhdCBhY3R1YWxseSByZXF1aXJlcyB0aGF0IGZ1
bmN0aW9uYWxpdHkuCisKKyAgICAgICAgUGF0aDo6YWRkQXJjVG8oKSB1c2VzIGNvZGUgYnkgWW9u
ZyBMaSA8eW9saUByaW0uY29tPi4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGgu
Y3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguaDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9vcGVudmcvR3JhcGhpY3NDb250ZXh0T3BlblZHLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6ZHJhd1BhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpi
ZWdpblBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpQYWludGVyT3BlblZHOjpQYWludGVyT3BlblZHKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhaW50ZXJPcGVuVkc6On5QYWludGVyT3BlblZHKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhaW50ZXJPcGVuVkc6OnRyYW5zZm9ybVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFp
bnRlck9wZW5WRzo6YmVnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhaW50ZXJPcGVuVkc6
OmFkZFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6Y3VycmVudFBhdGgp
OgorICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6ZHJhd1BhdGgpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYWludGVyT3BlblZHLmg6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1BhdGhPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6UGxhdGZvcm1QYXRoT3BlblZHKToKKyAgICAgICAg
KFdlYkNvcmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdlYkNv
cmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6flBsYXRmb3JtUGF0aE9wZW5WRyk6CisgICAgICAgIChX
ZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkc6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlBs
YXRmb3JtUGF0aE9wZW5WRzo6Y3JlYXRlUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpQ
YXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6On5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6Om9wZXJhdG9yPSk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpjb250YWlucyk6Cisg
ICAgICAgIChXZWJDb3JlOjpQYXRoOjpzdHJva2VDb250YWlucyk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXRoOjp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Ym91bmRpbmdSZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpQYXRoOjptb3ZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkTGlu
ZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZFF1YWRDdXJ2ZVRvKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhdGg6OmFkZEJlemllckN1cnZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0
aDo6YWRkQXJjVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y2xvc2VTdWJwYXRoKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEFyYyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjph
ZGRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEVsbGlwc2UpOgorICAgICAgICAo
V2ViQ29yZTo6UGF0aDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6aXNFbXB0eSk6
CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpoYXNDdXJyZW50UG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UGF0aDo6ZGVidWdTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YXBwbHkp
OgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6dHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpwb2ludEF0TGVuZ3RoKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhdGg6Om5vcm1hbEFuZ2xlQXRMZW5ndGgpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QbGF0Zm9ybVBhdGhPcGVuVkcuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkc6OnZnUGF0aCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRSZXNvdXJjZU9wZW5WRzo6bWFrZVNoYXJlZENvbnRl
eHRDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFJlc291cmNlT3BlblZHOjptYWtl
Q29tcGF0aWJsZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9v
cGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuaDogQWRkZWQuCisKIDIwMTAtMDEtMjkgIEpha29i
IFBldHNvdml0cyAgPGpwZXRzb3ZpdHNAcmltLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
aC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwCmluZGV4IGUzMDcwM2Mu
LmFmOTRiZTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmNwcApAQCAtMzksNiArMzksNyBA
QCBzdGF0aWMgY29uc3QgZmxvYXQgUVVBUlRFUiA9IDAuNTUyZjsgLy8gYXBwcm94aW1hdGlvbiBv
ZiBjb250cm9sIHBvaW50IHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gdG8gc2ltdWxhdGUgYSBxdWFydGVyIG9mIGEgY2lyY2xlLgogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCisjaWYgIVBMQVRGT1JNKE9QRU5WRykKIHN0YXRpYyB2b2lkIHBhdGhMZW5ndGhBcHBsaWVy
RnVuY3Rpb24odm9pZCogaW5mbywgY29uc3QgUGF0aEVsZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAg
UGF0aFRyYXZlcnNhbFN0YXRlJiB0cmF2ZXJzYWxTdGF0ZSA9ICpzdGF0aWNfY2FzdDxQYXRoVHJh
dmVyc2FsU3RhdGUqPihpbmZvKTsKQEAgLTEwNyw2ICsxMDgsNyBAQCBmbG9hdCBQYXRoOjpub3Jt
YWxBbmdsZUF0TGVuZ3RoKGZsb2F0IGxlbmd0aCwgYm9vbCYgb2spCiAgICAgb2sgPSB0cmF2ZXJz
YWxTdGF0ZS5tX3N1Y2Nlc3M7CiAgICAgcmV0dXJuIHRyYXZlcnNhbFN0YXRlLm1fbm9ybWFsQW5n
bGU7CiB9CisjZW5kaWYKIAogUGF0aCBQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKGNvbnN0
IEZsb2F0UmVjdCYgcmVjdGFuZ2xlLCBjb25zdCBGbG9hdFNpemUmIHJvdW5kaW5nUmFkaWkpCiB7
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCmluZGV4IGJmNGNkOWQuLmExZDgyNTcgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvUGF0aC5oCkBAIC0zMyw2ICszMywxMSBAQAogCiAjaWYgUExBVEZPUk0oQ0cp
CiB0eXBlZGVmIHN0cnVjdCBDR1BhdGggUGxhdGZvcm1QYXRoOworI2VsaWYgUExBVEZPUk0oT1BF
TlZHKQorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUGxhdGZvcm1QYXRoT3BlblZHOworfQor
dHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkcgUGxhdGZvcm1QYXRoOwogI2VsaWYg
UExBVEZPUk0oUVQpCiAjaW5jbHVkZSA8cWdsb2JhbC5oPgogUVRfQkVHSU5fTkFNRVNQQUNFCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9HcmFwaGljc0NvbnRl
eHRPcGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvR3JhcGhpY3ND
b250ZXh0T3BlblZHLmNwcAppbmRleCA1ZWQ4OTJjLi4xZGRiY2JiIDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9HcmFwaGljc0NvbnRleHRPcGVuVkcuY3BwCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0dyYXBoaWNzQ29udGV4dE9wZW5W
Ry5jcHAKQEAgLTE0Myw3ICsxNDMsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgo
KQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgbV9kYXRhLT5kcmF3UGF0aChWR19GSUxMX1BBVEgsIG1fY29t
bW9uLT5zdGF0ZS5maWxsUnVsZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQ
YXRoKCkKQEAgLTE1MSw3ICsxNTEsMTUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBh
dGgoKQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgbV9kYXRhLT5kcmF3UGF0aChWR19TVFJPS0VfUEFUSCwg
bV9jb21tb24tPnN0YXRlLmZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdQYXRoKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2RhdGEtPmRyYXdQYXRoKFZHX0ZJTExfUEFUSCB8IFZHX1NUUk9LRV9QQVRILCBt
X2NvbW1vbi0+c3RhdGUuZmlsbFJ1bGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Zmls
bFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQpAQCAtMTkzLDcgKzIwMSw3IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgbV9kYXRhLT5iZWdp
blBhdGgoKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgoY29uc3QgUGF0aCYg
cGF0aCkKQEAgLTIwMSw3ICsyMDksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkUGF0aChj
b25zdCBQYXRoJiBwYXRoKQogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgbV9kYXRhLT5hZGRQYXRoKHBhdGgp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBGbG9hdFJlY3QmIHJlY3Qp
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYWludGVyT3Bl
blZHLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcu
Y3BwCmluZGV4IDNiN2NmODUuLmNkZDkwYjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIkludFNpemUuaCIKICNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aE9wZW5WRy5oIgogI2luY2x1ZGUgIlN1
cmZhY2VPcGVuVkcuaCIKICNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgogI2luY2x1
ZGUgIlZHVXRpbHMuaCIKQEAgLTM0MywxMiArMzQ0LDE0IEBAIHN0cnVjdCBQbGF0Zm9ybVBhaW50
ZXJTdGF0ZSB7CiBQYWludGVyT3BlblZHOjpQYWludGVyT3BlblZHKCkKICAgICA6IG1fc3RhdGUo
MCkKICAgICAsIG1fc3VyZmFjZSgwKQorICAgICwgbV9jdXJyZW50UGF0aCgwKQogewogfQogCiBQ
YWludGVyT3BlblZHOjpQYWludGVyT3BlblZHKFN1cmZhY2VPcGVuVkcqIHN1cmZhY2UpCiAgICAg
OiBtX3N0YXRlKDApCiAgICAgLCBtX3N1cmZhY2UoMCkKKyAgICAsIG1fY3VycmVudFBhdGgoMCkK
IHsKICAgICBBU1NFUlQoc3VyZmFjZSk7CiAgICAgYmVnaW4oc3VyZmFjZSk7CkBAIC0zNTcsNiAr
MzYwLDcgQEAgUGFpbnRlck9wZW5WRzo6UGFpbnRlck9wZW5WRyhTdXJmYWNlT3BlblZHKiBzdXJm
YWNlKQogUGFpbnRlck9wZW5WRzo6flBhaW50ZXJPcGVuVkcoKQogewogICAgIGVuZCgpOworICAg
IGRlbGV0ZSBtX2N1cnJlbnRQYXRoOwogfQogCiB2b2lkIFBhaW50ZXJPcGVuVkc6OmJlZ2luKFN1
cmZhY2VPcGVuVkcqIHN1cmZhY2UpCkBAIC00NDQsNiArNDQ4LDI4IEBAIHZvaWQgUGFpbnRlck9w
ZW5WRzo6c2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IG1hdHJpeCkKICAgICBtX3N0YXRlLT5hcHBseVRyYW5zZm9ybWF0aW9uTWF0cml4KHRoaXMpOwog
fQogCit2b2lkIFBhaW50ZXJPcGVuVkc6OnRyYW5zZm9ybVBhdGgoVkdQYXRoIGRzdCwgVkdQYXRo
IHNyYywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkKK3sKKyAgICB2Z1NldGko
VkdfTUFUUklYX01PREUsIFZHX01BVFJJWF9QQVRIX1VTRVJfVE9fU1VSRkFDRSk7CisKKyAgICAv
LyBTYXZlIHRoZSB0cmFuc2Zvcm0gc3RhdGUKKyAgICBWR2Zsb2F0IGN1cnJlbnRNYXRyaXhbOV07
CisgICAgdmdHZXRNYXRyaXgoY3VycmVudE1hdHJpeCk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9S
KCk7CisKKyAgICAvLyBMb2FkIHRoZSBuZXcgdHJhbnNmb3JtCisgICAgdmdMb2FkTWF0cml4KFZH
TWF0cml4KG1hdHJpeCkudG9WR2Zsb2F0KCkpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOwor
CisgICAgLy8gQXBwbHkgdGhlIG5ldyB0cmFuc2Zvcm0KKyAgICB2Z1RyYW5zZm9ybVBhdGgoZHN0
LCBzcmMpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgLy8gUmVzdG9yZSB0aGUg
dHJhbnNmb3JtIHN0YXRlCisgICAgdmdMb2FkTWF0cml4KGN1cnJlbnRNYXRyaXgpOworICAgIEFT
U0VSVF9WR19OT19FUlJPUigpOworfQorCiBDb21wb3NpdGVPcGVyYXRvciBQYWludGVyT3BlblZH
Ojpjb21wb3NpdGVPcGVyYXRpb24oKSBjb25zdAogewogICAgIEFTU0VSVChtX3N0YXRlKTsKQEAg
LTYyNCw2ICs2NTAsNDcgQEAgdm9pZCBQYWludGVyT3BlblZHOjp0cmFuc2xhdGUoZmxvYXQgZHgs
IGZsb2F0IGR5KQogICAgIHNldFRyYW5zZm9ybWF0aW9uTWF0cml4KG1hdHJpeCk7CiB9CiAKK3Zv
aWQgUGFpbnRlck9wZW5WRzo6YmVnaW5QYXRoKCkKK3sKKyAgICBkZWxldGUgbV9jdXJyZW50UGF0
aDsKKyAgICBtX2N1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTsKK30KKwordm9pZCBQYWludGVyT3Bl
blZHOjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgbV9jdXJyZW50UGF0aC0+cGxh
dGZvcm1QYXRoKCktPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKworICAgIHZnQXBw
ZW5kUGF0aChtX2N1cnJlbnRQYXRoLT5wbGF0Zm9ybVBhdGgoKS0+dmdQYXRoKCksIHBhdGgucGxh
dGZvcm1QYXRoKCktPnZnUGF0aCgpKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKK30KKwor
UGF0aCogUGFpbnRlck9wZW5WRzo6Y3VycmVudFBhdGgoKQoreworICAgIHJldHVybiBtX2N1cnJl
bnRQYXRoOworfQorCit2b2lkIFBhaW50ZXJPcGVuVkc6OmRyYXdQYXRoKFZHYml0ZmllbGQgc3Bl
Y2lmaWVkUGFpbnRNb2RlcywgV2luZFJ1bGUgZmlsbFJ1bGUpCit7CisgICAgQVNTRVJUKG1fc3Rh
dGUpOworCisgICAgVkdiaXRmaWVsZCBwYWludE1vZGVzID0gMDsKKyAgICBpZiAoIW1fc3RhdGUt
PnN0cm9rZURpc2FibGVkKCkpCisgICAgICAgIHBhaW50TW9kZXMgfD0gVkdfU1RST0tFX1BBVEg7
CisgICAgaWYgKCFtX3N0YXRlLT5maWxsRGlzYWJsZWQoKSkKKyAgICAgICAgcGFpbnRNb2RlcyB8
PSBWR19GSUxMX1BBVEg7CisKKyAgICBwYWludE1vZGVzICY9IHNwZWNpZmllZFBhaW50TW9kZXM7
CisKKyAgICBpZiAoIXBhaW50TW9kZXMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VyZmFj
ZS0+bWFrZUN1cnJlbnQoKTsKKworICAgIHZnU2V0aShWR19GSUxMX1JVTEUsIHRvVkdGaWxsUnVs
ZShmaWxsUnVsZSkpOworICAgIHZnRHJhd1BhdGgobV9jdXJyZW50UGF0aC0+cGxhdGZvcm1QYXRo
KCktPnZnUGF0aCgpLCBwYWludE1vZGVzKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKK30K
Kwogdm9pZCBQYWludGVyT3BlblZHOjppbnRlcnNlY3RTY2lzc29yUmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QpCiB7CiAgICAgLy8gU2Npc3NvciByZWN0YW5nbGVzIGFyZSBkZWZpbmVkIGJ5IGZs
b2F0IHZhbHVlcywgYnV0IGUuZy4gcGFpbnRpbmcKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuaAppbmRleCA2OTM2ZWVlLi41NDhkZTVkIDEwMDY0
NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYWludGVyT3BlblZHLmgK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5oCkBA
IC0zNSw2ICszNSw3IEBAIGNsYXNzIEZsb2F0UG9pbnQ7CiBjbGFzcyBGbG9hdFJlY3Q7CiBjbGFz
cyBJbnRSZWN0OwogY2xhc3MgSW50U2l6ZTsKK2NsYXNzIFBhdGg7CiBjbGFzcyBTdXJmYWNlT3Bl
blZHOwogY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CiAKQEAgLTYxLDYgKzYyLDggQEAgcHVi
bGljOgogICAgIHZvaWQgc2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmKTsKICAgICB2b2lkIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4Jik7CiAKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2Zvcm1QYXRoKFZH
UGF0aCBkc3QsIFZHUGF0aCBzcmMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgp
OworCiAgICAgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3BlcmF0aW9uKCkgY29uc3Q7CiAg
ICAgdm9pZCBzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3IpOwogICAgIGZs
b2F0IG9wYWNpdHkoKSBjb25zdDsKQEAgLTk2LDYgKzk5LDExIEBAIHB1YmxpYzoKICAgICB2b2lk
IHJvdGF0ZShmbG9hdCByYWRpYW5zKTsKICAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxv
YXQgZHkpOwogCisgICAgdm9pZCBiZWdpblBhdGgoKTsKKyAgICB2b2lkIGFkZFBhdGgoY29uc3Qg
UGF0aCYpOworICAgIFBhdGgqIGN1cnJlbnRQYXRoKCk7CisgICAgdm9pZCBkcmF3UGF0aChWR2Jp
dGZpZWxkIHBhaW50TW9kZXMgPSAoVkdfU1RST0tFX1BBVEggfCBWR19GSUxMX1BBVEgpLCBXaW5k
UnVsZSBmaWxsUnVsZSA9IFJVTEVfTk9OWkVSTyk7CisKICAgICB2b2lkIGludGVyc2VjdENsaXBS
ZWN0KGNvbnN0IEZsb2F0UmVjdCYpOwogCiAgICAgdm9pZCBzYXZlKFBhaW50ZXJPcGVuVkc6OlNh
dmVNb2RlIHNhdmVNb2RlID0gQ3JlYXRlTmV3U3RhdGUpOwpAQCAtMTE0LDYgKzEyMiw3IEBAIHBy
aXZhdGU6CiAgICAgVmVjdG9yPFBsYXRmb3JtUGFpbnRlclN0YXRlKj4gbV9zdGF0ZVN0YWNrOwog
ICAgIFBsYXRmb3JtUGFpbnRlclN0YXRlKiBtX3N0YXRlOwogICAgIFN1cmZhY2VPcGVuVkcqIG1f
c3VyZmFjZTsKKyAgICBQYXRoKiBtX2N1cnJlbnRQYXRoOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGF0aE9wZW5WRy5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYXRoT3BlblZHLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi42YWIzMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGF0aE9wZW5WRy5jcHAKQEAgLTAsMCArMSw1MTkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDktMjAx
MC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBh
dGguaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFpbnRlck9wZW5W
Ry5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aE9wZW5WRy5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
U3RyaW5nLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVyLmgiCisjaW5jbHVkZSAiVHJh
bnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJWR1V0aWxzLmgiCisKKyNpbmNsdWRlIDxv
cGVudmcuaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjZGVmaW5lIFdFQktJVF9W
R19QQVRIX0NBUEFCSUxJVElFUyBWR19QQVRIX0NBUEFCSUxJVFlfQUxMCisKKyNkZWZpbmUgRlVa
WllfQ09NUEFSRShudW1iZXIsIHJlZmVyZW5jZSwgZGVsdGEpIFwKKyAgICAobnVtYmVyID49IChy
ZWZlcmVuY2UgLSBkZWx0YSkgJiYgbnVtYmVyIDw9IChyZWZlcmVuY2UgKyBkZWx0YSkpCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworUGxhdGZvcm1QYXRoT3BlblZHOjpQbGF0Zm9ybVBhdGhPcGVu
VkcoKQorICAgIDogU2hhcmVkUmVzb3VyY2VPcGVuVkcoKQoreworICAgIGNyZWF0ZVBhdGgoKTsK
K30KKworUGxhdGZvcm1QYXRoT3BlblZHOjpQbGF0Zm9ybVBhdGhPcGVuVkcoY29uc3QgUGxhdGZv
cm1QYXRoT3BlblZHJiBvdGhlcikKKyAgICA6IFNoYXJlZFJlc291cmNlT3BlblZHKCkKKyAgICAs
IG1fY3VycmVudFBvaW50KG90aGVyLm1fY3VycmVudFBvaW50KQorICAgICwgbV9zdWJwYXRoU3Rh
cnRQb2ludChvdGhlci5tX3N1YnBhdGhTdGFydFBvaW50KQoreworICAgIGNyZWF0ZVBhdGgoKTsK
KyAgICAvLyBtYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7IC8vIGNhbGxlZCBieSBjcmVh
dGVQYXRoKCksIG5vdCBuZWNlc3NhcnkKKyAgICB2Z0FwcGVuZFBhdGgobV92Z1BhdGgsIG90aGVy
Lm1fdmdQYXRoKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKK30KKworUGxhdGZvcm1QYXRo
T3BlblZHJiBQbGF0Zm9ybVBhdGhPcGVuVkc6Om9wZXJhdG9yPShjb25zdCBQbGF0Zm9ybVBhdGhP
cGVuVkcmIG90aGVyKQoreworICAgIGlmICgmb3RoZXIgIT0gdGhpcykgeworICAgICAgICBjbGVh
cigpOworICAgICAgICAvLyBtYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7IC8vIGNhbGxl
ZCBieSBjbGVhcigpLCBub3QgbmVjZXNzYXJ5CisgICAgICAgIHZnQXBwZW5kUGF0aChtX3ZnUGF0
aCwgb3RoZXIubV92Z1BhdGgpOworICAgICAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKKyAgICB9
CisgICAgcmV0dXJuICp0aGlzOworfQorCitQbGF0Zm9ybVBhdGhPcGVuVkc6On5QbGF0Zm9ybVBh
dGhPcGVuVkcoKQoreworICAgIG1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKworICAg
IHZnRGVzdHJveVBhdGgobV92Z1BhdGgpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworfQor
Cit2b2lkIFBsYXRmb3JtUGF0aE9wZW5WRzo6Y2xlYXIoKQoreworICAgIG1ha2VDb21wYXRpYmxl
Q29udGV4dEN1cnJlbnQoKTsKKworICAgIHZnQ2xlYXJQYXRoKG1fdmdQYXRoLCBXRUJLSVRfVkdf
UEFUSF9DQVBBQklMSVRJRVMpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9z
dWJwYXRoU3RhcnRQb2ludC5zZXRYKDApOworICAgIG1fc3VicGF0aFN0YXJ0UG9pbnQuc2V0WSgw
KTsKKyAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aFN0YXJ0UG9pbnQ7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoT3BlblZHOjpjcmVhdGVQYXRoKCkKK3sKKyAgICBtYWtlU2hhcmVkQ29udGV4
dEN1cnJlbnQoKTsKKworICAgIG1fdmdQYXRoID0gdmdDcmVhdGVQYXRoKAorICAgICAgICBWR19Q
QVRIX0ZPUk1BVF9TVEFOREFSRCwgVkdfUEFUSF9EQVRBVFlQRV9GLAorICAgICAgICAxLjAgLyog
c2NhbGUgKi8sIDAuMCAvKiBiaWFzICovLAorICAgICAgICAwIC8qIGV4cGVjdGVkIG51bWJlciBv
ZiBzZWdtZW50cyAqLywKKyAgICAgICAgMCAvKiBleHBlY3RlZCBudW1iZXIgb2YgdG90YWwgY29v
cmRpbmF0ZXMgKi8sCisgICAgICAgIFdFQktJVF9WR19QQVRIX0NBUEFCSUxJVElFUyk7CisgICAg
QVNTRVJUX1ZHX05PX0VSUk9SKCk7Cit9CisKKworUGF0aDo6UGF0aCgpCit7CisgICAgbV9wYXRo
ID0gbmV3IFBsYXRmb3JtUGF0aE9wZW5WRygpOworfQorCitQYXRoOjp+UGF0aCgpCit7CisgICAg
ZGVsZXRlIG1fcGF0aDsKK30KKworUGF0aDo6UGF0aChjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAg
ICBtX3BhdGggPSBuZXcgUGxhdGZvcm1QYXRoT3BlblZHKCoob3RoZXIubV9wYXRoKSk7Cit9CisK
K1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICAqbV9wYXRo
ID0gKihvdGhlci5tX3BhdGgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBQYXRoOjpj
b250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIGJvdW5kaW5nUmVjdCgpLmNvbnRh
aW5zKHBvaW50KTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VDb250YWlucyhTdHJva2VTdHlsZUFw
cGxpZXIqIGFwcGxpZXIsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIG5v
dEltcGxlbWVudGVkKCk7CisKKyAgICByZXR1cm4gKGNvbnN0X2Nhc3Q8UGF0aCo+KHRoaXMpKS0+
c3Ryb2tlQm91bmRpbmdSZWN0KCkuY29udGFpbnMocG9pbnQpOworfQorCit2b2lkIFBhdGg6OnRy
YW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggbWF0cml4OworICAgIG1hdHJpeC50cmFuc2xhdGUoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdo
dCgpKTsKKyAgICB0cmFuc2Zvcm0obWF0cml4KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5k
aW5nUmVjdCgpIGNvbnN0Cit7CisgICAgVkdmbG9hdCBtaW5YOworICAgIFZHZmxvYXQgbWluWTsK
KyAgICBWR2Zsb2F0IHdpZHRoOworICAgIFZHZmxvYXQgaGVpZ2h0OworCisgICAgbV9wYXRoLT5t
YWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdQYXRoQm91bmRzKG1fcGF0aC0+
dmdQYXRoKCksICZtaW5YLCAmbWluWSwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVkdf
Tk9fRVJST1IoKTsKKworICAgIHJldHVybiBGbG9hdFJlY3QoRmxvYXRQb2ludChtaW5YLCBtaW5Z
KSwgRmxvYXRTaXplKHdpZHRoLCBoZWlnaHQpKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9r
ZUJvdW5kaW5nUmVjdChTdHJva2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKworICAgIHJldHVybiBib3VuZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRo
Ojptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgc3RhdGljIGNvbnN0IFZH
dWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7IFZHX01PVkVfVE9fQUJTIH07CisgICAgY29uc3QgVkdm
bG9hdCBwYXRoRGF0YVtdID0geyBwb2ludC54KCksIHBvaW50LnkoKSB9OworCisgICAgbV9wYXRo
LT5tYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YSht
X3BhdGgtPnZnUGF0aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRf
VkdfTk9fRVJST1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBtX3BhdGgtPm1f
c3VicGF0aFN0YXJ0UG9pbnQgPSBwb2ludDsKK30KKwordm9pZCBQYXRoOjphZGRMaW5lVG8oY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgc3RhdGljIGNvbnN0IFZHdWJ5dGUgcGF0aFNl
Z21lbnRzW10gPSB7IFZHX0xJTkVfVE9fQUJTIH07CisgICAgY29uc3QgVkdmbG9hdCBwYXRoRGF0
YVtdID0geyBwb2ludC54KCksIHBvaW50LnkoKSB9OworCisgICAgbV9wYXRoLT5tYWtlQ29tcGF0
aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3BhdGgtPnZnUGF0
aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1Io
KTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBwb2ludDsKK30KKwordm9pZCBQYXRo
OjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQsIGNvbnN0IEZs
b2F0UG9pbnQmIGVuZFBvaW50KQoreworICAgIHN0YXRpYyBjb25zdCBWR3VieXRlIHBhdGhTZWdt
ZW50c1tdID0geyBWR19RVUFEX1RPX0FCUyB9OworICAgIGNvbnN0IFZHZmxvYXQgcGF0aERhdGFb
XSA9IHsgY29udHJvbFBvaW50LngoKSwgY29udHJvbFBvaW50LnkoKSwgZW5kUG9pbnQueCgpLCBl
bmRQb2ludC55KCkgfTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVu
dCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgMSwgcGF0aFNlZ21l
bnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgt
Pm1fY3VycmVudFBvaW50ID0gZW5kUG9pbnQ7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3Vy
dmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQxLCBjb25zdCBGbG9hdFBvaW50JiBj
b250cm9sUG9pbnQyLCBjb25zdCBGbG9hdFBvaW50JiBlbmRQb2ludCkKK3sKKyAgICBzdGF0aWMg
Y29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9IHsgVkdfQ1VCSUNfVE9fQUJTIH07CisgICAg
Y29uc3QgVkdmbG9hdCBwYXRoRGF0YVtdID0geyBjb250cm9sUG9pbnQxLngoKSwgY29udHJvbFBv
aW50MS55KCksIGNvbnRyb2xQb2ludDIueCgpLCBjb250cm9sUG9pbnQyLnkoKSwgZW5kUG9pbnQu
eCgpLCBlbmRQb2ludC55KCkgfTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0
Q3VycmVudCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgMSwgcGF0
aFNlZ21lbnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBt
X3BhdGgtPm1fY3VycmVudFBvaW50ID0gZW5kUG9pbnQ7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJj
VG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQxLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludDIsIGZs
b2F0IHJhZGl1cykKK3sKKyAgICAvLyBTZWUgaHR0cDovL3BoaWxpcC5odG1sNS5vcmcvdGVzdHMv
Y2FudmFzL3N1aXRlL3Rlc3RzL3NwZWMuaHRtbCNhcmN0by4KKworICAgIGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50MCA9IG1fcGF0aC0+bV9jdXJyZW50UG9pbnQ7CisgICAgaWYgKCFyYWRpdXMgfHwg
cG9pbnQwID09IHBvaW50MSB8fCBwb2ludDEgPT0gcG9pbnQyKSB7CisgICAgICAgIGFkZExpbmVU
byhwb2ludDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRmxvYXRTaXplIHYwMSA9
IHBvaW50MCAtIHBvaW50MTsKKyAgICBGbG9hdFNpemUgdjIxID0gcG9pbnQyIC0gcG9pbnQxOwor
CisgICAgLy8gc2luKEEgLSBCKSA9IHNpbihBKSAqIGNvcyhCKSAtIHNpbihCKSAqIGNvcyhBKQor
ICAgIGRvdWJsZSBjcm9zcyA9IHYwMS53aWR0aCgpICogdjIxLmhlaWdodCgpIC0gdjAxLmhlaWdo
dCgpICogdjIxLndpZHRoKCk7CisKKyAgICBpZiAoZmFicyhjcm9zcykgPCAxRS0xMCkgeworICAg
ICAgICAvLyBvbiBvbmUgbGluZQorICAgICAgICBhZGRMaW5lVG8ocG9pbnQxKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGRvdWJsZSBkMDEgPSBoeXBvdCh2MDEud2lkdGgoKSwgdjAx
LmhlaWdodCgpKTsKKyAgICBkb3VibGUgZDIxID0gaHlwb3QodjIxLndpZHRoKCksIHYyMS5oZWln
aHQoKSk7CisgICAgZG91YmxlIGFuZ2xlID0gKHBpRG91YmxlIC0gZmFicyhhc2luKGNyb3NzIC8g
KGQwMSAqIGQyMSkpKSkgKiAwLjU7CisgICAgZG91YmxlIHNwYW4gPSByYWRpdXMgKiB0YW4oYW5n
bGUpOworICAgIGRvdWJsZSByYXRlID0gc3BhbiAvIGQwMTsKKyAgICBGbG9hdFBvaW50IHN0YXJ0
UG9pbnQgPSBGbG9hdFBvaW50KHBvaW50MS54KCkgKyB2MDEud2lkdGgoKSAqIHJhdGUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludDEueSgpICsgdjAxLmhlaWdo
dCgpICogcmF0ZSk7CisgICAgcmF0ZSA9IHNwYW4gLyBkMjE7CisgICAgRmxvYXRQb2ludCBlbmRQ
b2ludCA9IEZsb2F0UG9pbnQocG9pbnQxLngoKSArIHYyMS53aWR0aCgpICogcmF0ZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludDEueSgpICsgdjIxLmhlaWdodCgp
ICogcmF0ZSk7CisKKyAgICAvLyBGYTogbGFyZ2UgYXJjIGZsYWcsIG1ha2VzIHRoZSBkaWZmZXJl
bmNlIGJldHdlZW4gU0NXQVJDX1RPIGFuZCBMQ1dBUkNfVE8KKyAgICAvLyAgICAgcmVzcGVjdGl2
ZWx5IFNDQ1dBUkNfVE8gYW5kIExDQ1dBUkNfVE8gYXJjcy4gV2UgYWx3YXlzIHVzZSBzbWFsbAor
ICAgIC8vICAgICBhcmNzIGZvciBhcmNUbygpLCBhcyB0aGUgYXJjIGlzIGRlZmluZWQgYXMgdGhl
ICJzaG9ydGVzdCBhcmMiIG9mIHRoZQorICAgIC8vICAgICBjaXJjbGUgc3BlY2lmaWVkIGluIEhU
TUwgNS4KKworICAgIC8vIEZzOiBzd2VlcCBmbGFnLCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGFy
YyBpcyBkcmF3biBpbiBpbmNyZWFzaW5nICh0cnVlKQorICAgIC8vICAgICBvciBkZWNyZWFzaW5n
ICgwKSBkaXJlY3Rpb24uCisgICAgY29uc3QgYm9vbCBhbnRpY2xvY2t3aXNlID0gY3Jvc3MgPCAw
OworCisgICAgLy8gVHJhbnNsYXRlIHRoZSBsYXJnZSBhcmMgYW5kIHN3ZWVwIGZsYWdzIGludG8g
YW4gT3BlblZHIHNlZ21lbnQgY29tbWFuZC4KKyAgICBjb25zdCBWR3VieXRlIHNlZ21lbnRDb21t
YW5kID0gYW50aWNsb2Nrd2lzZSA/IFZHX1NDQ1dBUkNfVE9fQUJTIDogVkdfU0NXQVJDX1RPX0FC
UzsKKworICAgIGNvbnN0IFZHdWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7CisgICAgICAgIFZHX0xJ
TkVfVE9fQUJTLAorICAgICAgICBzZWdtZW50Q29tbWFuZAorICAgIH07CisgICAgY29uc3QgVkdm
bG9hdCBwYXRoRGF0YVtdID0geworICAgICAgICBzdGFydFBvaW50LngoKSwgc3RhcnRQb2ludC55
KCksCisgICAgICAgIHJhZGl1cywgcmFkaXVzLCAwLCBlbmRQb2ludC54KCksIGVuZFBvaW50Lnko
KQorICAgIH07CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsK
KyAgICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDIsIHBhdGhTZWdtZW50cywg
cGF0aERhdGEpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1
cnJlbnRQb2ludCA9IGVuZFBvaW50OworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7
CisgICAgc3RhdGljIGNvbnN0IFZHdWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7IFZHX0NMT1NFX1BB
VEggfTsKKyAgICAvLyBwYXRoRGF0YSBtdXN0IG5vdCBiZSAwLCBidXQgY2VydGFpbiBjb21waWxl
cnMgYWxzbyBkb24ndCBjcmVhdGUKKyAgICAvLyB6ZXJvLXNpemUgYXJyYXlzLiBTbyBsZXQncyB1
c2UgYSByYW5kb20gYWxpZ25lZCB2YWx1ZSAoc2l6ZW9mKFZHZmxvYXQpKSwKKyAgICAvLyBpdCB3
b24ndCBiZSBhY2Nlc3NlZCBhbnl3YXlzIGFzIFZHX0NMT1NFX1BBVEggZG9lc24ndCB0YWtlIGNv
b3JkaW5hdGVzLgorICAgIHN0YXRpYyBjb25zdCBWR2Zsb2F0KiBwYXRoRGF0YSA9IHJlaW50ZXJw
cmV0X2Nhc3Q8VkdmbG9hdCo+KHNpemVvZihWR2Zsb2F0KSk7CisKKyAgICBtX3BhdGgtPm1ha2VD
b21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+
dmdQYXRoKCksIDEsIHBhdGhTZWdtZW50cywgcGF0aERhdGEpOworICAgIEFTU0VSVF9WR19OT19F
UlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludCA9IG1fcGF0aC0+bV9zdWJwYXRo
U3RhcnRQb2ludDsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYgY2Vu
dGVyLCBmbG9hdCByYWRpdXMsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IGVuZEFuZ2xlLCBib29s
IGFudGljbG9ja3dpc2UpCit7CisgICAgLy8gVGhlIE9wZW5WRyBzcGVjIHNheXMgbm90aGluZyBh
Ym91dCBpbmYgYXMgcmFkaXVzIG9yIHN0YXJ0L2VuZCBhbmdsZS4KKyAgICAvLyBXZWJLaXQgc2Vl
bXMgdG8gcGFzcyB0aG9zZSAoZS5nLiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY0NDkpLAorICAgIC8vIHNvIGFib3J0IGluc3RlYWQgb2Ygcmlza2luZyB1bmRlZmlu
ZWQgYmVoYXZpb3IuCisgICAgaWYgKCFpc2Zpbml0ZShyYWRpdXMpIHx8ICFpc2Zpbml0ZShzdGFy
dEFuZ2xlKSB8fCAhaXNmaW5pdGUoZW5kQW5nbGUpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBGb3Igc29tZSByZWFzb24sIHRoZSBIVE1MIDUgc3BlYyBkZWZpbmVzIHRoZSBhbmdsZSBhcyBn
b2luZyBjbG9ja3dpc2UKKyAgICAvLyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMgaW5zdGVhZCBv
ZiBnb2luZyBzdGFuZGFyZCBhbnRpY2xvY2t3aXNlLgorICAgIC8vIFNvIGxldCdzIG1ha2UgaXQg
YSBwcm9wZXIgYW5nbGUgaW4gb3JkZXIgdG8ga2VlcCBzYW5pdHkuCisgICAgc3RhcnRBbmdsZSA9
IGZtb2QoKDIuMCAqIHBpRG91YmxlKSAtIHN0YXJ0QW5nbGUsIDIuMCAqIHBpRG91YmxlKTsKKyAg
ICBlbmRBbmdsZSA9IGZtb2QoKDIuMCAqIHBpRG91YmxlKSAtIGVuZEFuZ2xlLCAyLjAgKiBwaURv
dWJsZSk7CisKKyAgICAvLyBNYWtlIGl0IHNvIHRoYXQgZW5kQW5nbGUgPiBzdGFydEFuZ2xlLiBm
bW9kKCkgYWJvdmUgdGFrZXMgY2FyZSBvZgorICAgIC8vIGtlZXBpbmcgdGhlIGRpZmZlcmVuY2Ug
YmVsb3cgMzYwIGRlZ3JlZXMuCisgICAgaWYgKGVuZEFuZ2xlIDw9IHN0YXJ0QW5nbGUpCisgICAg
ICAgIGVuZEFuZ2xlICs9IDIuMCAqIHBpRG91YmxlOworCisgICAgY29uc3QgVkdmbG9hdCBhbmds
ZURlbHRhID0gYW50aWNsb2Nrd2lzZQorICAgICAgICA/IChlbmRBbmdsZSAtIHN0YXJ0QW5nbGUp
CisgICAgICAgIDogKHN0YXJ0QW5nbGUgLSBlbmRBbmdsZSArICgyLjAgKiBwaURvdWJsZSkpOwor
CisgICAgLy8gT3BlblZHIHVzZXMgZW5kcG9pbnQgcGFyYW1ldGVyaXphdGlvbiB3aGlsZSB0aGlz
IG1ldGhvZCByZWNlaXZlcyBpdHMKKyAgICAvLyB2YWx1ZXMgaW4gY2VudGVyIHBhcmFtZXRlcml6
YXRpb24uIEl0IGxhY2tzIGFuIGVsbGlwc2Ugcm90YXRpb24KKyAgICAvLyBwYXJhbWV0ZXIgc28g
d2UgdXNlIDAgZm9yIHRoYXQsIGFuZCBhbHNvIHRoZSByYWRpdXMgaXMgb25seSBhIHNpbmdsZQor
ICAgIC8vIHZhbHVlIHdoaWNoIG1ha2VzIGZvciByaCA9PSBydi4gSW4gb3JkZXIgdG8gY29udmVy
dCBmcm9tIGVuZHBvaW50IHRvCisgICAgLy8gY2VudGVyIHBhcmFtZXRlcml6YXRpb24sIHdlIHVz
ZSB0aGUgZm9ybXVsYXMgZnJvbSB0aGUgT3BlblZHL1NWRyBzcGVjczoKKworICAgIC8vICh4LHkp
ID0gKGNvcyByb3QsIC1zaW4gcm90OyBzaW4gcm90LCAtY29zIHJvdCkgKiAocmggKiBjb3MgYW5n
bGUsIHJ2ICogc2luIGFuZ2xlKSArIChjZW50ZXIueCwgY2VudGVyLnkpCisgICAgLy8gcm90IGlz
IDAsIHdoaWNoIHNpbXBsaWZpZXMgdGhpcyBhIGJpdDoKKyAgICAvLyAoeCx5KSA9ICgxLCAwOyAw
LCAtMSkgKiAocmggKiBjb3MgYW5nbGUsIHJ2ICogc2luIGFuZ2xlKSArIChjZW50ZXIueCwgY2Vu
dGVyLnkpCisgICAgLy8gICAgICAgPSAoMSAqIHJoICogY29zIGFuZ2xlICsgMCAqIHJ2ICogc2lu
IGFuZ2xlLCAwICogcmggKiBjb3MgYW5nbGUgKyAtMSAqIHJ2ICogc2luIGFuZ2xlKSArIChjZW50
ZXIueCwgY2VudGVyLnkpCisgICAgLy8gICAgICAgPSAocmggKiBjb3MgYW5nbGUsIC1ydiAqIHNp
biBhbmdsZSkgKyAoY2VudGVyLngsIGNlbnRlci55KQorICAgIC8vIChTZXQgYW5nbGUgPSB7c3Rh
cnRBbmdsZSwgZW5kQW5nbGV9IHRvIHJldHJpZXZlIHRoZSByZXNwZWN0aXZlIGVuZHBvaW50cy4p
CisKKyAgICBjb25zdCBWR2Zsb2F0IHN0YXJ0WCA9IHJhZGl1cyAqIGNvcyhzdGFydEFuZ2xlKSAr
IGNlbnRlci54KCk7CisgICAgY29uc3QgVkdmbG9hdCBzdGFydFkgPSAtcmFkaXVzICogc2luKHN0
YXJ0QW5nbGUpICsgY2VudGVyLnkoKTsKKyAgICBjb25zdCBWR2Zsb2F0IGVuZFggPSByYWRpdXMg
KiBjb3MoZW5kQW5nbGUpICsgY2VudGVyLngoKTsKKyAgICBjb25zdCBWR2Zsb2F0IGVuZFkgPSAt
cmFkaXVzICogc2luKGVuZEFuZ2xlKSArIGNlbnRlci55KCk7CisKKyAgICAvLyBGYTogbGFyZ2Ug
YXJjIGZsYWcsIG1ha2VzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gU0NXQVJDX1RPIGFuZCBMQ1dB
UkNfVE8KKyAgICAvLyAgICAgcmVzcGVjdGl2ZWx5IFNDQ1dBUkNfVE8gYW5kIExDQ1dBUkNfVE8g
YXJjcy4KKyAgICBjb25zdCBib29sIGxhcmdlQXJjID0gKGFuZ2xlRGVsdGEgPiBwaURvdWJsZSk7
CisKKyAgICAvLyBGczogc3dlZXAgZmxhZywgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBhcmMgaXMg
ZHJhd24gaW4gaW5jcmVhc2luZyAodHJ1ZSkKKyAgICAvLyAgICAgb3IgZGVjcmVhc2luZyAoMCkg
ZGlyZWN0aW9uLiBObyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGlzIHZhbHVlLCBhcyBpdAorICAgIC8v
ICAgICB3ZSBhbHJlYWR5IGdldCBpdCBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgKEZzID09ICFhbnRp
Y2xvY2t3aXNlKS4KKworICAgIC8vIFRyYW5zbGF0ZSB0aGUgbGFyZ2UgYXJjIGFuZCBzd2VlcCBm
bGFncyBpbnRvIGFuIE9wZW5WRyBzZWdtZW50IGNvbW1hbmQuCisgICAgLy8gQXMgT3BlblZHIHRo
aW5rcyBvZiBldmVyeXRoaW5nIHVwc2lkZSBkb3duLCB3ZSBuZWVkIHRvIHJldmVyc2UgdGhlCisg
ICAgLy8gYW50aWNsb2Nrd2lzZSBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gZ2V0IHRoZSBzcGVjaWZp
ZWQgcm90YXRpb24uCisgICAgY29uc3QgVkd1Ynl0ZSBzZWdtZW50Q29tbWFuZCA9ICFhbnRpY2xv
Y2t3aXNlCisgICAgICAgID8gKGxhcmdlQXJjID8gVkdfTENDV0FSQ19UT19BQlMgOiBWR19TQ0NX
QVJDX1RPX0FCUykKKyAgICAgICAgOiAobGFyZ2VBcmMgPyBWR19MQ1dBUkNfVE9fQUJTIDogVkdf
U0NXQVJDX1RPX0FCUyk7CisKKyAgICAvLyBTbyBub3csIHdlJ3ZlIGdvdCBhbGwgdGhlIHBhcmFt
ZXRlcnMgaW4gZW5kcG9pbnQgcGFyYW1ldGVyaXphdGlvbiBmb3JtYXQKKyAgICAvLyBhcyBPcGVu
VkcgcmVxdWlyZXMgaXQuIFdoaWNoIG1lYW5zIHdlIGNhbiBqdXN0IHBhc3MgaXQgbGlrZSB0aGlz
LgorICAgIGNvbnN0IFZHdWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7CisgICAgICAgIGhhc0N1cnJl
bnRQb2ludCgpID8gVkdfTElORV9UT19BQlMgOiBWR19NT1ZFX1RPX0FCUywKKyAgICAgICAgc2Vn
bWVudENvbW1hbmQKKyAgICB9OworICAgIGNvbnN0IFZHZmxvYXQgcGF0aERhdGFbXSA9IHsKKyAg
ICAgICAgc3RhcnRYLCBzdGFydFksCisgICAgICAgIHJhZGl1cywgcmFkaXVzLCAwLCBlbmRYLCBl
bmRZCisgICAgfTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgp
OworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgMiwgcGF0aFNlZ21lbnRz
LCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgtPm1f
Y3VycmVudFBvaW50LnNldFgoZW5kWCk7CisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludC5zZXRZ
KGVuZFkpOworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIHN0YXRpYyBjb25zdCBWR3VieXRlIHBhdGhTZWdtZW50c1tdID0geworICAgICAgICBW
R19NT1ZFX1RPX0FCUywKKyAgICAgICAgVkdfSExJTkVfVE9fUkVMLAorICAgICAgICBWR19WTElO
RV9UT19SRUwsCisgICAgICAgIFZHX0hMSU5FX1RPX1JFTCwKKyAgICAgICAgVkdfQ0xPU0VfUEFU
SAorICAgIH07CisgICAgY29uc3QgVkdmbG9hdCBwYXRoRGF0YVtdID0geworICAgICAgICByZWN0
LngoKSwgcmVjdC55KCksCisgICAgICAgIHJlY3Qud2lkdGgoKSwKKyAgICAgICAgcmVjdC5oZWln
aHQoKSwKKyAgICAgICAgLXJlY3Qud2lkdGgoKQorICAgIH07CisKKyAgICBtX3BhdGgtPm1ha2VD
b21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+
dmdQYXRoKCksIDUsIHBhdGhTZWdtZW50cywgcGF0aERhdGEpOworICAgIEFTU0VSVF9WR19OT19F
UlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludCA9IG1fcGF0aC0+bV9zdWJwYXRo
U3RhcnRQb2ludCA9IHJlY3QubG9jYXRpb24oKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNl
KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBzdGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRo
U2VnbWVudHNbXSA9IHsKKyAgICAgICAgVkdfTU9WRV9UT19BQlMsCisgICAgICAgIFZHX1NDQ1dB
UkNfVE9fUkVMLAorICAgICAgICBWR19TQ0NXQVJDX1RPX1JFTCwKKyAgICAgICAgVkdfQ0xPU0Vf
UEFUSAorICAgIH07CisgICAgY29uc3QgVkdmbG9hdCBwYXRoRGF0YVtdID0geworICAgICAgICBy
ZWN0LngoKSArIHJlY3Qud2lkdGgoKSAvIDIuMCwgcmVjdC55KCksCisgICAgICAgIHJlY3Qud2lk
dGgoKSAvIDIuMCwgcmVjdC5oZWlnaHQoKSAvIDIuMCwgMCwgMCwgcmVjdC5oZWlnaHQoKSwKKyAg
ICAgICAgcmVjdC53aWR0aCgpIC8gMi4wLCByZWN0LmhlaWdodCgpIC8gMi4wLCAwLCAwLCAtcmVj
dC5oZWlnaHQoKQorICAgIH07CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1
cnJlbnQoKTsKKyAgICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDQsIHBhdGhT
ZWdtZW50cywgcGF0aERhdGEpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworfQorCit2b2lk
IFBhdGg6OmNsZWFyKCkKK3sKKyAgICBtX3BhdGgtPmNsZWFyKCk7Cit9CisKK2Jvb2wgUGF0aDo6
aXNFbXB0eSgpIGNvbnN0Cit7CisgICAgLy8gQnkgY2hlY2tpbmcgdGhlIGJvdW5kcyBpbnN0ZWFk
IG9mIGp1c3QgdGhlIG51bWJlciBvZiBwYXRoIHNlZ21lbnRzLAorICAgIC8vIHdlIHJldHVybiAi
ZW1wdHkiIGFsc28gZm9yIHBhdGhzIHRoYXQgY29udGFpbiBtb3ZlLXRvIGNvbW1hbmRzIGJ1dAor
ICAgIC8vIGRvbid0IGFjdHVhbGx5IGNhdXNlIHNvbWV0aGluZyB0byBiZSBkcmF3bi4KKyAgICBW
R2Zsb2F0IG1pblg7CisgICAgVkdmbG9hdCBtaW5ZOworICAgIFZHZmxvYXQgd2lkdGg7CisgICAg
VkdmbG9hdCBoZWlnaHQ7CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJl
bnQoKTsKKyAgICB2Z1BhdGhCb3VuZHMobV9wYXRoLT52Z1BhdGgoKSwgJm1pblgsICZtaW5ZLCAm
d2lkdGgsICZoZWlnaHQpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgcmV0dXJu
IChGVVpaWV9DT01QQVJFKG1pblgsIDAsIDAuMDAxKSAmJiBGVVpaWV9DT01QQVJFKG1pblksIDAs
IDAuMDAxKQorICAgICAgICAmJiBGVVpaWV9DT01QQVJFKHdpZHRoLCAtMSwgMC4wMDEpICYmIEZV
WlpZX0NPTVBBUkUoaGVpZ2h0LCAtMSwgMC4wMDEpKTsKK30KKworYm9vbCBQYXRoOjpoYXNDdXJy
ZW50UG9pbnQoKSBjb25zdAoreworICAgIHJldHVybiAodmdHZXRQYXJhbWV0ZXJpKG1fcGF0aC0+
dmdQYXRoKCksIFZHX1BBVEhfTlVNX1NFR01FTlRTKSA+IDApOworfQorCitTdHJpbmcgUGF0aDo6
ZGVidWdTdHJpbmcoKSBjb25zdAoreworICAgIFN0cmluZyBkZWJ1Z1N0cmluZyA9ICIiOworCisg
ICAgLyoKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICBW
R2ludCBudW1TZWdtZW50cyA9IHZnR2V0UGFyYW1ldGVyaShtX3BhdGgtPnZnUGF0aCgpLCBWR19Q
QVRIX05VTV9TRUdNRU5UUyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlZ21lbnRz
OyBpKyspIHsKKyAgICAgICAgLy8gSG0sIE9wZW5WRyBwcm92aWRlcyBubyBtZWFucyB0byByZXRy
aWV2ZSBwYXRoIHNlZ21lbnQgaW5mb3JtYXRpb24/CisgICAgICAgIC8vIFRoaXMgaXMgYSBiaXQg
dW5mb3J0dW5hdGUsIHdlIG1pZ2h0IG5lZWQgdG8gc3RvcmUgdGhlIHNlZ21lbnRzIGluCisgICAg
ICAgIC8vIG1lbW9yeSBpZiB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHByb3Bl
cmx5LgorICAgIH0KKyAgICAqLworCisgICAgcmV0dXJuIGRlYnVnU3RyaW5nOworfQorCit2b2lk
IFBhdGg6OmFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNv
bnN0Cit7CisgICAgLyoKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQo
KTsKKyAgICBWR2ludCBudW1TZWdtZW50cyA9IHZnR2V0UGFyYW1ldGVyaShtX3BhdGgtPnZnUGF0
aCgpLCBWR19QQVRIX05VTV9TRUdNRU5UUyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51
bVNlZ21lbnRzOyBpKyspIHsKKyAgICAgICAgLy8gSG0sIE9wZW5WRyBwcm92aWRlcyBubyBtZWFu
cyB0byByZXRyaWV2ZSBwYXRoIHNlZ21lbnQgaW5mb3JtYXRpb24/CisgICAgICAgIC8vIFRoaXMg
aXMgKnZlcnkqIHVuZm9ydHVuYXRlLCB3ZSBtaWdodCBuZWVkIHRvIHN0b3JlIHRoZSBzZWdtZW50
cyBpbgorICAgICAgICAvLyBtZW1vcnkgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnQgdGhpcyBmdW5j
dGlvbiBwcm9wZXJseS4KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvbWVz
c2FnZV9ib2FyZHMvdmlld3RvcGljLnBocD9mPTYmdD0xODg3CisgICAgICAgIC8vIEJsZWguCisg
ICAgfQorICAgICovCit9CisKK3ZvaWQgUGF0aDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgUGxhdGZvcm1QYXRoT3BlblZHKiBkc3QgPSBu
ZXcgUGxhdGZvcm1QYXRoT3BlblZHKCk7CisgICAgLy8gZHN0LT5tYWtlQ29tcGF0aWJsZUNvbnRl
eHRDdXJyZW50KCk7IC8vIGRvbmUgYnkgcGxhdGZvcm0gcGF0aCBjb25zdHJ1Y3RvcgorICAgIFBh
aW50ZXJPcGVuVkc6OnRyYW5zZm9ybVBhdGgoZHN0LT52Z1BhdGgoKSwgbV9wYXRoLT52Z1BhdGgo
KSwgdHJhbnNmb3JtKTsKKyAgICBkZWxldGUgbV9wYXRoOworICAgIG1fcGF0aCA9IGRzdDsKKwor
ICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSB0cmFuc2Zvcm0ubWFwUG9pbnQobV9wYXRoLT5t
X2N1cnJlbnRQb2ludCk7CisgICAgbV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50ID0gdHJhbnNm
b3JtLm1hcFBvaW50KG1fcGF0aC0+bV9zdWJwYXRoU3RhcnRQb2ludCk7Cit9CisKKworLy8gUGF0
aDo6bGVuZ3RoKCksIFBhdGg6OnBvaW50QXRMZW5ndGgoKSBhbmQgUGF0aDo6bm9ybWFsQW5nbGVB
dExlbmd0aCgpIGFyZQorLy8gcmVpbXBsZW1lbnRlZCBoZXJlIGluc3RlYWQgb2YgaW4gUGF0aC5j
cHAsIGJlY2F1c2UgT3BlblZHIGhhcyBpdHMgb3duCisvLyBmdW5jdGlvbnMgYW5kIFBhdGg6OmFw
cGx5KCkgZG9lc24ndCByZWFsbHkgd29yayBhcyBsb25nIGFzIHdlIHJlbHkgb24gVkdQYXRoCisv
LyBhcyBwcmltYXJ5IHBhdGggc3RvcmFnZS4KKworZmxvYXQgUGF0aDo6bGVuZ3RoKCkKK3sKKyAg
ICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICBWR2Zsb2F0IGxl
bmd0aCA9IHZnUGF0aExlbmd0aChtX3BhdGgtPnZnUGF0aCgpLCAwLCB2Z0dldFBhcmFtZXRlcmko
bV9wYXRoLT52Z1BhdGgoKSwgVkdfUEFUSF9OVU1fU0VHTUVOVFMpKTsKKyAgICBBU1NFUlRfVkdf
Tk9fRVJST1IoKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitGbG9hdFBvaW50IFBhdGg6OnBv
aW50QXRMZW5ndGgoZmxvYXQgbGVuZ3RoLCBib29sJiBvaykKK3sKKyAgICBWR2Zsb2F0IHggPSAw
LCB5ID0gMDsKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKwor
ICAgIHZnUG9pbnRBbG9uZ1BhdGgobV9wYXRoLT52Z1BhdGgoKSwgMCwgdmdHZXRQYXJhbWV0ZXJp
KG1fcGF0aC0+dmdQYXRoKCksIFZHX1BBVEhfTlVNX1NFR01FTlRTKSwKKyAgICAgICAgICAgICAg
ICAgICAgIGxlbmd0aCwgJngsICZ5LCAwLCAwKTsKKyAgICBvayA9ICh2Z0dldEVycm9yKCkgPT0g
VkdfTk9fRVJST1IpOworICAgIHJldHVybiBGbG9hdFBvaW50KHgsIHkpOworfQorCitmbG9hdCBQ
YXRoOjpub3JtYWxBbmdsZUF0TGVuZ3RoKGZsb2F0IGxlbmd0aCwgYm9vbCYgb2spCit7CisgICAg
VkdmbG9hdCB0YW5nZW50WCwgdGFuZ2VudFk7CisgICAgbV9wYXRoLT5tYWtlQ29tcGF0aWJsZUNv
bnRleHRDdXJyZW50KCk7CisKKyAgICB2Z1BvaW50QWxvbmdQYXRoKG1fcGF0aC0+dmdQYXRoKCks
IDAsIHZnR2V0UGFyYW1ldGVyaShtX3BhdGgtPnZnUGF0aCgpLCBWR19QQVRIX05VTV9TRUdNRU5U
UyksCisgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIDAsIDAsICZ0YW5nZW50WCwgJnRhbmdl
bnRZKTsKKyAgICBvayA9ICh2Z0dldEVycm9yKCkgPT0gVkdfTk9fRVJST1IpOworICAgIHJldHVy
biBhdGFuMmYodGFuZ2VudFksIHRhbmdlbnRYKSAqIDE4MC4wIC8gcGlGbG9hdDsgLy8gY29udmVy
dCB0byBkZWdyZWVzCit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1BsYXRmb3JtUGF0aE9wZW5WRy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvUGxhdGZvcm1QYXRoT3BlblZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMjg2ZGE1MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1BsYXRmb3JtUGF0aE9wZW5WRy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDktMjAxMC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybVBhdGhPcGVuVkdfaAorI2RlZmluZSBQ
bGF0Zm9ybVBhdGhPcGVuVkdfaAorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUg
IlNoYXJlZFJlc291cmNlT3BlblZHLmgiCisKKyNpbmNsdWRlIDxvcGVudmcuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBQbGF0Zm9ybVBhdGhPcGVuVkcgOiBwdWJsaWMgU2hhcmVk
UmVzb3VyY2VPcGVuVkcgeworcHVibGljOgorICAgIFBsYXRmb3JtUGF0aE9wZW5WRygpOworICAg
IFBsYXRmb3JtUGF0aE9wZW5WRyhjb25zdCBQbGF0Zm9ybVBhdGhPcGVuVkcmKTsKKyAgICB+UGxh
dGZvcm1QYXRoT3BlblZHKCk7CisKKyAgICBQbGF0Zm9ybVBhdGhPcGVuVkcmIG9wZXJhdG9yPShj
b25zdCBQbGF0Zm9ybVBhdGhPcGVuVkcmKTsKKworICAgIFZHUGF0aCB2Z1BhdGgoKSB7IHJldHVy
biBtX3ZnUGF0aDsgfQorICAgIHZvaWQgY2xlYXIoKTsKKworcHVibGljOgorICAgIEZsb2F0UG9p
bnQgbV9jdXJyZW50UG9pbnQ7CisgICAgRmxvYXRQb2ludCBtX3N1YnBhdGhTdGFydFBvaW50Owor
Citwcml2YXRlOgorICAgIHZvaWQgY3JlYXRlUGF0aCgpOworCisgICAgVkdQYXRoIG1fdmdQYXRo
OworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5hODQzZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuY3BwCkBAIC0wLDAgKzEs
NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIw
MDkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJT
aGFyZWRSZXNvdXJjZU9wZW5WRy5oIgorCisjaW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgorCisj
aWYgUExBVEZPUk0oRUdMKQorI2luY2x1ZGUgIkVHTERpc3BsYXlPcGVuVkcuaCIKKyNlbmRpZgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU2hhcmVkUmVzb3VyY2VPcGVuVkc6Om1ha2VT
aGFyZWRDb250ZXh0Q3VycmVudCgpCit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEVHTERpc3Bs
YXlPcGVuVkc6OmN1cnJlbnQoKS0+c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCktPm1ha2VDdXJyZW50
KCk7CisjZW5kaWYKK30KKwordm9pZCBTaGFyZWRSZXNvdXJjZU9wZW5WRzo6bWFrZUNvbXBhdGli
bGVDb250ZXh0Q3VycmVudCgpCit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEVHTERpc3BsYXlP
cGVuVkc6OmN1cnJlbnQoKS0+c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCktPm1ha2VDb21wYXRpYmxl
Q3VycmVudCgpOworI2VuZGlmCit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmggYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL29wZW52Zy9TaGFyZWRSZXNvdXJjZU9wZW5WRy5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjQzNmFlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TaGFyZWRSZXNvdXJjZU9wZW5WRy5oCkBAIC0wLDAgKzEs
MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIw
MDkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgU2hhcmVkUmVzb3VyY2VPcGVuVkdfaAor
I2RlZmluZSBTaGFyZWRSZXNvdXJjZU9wZW5WR19oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgU2hhcmVkUmVzb3VyY2VPcGVuVkcgeworcHVibGljOgorICAgIHZvaWQgbWFrZVNoYXJl
ZENvbnRleHRDdXJyZW50KCk7CisgICAgdm9pZCBtYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50
KCk7Cit9OworCit9CisKKyNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48904</attachid>
            <date>2010-02-17 08:29:37 -0800</date>
            <delta_ts>2010-02-26 13:38:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34366-20100217112936.patch</filename>
            <type>text/plain</type>
            <size>33733</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZWI1MTkzMy4uOWIxZTgyNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw4NiBAQAorMjAxMC0wMi0xNyAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEltcGxlbWVudCBzdXBwb3J0IGZvciBwYXRocwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNjYKKwor
ICAgICAgICBBZGRzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXRoIGNsYXNzIC0KKyAgICAg
ICAgKmFsbW9zdCogY29tcGxldGUsIGJ1dCBub3QgcXVpdGUgYmVjYXVzZSBPcGVuVkcKKyAgICAg
ICAgZG9lcyBub3QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHBvaW50cyBpbiBhIFZHUGF0aAorICAg
ICAgICB1bmxlc3Mgb25lIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgcG9pbnRzIGJ5CisgICAgICAg
IHRoZW1zZWx2ZXMsIHdoaWNoIHdlIGRlY2lkZWQgbm90IHRvIGRvLgorCisgICAgICAgIEFsc28g
aG9va2VkIHVwIHRvIFBhaW50ZXJPcGVuVkcgYW5kIEdyYXBoaWNzQ29udGV4dC4KKworICAgICAg
ICBGdXJ0aGVyIGludHJvZHVjZWQgaXMgU2hhcmVkUmVzb3VyY2VPcGVuVkcsIHdoaWNoIGlzCisg
ICAgICAgIGludGVuZGVkIGFzIGJhc2UgY2xhc3MgZm9yIHBhdGhzIGFuZCBvdGhlciBPcGVuVkcK
KyAgICAgICAgcmVzb3VyY2VzIChpbWFnZXMsIGZvbnRzKSB0aGF0IFdlYktpdCBjcmVhdGVzIGFz
CisgICAgICAgIGxvbmctbGl2ZWQgb2JqZWN0cy4gV2UgYXJlIGF0IGEgc2xpZ2h0IGRpc2FkdmFu
dGFnZQorICAgICAgICBoZXJlIGFzIFdlYktpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2Yg
cmVzb3VyY2VzCisgICAgICAgIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIChoYXJkd2FyZSBncmFw
aGljcykgY29udGV4dCwKKyAgICAgICAgd2hpY2ggaXMgdGhlIHJlYXNvbiB3aHkgRUdMRGlzcGxh
eU9wZW5WRyBoYWQgdG8KKyAgICAgICAgcHJvdmlkZSBhIGN1cnJlbnQgZGlzcGxheSBzaW5nbGV0
b247IHRoaXMgY2xhc3MgaXMKKyAgICAgICAgd2hhdCBhY3R1YWxseSByZXF1aXJlcyB0aGF0IGZ1
bmN0aW9uYWxpdHkuCisKKyAgICAgICAgUGF0aDo6YWRkQXJjVG8oKSB1c2VzIGNvZGUgYnkgWW9u
ZyBMaSA8eW9saUByaW0uY29tPi4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGgu
Y3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguaDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9vcGVudmcvR3JhcGhpY3NDb250ZXh0T3BlblZHLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6ZHJhd1BhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpi
ZWdpblBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpQYWludGVyT3BlblZHOjpQYWludGVyT3BlblZHKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhaW50ZXJPcGVuVkc6On5QYWludGVyT3BlblZHKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhaW50ZXJPcGVuVkc6OnRyYW5zZm9ybVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFp
bnRlck9wZW5WRzo6YmVnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhaW50ZXJPcGVuVkc6
OmFkZFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6Y3VycmVudFBhdGgp
OgorICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6ZHJhd1BhdGgpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYWludGVyT3BlblZHLmg6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1BhdGhPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6UGxhdGZvcm1QYXRoT3BlblZHKToKKyAgICAgICAg
KFdlYkNvcmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdlYkNv
cmU6OlBsYXRmb3JtUGF0aE9wZW5WRzo6flBsYXRmb3JtUGF0aE9wZW5WRyk6CisgICAgICAgIChX
ZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkc6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlBs
YXRmb3JtUGF0aE9wZW5WRzo6Y3JlYXRlUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpQ
YXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6On5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6Om9wZXJhdG9yPSk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpjb250YWlucyk6Cisg
ICAgICAgIChXZWJDb3JlOjpQYXRoOjpzdHJva2VDb250YWlucyk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXRoOjp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Ym91bmRpbmdSZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpQYXRoOjptb3ZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkTGlu
ZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZFF1YWRDdXJ2ZVRvKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhdGg6OmFkZEJlemllckN1cnZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0
aDo6YWRkQXJjVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y2xvc2VTdWJwYXRoKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEFyYyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjph
ZGRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEVsbGlwc2UpOgorICAgICAgICAo
V2ViQ29yZTo6UGF0aDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6aXNFbXB0eSk6
CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpoYXNDdXJyZW50UG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UGF0aDo6ZGVidWdTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YXBwbHkp
OgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6dHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpwb2ludEF0TGVuZ3RoKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhdGg6Om5vcm1hbEFuZ2xlQXRMZW5ndGgpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QbGF0Zm9ybVBhdGhPcGVuVkcuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkc6OnZnUGF0aCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRSZXNvdXJjZU9wZW5WRzo6bWFrZVNoYXJlZENvbnRl
eHRDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFJlc291cmNlT3BlblZHOjptYWtl
Q29tcGF0aWJsZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9v
cGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuaDogQWRkZWQuCisKIDIwMTAtMDEtMjkgIEpha29i
IFBldHNvdml0cyAgPGpwZXRzb3ZpdHNAcmltLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
aC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwCmluZGV4IGUzMDcwM2Mu
LmFmOTRiZTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmNwcApAQCAtMzksNiArMzksNyBA
QCBzdGF0aWMgY29uc3QgZmxvYXQgUVVBUlRFUiA9IDAuNTUyZjsgLy8gYXBwcm94aW1hdGlvbiBv
ZiBjb250cm9sIHBvaW50IHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gdG8gc2ltdWxhdGUgYSBxdWFydGVyIG9mIGEgY2lyY2xlLgogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCisjaWYgIVBMQVRGT1JNKE9QRU5WRykKIHN0YXRpYyB2b2lkIHBhdGhMZW5ndGhBcHBsaWVy
RnVuY3Rpb24odm9pZCogaW5mbywgY29uc3QgUGF0aEVsZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAg
UGF0aFRyYXZlcnNhbFN0YXRlJiB0cmF2ZXJzYWxTdGF0ZSA9ICpzdGF0aWNfY2FzdDxQYXRoVHJh
dmVyc2FsU3RhdGUqPihpbmZvKTsKQEAgLTEwNyw2ICsxMDgsNyBAQCBmbG9hdCBQYXRoOjpub3Jt
YWxBbmdsZUF0TGVuZ3RoKGZsb2F0IGxlbmd0aCwgYm9vbCYgb2spCiAgICAgb2sgPSB0cmF2ZXJz
YWxTdGF0ZS5tX3N1Y2Nlc3M7CiAgICAgcmV0dXJuIHRyYXZlcnNhbFN0YXRlLm1fbm9ybWFsQW5n
bGU7CiB9CisjZW5kaWYKIAogUGF0aCBQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKGNvbnN0
IEZsb2F0UmVjdCYgcmVjdGFuZ2xlLCBjb25zdCBGbG9hdFNpemUmIHJvdW5kaW5nUmFkaWkpCiB7
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCmluZGV4IGJmNGNkOWQuLmExZDgyNTcgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvUGF0aC5oCkBAIC0zMyw2ICszMywxMSBAQAogCiAjaWYgUExBVEZPUk0oQ0cp
CiB0eXBlZGVmIHN0cnVjdCBDR1BhdGggUGxhdGZvcm1QYXRoOworI2VsaWYgUExBVEZPUk0oT1BF
TlZHKQorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUGxhdGZvcm1QYXRoT3BlblZHOworfQor
dHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkcgUGxhdGZvcm1QYXRoOwogI2VsaWYg
UExBVEZPUk0oUVQpCiAjaW5jbHVkZSA8cWdsb2JhbC5oPgogUVRfQkVHSU5fTkFNRVNQQUNFCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9HcmFwaGljc0NvbnRl
eHRPcGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvR3JhcGhpY3ND
b250ZXh0T3BlblZHLmNwcAppbmRleCA1ZWQ4OTJjLi41ZjM3OGI4IDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9HcmFwaGljc0NvbnRleHRPcGVuVkcuY3BwCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0dyYXBoaWNzQ29udGV4dE9wZW5W
Ry5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKIAog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFByaXZhdGUuaCIKKyNpbmNsdWRlICJLVVJMLmgiCiAj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYWludGVyT3BlblZHLmgiCiAj
aW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgpAQCAtMTQzLDcgKzE0NCw3IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUGF0aCgpCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBtX2RhdGEtPmRyYXdQYXRo
KFZHX0ZJTExfUEFUSCwgbV9jb21tb24tPnN0YXRlLmZpbGxSdWxlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoKQpAQCAtMTUxLDcgKzE1MiwxNSBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6c3Ryb2tlUGF0aCgpCiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAg
ICAgICAgcmV0dXJuOwogCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBtX2RhdGEtPmRyYXdQ
YXRoKFZHX1NUUk9LRV9QQVRILCBtX2NvbW1vbi0+c3RhdGUuZmlsbFJ1bGUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdGgoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZGF0YS0+ZHJhd1BhdGgoVkdfRklMTF9QQVRI
IHwgVkdfU1RST0tFX1BBVEgsIG1fY29tbW9uLT5zdGF0ZS5maWxsUnVsZSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCkBAIC0xOTMs
NyArMjAyLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luUGF0aCgpCiAgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbm90SW1wbGVtZW50ZWQo
KTsKKyAgICBtX2RhdGEtPmJlZ2luUGF0aCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQpAQCAtMjAxLDcgKzIxMCw3IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCiAgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBt
X2RhdGEtPmFkZFBhdGgocGF0aCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9v
cGVudmcvUGFpbnRlck9wZW5WRy5jcHAKaW5kZXggM2I3Y2Y4NS4uM2ZhMTI4YiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHAKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHAKQEAg
LTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiSW50U2l6ZS5o
IgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoT3Bl
blZHLmgiCiAjaW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0
aW9uTWF0cml4LmgiCiAjaW5jbHVkZSAiVkdVdGlscy5oIgpAQCAtMzQzLDEyICszNDQsMTQgQEAg
c3RydWN0IFBsYXRmb3JtUGFpbnRlclN0YXRlIHsKIFBhaW50ZXJPcGVuVkc6OlBhaW50ZXJPcGVu
VkcoKQogICAgIDogbV9zdGF0ZSgwKQogICAgICwgbV9zdXJmYWNlKDApCisgICAgLCBtX2N1cnJl
bnRQYXRoKDApCiB7CiB9CiAKIFBhaW50ZXJPcGVuVkc6OlBhaW50ZXJPcGVuVkcoU3VyZmFjZU9w
ZW5WRyogc3VyZmFjZSkKICAgICA6IG1fc3RhdGUoMCkKICAgICAsIG1fc3VyZmFjZSgwKQorICAg
ICwgbV9jdXJyZW50UGF0aCgwKQogewogICAgIEFTU0VSVChzdXJmYWNlKTsKICAgICBiZWdpbihz
dXJmYWNlKTsKQEAgLTM1Nyw2ICszNjAsNyBAQCBQYWludGVyT3BlblZHOjpQYWludGVyT3BlblZH
KFN1cmZhY2VPcGVuVkcqIHN1cmZhY2UpCiBQYWludGVyT3BlblZHOjp+UGFpbnRlck9wZW5WRygp
CiB7CiAgICAgZW5kKCk7CisgICAgZGVsZXRlIG1fY3VycmVudFBhdGg7CiB9CiAKIHZvaWQgUGFp
bnRlck9wZW5WRzo6YmVnaW4oU3VyZmFjZU9wZW5WRyogc3VyZmFjZSkKQEAgLTQ0NCw2ICs0NDgs
MjggQEAgdm9pZCBQYWludGVyT3BlblZHOjpzZXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4KQogICAgIG1fc3RhdGUtPmFwcGx5VHJhbnNmb3Jt
YXRpb25NYXRyaXgodGhpcyk7CiB9CiAKK3ZvaWQgUGFpbnRlck9wZW5WRzo6dHJhbnNmb3JtUGF0
aChWR1BhdGggZHN0LCBWR1BhdGggc3JjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0
cml4KQoreworICAgIHZnU2V0aShWR19NQVRSSVhfTU9ERSwgVkdfTUFUUklYX1BBVEhfVVNFUl9U
T19TVVJGQUNFKTsKKworICAgIC8vIFNhdmUgdGhlIHRyYW5zZm9ybSBzdGF0ZQorICAgIFZHZmxv
YXQgY3VycmVudE1hdHJpeFs5XTsKKyAgICB2Z0dldE1hdHJpeChjdXJyZW50TWF0cml4KTsKKyAg
ICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKKworICAgIC8vIExvYWQgdGhlIG5ldyB0cmFuc2Zvcm0K
KyAgICB2Z0xvYWRNYXRyaXgoVkdNYXRyaXgobWF0cml4KS50b1ZHZmxvYXQoKSk7CisgICAgQVNT
RVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICAvLyBBcHBseSB0aGUgbmV3IHRyYW5zZm9ybQorICAg
IHZnVHJhbnNmb3JtUGF0aChkc3QsIHNyYyk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisK
KyAgICAvLyBSZXN0b3JlIHRoZSB0cmFuc2Zvcm0gc3RhdGUKKyAgICB2Z0xvYWRNYXRyaXgoY3Vy
cmVudE1hdHJpeCk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7Cit9CisKIENvbXBvc2l0ZU9w
ZXJhdG9yIFBhaW50ZXJPcGVuVkc6OmNvbXBvc2l0ZU9wZXJhdGlvbigpIGNvbnN0CiB7CiAgICAg
QVNTRVJUKG1fc3RhdGUpOwpAQCAtNjI0LDYgKzY1MCw0NyBAQCB2b2lkIFBhaW50ZXJPcGVuVkc6
OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpCiAgICAgc2V0VHJhbnNmb3JtYXRpb25NYXRy
aXgobWF0cml4KTsKIH0KIAordm9pZCBQYWludGVyT3BlblZHOjpiZWdpblBhdGgoKQoreworICAg
IGRlbGV0ZSBtX2N1cnJlbnRQYXRoOworICAgIG1fY3VycmVudFBhdGggPSBuZXcgUGF0aCgpOwor
fQorCit2b2lkIFBhaW50ZXJPcGVuVkc6OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAg
ICBtX2N1cnJlbnRQYXRoLT5wbGF0Zm9ybVBhdGgoKS0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3Vy
cmVudCgpOworCisgICAgdmdBcHBlbmRQYXRoKG1fY3VycmVudFBhdGgtPnBsYXRmb3JtUGF0aCgp
LT52Z1BhdGgoKSwgcGF0aC5wbGF0Zm9ybVBhdGgoKS0+dmdQYXRoKCkpOworICAgIEFTU0VSVF9W
R19OT19FUlJPUigpOworfQorCitQYXRoKiBQYWludGVyT3BlblZHOjpjdXJyZW50UGF0aCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fY3VycmVudFBhdGg7Cit9CisKK3ZvaWQgUGFpbnRlck9wZW5W
Rzo6ZHJhd1BhdGgoVkdiaXRmaWVsZCBzcGVjaWZpZWRQYWludE1vZGVzLCBXaW5kUnVsZSBmaWxs
UnVsZSkKK3sKKyAgICBBU1NFUlQobV9zdGF0ZSk7CisKKyAgICBWR2JpdGZpZWxkIHBhaW50TW9k
ZXMgPSAwOworICAgIGlmICghbV9zdGF0ZS0+c3Ryb2tlRGlzYWJsZWQoKSkKKyAgICAgICAgcGFp
bnRNb2RlcyB8PSBWR19TVFJPS0VfUEFUSDsKKyAgICBpZiAoIW1fc3RhdGUtPmZpbGxEaXNhYmxl
ZCgpKQorICAgICAgICBwYWludE1vZGVzIHw9IFZHX0ZJTExfUEFUSDsKKworICAgIHBhaW50TW9k
ZXMgJj0gc3BlY2lmaWVkUGFpbnRNb2RlczsKKworICAgIGlmICghcGFpbnRNb2RlcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9zdXJmYWNlLT5tYWtlQ3VycmVudCgpOworCisgICAgdmdTZXRp
KFZHX0ZJTExfUlVMRSwgdG9WR0ZpbGxSdWxlKGZpbGxSdWxlKSk7CisgICAgdmdEcmF3UGF0aCht
X2N1cnJlbnRQYXRoLT5wbGF0Zm9ybVBhdGgoKS0+dmdQYXRoKCksIHBhaW50TW9kZXMpOworICAg
IEFTU0VSVF9WR19OT19FUlJPUigpOworfQorCiB2b2lkIFBhaW50ZXJPcGVuVkc6OmludGVyc2Vj
dFNjaXNzb3JSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKIHsKICAgICAvLyBTY2lzc29yIHJl
Y3RhbmdsZXMgYXJlIGRlZmluZWQgYnkgZmxvYXQgdmFsdWVzLCBidXQgZS5nLiBwYWludGluZwpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5W
Ry5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5oCmlu
ZGV4IDY5MzZlZWUuLmUyMDc4ZTEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1BhaW50ZXJPcGVuVkcuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9QYWludGVyT3BlblZHLmgKQEAgLTM1LDYgKzM1LDcgQEAgY2xhc3MgRmxvYXRQb2lu
dDsKIGNsYXNzIEZsb2F0UmVjdDsKIGNsYXNzIEludFJlY3Q7CiBjbGFzcyBJbnRTaXplOworY2xh
c3MgUGF0aDsKIGNsYXNzIFN1cmZhY2VPcGVuVkc7CiBjbGFzcyBUcmFuc2Zvcm1hdGlvbk1hdHJp
eDsKIApAQCAtNjEsNiArNjIsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRUcmFuc2Zvcm1hdGlv
bk1hdHJpeChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpOwogICAgIHZvaWQgY29uY2F0VHJh
bnNmb3JtYXRpb25NYXRyaXgoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKIAorICAgIHN0
YXRpYyB2b2lkIHRyYW5zZm9ybVBhdGgoVkdQYXRoIGRzdCwgVkdQYXRoIHNyYywgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCk7CisKICAgICBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcGVyYXRpb24oKSBjb25zdDsKICAgICB2b2lkIHNldENvbXBvc2l0ZU9wZXJhdGlvbihD
b21wb3NpdGVPcGVyYXRvcik7CiAgICAgZmxvYXQgb3BhY2l0eSgpIGNvbnN0OwpAQCAtOTYsNiAr
OTksMTEgQEAgcHVibGljOgogICAgIHZvaWQgcm90YXRlKGZsb2F0IHJhZGlhbnMpOwogICAgIHZv
aWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSk7CiAKKyAgICB2b2lkIGJlZ2luUGF0aCgp
OworICAgIHZvaWQgYWRkUGF0aChjb25zdCBQYXRoJik7CisgICAgUGF0aCogY3VycmVudFBhdGgo
KSBjb25zdDsKKyAgICB2b2lkIGRyYXdQYXRoKFZHYml0ZmllbGQgcGFpbnRNb2RlcyA9IChWR19T
VFJPS0VfUEFUSCB8IFZHX0ZJTExfUEFUSCksIFdpbmRSdWxlIGZpbGxSdWxlID0gUlVMRV9OT05a
RVJPKTsKKwogICAgIHZvaWQgaW50ZXJzZWN0Q2xpcFJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CiAK
ICAgICB2b2lkIHNhdmUoUGFpbnRlck9wZW5WRzo6U2F2ZU1vZGUgc2F2ZU1vZGUgPSBDcmVhdGVO
ZXdTdGF0ZSk7CkBAIC0xMTQsNiArMTIyLDcgQEAgcHJpdmF0ZToKICAgICBWZWN0b3I8UGxhdGZv
cm1QYWludGVyU3RhdGUqPiBtX3N0YXRlU3RhY2s7CiAgICAgUGxhdGZvcm1QYWludGVyU3RhdGUq
IG1fc3RhdGU7CiAgICAgU3VyZmFjZU9wZW5WRyogbV9zdXJmYWNlOworICAgIFBhdGgqIG1fY3Vy
cmVudFBhdGg7CiB9OwogCiB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9QYXRoT3BlblZHLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZn
L1BhdGhPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDY0
YjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9Q
YXRoT3BlblZHLmNwcApAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS0yMDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorCisjaW5jbHVkZSAiRmxvYXRS
ZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJQYWludGVyT3BlblZHLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Q
YXRoT3BlblZHLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTdHJv
a2VTdHlsZUFwcGxpZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2lu
Y2x1ZGUgIlZHVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW52Zy5oPgorI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisKKyNkZWZpbmUgV0VCS0lUX1ZHX1BBVEhfQ0FQQUJJTElUSUVTIFZHX1BB
VEhfQ0FQQUJJTElUWV9BTEwKKworI2RlZmluZSBGVVpaWV9DT01QQVJFKG51bWJlciwgcmVmZXJl
bmNlLCBkZWx0YSkgXAorICAgIChudW1iZXIgPj0gKHJlZmVyZW5jZSAtIGRlbHRhKSAmJiBudW1i
ZXIgPD0gKHJlZmVyZW5jZSArIGRlbHRhKSkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQbGF0
Zm9ybVBhdGhPcGVuVkc6OlBsYXRmb3JtUGF0aE9wZW5WRygpCisgICAgOiBTaGFyZWRSZXNvdXJj
ZU9wZW5WRygpCit7CisgICAgY3JlYXRlUGF0aCgpOworfQorCitQbGF0Zm9ybVBhdGhPcGVuVkc6
OlBsYXRmb3JtUGF0aE9wZW5WRyhjb25zdCBQbGF0Zm9ybVBhdGhPcGVuVkcmIG90aGVyKQorICAg
IDogU2hhcmVkUmVzb3VyY2VPcGVuVkcoKQorICAgICwgbV9jdXJyZW50UG9pbnQob3RoZXIubV9j
dXJyZW50UG9pbnQpCisgICAgLCBtX3N1YnBhdGhTdGFydFBvaW50KG90aGVyLm1fc3VicGF0aFN0
YXJ0UG9pbnQpCit7CisgICAgY3JlYXRlUGF0aCgpOworICAgIC8vIG1ha2VDb21wYXRpYmxlQ29u
dGV4dEN1cnJlbnQoKTsgLy8gY2FsbGVkIGJ5IGNyZWF0ZVBhdGgoKSwgbm90IG5lY2Vzc2FyeQor
ICAgIHZnQXBwZW5kUGF0aChtX3ZnUGF0aCwgb3RoZXIubV92Z1BhdGgpOworICAgIEFTU0VSVF9W
R19OT19FUlJPUigpOworfQorCitQbGF0Zm9ybVBhdGhPcGVuVkcmIFBsYXRmb3JtUGF0aE9wZW5W
Rzo6b3BlcmF0b3I9KGNvbnN0IFBsYXRmb3JtUGF0aE9wZW5WRyYgb3RoZXIpCit7CisgICAgaWYg
KCZvdGhlciAhPSB0aGlzKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIC8vIG1ha2VDb21w
YXRpYmxlQ29udGV4dEN1cnJlbnQoKTsgLy8gY2FsbGVkIGJ5IGNsZWFyKCksIG5vdCBuZWNlc3Nh
cnkKKyAgICAgICAgdmdBcHBlbmRQYXRoKG1fdmdQYXRoLCBvdGhlci5tX3ZnUGF0aCk7CisgICAg
ICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisK
K1BsYXRmb3JtUGF0aE9wZW5WRzo6flBsYXRmb3JtUGF0aE9wZW5WRygpCit7CisgICAgbWFrZUNv
bXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworCisgICAgdmdEZXN0cm95UGF0aChtX3ZnUGF0aCk7
CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoT3BlblZH
OjpjbGVhcigpCit7CisgICAgbWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworCisgICAg
dmdDbGVhclBhdGgobV92Z1BhdGgsIFdFQktJVF9WR19QQVRIX0NBUEFCSUxJVElFUyk7CisgICAg
QVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3N1YnBhdGhTdGFydFBvaW50LnNldFgoMCk7
CisgICAgbV9zdWJwYXRoU3RhcnRQb2ludC5zZXRZKDApOworICAgIG1fY3VycmVudFBvaW50ID0g
bV9zdWJwYXRoU3RhcnRQb2ludDsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGhPcGVuVkc6OmNyZWF0
ZVBhdGgoKQoreworICAgIG1ha2VTaGFyZWRDb250ZXh0Q3VycmVudCgpOworCisgICAgbV92Z1Bh
dGggPSB2Z0NyZWF0ZVBhdGgoCisgICAgICAgIFZHX1BBVEhfRk9STUFUX1NUQU5EQVJELCBWR19Q
QVRIX0RBVEFUWVBFX0YsCisgICAgICAgIDEuMCAvKiBzY2FsZSAqLywgMC4wIC8qIGJpYXMgKi8s
CisgICAgICAgIDAgLyogZXhwZWN0ZWQgbnVtYmVyIG9mIHNlZ21lbnRzICovLAorICAgICAgICAw
IC8qIGV4cGVjdGVkIG51bWJlciBvZiB0b3RhbCBjb29yZGluYXRlcyAqLywKKyAgICAgICAgV0VC
S0lUX1ZHX1BBVEhfQ0FQQUJJTElUSUVTKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKK30K
KworCitQYXRoOjpQYXRoKCkKK3sKKyAgICBtX3BhdGggPSBuZXcgUGxhdGZvcm1QYXRoT3BlblZH
KCk7Cit9CisKK1BhdGg6On5QYXRoKCkKK3sKKyAgICBkZWxldGUgbV9wYXRoOworfQorCitQYXRo
OjpQYXRoKGNvbnN0IFBhdGgmIG90aGVyKQoreworICAgIG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBh
dGhPcGVuVkcoKihvdGhlci5tX3BhdGgpKTsKK30KKworUGF0aCYgUGF0aDo6b3BlcmF0b3I9KGNv
bnN0IFBhdGgmIG90aGVyKQoreworICAgICptX3BhdGggPSAqKG90aGVyLm1fcGF0aCk7CisgICAg
cmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisK
KyAgICAvLyBPcGVuVkcgaGFzIG5vIHBhdGgtY29udGFpbnMgZnVuY3Rpb24sIHNvIGZvciBub3cg
d2UgYXBwcm94aW1hdGUgYnkKKyAgICAvLyB1c2luZyB0aGUgYm91bmRpbmcgcmVjdCBvZiB0aGUg
cGF0aC4KKyAgICByZXR1cm4gYm91bmRpbmdSZWN0KCkuY29udGFpbnMocG9pbnQpOworfQorCiti
b29sIFBhdGg6OnN0cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGllciogYXBwbGllciwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKwor
ICAgIC8vIE9wZW5WRyBoYXMgbm8gcGF0aC1jb250YWlucyBmdW5jdGlvbiwgc28gZm9yIG5vdyB3
ZSBhcHByb3hpbWF0ZSBieQorICAgIC8vIHVzaW5nIHRoZSBzdHJva2UgYm91bmRpbmcgcmVjdCBv
ZiB0aGUgcGF0aC4KKyAgICByZXR1cm4gKGNvbnN0X2Nhc3Q8UGF0aCo+KHRoaXMpKS0+c3Ryb2tl
Qm91bmRpbmdSZWN0KCkuY29udGFpbnMocG9pbnQpOworfQorCit2b2lkIFBhdGg6OnRyYW5zbGF0
ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbWF0
cml4OworICAgIG1hdHJpeC50cmFuc2xhdGUoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsK
KyAgICB0cmFuc2Zvcm0obWF0cml4KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVj
dCgpIGNvbnN0Cit7CisgICAgVkdmbG9hdCBtaW5YOworICAgIFZHZmxvYXQgbWluWTsKKyAgICBW
R2Zsb2F0IHdpZHRoOworICAgIFZHZmxvYXQgaGVpZ2h0OworCisgICAgbV9wYXRoLT5tYWtlQ29t
cGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdQYXRoQm91bmRzKG1fcGF0aC0+dmdQYXRo
KCksICZtaW5YLCAmbWluWSwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVkdfTk9fRVJS
T1IoKTsKKworICAgIHJldHVybiBGbG9hdFJlY3QoRmxvYXRQb2ludChtaW5YLCBtaW5ZKSwgRmxv
YXRTaXplKHdpZHRoLCBoZWlnaHQpKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5k
aW5nUmVjdChTdHJva2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKKworICAgIC8vIHZnUGF0aEJvdW5kcygpIGlnbm9yZXMgc3Ryb2tlIHBhcmFtZXRlcnMs
IGFuZCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZQorICAgIC8vIGFuIGFwcHJveGltYXRpb24gdGhh
dCB0YWtlcyBzdHJva2UgcGFyYW1ldGVycyBpbnRvIGFjY291bnQuCisgICAgcmV0dXJuIGJvdW5k
aW5nUmVjdCgpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCkKK3sKKyAgICBzdGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9IHsgVkdfTU9W
RV9UT19BQlMgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IHBvaW50LngoKSwg
cG9pbnQueSgpIH07CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQo
KTsKKyAgICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDEsIHBhdGhTZWdtZW50
cywgcGF0aERhdGEpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9wYXRoLT5t
X2N1cnJlbnRQb2ludCA9IG1fcGF0aC0+bV9zdWJwYXRoU3RhcnRQb2ludCA9IHBvaW50OworfQor
Cit2b2lkIFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBz
dGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9IHsgVkdfTElORV9UT19BQlMgfTsK
KyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IHBvaW50LngoKSwgcG9pbnQueSgpIH07
CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICB2Z0Fw
cGVuZFBhdGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDEsIHBhdGhTZWdtZW50cywgcGF0aERhdGEp
OworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2lu
dCA9IHBvaW50OworfQorCit2b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9p
bnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgZW5kUG9pbnQpCit7CisgICAgc3Rh
dGljIGNvbnN0IFZHdWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7IFZHX1FVQURfVE9fQUJTIH07Cisg
ICAgY29uc3QgVkdmbG9hdCBwYXRoRGF0YVtdID0geyBjb250cm9sUG9pbnQueCgpLCBjb250cm9s
UG9pbnQueSgpLCBlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSB9OworCisgICAgbV9wYXRoLT5t
YWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3Bh
dGgtPnZnUGF0aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdf
Tk9fRVJST1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBlbmRQb2ludDsKK30K
Kwordm9pZCBQYXRoOjphZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQ
b2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQm
IGVuZFBvaW50KQoreworICAgIHN0YXRpYyBjb25zdCBWR3VieXRlIHBhdGhTZWdtZW50c1tdID0g
eyBWR19DVUJJQ19UT19BQlMgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IGNv
bnRyb2xQb2ludDEueCgpLCBjb250cm9sUG9pbnQxLnkoKSwgY29udHJvbFBvaW50Mi54KCksIGNv
bnRyb2xQb2ludDIueSgpLCBlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSB9OworCisgICAgbV9w
YXRoLT5tYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0
YShtX3BhdGgtPnZnUGF0aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NF
UlRfVkdfTk9fRVJST1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBlbmRQb2lu
dDsKK30KKwordm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludDEsIGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50MiwgZmxvYXQgcmFkaXVzKQoreworICAgIC8vIFNlZSBodHRw
Oi8vcGhpbGlwLmh0bWw1Lm9yZy90ZXN0cy9jYW52YXMvc3VpdGUvdGVzdHMvc3BlYy5odG1sI2Fy
Y3RvLgorCisgICAgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQwID0gbV9wYXRoLT5tX2N1cnJlbnRQ
b2ludDsKKyAgICBpZiAoIXJhZGl1cyB8fCBwb2ludDAgPT0gcG9pbnQxIHx8IHBvaW50MSA9PSBw
b2ludDIpIHsKKyAgICAgICAgYWRkTGluZVRvKHBvaW50MSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBGbG9hdFNpemUgdjAxID0gcG9pbnQwIC0gcG9pbnQxOworICAgIEZsb2F0U2l6
ZSB2MjEgPSBwb2ludDIgLSBwb2ludDE7CisKKyAgICAvLyBzaW4oQSAtIEIpID0gc2luKEEpICog
Y29zKEIpIC0gc2luKEIpICogY29zKEEpCisgICAgZG91YmxlIGNyb3NzID0gdjAxLndpZHRoKCkg
KiB2MjEuaGVpZ2h0KCkgLSB2MDEuaGVpZ2h0KCkgKiB2MjEud2lkdGgoKTsKKworICAgIGlmIChm
YWJzKGNyb3NzKSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9uIG9uZSBsaW5lCisgICAgICAgIGFk
ZExpbmVUbyhwb2ludDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQw
MSA9IGh5cG90KHYwMS53aWR0aCgpLCB2MDEuaGVpZ2h0KCkpOworICAgIGRvdWJsZSBkMjEgPSBo
eXBvdCh2MjEud2lkdGgoKSwgdjIxLmhlaWdodCgpKTsKKyAgICBkb3VibGUgYW5nbGUgPSAocGlE
b3VibGUgLSBmYWJzKGFzaW4oY3Jvc3MgLyAoZDAxICogZDIxKSkpKSAqIDAuNTsKKyAgICBkb3Vi
bGUgc3BhbiA9IHJhZGl1cyAqIHRhbihhbmdsZSk7CisgICAgZG91YmxlIHJhdGUgPSBzcGFuIC8g
ZDAxOworICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludCA9IEZsb2F0UG9pbnQocG9pbnQxLngoKSAr
IHYwMS53aWR0aCgpICogcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHBvaW50MS55KCkgKyB2MDEuaGVpZ2h0KCkgKiByYXRlKTsKKyAgICByYXRlID0gc3BhbiAv
IGQyMTsKKyAgICBGbG9hdFBvaW50IGVuZFBvaW50ID0gRmxvYXRQb2ludChwb2ludDEueCgpICsg
djIxLndpZHRoKCkgKiByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHBvaW50MS55KCkgKyB2MjEuaGVpZ2h0KCkgKiByYXRlKTsKKworICAgIC8vIEZhOiBsYXJnZSBh
cmMgZmxhZywgbWFrZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBTQ1dBUkNfVE8gYW5kIExDV0FS
Q19UTworICAgIC8vICAgICByZXNwZWN0aXZlbHkgU0NDV0FSQ19UTyBhbmQgTENDV0FSQ19UTyBh
cmNzLiBXZSBhbHdheXMgdXNlIHNtYWxsCisgICAgLy8gICAgIGFyY3MgZm9yIGFyY1RvKCksIGFz
IHRoZSBhcmMgaXMgZGVmaW5lZCBhcyB0aGUgInNob3J0ZXN0IGFyYyIgb2YgdGhlCisgICAgLy8g
ICAgIGNpcmNsZSBzcGVjaWZpZWQgaW4gSFRNTCA1LgorCisgICAgLy8gRnM6IHN3ZWVwIGZsYWcs
IHNwZWNpZnlpbmcgd2hldGhlciB0aGUgYXJjIGlzIGRyYXduIGluIGluY3JlYXNpbmcgKHRydWUp
CisgICAgLy8gICAgIG9yIGRlY3JlYXNpbmcgKDApIGRpcmVjdGlvbi4KKyAgICBjb25zdCBib29s
IGFudGljbG9ja3dpc2UgPSBjcm9zcyA8IDA7CisKKyAgICAvLyBUcmFuc2xhdGUgdGhlIGxhcmdl
IGFyYyBhbmQgc3dlZXAgZmxhZ3MgaW50byBhbiBPcGVuVkcgc2VnbWVudCBjb21tYW5kLgorICAg
IGNvbnN0IFZHdWJ5dGUgc2VnbWVudENvbW1hbmQgPSBhbnRpY2xvY2t3aXNlID8gVkdfU0NDV0FS
Q19UT19BQlMgOiBWR19TQ1dBUkNfVE9fQUJTOworCisgICAgY29uc3QgVkd1Ynl0ZSBwYXRoU2Vn
bWVudHNbXSA9IHsKKyAgICAgICAgVkdfTElORV9UT19BQlMsCisgICAgICAgIHNlZ21lbnRDb21t
YW5kCisgICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7CisgICAgICAgIHN0
YXJ0UG9pbnQueCgpLCBzdGFydFBvaW50LnkoKSwKKyAgICAgICAgcmFkaXVzLCByYWRpdXMsIDAs
IGVuZFBvaW50LngoKSwgZW5kUG9pbnQueSgpCisgICAgfTsKKworICAgIG1fcGF0aC0+bWFrZUNv
bXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52
Z1BhdGgoKSwgMiwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VS
Uk9SKCk7CisKKyAgICBtX3BhdGgtPm1fY3VycmVudFBvaW50ID0gZW5kUG9pbnQ7Cit9CisKK3Zv
aWQgUGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRo
U2VnbWVudHNbXSA9IHsgVkdfQ0xPU0VfUEFUSCB9OworICAgIC8vIHBhdGhEYXRhIG11c3Qgbm90
IGJlIDAsIGJ1dCBjZXJ0YWluIGNvbXBpbGVycyBhbHNvIGRvbid0IGNyZWF0ZQorICAgIC8vIHpl
cm8tc2l6ZSBhcnJheXMuIFNvIGxldCdzIHVzZSBhIHJhbmRvbSBhbGlnbmVkIHZhbHVlIChzaXpl
b2YoVkdmbG9hdCkpLAorICAgIC8vIGl0IHdvbid0IGJlIGFjY2Vzc2VkIGFueXdheXMgYXMgVkdf
Q0xPU0VfUEFUSCBkb2Vzbid0IHRha2UgY29vcmRpbmF0ZXMuCisgICAgc3RhdGljIGNvbnN0IFZH
ZmxvYXQqIHBhdGhEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxWR2Zsb2F0Kj4oc2l6ZW9mKFZHZmxv
YXQpKTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAg
IHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgMSwgcGF0aFNlZ21lbnRzLCBwYXRo
RGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgtPm1fY3VycmVu
dFBvaW50ID0gbV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50OworfQorCit2b2lkIFBhdGg6OmFk
ZEFyYyhjb25zdCBGbG9hdFBvaW50JiBjZW50ZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgc3RhcnRB
bmdsZSwgZmxvYXQgZW5kQW5nbGUsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICAvLyBUaGUg
T3BlblZHIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IGluZiBhcyByYWRpdXMgb3Igc3RhcnQvZW5k
IGFuZ2xlLgorICAgIC8vIFdlYktpdCBzZWVtcyB0byBwYXNzIHRob3NlIChlLmcuIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjQ0OSksCisgICAgLy8gc28gYWJvcnQg
aW5zdGVhZCBvZiByaXNraW5nIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoIWlzZmluaXRl
KHJhZGl1cykgfHwgIWlzZmluaXRlKHN0YXJ0QW5nbGUpIHx8ICFpc2Zpbml0ZShlbmRBbmdsZSkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZvciBzb21lIHJlYXNvbiwgdGhlIEhUTUwgNSBz
cGVjIGRlZmluZXMgdGhlIGFuZ2xlIGFzIGdvaW5nIGNsb2Nrd2lzZQorICAgIC8vIGZyb20gdGhl
IHBvc2l0aXZlIFggYXhpcyBpbnN0ZWFkIG9mIGdvaW5nIHN0YW5kYXJkIGFudGljbG9ja3dpc2Uu
CisgICAgLy8gU28gbGV0J3MgbWFrZSBpdCBhIHByb3BlciBhbmdsZSBpbiBvcmRlciB0byBrZWVw
IHNhbml0eS4KKyAgICBzdGFydEFuZ2xlID0gZm1vZCgoMi4wICogcGlEb3VibGUpIC0gc3RhcnRB
bmdsZSwgMi4wICogcGlEb3VibGUpOworICAgIGVuZEFuZ2xlID0gZm1vZCgoMi4wICogcGlEb3Vi
bGUpIC0gZW5kQW5nbGUsIDIuMCAqIHBpRG91YmxlKTsKKworICAgIC8vIE1ha2UgaXQgc28gdGhh
dCBlbmRBbmdsZSA+IHN0YXJ0QW5nbGUuIGZtb2QoKSBhYm92ZSB0YWtlcyBjYXJlIG9mCisgICAg
Ly8ga2VlcGluZyB0aGUgZGlmZmVyZW5jZSBiZWxvdyAzNjAgZGVncmVlcy4KKyAgICBpZiAoZW5k
QW5nbGUgPD0gc3RhcnRBbmdsZSkKKyAgICAgICAgZW5kQW5nbGUgKz0gMi4wICogcGlEb3VibGU7
CisKKyAgICBjb25zdCBWR2Zsb2F0IGFuZ2xlRGVsdGEgPSBhbnRpY2xvY2t3aXNlCisgICAgICAg
ID8gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkKKyAgICAgICAgOiAoc3RhcnRBbmdsZSAtIGVuZEFu
Z2xlICsgKDIuMCAqIHBpRG91YmxlKSk7CisKKyAgICAvLyBPcGVuVkcgdXNlcyBlbmRwb2ludCBw
YXJhbWV0ZXJpemF0aW9uIHdoaWxlIHRoaXMgbWV0aG9kIHJlY2VpdmVzIGl0cworICAgIC8vIHZh
bHVlcyBpbiBjZW50ZXIgcGFyYW1ldGVyaXphdGlvbi4gSXQgbGFja3MgYW4gZWxsaXBzZSByb3Rh
dGlvbgorICAgIC8vIHBhcmFtZXRlciBzbyB3ZSB1c2UgMCBmb3IgdGhhdCwgYW5kIGFsc28gdGhl
IHJhZGl1cyBpcyBvbmx5IGEgc2luZ2xlCisgICAgLy8gdmFsdWUgd2hpY2ggbWFrZXMgZm9yIHJo
ID09IHJ2LiBJbiBvcmRlciB0byBjb252ZXJ0IGZyb20gZW5kcG9pbnQgdG8KKyAgICAvLyBjZW50
ZXIgcGFyYW1ldGVyaXphdGlvbiwgd2UgdXNlIHRoZSBmb3JtdWxhcyBmcm9tIHRoZSBPcGVuVkcv
U1ZHIHNwZWNzOgorCisgICAgLy8gKHgseSkgPSAoY29zIHJvdCwgLXNpbiByb3Q7IHNpbiByb3Qs
IC1jb3Mgcm90KSAqIChyaCAqIGNvcyBhbmdsZSwgcnYgKiBzaW4gYW5nbGUpICsgKGNlbnRlci54
LCBjZW50ZXIueSkKKyAgICAvLyByb3QgaXMgMCwgd2hpY2ggc2ltcGxpZmllcyB0aGlzIGEgYml0
OgorICAgIC8vICh4LHkpID0gKDEsIDA7IDAsIC0xKSAqIChyaCAqIGNvcyBhbmdsZSwgcnYgKiBz
aW4gYW5nbGUpICsgKGNlbnRlci54LCBjZW50ZXIueSkKKyAgICAvLyAgICAgICA9ICgxICogcmgg
KiBjb3MgYW5nbGUgKyAwICogcnYgKiBzaW4gYW5nbGUsIDAgKiByaCAqIGNvcyBhbmdsZSArIC0x
ICogcnYgKiBzaW4gYW5nbGUpICsgKGNlbnRlci54LCBjZW50ZXIueSkKKyAgICAvLyAgICAgICA9
IChyaCAqIGNvcyBhbmdsZSwgLXJ2ICogc2luIGFuZ2xlKSArIChjZW50ZXIueCwgY2VudGVyLnkp
CisgICAgLy8gKFNldCBhbmdsZSA9IHtzdGFydEFuZ2xlLCBlbmRBbmdsZX0gdG8gcmV0cmlldmUg
dGhlIHJlc3BlY3RpdmUgZW5kcG9pbnRzLikKKworICAgIGNvbnN0IFZHZmxvYXQgc3RhcnRYID0g
cmFkaXVzICogY29zKHN0YXJ0QW5nbGUpICsgY2VudGVyLngoKTsKKyAgICBjb25zdCBWR2Zsb2F0
IHN0YXJ0WSA9IC1yYWRpdXMgKiBzaW4oc3RhcnRBbmdsZSkgKyBjZW50ZXIueSgpOworICAgIGNv
bnN0IFZHZmxvYXQgZW5kWCA9IHJhZGl1cyAqIGNvcyhlbmRBbmdsZSkgKyBjZW50ZXIueCgpOwor
ICAgIGNvbnN0IFZHZmxvYXQgZW5kWSA9IC1yYWRpdXMgKiBzaW4oZW5kQW5nbGUpICsgY2VudGVy
LnkoKTsKKworICAgIC8vIEZhOiBsYXJnZSBhcmMgZmxhZywgbWFrZXMgdGhlIGRpZmZlcmVuY2Ug
YmV0d2VlbiBTQ1dBUkNfVE8gYW5kIExDV0FSQ19UTworICAgIC8vICAgICByZXNwZWN0aXZlbHkg
U0NDV0FSQ19UTyBhbmQgTENDV0FSQ19UTyBhcmNzLgorICAgIGNvbnN0IGJvb2wgbGFyZ2VBcmMg
PSAoYW5nbGVEZWx0YSA+IHBpRG91YmxlKTsKKworICAgIC8vIEZzOiBzd2VlcCBmbGFnLCBzcGVj
aWZ5aW5nIHdoZXRoZXIgdGhlIGFyYyBpcyBkcmF3biBpbiBpbmNyZWFzaW5nICh0cnVlKQorICAg
IC8vICAgICBvciBkZWNyZWFzaW5nICgwKSBkaXJlY3Rpb24uIE5vIG5lZWQgdG8gY2FsY3VsYXRl
IHRoaXMgdmFsdWUsIGFzIGl0CisgICAgLy8gICAgIHdlIGFscmVhZHkgZ2V0IGl0IHBhc3NlZCBh
cyBhIHBhcmFtZXRlciAoRnMgPT0gIWFudGljbG9ja3dpc2UpLgorCisgICAgLy8gVHJhbnNsYXRl
IHRoZSBsYXJnZSBhcmMgYW5kIHN3ZWVwIGZsYWdzIGludG8gYW4gT3BlblZHIHNlZ21lbnQgY29t
bWFuZC4KKyAgICAvLyBBcyBPcGVuVkcgdGhpbmtzIG9mIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24s
IHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUKKyAgICAvLyBhbnRpY2xvY2t3aXNlIHBhcmFtZXRlciBp
biBvcmRlciB0byBnZXQgdGhlIHNwZWNpZmllZCByb3RhdGlvbi4KKyAgICBjb25zdCBWR3VieXRl
IHNlZ21lbnRDb21tYW5kID0gIWFudGljbG9ja3dpc2UKKyAgICAgICAgPyAobGFyZ2VBcmMgPyBW
R19MQ0NXQVJDX1RPX0FCUyA6IFZHX1NDQ1dBUkNfVE9fQUJTKQorICAgICAgICA6IChsYXJnZUFy
YyA/IFZHX0xDV0FSQ19UT19BQlMgOiBWR19TQ1dBUkNfVE9fQUJTKTsKKworICAgIC8vIFNvIG5v
dywgd2UndmUgZ290IGFsbCB0aGUgcGFyYW1ldGVycyBpbiBlbmRwb2ludCBwYXJhbWV0ZXJpemF0
aW9uIGZvcm1hdAorICAgIC8vIGFzIE9wZW5WRyByZXF1aXJlcyBpdC4gV2hpY2ggbWVhbnMgd2Ug
Y2FuIGp1c3QgcGFzcyBpdCBsaWtlIHRoaXMuCisgICAgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVu
dHNbXSA9IHsKKyAgICAgICAgaGFzQ3VycmVudFBvaW50KCkgPyBWR19MSU5FX1RPX0FCUyA6IFZH
X01PVkVfVE9fQUJTLAorICAgICAgICBzZWdtZW50Q29tbWFuZAorICAgIH07CisgICAgY29uc3Qg
VkdmbG9hdCBwYXRoRGF0YVtdID0geworICAgICAgICBzdGFydFgsIHN0YXJ0WSwKKyAgICAgICAg
cmFkaXVzLCByYWRpdXMsIDAsIGVuZFgsIGVuZFkKKyAgICB9OworCisgICAgbV9wYXRoLT5tYWtl
Q29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3BhdGgt
PnZnUGF0aCgpLCAyLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdfTk9f
RVJST1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQuc2V0WChlbmRYKTsKKyAgICBt
X3BhdGgtPm1fY3VycmVudFBvaW50LnNldFkoZW5kWSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUmVj
dChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgc3RhdGljIGNvbnN0IFZHdWJ5dGUgcGF0
aFNlZ21lbnRzW10gPSB7CisgICAgICAgIFZHX01PVkVfVE9fQUJTLAorICAgICAgICBWR19ITElO
RV9UT19SRUwsCisgICAgICAgIFZHX1ZMSU5FX1RPX1JFTCwKKyAgICAgICAgVkdfSExJTkVfVE9f
UkVMLAorICAgICAgICBWR19DTE9TRV9QQVRICisgICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBh
dGhEYXRhW10gPSB7CisgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwKKyAgICAgICAgcmVjdC53
aWR0aCgpLAorICAgICAgICByZWN0LmhlaWdodCgpLAorICAgICAgICAtcmVjdC53aWR0aCgpCisg
ICAgfTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAg
IHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgNSwgcGF0aFNlZ21lbnRzLCBwYXRo
RGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgtPm1fY3VycmVu
dFBvaW50ID0gbV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50ID0gcmVjdC5sb2NhdGlvbigpOwor
fQorCit2b2lkIFBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAg
IHN0YXRpYyBjb25zdCBWR3VieXRlIHBhdGhTZWdtZW50c1tdID0geworICAgICAgICBWR19NT1ZF
X1RPX0FCUywKKyAgICAgICAgVkdfU0NDV0FSQ19UT19SRUwsCisgICAgICAgIFZHX1NDQ1dBUkNf
VE9fUkVMLAorICAgICAgICBWR19DTE9TRV9QQVRICisgICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0
IHBhdGhEYXRhW10gPSB7CisgICAgICAgIHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC8gMi4wLCBy
ZWN0LnkoKSwKKyAgICAgICAgcmVjdC53aWR0aCgpIC8gMi4wLCByZWN0LmhlaWdodCgpIC8gMi4w
LCAwLCAwLCByZWN0LmhlaWdodCgpLAorICAgICAgICByZWN0LndpZHRoKCkgLyAyLjAsIHJlY3Qu
aGVpZ2h0KCkgLyAyLjAsIDAsIDAsIC1yZWN0LmhlaWdodCgpCisgICAgfTsKKworICAgIG1fcGF0
aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEo
bV9wYXRoLT52Z1BhdGgoKSwgNCwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJU
X1ZHX05PX0VSUk9SKCk7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQoreworICAgIG1fcGF0aC0+
Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sKKyAgICAvLyBCeSBj
aGVja2luZyB0aGUgYm91bmRzIGluc3RlYWQgb2YganVzdCB0aGUgbnVtYmVyIG9mIHBhdGggc2Vn
bWVudHMsCisgICAgLy8gd2UgcmV0dXJuICJlbXB0eSIgYWxzbyBmb3IgcGF0aHMgdGhhdCBjb250
YWluIG1vdmUtdG8gY29tbWFuZHMgYnV0CisgICAgLy8gZG9uJ3QgYWN0dWFsbHkgY2F1c2Ugc29t
ZXRoaW5nIHRvIGJlIGRyYXduLgorICAgIFZHZmxvYXQgbWluWDsKKyAgICBWR2Zsb2F0IG1pblk7
CisgICAgVkdmbG9hdCB3aWR0aDsKKyAgICBWR2Zsb2F0IGhlaWdodDsKKworICAgIG1fcGF0aC0+
bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnUGF0aEJvdW5kcyhtX3BhdGgt
PnZnUGF0aCgpLCAmbWluWCwgJm1pblksICZ3aWR0aCwgJmhlaWdodCk7CisgICAgQVNTRVJUX1ZH
X05PX0VSUk9SKCk7CisKKyAgICByZXR1cm4gKEZVWlpZX0NPTVBBUkUobWluWCwgMCwgMC4wMDEp
ICYmIEZVWlpZX0NPTVBBUkUobWluWSwgMCwgMC4wMDEpCisgICAgICAgICYmIEZVWlpZX0NPTVBB
UkUod2lkdGgsIC0xLCAwLjAwMSkgJiYgRlVaWllfQ09NUEFSRShoZWlnaHQsIC0xLCAwLjAwMSkp
OworfQorCitib29sIFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
ICh2Z0dldFBhcmFtZXRlcmkobV9wYXRoLT52Z1BhdGgoKSwgVkdfUEFUSF9OVU1fU0VHTUVOVFMp
ID4gMCk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7CisgICAgU3Ry
aW5nIGRlYnVnU3RyaW5nID0gIiI7CisKKyAgICAvLyBPcGVuVkcgcHJvdmlkZXMgbm8gbWVhbnMg
dG8gcmV0cmlldmUgcGF0aCBzZWdtZW50IGluZm9ybWF0aW9uLgorICAgIC8vIFRoaXMgaXMgYSBi
aXQgdW5mb3J0dW5hdGUsIHdlIG1pZ2h0IG5lZWQgdG8gc3RvcmUgdGhlIHNlZ21lbnRzIGluCisg
ICAgLy8gbWVtb3J5IGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gcHJvcGVy
bHkuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiBkZWJ1Z1N0cmluZzsKK30K
Kwordm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0
aW9uKSBjb25zdAoreworICAgIC8vIE9wZW5WRyBwcm92aWRlcyBubyBtZWFucyB0byByZXRyaWV2
ZSBwYXRoIHNlZ21lbnQgaW5mb3JtYXRpb24uCisgICAgLy8gVGhpcyBpcyAqdmVyeSogdW5mb3J0
dW5hdGUsIHdlIG1pZ2h0IG5lZWQgdG8gc3RvcmUgdGhlIHNlZ21lbnRzIGluCisgICAgLy8gbWVt
b3J5IGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gcHJvcGVybHkuCisgICAg
Ly8gU2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvbWVzc2FnZV9ib2FyZHMvdmlld3RvcGljLnBo
cD9mPTYmdD0xODg3CisgICAgbm90aW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBQYXRoOjp0cmFu
c2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSkKK3sKKyAgICBQbGF0
Zm9ybVBhdGhPcGVuVkcqIGRzdCA9IG5ldyBQbGF0Zm9ybVBhdGhPcGVuVkcoKTsKKyAgICAvLyBk
c3QtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsgLy8gZG9uZSBieSBwbGF0Zm9ybSBw
YXRoIGNvbnN0cnVjdG9yCisgICAgUGFpbnRlck9wZW5WRzo6dHJhbnNmb3JtUGF0aChkc3QtPnZn
UGF0aCgpLCBtX3BhdGgtPnZnUGF0aCgpLCB0cmFuc2Zvcm0pOworICAgIGRlbGV0ZSBtX3BhdGg7
CisgICAgbV9wYXRoID0gZHN0OworCisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludCA9IHRyYW5z
Zm9ybS5tYXBQb2ludChtX3BhdGgtPm1fY3VycmVudFBvaW50KTsKKyAgICBtX3BhdGgtPm1fc3Vi
cGF0aFN0YXJ0UG9pbnQgPSB0cmFuc2Zvcm0ubWFwUG9pbnQobV9wYXRoLT5tX3N1YnBhdGhTdGFy
dFBvaW50KTsKK30KKworCisvLyBQYXRoOjpsZW5ndGgoKSwgUGF0aDo6cG9pbnRBdExlbmd0aCgp
IGFuZCBQYXRoOjpub3JtYWxBbmdsZUF0TGVuZ3RoKCkgYXJlCisvLyByZWltcGxlbWVudGVkIGhl
cmUgaW5zdGVhZCBvZiBpbiBQYXRoLmNwcCwgYmVjYXVzZSBPcGVuVkcgaGFzIGl0cyBvd24KKy8v
IGZ1bmN0aW9ucyBhbmQgUGF0aDo6YXBwbHkoKSBkb2Vzbid0IHJlYWxseSB3b3JrIGFzIGxvbmcg
YXMgd2UgcmVseSBvbiBWR1BhdGgKKy8vIGFzIHByaW1hcnkgcGF0aCBzdG9yYWdlLgorCitmbG9h
dCBQYXRoOjpsZW5ndGgoKQoreworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3Vy
cmVudCgpOworICAgIFZHZmxvYXQgbGVuZ3RoID0gdmdQYXRoTGVuZ3RoKG1fcGF0aC0+dmdQYXRo
KCksIDAsIHZnR2V0UGFyYW1ldGVyaShtX3BhdGgtPnZnUGF0aCgpLCBWR19QQVRIX05VTV9TRUdN
RU5UUykpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworICAgIHJldHVybiBsZW5ndGg7Cit9
CisKK0Zsb2F0UG9pbnQgUGF0aDo6cG9pbnRBdExlbmd0aChmbG9hdCBsZW5ndGgsIGJvb2wmIG9r
KQoreworICAgIFZHZmxvYXQgeCA9IDAsIHkgPSAwOworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGli
bGVDb250ZXh0Q3VycmVudCgpOworCisgICAgdmdQb2ludEFsb25nUGF0aChtX3BhdGgtPnZnUGF0
aCgpLCAwLCB2Z0dldFBhcmFtZXRlcmkobV9wYXRoLT52Z1BhdGgoKSwgVkdfUEFUSF9OVU1fU0VH
TUVOVFMpLAorICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCAmeCwgJnksIDAsIDApOworICAg
IG9rID0gKHZnR2V0RXJyb3IoKSA9PSBWR19OT19FUlJPUik7CisgICAgcmV0dXJuIEZsb2F0UG9p
bnQoeCwgeSk7Cit9CisKK2Zsb2F0IFBhdGg6Om5vcm1hbEFuZ2xlQXRMZW5ndGgoZmxvYXQgbGVu
Z3RoLCBib29sJiBvaykKK3sKKyAgICBWR2Zsb2F0IHRhbmdlbnRYLCB0YW5nZW50WTsKKyAgICBt
X3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKworICAgIHZnUG9pbnRBbG9u
Z1BhdGgobV9wYXRoLT52Z1BhdGgoKSwgMCwgdmdHZXRQYXJhbWV0ZXJpKG1fcGF0aC0+dmdQYXRo
KCksIFZHX1BBVEhfTlVNX1NFR01FTlRTKSwKKyAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwg
MCwgMCwgJnRhbmdlbnRYLCAmdGFuZ2VudFkpOworICAgIG9rID0gKHZnR2V0RXJyb3IoKSA9PSBW
R19OT19FUlJPUik7CisgICAgcmV0dXJuIGF0YW4yZih0YW5nZW50WSwgdGFuZ2VudFgpICogMTgw
LjAgLyBwaUZsb2F0OyAvLyBjb252ZXJ0IHRvIGRlZ3JlZXMKK30KKworfQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGxhdGZvcm1QYXRoT3BlblZHLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QbGF0Zm9ybVBhdGhPcGVuVkcuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZkYTUzCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGxhdGZvcm1QYXRoT3BlblZHLmgK
QEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9u
IExpbWl0ZWQgMjAwOS0yMDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3Jt
UGF0aE9wZW5WR19oCisjZGVmaW5lIFBsYXRmb3JtUGF0aE9wZW5WR19oCisKKyNpbmNsdWRlICJG
bG9hdFBvaW50LmgiCisjaW5jbHVkZSAiU2hhcmVkUmVzb3VyY2VPcGVuVkcuaCIKKworI2luY2x1
ZGUgPG9wZW52Zy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBsYXRmb3JtUGF0
aE9wZW5WRyA6IHB1YmxpYyBTaGFyZWRSZXNvdXJjZU9wZW5WRyB7CitwdWJsaWM6CisgICAgUGxh
dGZvcm1QYXRoT3BlblZHKCk7CisgICAgUGxhdGZvcm1QYXRoT3BlblZHKGNvbnN0IFBsYXRmb3Jt
UGF0aE9wZW5WRyYpOworICAgIH5QbGF0Zm9ybVBhdGhPcGVuVkcoKTsKKworICAgIFBsYXRmb3Jt
UGF0aE9wZW5WRyYgb3BlcmF0b3I9KGNvbnN0IFBsYXRmb3JtUGF0aE9wZW5WRyYpOworCisgICAg
VkdQYXRoIHZnUGF0aCgpIHsgcmV0dXJuIG1fdmdQYXRoOyB9CisgICAgdm9pZCBjbGVhcigpOwor
CitwdWJsaWM6CisgICAgRmxvYXRQb2ludCBtX2N1cnJlbnRQb2ludDsKKyAgICBGbG9hdFBvaW50
IG1fc3VicGF0aFN0YXJ0UG9pbnQ7CisKK3ByaXZhdGU6CisgICAgdm9pZCBjcmVhdGVQYXRoKCk7
CisKKyAgICBWR1BhdGggbV92Z1BhdGg7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDNkYjUKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TaGFyZWRSZXNvdXJj
ZU9wZW5WRy5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZFJlc291cmNlT3BlblZHLmgiCisKKyNpbmNsdWRl
ICJTdXJmYWNlT3BlblZHLmgiCisKKyNpZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSAiRUdMRGlz
cGxheU9wZW5WRy5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTaGFy
ZWRSZXNvdXJjZU9wZW5WRzo6bWFrZVNoYXJlZENvbnRleHRDdXJyZW50KCkKK3sKKyNpZiBQTEFU
Rk9STShFR0wpCisgICAgRUdMRGlzcGxheU9wZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9y
bVN1cmZhY2UoKS0+bWFrZUN1cnJlbnQoKTsKKyNlbmRpZgorfQorCit2b2lkIFNoYXJlZFJlc291
cmNlT3BlblZHOjptYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCkKK3sKKyNpZiBQTEFURk9S
TShFR0wpCisgICAgRUdMRGlzcGxheU9wZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9ybVN1
cmZhY2UoKS0+bWFrZUNvbXBhdGlibGVDdXJyZW50KCk7CisjZW5kaWYKK30KKworfQpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVu
VkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3Bl
blZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2YWU5MAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291
cmNlT3BlblZHLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBT
aGFyZWRSZXNvdXJjZU9wZW5WR19oCisjZGVmaW5lIFNoYXJlZFJlc291cmNlT3BlblZHX2gKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTaGFyZWRSZXNvdXJjZU9wZW5WRyB7CitwdWJs
aWM6CisgICAgdm9pZCBtYWtlU2hhcmVkQ29udGV4dEN1cnJlbnQoKTsKKyAgICB2b2lkIG1ha2VD
b21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKK307CisKK30KKworI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49632</attachid>
            <date>2010-02-26 13:38:45 -0800</date>
            <delta_ts>2010-03-01 09:17:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34366-20100226163843.patch</filename>
            <type>text/plain</type>
            <size>33481</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YWI3ZWFkOC4uNjFlY2Y0ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTIsNiArMiw5MSBAQAogCiAgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgogCisgICAgICAgIFtPcGVuVkddIEltcGxlbWVudCBzdXBwb3J0IGZvciBw
YXRocworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQz
NjYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRz
IGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXRoIGNsYXNzIC0KKyAgICAgICAgKmFsbW9zdCog
Y29tcGxldGUsIGJ1dCBub3QgcXVpdGUgYmVjYXVzZSBPcGVuVkcKKyAgICAgICAgZG9lcyBub3Qg
cHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHBvaW50cyBpbiBhIFZHUGF0aAorICAgICAgICB1bmxlc3Mg
b25lIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgcG9pbnRzIGJ5CisgICAgICAgIHRoZW1zZWx2ZXMs
IHdoaWNoIHdlIGRlY2lkZWQgbm90IHRvIGRvLgorCisgICAgICAgIEFsc28gaG9va2VkIHVwIHRv
IFBhaW50ZXJPcGVuVkcgYW5kIEdyYXBoaWNzQ29udGV4dC4KKworICAgICAgICBGdXJ0aGVyIGlu
dHJvZHVjZWQgaXMgU2hhcmVkUmVzb3VyY2VPcGVuVkcsIHdoaWNoIGlzCisgICAgICAgIGludGVu
ZGVkIGFzIGJhc2UgY2xhc3MgZm9yIHBhdGhzIGFuZCBvdGhlciBPcGVuVkcKKyAgICAgICAgcmVz
b3VyY2VzIChpbWFnZXMsIGZvbnRzKSB0aGF0IFdlYktpdCBjcmVhdGVzIGFzCisgICAgICAgIGxv
bmctbGl2ZWQgb2JqZWN0cy4gV2UgYXJlIGF0IGEgc2xpZ2h0IGRpc2FkdmFudGFnZQorICAgICAg
ICBoZXJlIGFzIFdlYktpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVzb3VyY2VzCisg
ICAgICAgIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIChoYXJkd2FyZSBncmFwaGljcykgY29udGV4
dCwKKyAgICAgICAgd2hpY2ggaXMgdGhlIHJlYXNvbiB3aHkgRUdMRGlzcGxheU9wZW5WRyBoYWQg
dG8KKyAgICAgICAgcHJvdmlkZSBhIGN1cnJlbnQgZGlzcGxheSBzaW5nbGV0b247IHRoaXMgY2xh
c3MgaXMKKyAgICAgICAgd2hhdCBhY3R1YWxseSByZXF1aXJlcyB0aGF0IGZ1bmN0aW9uYWxpdHku
CisKKyAgICAgICAgUGF0aDo6YWRkQXJjVG8oKSB1c2VzIGNvZGUgYnkgWW9uZyBMaSA8eW9saUBy
aW0uY29tPi4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvR3JhcGhpY3NDb250ZXh0T3BlblZHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJh
d1BhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpQYWludGVyT3BlblZHOjpQYWludGVyT3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
aW50ZXJPcGVuVkc6On5QYWludGVyT3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OlBhaW50ZXJP
cGVuVkc6OnRyYW5zZm9ybVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6
YmVnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhaW50ZXJPcGVuVkc6OmFkZFBhdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6Y3VycmVudFBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6UGFpbnRlck9wZW5WRzo6ZHJhd1BhdGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL29wZW52Zy9QYWludGVyT3BlblZHLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1BhdGhPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBsYXRm
b3JtUGF0aE9wZW5WRzo6UGxhdGZvcm1QYXRoT3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OlBs
YXRmb3JtUGF0aE9wZW5WRzo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3Jt
UGF0aE9wZW5WRzo6flBsYXRmb3JtUGF0aE9wZW5WRyk6CisgICAgICAgIChXZWJDb3JlOjpQbGF0
Zm9ybVBhdGhPcGVuVkc6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtUGF0aE9w
ZW5WRzo6Y3JlYXRlUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpQYXRoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBhdGg6On5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6Om9wZXJh
dG9yPSk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpjb250YWlucyk6CisgICAgICAgIChXZWJD
b3JlOjpQYXRoOjpzdHJva2VDb250YWlucyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjp0cmFu
c2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Ym91bmRpbmdSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpQ
YXRoOjptb3ZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkTGluZVRvKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBhdGg6OmFkZFF1YWRDdXJ2ZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
dGg6OmFkZEJlemllckN1cnZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkQXJjVG8p
OgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y2xvc2VTdWJwYXRoKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhdGg6OmFkZEFyYyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjphZGRSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEVsbGlwc2UpOgorICAgICAgICAoV2ViQ29yZTo6UGF0
aDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6aXNFbXB0eSk6CisgICAgICAgIChX
ZWJDb3JlOjpQYXRoOjpoYXNDdXJyZW50UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6
ZGVidWdTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YXBwbHkpOgorICAgICAgICAo
V2ViQ29yZTo6UGF0aDo6dHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6Omxlbmd0
aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpwb2ludEF0TGVuZ3RoKToKKyAgICAgICAgKFdl
YkNvcmU6OlBhdGg6Om5vcm1hbEFuZ2xlQXRMZW5ndGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL29wZW52Zy9QbGF0Zm9ybVBhdGhPcGVuVkcuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpQbGF0Zm9ybVBhdGhPcGVuVkc6OnZnUGF0aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpTaGFyZWRSZXNvdXJjZU9wZW5WRzo6bWFrZVNoYXJlZENvbnRleHRDdXJyZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFJlc291cmNlT3BlblZHOjptYWtlQ29tcGF0aWJsZUNv
bnRleHRDdXJyZW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU2hhcmVk
UmVzb3VyY2VPcGVuVkcuaDogQWRkZWQuCisKKzIwMTAtMDItMjYgIEpha29iIFBldHNvdml0cyAg
PGpwZXRzb3ZpdHNAcmltLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKwogICAgICAgICBbT3BlblZHXSBDb252ZXJ0IGZyb20gVHJhbnNmb3JtYXRpb25NYXRyaXgg
dG8gQWZmaW5lVHJhbnNmb3JtLgogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MzU0NDUKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9QYXRoLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5jcHAKaW5kZXggZTMw
NzAzYy4uYWY5NGJlNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXRo
LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwCkBAIC0zOSw2ICsz
OSw3IEBAIHN0YXRpYyBjb25zdCBmbG9hdCBRVUFSVEVSID0gMC41NTJmOyAvLyBhcHByb3hpbWF0
aW9uIG9mIGNvbnRyb2wgcG9pbnQgcG9zaXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyB0byBzaW11bGF0ZSBhIHF1YXJ0ZXIgb2YgYSBjaXJjbGUuCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKKyNpZiAhUExBVEZPUk0oT1BFTlZHKQogc3RhdGljIHZvaWQgcGF0aExlbmd0aEFw
cGxpZXJGdW5jdGlvbih2b2lkKiBpbmZvLCBjb25zdCBQYXRoRWxlbWVudCogZWxlbWVudCkKIHsK
ICAgICBQYXRoVHJhdmVyc2FsU3RhdGUmIHRyYXZlcnNhbFN0YXRlID0gKnN0YXRpY19jYXN0PFBh
dGhUcmF2ZXJzYWxTdGF0ZSo+KGluZm8pOwpAQCAtMTA3LDYgKzEwOCw3IEBAIGZsb2F0IFBhdGg6
Om5vcm1hbEFuZ2xlQXRMZW5ndGgoZmxvYXQgbGVuZ3RoLCBib29sJiBvaykKICAgICBvayA9IHRy
YXZlcnNhbFN0YXRlLm1fc3VjY2VzczsKICAgICByZXR1cm4gdHJhdmVyc2FsU3RhdGUubV9ub3Jt
YWxBbmdsZTsKIH0KKyNlbmRpZgogCiBQYXRoIFBhdGg6OmNyZWF0ZVJvdW5kZWRSZWN0YW5nbGUo
Y29uc3QgRmxvYXRSZWN0JiByZWN0YW5nbGUsIGNvbnN0IEZsb2F0U2l6ZSYgcm91bmRpbmdSYWRp
aSkKIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmgKaW5kZXggNTMzZWY4Zi4uYjY5NjcwZiAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmgKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9QYXRoLmgKQEAgLTMzLDYgKzMzLDExIEBACiAKICNpZiBQTEFURk9S
TShDRykKIHR5cGVkZWYgc3RydWN0IENHUGF0aCBQbGF0Zm9ybVBhdGg7CisjZWxpZiBQTEFURk9S
TShPUEVOVkcpCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBQbGF0Zm9ybVBhdGhPcGVuVkc7
Cit9Cit0eXBlZGVmIFdlYkNvcmU6OlBsYXRmb3JtUGF0aE9wZW5WRyBQbGF0Zm9ybVBhdGg7CiAj
ZWxpZiBQTEFURk9STShRVCkKICNpbmNsdWRlIDxxcGFpbnRlcnBhdGguaD4KIHR5cGVkZWYgUVBh
aW50ZXJQYXRoIFBsYXRmb3JtUGF0aDsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL0dyYXBoaWNzQ29udGV4dE9wZW5WRy5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL29wZW52Zy9HcmFwaGljc0NvbnRleHRPcGVuVkcuY3BwCmluZGV4IDkwOWZhMjcu
LjM5N2Q3OTIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0dy
YXBoaWNzQ29udGV4dE9wZW5WRy5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9v
cGVudmcvR3JhcGhpY3NDb250ZXh0T3BlblZHLmNwcApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5j
bHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UHJpdmF0
ZS5oIgorI2luY2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2lu
Y2x1ZGUgIlBhaW50ZXJPcGVuVkcuaCIKICNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCkBAIC0x
NDMsNyArMTQ0LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKCkKICAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgIG1fZGF0YS0+ZHJhd1BhdGgoVkdfRklMTF9QQVRILCBtX2NvbW1vbi0+c3RhdGUu
ZmlsbFJ1bGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aCgpCkBAIC0x
NTEsNyArMTUyLDE1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKICAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIG1fZGF0YS0+ZHJhd1BhdGgoVkdfU1RST0tFX1BBVEgsIG1fY29tbW9uLT5z
dGF0ZS5maWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UGF0aCgpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9k
YXRhLT5kcmF3UGF0aChWR19GSUxMX1BBVEggfCBWR19TVFJPS0VfUEFUSCwgbV9jb21tb24tPnN0
YXRlLmZpbGxSdWxlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTE5Myw3ICsyMDIsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6YmVnaW5QYXRoKCkKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1
cm47CiAKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIG1fZGF0YS0+YmVnaW5QYXRoKCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCkBAIC0y
MDEsNyArMjEwLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgoY29uc3QgUGF0aCYg
cGF0aCkKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIG1fZGF0YS0+YWRkUGF0aChwYXRoKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiByZWN0KQpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYWludGVyT3BlblZHLmNwcAppbmRleCBm
ZDc1ZWMxLi5kMjQzYzU3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29w
ZW52Zy9QYWludGVyT3BlblZHLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29w
ZW52Zy9QYWludGVyT3BlblZHLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgIkludFJl
Y3QuaCIKICNpbmNsdWRlICJJbnRTaXplLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhPcGVuVkcuaCIKICNpbmNsdWRlICJTdXJmYWNlT3BlblZH
LmgiCiAjaW5jbHVkZSAiVkdVdGlscy5oIgogCkBAIC0zNDAsMTIgKzM0MSwxNCBAQCBzdHJ1Y3Qg
UGxhdGZvcm1QYWludGVyU3RhdGUgewogUGFpbnRlck9wZW5WRzo6UGFpbnRlck9wZW5WRygpCiAg
ICAgOiBtX3N0YXRlKDApCiAgICAgLCBtX3N1cmZhY2UoMCkKKyAgICAsIG1fY3VycmVudFBhdGgo
MCkKIHsKIH0KIAogUGFpbnRlck9wZW5WRzo6UGFpbnRlck9wZW5WRyhTdXJmYWNlT3BlblZHKiBz
dXJmYWNlKQogICAgIDogbV9zdGF0ZSgwKQogICAgICwgbV9zdXJmYWNlKDApCisgICAgLCBtX2N1
cnJlbnRQYXRoKDApCiB7CiAgICAgQVNTRVJUKHN1cmZhY2UpOwogICAgIGJlZ2luKHN1cmZhY2Up
OwpAQCAtMzU0LDYgKzM1Nyw3IEBAIFBhaW50ZXJPcGVuVkc6OlBhaW50ZXJPcGVuVkcoU3VyZmFj
ZU9wZW5WRyogc3VyZmFjZSkKIFBhaW50ZXJPcGVuVkc6On5QYWludGVyT3BlblZHKCkKIHsKICAg
ICBlbmQoKTsKKyAgICBkZWxldGUgbV9jdXJyZW50UGF0aDsKIH0KIAogdm9pZCBQYWludGVyT3Bl
blZHOjpiZWdpbihTdXJmYWNlT3BlblZHKiBzdXJmYWNlKQpAQCAtNDQxLDYgKzQ0NSwyOCBAQCB2
b2lkIFBhaW50ZXJPcGVuVkc6OnNldFRyYW5zZm9ybWF0aW9uKGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgdHJhbnNmb3JtYXRpb24pCiAgICAgbV9zdGF0ZS0+YXBwbHlUcmFuc2Zvcm1hdGlvbih0aGlz
KTsKIH0KIAordm9pZCBQYWludGVyT3BlblZHOjp0cmFuc2Zvcm1QYXRoKFZHUGF0aCBkc3QsIFZH
UGF0aCBzcmMsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtYXRpb24pCit7CisgICAg
dmdTZXRpKFZHX01BVFJJWF9NT0RFLCBWR19NQVRSSVhfUEFUSF9VU0VSX1RPX1NVUkZBQ0UpOwor
CisgICAgLy8gU2F2ZSB0aGUgdHJhbnNmb3JtIHN0YXRlCisgICAgVkdmbG9hdCBjdXJyZW50TWF0
cml4WzldOworICAgIHZnR2V0TWF0cml4KGN1cnJlbnRNYXRyaXgpOworICAgIEFTU0VSVF9WR19O
T19FUlJPUigpOworCisgICAgLy8gTG9hZCB0aGUgbmV3IHRyYW5zZm9ybQorICAgIHZnTG9hZE1h
dHJpeChWR01hdHJpeCh0cmFuc2Zvcm1hdGlvbikudG9WR2Zsb2F0KCkpOworICAgIEFTU0VSVF9W
R19OT19FUlJPUigpOworCisgICAgLy8gQXBwbHkgdGhlIG5ldyB0cmFuc2Zvcm0KKyAgICB2Z1Ry
YW5zZm9ybVBhdGgoZHN0LCBzcmMpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAg
Ly8gUmVzdG9yZSB0aGUgdHJhbnNmb3JtIHN0YXRlCisgICAgdmdMb2FkTWF0cml4KGN1cnJlbnRN
YXRyaXgpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworfQorCiBDb21wb3NpdGVPcGVyYXRv
ciBQYWludGVyT3BlblZHOjpjb21wb3NpdGVPcGVyYXRpb24oKSBjb25zdAogewogICAgIEFTU0VS
VChtX3N0YXRlKTsKQEAgLTYyMSw2ICs2NDcsNDcgQEAgdm9pZCBQYWludGVyT3BlblZHOjp0cmFu
c2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KQogICAgIHNldFRyYW5zZm9ybWF0aW9uKHRyYW5zZm9y
bWF0aW9uKTsKIH0KIAordm9pZCBQYWludGVyT3BlblZHOjpiZWdpblBhdGgoKQoreworICAgIGRl
bGV0ZSBtX2N1cnJlbnRQYXRoOworICAgIG1fY3VycmVudFBhdGggPSBuZXcgUGF0aCgpOworfQor
Cit2b2lkIFBhaW50ZXJPcGVuVkc6OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBt
X2N1cnJlbnRQYXRoLT5wbGF0Zm9ybVBhdGgoKS0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVu
dCgpOworCisgICAgdmdBcHBlbmRQYXRoKG1fY3VycmVudFBhdGgtPnBsYXRmb3JtUGF0aCgpLT52
Z1BhdGgoKSwgcGF0aC5wbGF0Zm9ybVBhdGgoKS0+dmdQYXRoKCkpOworICAgIEFTU0VSVF9WR19O
T19FUlJPUigpOworfQorCitQYXRoKiBQYWludGVyT3BlblZHOjpjdXJyZW50UGF0aCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fY3VycmVudFBhdGg7Cit9CisKK3ZvaWQgUGFpbnRlck9wZW5WRzo6
ZHJhd1BhdGgoVkdiaXRmaWVsZCBzcGVjaWZpZWRQYWludE1vZGVzLCBXaW5kUnVsZSBmaWxsUnVs
ZSkKK3sKKyAgICBBU1NFUlQobV9zdGF0ZSk7CisKKyAgICBWR2JpdGZpZWxkIHBhaW50TW9kZXMg
PSAwOworICAgIGlmICghbV9zdGF0ZS0+c3Ryb2tlRGlzYWJsZWQoKSkKKyAgICAgICAgcGFpbnRN
b2RlcyB8PSBWR19TVFJPS0VfUEFUSDsKKyAgICBpZiAoIW1fc3RhdGUtPmZpbGxEaXNhYmxlZCgp
KQorICAgICAgICBwYWludE1vZGVzIHw9IFZHX0ZJTExfUEFUSDsKKworICAgIHBhaW50TW9kZXMg
Jj0gc3BlY2lmaWVkUGFpbnRNb2RlczsKKworICAgIGlmICghcGFpbnRNb2RlcykKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9zdXJmYWNlLT5tYWtlQ3VycmVudCgpOworCisgICAgdmdTZXRpKFZH
X0ZJTExfUlVMRSwgdG9WR0ZpbGxSdWxlKGZpbGxSdWxlKSk7CisgICAgdmdEcmF3UGF0aChtX2N1
cnJlbnRQYXRoLT5wbGF0Zm9ybVBhdGgoKS0+dmdQYXRoKCksIHBhaW50TW9kZXMpOworICAgIEFT
U0VSVF9WR19OT19FUlJPUigpOworfQorCiB2b2lkIFBhaW50ZXJPcGVuVkc6OmludGVyc2VjdFNj
aXNzb3JSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKIHsKICAgICAvLyBTY2lzc29yIHJlY3Rh
bmdsZXMgYXJlIGRlZmluZWQgYnkgZmxvYXQgdmFsdWVzLCBidXQgZS5nLiBwYWludGluZwpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvUGFpbnRlck9wZW5WRy5oCmluZGV4
IDk5ODIyODMuLjYwNzFlZTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
b3BlbnZnL1BhaW50ZXJPcGVuVkcuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29w
ZW52Zy9QYWludGVyT3BlblZHLmgKQEAgLTM2LDYgKzM2LDcgQEAgY2xhc3MgRmxvYXRQb2ludDsK
IGNsYXNzIEZsb2F0UmVjdDsKIGNsYXNzIEludFJlY3Q7CiBjbGFzcyBJbnRTaXplOworY2xhc3Mg
UGF0aDsKIGNsYXNzIFN1cmZhY2VPcGVuVkc7CiAKIHN0cnVjdCBQbGF0Zm9ybVBhaW50ZXJTdGF0
ZTsKQEAgLTYxLDYgKzYyLDggQEAgcHVibGljOgogICAgIHZvaWQgc2V0VHJhbnNmb3JtYXRpb24o
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CiAgICAgdm9pZCBjb25jYXRUcmFuc2Zvcm1hdGlvbihj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mKTsKIAorICAgIHN0YXRpYyB2b2lkIHRyYW5zZm9ybVBhdGgo
VkdQYXRoIGRzdCwgVkdQYXRoIHNyYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisKICAgICBD
b21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcGVyYXRpb24oKSBjb25zdDsKICAgICB2b2lkIHNl
dENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvcik7CiAgICAgZmxvYXQgb3BhY2l0
eSgpIGNvbnN0OwpAQCAtOTYsNiArOTksMTEgQEAgcHVibGljOgogICAgIHZvaWQgcm90YXRlKGZs
b2F0IHJhZGlhbnMpOwogICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSk7CiAK
KyAgICB2b2lkIGJlZ2luUGF0aCgpOworICAgIHZvaWQgYWRkUGF0aChjb25zdCBQYXRoJik7Cisg
ICAgUGF0aCogY3VycmVudFBhdGgoKSBjb25zdDsKKyAgICB2b2lkIGRyYXdQYXRoKFZHYml0Zmll
bGQgcGFpbnRNb2RlcyA9IChWR19TVFJPS0VfUEFUSCB8IFZHX0ZJTExfUEFUSCksIFdpbmRSdWxl
IGZpbGxSdWxlID0gUlVMRV9OT05aRVJPKTsKKwogICAgIHZvaWQgaW50ZXJzZWN0Q2xpcFJlY3Qo
Y29uc3QgRmxvYXRSZWN0Jik7CiAKICAgICB2b2lkIHNhdmUoUGFpbnRlck9wZW5WRzo6U2F2ZU1v
ZGUgc2F2ZU1vZGUgPSBDcmVhdGVOZXdTdGF0ZSk7CkBAIC0xMTQsNiArMTIyLDcgQEAgcHJpdmF0
ZToKICAgICBWZWN0b3I8UGxhdGZvcm1QYWludGVyU3RhdGUqPiBtX3N0YXRlU3RhY2s7CiAgICAg
UGxhdGZvcm1QYWludGVyU3RhdGUqIG1fc3RhdGU7CiAgICAgU3VyZmFjZU9wZW5WRyogbV9zdXJm
YWNlOworICAgIFBhdGgqIG1fY3VycmVudFBhdGg7CiB9OwogCiB9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9QYXRoT3BlblZHLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1BhdGhPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjJjMzY2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW52Zy9QYXRoT3BlblZHLmNwcApAQCAtMCwwICsxLDUwMiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS0yMDEwLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0aC5o
IgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJQYWludGVyT3BlblZHLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoT3Bl
blZHLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTdHJva2VTdHls
ZUFwcGxpZXIuaCIKKyNpbmNsdWRlICJWR1V0aWxzLmgiCisKKyNpbmNsdWRlIDxvcGVudmcuaD4K
KyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjZGVmaW5lIFdFQktJVF9WR19QQVRIX0NB
UEFCSUxJVElFUyBWR19QQVRIX0NBUEFCSUxJVFlfQUxMCisKKyNkZWZpbmUgRlVaWllfQ09NUEFS
RShudW1iZXIsIHJlZmVyZW5jZSwgZGVsdGEpIFwKKyAgICAobnVtYmVyID49IChyZWZlcmVuY2Ug
LSBkZWx0YSkgJiYgbnVtYmVyIDw9IChyZWZlcmVuY2UgKyBkZWx0YSkpCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworUGxhdGZvcm1QYXRoT3BlblZHOjpQbGF0Zm9ybVBhdGhPcGVuVkcoKQorICAg
IDogU2hhcmVkUmVzb3VyY2VPcGVuVkcoKQoreworICAgIGNyZWF0ZVBhdGgoKTsKK30KKworUGxh
dGZvcm1QYXRoT3BlblZHOjpQbGF0Zm9ybVBhdGhPcGVuVkcoY29uc3QgUGxhdGZvcm1QYXRoT3Bl
blZHJiBvdGhlcikKKyAgICA6IFNoYXJlZFJlc291cmNlT3BlblZHKCkKKyAgICAsIG1fY3VycmVu
dFBvaW50KG90aGVyLm1fY3VycmVudFBvaW50KQorICAgICwgbV9zdWJwYXRoU3RhcnRQb2ludChv
dGhlci5tX3N1YnBhdGhTdGFydFBvaW50KQoreworICAgIGNyZWF0ZVBhdGgoKTsKKyAgICAvLyBt
YWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCkgaXMgY2FsbGVkIGJ5IGNyZWF0ZVBhdGgoKSwg
c28gbm90IG5lY2Vzc2FyeSBoZXJlLgorICAgIHZnQXBwZW5kUGF0aChtX3ZnUGF0aCwgb3RoZXIu
bV92Z1BhdGgpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworfQorCitQbGF0Zm9ybVBhdGhP
cGVuVkcmIFBsYXRmb3JtUGF0aE9wZW5WRzo6b3BlcmF0b3I9KGNvbnN0IFBsYXRmb3JtUGF0aE9w
ZW5WRyYgb3RoZXIpCit7CisgICAgaWYgKCZvdGhlciAhPSB0aGlzKSB7CisgICAgICAgIGNsZWFy
KCk7CisgICAgICAgIC8vIG1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKSBpcyBjYWxsZWQg
YnkgY2xlYXIoKSwgc28gbm90IG5lY2Vzc2FyeSBoZXJlLgorICAgICAgICB2Z0FwcGVuZFBhdGgo
bV92Z1BhdGgsIG90aGVyLm1fdmdQYXRoKTsKKyAgICAgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7
CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKworUGxhdGZvcm1QYXRoT3BlblZHOjp+UGxh
dGZvcm1QYXRoT3BlblZHKCkKK3sKKyAgICBtYWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7
CisKKyAgICB2Z0Rlc3Ryb3lQYXRoKG1fdmdQYXRoKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1Io
KTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGhPcGVuVkc6OmNsZWFyKCkKK3sKKyAgICBtYWtlQ29t
cGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICB2Z0NsZWFyUGF0aChtX3ZnUGF0aCwgV0VC
S0lUX1ZHX1BBVEhfQ0FQQUJJTElUSUVTKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsKKwor
ICAgIG1fc3VicGF0aFN0YXJ0UG9pbnQuc2V0WCgwKTsKKyAgICBtX3N1YnBhdGhTdGFydFBvaW50
LnNldFkoMCk7CisgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhTdGFydFBvaW50OworfQor
Cit2b2lkIFBsYXRmb3JtUGF0aE9wZW5WRzo6Y3JlYXRlUGF0aCgpCit7CisgICAgbWFrZVNoYXJl
ZENvbnRleHRDdXJyZW50KCk7CisKKyAgICBtX3ZnUGF0aCA9IHZnQ3JlYXRlUGF0aCgKKyAgICAg
ICAgVkdfUEFUSF9GT1JNQVRfU1RBTkRBUkQsIFZHX1BBVEhfREFUQVRZUEVfRiwKKyAgICAgICAg
MS4wIC8qIHNjYWxlICovLCAwLjAgLyogYmlhcyAqLywKKyAgICAgICAgMCAvKiBleHBlY3RlZCBu
dW1iZXIgb2Ygc2VnbWVudHMgKi8sCisgICAgICAgIDAgLyogZXhwZWN0ZWQgbnVtYmVyIG9mIHRv
dGFsIGNvb3JkaW5hdGVzICovLAorICAgICAgICBXRUJLSVRfVkdfUEFUSF9DQVBBQklMSVRJRVMp
OworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworfQorCisKK1BhdGg6OlBhdGgoKQoreworICAg
IG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBhdGhPcGVuVkcoKTsKK30KKworUGF0aDo6flBhdGgoKQor
eworICAgIGRlbGV0ZSBtX3BhdGg7Cit9CisKK1BhdGg6OlBhdGgoY29uc3QgUGF0aCYgb3RoZXIp
Cit7CisgICAgbV9wYXRoID0gbmV3IFBsYXRmb3JtUGF0aE9wZW5WRygqKG90aGVyLm1fcGF0aCkp
OworfQorCitQYXRoJiBQYXRoOjpvcGVyYXRvcj0oY29uc3QgUGF0aCYgb3RoZXIpCit7CisgICAg
Km1fcGF0aCA9ICoob3RoZXIubV9wYXRoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wg
UGF0aDo6Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNv
bnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIC8vIE9wZW5WRyBoYXMgbm8gcGF0
aC1jb250YWlucyBmdW5jdGlvbiwgc28gZm9yIG5vdyB3ZSBhcHByb3hpbWF0ZSBieQorICAgIC8v
IHVzaW5nIHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBwYXRoLgorICAgIHJldHVybiBib3VuZGlu
Z1JlY3QoKS5jb250YWlucyhwb2ludCk7Cit9CisKK2Jvb2wgUGF0aDo6c3Ryb2tlQ29udGFpbnMo
U3Ryb2tlU3R5bGVBcHBsaWVyKiBhcHBsaWVyLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgLy8gT3BlblZHIGhhcyBubyBwYXRo
LWNvbnRhaW5zIGZ1bmN0aW9uLCBzbyBmb3Igbm93IHdlIGFwcHJveGltYXRlIGJ5CisgICAgLy8g
dXNpbmcgdGhlIHN0cm9rZSBib3VuZGluZyByZWN0IG9mIHRoZSBwYXRoLgorICAgIHJldHVybiAo
Y29uc3RfY2FzdDxQYXRoKj4odGhpcykpLT5zdHJva2VCb3VuZGluZ1JlY3QoKS5jb250YWlucyhw
b2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkK
K3sKKyAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtYXRpb247CisgICAgdHJhbnNmb3JtYXRp
b24udHJhbnNsYXRlKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgdHJhbnNmb3Jt
KHRyYW5zZm9ybWF0aW9uKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNv
bnN0Cit7CisgICAgVkdmbG9hdCBtaW5YOworICAgIFZHZmxvYXQgbWluWTsKKyAgICBWR2Zsb2F0
IHdpZHRoOworICAgIFZHZmxvYXQgaGVpZ2h0OworCisgICAgbV9wYXRoLT5tYWtlQ29tcGF0aWJs
ZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdQYXRoQm91bmRzKG1fcGF0aC0+dmdQYXRoKCksICZt
aW5YLCAmbWluWSwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1IoKTsK
KworICAgIHJldHVybiBGbG9hdFJlY3QoRmxvYXRQb2ludChtaW5YLCBtaW5ZKSwgRmxvYXRTaXpl
KHdpZHRoLCBoZWlnaHQpKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVj
dChTdHJva2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KworICAgIC8vIHZnUGF0aEJvdW5kcygpIGlnbm9yZXMgc3Ryb2tlIHBhcmFtZXRlcnMsIGFuZCB3
ZSBkb24ndCBjdXJyZW50bHkgaGF2ZQorICAgIC8vIGFuIGFwcHJveGltYXRpb24gdGhhdCB0YWtl
cyBzdHJva2UgcGFyYW1ldGVycyBpbnRvIGFjY291bnQuCisgICAgcmV0dXJuIGJvdW5kaW5nUmVj
dCgpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sK
KyAgICBzdGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9IHsgVkdfTU9WRV9UT19B
QlMgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IHBvaW50LngoKSwgcG9pbnQu
eSgpIH07CisKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAg
ICB2Z0FwcGVuZFBhdGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDEsIHBhdGhTZWdtZW50cywgcGF0
aERhdGEpOworICAgIEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1cnJl
bnRQb2ludCA9IG1fcGF0aC0+bV9zdWJwYXRoU3RhcnRQb2ludCA9IHBvaW50OworfQorCit2b2lk
IFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBzdGF0aWMg
Y29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9IHsgVkdfTElORV9UT19BQlMgfTsKKyAgICBj
b25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IHBvaW50LngoKSwgcG9pbnQueSgpIH07CisKKyAg
ICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICB2Z0FwcGVuZFBh
dGhEYXRhKG1fcGF0aC0+dmdQYXRoKCksIDEsIHBhdGhTZWdtZW50cywgcGF0aERhdGEpOworICAg
IEFTU0VSVF9WR19OT19FUlJPUigpOworCisgICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludCA9IHBv
aW50OworfQorCit2b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNv
bnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgZW5kUG9pbnQpCit7CisgICAgc3RhdGljIGNv
bnN0IFZHdWJ5dGUgcGF0aFNlZ21lbnRzW10gPSB7IFZHX1FVQURfVE9fQUJTIH07CisgICAgY29u
c3QgVkdmbG9hdCBwYXRoRGF0YVtdID0geyBjb250cm9sUG9pbnQueCgpLCBjb250cm9sUG9pbnQu
eSgpLCBlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSB9OworCisgICAgbV9wYXRoLT5tYWtlQ29t
cGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3BhdGgtPnZn
UGF0aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJS
T1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBlbmRQb2ludDsKK30KKwordm9p
ZCBQYXRoOjphZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDEs
IGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQmIGVuZFBv
aW50KQoreworICAgIHN0YXRpYyBjb25zdCBWR3VieXRlIHBhdGhTZWdtZW50c1tdID0geyBWR19D
VUJJQ19UT19BQlMgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7IGNvbnRyb2xQ
b2ludDEueCgpLCBjb250cm9sUG9pbnQxLnkoKSwgY29udHJvbFBvaW50Mi54KCksIGNvbnRyb2xQ
b2ludDIueSgpLCBlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSB9OworCisgICAgbV9wYXRoLT5t
YWtlQ29tcGF0aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3Bh
dGgtPnZnUGF0aCgpLCAxLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdf
Tk9fRVJST1IoKTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQgPSBlbmRQb2ludDsKK30K
Kwordm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludDEsIGNvbnN0IEZs
b2F0UG9pbnQmIHBvaW50MiwgZmxvYXQgcmFkaXVzKQoreworICAgIC8vIFNlZSBodHRwOi8vcGhp
bGlwLmh0bWw1Lm9yZy90ZXN0cy9jYW52YXMvc3VpdGUvdGVzdHMvc3BlYy5odG1sI2FyY3RvLgor
CisgICAgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQwID0gbV9wYXRoLT5tX2N1cnJlbnRQb2ludDsK
KyAgICBpZiAoIXJhZGl1cyB8fCBwb2ludDAgPT0gcG9pbnQxIHx8IHBvaW50MSA9PSBwb2ludDIp
IHsKKyAgICAgICAgYWRkTGluZVRvKHBvaW50MSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBGbG9hdFNpemUgdjAxID0gcG9pbnQwIC0gcG9pbnQxOworICAgIEZsb2F0U2l6ZSB2MjEg
PSBwb2ludDIgLSBwb2ludDE7CisKKyAgICAvLyBzaW4oQSAtIEIpID0gc2luKEEpICogY29zKEIp
IC0gc2luKEIpICogY29zKEEpCisgICAgZG91YmxlIGNyb3NzID0gdjAxLndpZHRoKCkgKiB2MjEu
aGVpZ2h0KCkgLSB2MDEuaGVpZ2h0KCkgKiB2MjEud2lkdGgoKTsKKworICAgIGlmIChmYWJzKGNy
b3NzKSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9uIG9uZSBsaW5lCisgICAgICAgIGFkZExpbmVU
byhwb2ludDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQwMSA9IGh5
cG90KHYwMS53aWR0aCgpLCB2MDEuaGVpZ2h0KCkpOworICAgIGRvdWJsZSBkMjEgPSBoeXBvdCh2
MjEud2lkdGgoKSwgdjIxLmhlaWdodCgpKTsKKyAgICBkb3VibGUgYW5nbGUgPSAocGlEb3VibGUg
LSBmYWJzKGFzaW4oY3Jvc3MgLyAoZDAxICogZDIxKSkpKSAqIDAuNTsKKyAgICBkb3VibGUgc3Bh
biA9IHJhZGl1cyAqIHRhbihhbmdsZSk7CisgICAgZG91YmxlIHJhdGUgPSBzcGFuIC8gZDAxOwor
ICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludCA9IEZsb2F0UG9pbnQocG9pbnQxLngoKSArIHYwMS53
aWR0aCgpICogcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBv
aW50MS55KCkgKyB2MDEuaGVpZ2h0KCkgKiByYXRlKTsKKyAgICByYXRlID0gc3BhbiAvIGQyMTsK
KyAgICBGbG9hdFBvaW50IGVuZFBvaW50ID0gRmxvYXRQb2ludChwb2ludDEueCgpICsgdjIxLndp
ZHRoKCkgKiByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50
MS55KCkgKyB2MjEuaGVpZ2h0KCkgKiByYXRlKTsKKworICAgIC8vIEZhOiBsYXJnZSBhcmMgZmxh
ZywgbWFrZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBTQ1dBUkNfVE8gYW5kIExDV0FSQ19UTwor
ICAgIC8vICAgICByZXNwZWN0aXZlbHkgU0NDV0FSQ19UTyBhbmQgTENDV0FSQ19UTyBhcmNzLiBX
ZSBhbHdheXMgdXNlIHNtYWxsCisgICAgLy8gICAgIGFyY3MgZm9yIGFyY1RvKCksIGFzIHRoZSBh
cmMgaXMgZGVmaW5lZCBhcyB0aGUgInNob3J0ZXN0IGFyYyIgb2YgdGhlCisgICAgLy8gICAgIGNp
cmNsZSBzcGVjaWZpZWQgaW4gSFRNTCA1LgorCisgICAgLy8gRnM6IHN3ZWVwIGZsYWcsIHNwZWNp
Znlpbmcgd2hldGhlciB0aGUgYXJjIGlzIGRyYXduIGluIGluY3JlYXNpbmcgKHRydWUpCisgICAg
Ly8gICAgIG9yIGRlY3JlYXNpbmcgKDApIGRpcmVjdGlvbi4KKyAgICBjb25zdCBib29sIGFudGlj
bG9ja3dpc2UgPSBjcm9zcyA8IDA7CisKKyAgICAvLyBUcmFuc2xhdGUgdGhlIGxhcmdlIGFyYyBh
bmQgc3dlZXAgZmxhZ3MgaW50byBhbiBPcGVuVkcgc2VnbWVudCBjb21tYW5kLgorICAgIGNvbnN0
IFZHdWJ5dGUgc2VnbWVudENvbW1hbmQgPSBhbnRpY2xvY2t3aXNlID8gVkdfU0NDV0FSQ19UT19B
QlMgOiBWR19TQ1dBUkNfVE9fQUJTOworCisgICAgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNb
XSA9IHsKKyAgICAgICAgVkdfTElORV9UT19BQlMsCisgICAgICAgIHNlZ21lbnRDb21tYW5kCisg
ICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRhW10gPSB7CisgICAgICAgIHN0YXJ0UG9p
bnQueCgpLCBzdGFydFBvaW50LnkoKSwKKyAgICAgICAgcmFkaXVzLCByYWRpdXMsIDAsIGVuZFBv
aW50LngoKSwgZW5kUG9pbnQueSgpCisgICAgfTsKKworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGli
bGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgo
KSwgMiwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7
CisKKyAgICBtX3BhdGgtPm1fY3VycmVudFBvaW50ID0gZW5kUG9pbnQ7Cit9CisKK3ZvaWQgUGF0
aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVu
dHNbXSA9IHsgVkdfQ0xPU0VfUEFUSCB9OworICAgIC8vIHBhdGhEYXRhIG11c3Qgbm90IGJlIDAs
IGJ1dCBjZXJ0YWluIGNvbXBpbGVycyBhbHNvIGRvbid0IGNyZWF0ZQorICAgIC8vIHplcm8tc2l6
ZSBhcnJheXMuIFNvIGxldCdzIHVzZSBhIHJhbmRvbSBhbGlnbmVkIHZhbHVlIChzaXplb2YoVkdm
bG9hdCkpLAorICAgIC8vIGl0IHdvbid0IGJlIGFjY2Vzc2VkIGFueXdheXMgYXMgVkdfQ0xPU0Vf
UEFUSCBkb2Vzbid0IHRha2UgY29vcmRpbmF0ZXMuCisgICAgc3RhdGljIGNvbnN0IFZHZmxvYXQq
IHBhdGhEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxWR2Zsb2F0Kj4oc2l6ZW9mKFZHZmxvYXQpKTsK
KworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBw
ZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgMSwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7
CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgtPm1fY3VycmVudFBvaW50
ID0gbV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50OworfQorCit2b2lkIFBhdGg6OmFkZEFyYyhj
b25zdCBGbG9hdFBvaW50JiBjZW50ZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgc3RhcnRBbmdsZSwg
ZmxvYXQgZW5kQW5nbGUsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICAvLyBUaGUgT3BlblZH
IHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IGluZiBhcyByYWRpdXMgb3Igc3RhcnQvZW5kIGFuZ2xl
LgorICAgIC8vIFdlYktpdCBzZWVtcyB0byBwYXNzIHRob3NlIChlLmcuIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjQ0OSksCisgICAgLy8gc28gYWJvcnQgaW5zdGVh
ZCBvZiByaXNraW5nIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoIWlzZmluaXRlKHJhZGl1
cykgfHwgIWlzZmluaXRlKHN0YXJ0QW5nbGUpIHx8ICFpc2Zpbml0ZShlbmRBbmdsZSkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIEZvciBzb21lIHJlYXNvbiwgdGhlIEhUTUwgNSBzcGVjIGRl
ZmluZXMgdGhlIGFuZ2xlIGFzIGdvaW5nIGNsb2Nrd2lzZQorICAgIC8vIGZyb20gdGhlIHBvc2l0
aXZlIFggYXhpcyBpbnN0ZWFkIG9mIGdvaW5nIHN0YW5kYXJkIGFudGljbG9ja3dpc2UuCisgICAg
Ly8gU28gbGV0J3MgbWFrZSBpdCBhIHByb3BlciBhbmdsZSBpbiBvcmRlciB0byBrZWVwIHNhbml0
eS4KKyAgICBzdGFydEFuZ2xlID0gZm1vZCgoMi4wICogcGlEb3VibGUpIC0gc3RhcnRBbmdsZSwg
Mi4wICogcGlEb3VibGUpOworICAgIGVuZEFuZ2xlID0gZm1vZCgoMi4wICogcGlEb3VibGUpIC0g
ZW5kQW5nbGUsIDIuMCAqIHBpRG91YmxlKTsKKworICAgIC8vIE1ha2UgaXQgc28gdGhhdCBlbmRB
bmdsZSA+IHN0YXJ0QW5nbGUuIGZtb2QoKSBhYm92ZSB0YWtlcyBjYXJlIG9mCisgICAgLy8ga2Vl
cGluZyB0aGUgZGlmZmVyZW5jZSBiZWxvdyAzNjAgZGVncmVlcy4KKyAgICBpZiAoZW5kQW5nbGUg
PD0gc3RhcnRBbmdsZSkKKyAgICAgICAgZW5kQW5nbGUgKz0gMi4wICogcGlEb3VibGU7CisKKyAg
ICBjb25zdCBWR2Zsb2F0IGFuZ2xlRGVsdGEgPSBhbnRpY2xvY2t3aXNlCisgICAgICAgID8gKGVu
ZEFuZ2xlIC0gc3RhcnRBbmdsZSkKKyAgICAgICAgOiAoc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICsg
KDIuMCAqIHBpRG91YmxlKSk7CisKKyAgICAvLyBPcGVuVkcgdXNlcyBlbmRwb2ludCBwYXJhbWV0
ZXJpemF0aW9uIHdoaWxlIHRoaXMgbWV0aG9kIHJlY2VpdmVzIGl0cworICAgIC8vIHZhbHVlcyBp
biBjZW50ZXIgcGFyYW1ldGVyaXphdGlvbi4gSXQgbGFja3MgYW4gZWxsaXBzZSByb3RhdGlvbgor
ICAgIC8vIHBhcmFtZXRlciBzbyB3ZSB1c2UgMCBmb3IgdGhhdCwgYW5kIGFsc28gdGhlIHJhZGl1
cyBpcyBvbmx5IGEgc2luZ2xlCisgICAgLy8gdmFsdWUgd2hpY2ggbWFrZXMgZm9yIHJoID09IHJ2
LiBJbiBvcmRlciB0byBjb252ZXJ0IGZyb20gZW5kcG9pbnQgdG8KKyAgICAvLyBjZW50ZXIgcGFy
YW1ldGVyaXphdGlvbiwgd2UgdXNlIHRoZSBmb3JtdWxhcyBmcm9tIHRoZSBPcGVuVkcvU1ZHIHNw
ZWNzOgorCisgICAgLy8gKHgseSkgPSAoY29zIHJvdCwgLXNpbiByb3Q7IHNpbiByb3QsIC1jb3Mg
cm90KSAqIChyaCAqIGNvcyBhbmdsZSwgcnYgKiBzaW4gYW5nbGUpICsgKGNlbnRlci54LCBjZW50
ZXIueSkKKyAgICAvLyByb3QgaXMgMCwgd2hpY2ggc2ltcGxpZmllcyB0aGlzIGEgYml0OgorICAg
IC8vICh4LHkpID0gKDEsIDA7IDAsIC0xKSAqIChyaCAqIGNvcyBhbmdsZSwgcnYgKiBzaW4gYW5n
bGUpICsgKGNlbnRlci54LCBjZW50ZXIueSkKKyAgICAvLyAgICAgICA9ICgxICogcmggKiBjb3Mg
YW5nbGUgKyAwICogcnYgKiBzaW4gYW5nbGUsIDAgKiByaCAqIGNvcyBhbmdsZSArIC0xICogcnYg
KiBzaW4gYW5nbGUpICsgKGNlbnRlci54LCBjZW50ZXIueSkKKyAgICAvLyAgICAgICA9IChyaCAq
IGNvcyBhbmdsZSwgLXJ2ICogc2luIGFuZ2xlKSArIChjZW50ZXIueCwgY2VudGVyLnkpCisgICAg
Ly8gKFNldCBhbmdsZSA9IHtzdGFydEFuZ2xlLCBlbmRBbmdsZX0gdG8gcmV0cmlldmUgdGhlIHJl
c3BlY3RpdmUgZW5kcG9pbnRzLikKKworICAgIGNvbnN0IFZHZmxvYXQgc3RhcnRYID0gcmFkaXVz
ICogY29zKHN0YXJ0QW5nbGUpICsgY2VudGVyLngoKTsKKyAgICBjb25zdCBWR2Zsb2F0IHN0YXJ0
WSA9IC1yYWRpdXMgKiBzaW4oc3RhcnRBbmdsZSkgKyBjZW50ZXIueSgpOworICAgIGNvbnN0IFZH
ZmxvYXQgZW5kWCA9IHJhZGl1cyAqIGNvcyhlbmRBbmdsZSkgKyBjZW50ZXIueCgpOworICAgIGNv
bnN0IFZHZmxvYXQgZW5kWSA9IC1yYWRpdXMgKiBzaW4oZW5kQW5nbGUpICsgY2VudGVyLnkoKTsK
KworICAgIC8vIEZhOiBsYXJnZSBhcmMgZmxhZywgbWFrZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2Vl
biBTQ1dBUkNfVE8gYW5kIExDV0FSQ19UTworICAgIC8vICAgICByZXNwZWN0aXZlbHkgU0NDV0FS
Q19UTyBhbmQgTENDV0FSQ19UTyBhcmNzLgorICAgIGNvbnN0IGJvb2wgbGFyZ2VBcmMgPSAoYW5n
bGVEZWx0YSA+IHBpRG91YmxlKTsKKworICAgIC8vIEZzOiBzd2VlcCBmbGFnLCBzcGVjaWZ5aW5n
IHdoZXRoZXIgdGhlIGFyYyBpcyBkcmF3biBpbiBpbmNyZWFzaW5nICh0cnVlKQorICAgIC8vICAg
ICBvciBkZWNyZWFzaW5nICgwKSBkaXJlY3Rpb24uIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoaXMg
dmFsdWUsIGFzIGl0CisgICAgLy8gICAgIHdlIGFscmVhZHkgZ2V0IGl0IHBhc3NlZCBhcyBhIHBh
cmFtZXRlciAoRnMgPT0gIWFudGljbG9ja3dpc2UpLgorCisgICAgLy8gVHJhbnNsYXRlIHRoZSBs
YXJnZSBhcmMgYW5kIHN3ZWVwIGZsYWdzIGludG8gYW4gT3BlblZHIHNlZ21lbnQgY29tbWFuZC4K
KyAgICAvLyBBcyBPcGVuVkcgdGhpbmtzIG9mIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24sIHdlIG5l
ZWQgdG8gcmV2ZXJzZSB0aGUKKyAgICAvLyBhbnRpY2xvY2t3aXNlIHBhcmFtZXRlciBpbiBvcmRl
ciB0byBnZXQgdGhlIHNwZWNpZmllZCByb3RhdGlvbi4KKyAgICBjb25zdCBWR3VieXRlIHNlZ21l
bnRDb21tYW5kID0gIWFudGljbG9ja3dpc2UKKyAgICAgICAgPyAobGFyZ2VBcmMgPyBWR19MQ0NX
QVJDX1RPX0FCUyA6IFZHX1NDQ1dBUkNfVE9fQUJTKQorICAgICAgICA6IChsYXJnZUFyYyA/IFZH
X0xDV0FSQ19UT19BQlMgOiBWR19TQ1dBUkNfVE9fQUJTKTsKKworICAgIC8vIFNvIG5vdywgd2Un
dmUgZ290IGFsbCB0aGUgcGFyYW1ldGVycyBpbiBlbmRwb2ludCBwYXJhbWV0ZXJpemF0aW9uIGZv
cm1hdAorICAgIC8vIGFzIE9wZW5WRyByZXF1aXJlcyBpdC4gV2hpY2ggbWVhbnMgd2UgY2FuIGp1
c3QgcGFzcyBpdCBsaWtlIHRoaXMuCisgICAgY29uc3QgVkd1Ynl0ZSBwYXRoU2VnbWVudHNbXSA9
IHsKKyAgICAgICAgaGFzQ3VycmVudFBvaW50KCkgPyBWR19MSU5FX1RPX0FCUyA6IFZHX01PVkVf
VE9fQUJTLAorICAgICAgICBzZWdtZW50Q29tbWFuZAorICAgIH07CisgICAgY29uc3QgVkdmbG9h
dCBwYXRoRGF0YVtdID0geworICAgICAgICBzdGFydFgsIHN0YXJ0WSwKKyAgICAgICAgcmFkaXVz
LCByYWRpdXMsIDAsIGVuZFgsIGVuZFkKKyAgICB9OworCisgICAgbV9wYXRoLT5tYWtlQ29tcGF0
aWJsZUNvbnRleHRDdXJyZW50KCk7CisgICAgdmdBcHBlbmRQYXRoRGF0YShtX3BhdGgtPnZnUGF0
aCgpLCAyLCBwYXRoU2VnbWVudHMsIHBhdGhEYXRhKTsKKyAgICBBU1NFUlRfVkdfTk9fRVJST1Io
KTsKKworICAgIG1fcGF0aC0+bV9jdXJyZW50UG9pbnQuc2V0WChlbmRYKTsKKyAgICBtX3BhdGgt
Pm1fY3VycmVudFBvaW50LnNldFkoZW5kWSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgc3RhdGljIGNvbnN0IFZHdWJ5dGUgcGF0aFNlZ21l
bnRzW10gPSB7CisgICAgICAgIFZHX01PVkVfVE9fQUJTLAorICAgICAgICBWR19ITElORV9UT19S
RUwsCisgICAgICAgIFZHX1ZMSU5FX1RPX1JFTCwKKyAgICAgICAgVkdfSExJTkVfVE9fUkVMLAor
ICAgICAgICBWR19DTE9TRV9QQVRICisgICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhEYXRh
W10gPSB7CisgICAgICAgIHJlY3QueCgpLCByZWN0LnkoKSwKKyAgICAgICAgcmVjdC53aWR0aCgp
LAorICAgICAgICByZWN0LmhlaWdodCgpLAorICAgICAgICAtcmVjdC53aWR0aCgpCisgICAgfTsK
KworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBw
ZW5kUGF0aERhdGEobV9wYXRoLT52Z1BhdGgoKSwgNSwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7
CisgICAgQVNTRVJUX1ZHX05PX0VSUk9SKCk7CisKKyAgICBtX3BhdGgtPm1fY3VycmVudFBvaW50
ID0gbV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50ID0gcmVjdC5sb2NhdGlvbigpOworfQorCit2
b2lkIFBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHN0YXRp
YyBjb25zdCBWR3VieXRlIHBhdGhTZWdtZW50c1tdID0geworICAgICAgICBWR19NT1ZFX1RPX0FC
UywKKyAgICAgICAgVkdfU0NDV0FSQ19UT19SRUwsCisgICAgICAgIFZHX1NDQ1dBUkNfVE9fUkVM
LAorICAgICAgICBWR19DTE9TRV9QQVRICisgICAgfTsKKyAgICBjb25zdCBWR2Zsb2F0IHBhdGhE
YXRhW10gPSB7CisgICAgICAgIHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC8gMi4wLCByZWN0Lnko
KSwKKyAgICAgICAgcmVjdC53aWR0aCgpIC8gMi4wLCByZWN0LmhlaWdodCgpIC8gMi4wLCAwLCAw
LCByZWN0LmhlaWdodCgpLAorICAgICAgICByZWN0LndpZHRoKCkgLyAyLjAsIHJlY3QuaGVpZ2h0
KCkgLyAyLjAsIDAsIDAsIC1yZWN0LmhlaWdodCgpCisgICAgfTsKKworICAgIG1fcGF0aC0+bWFr
ZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIHZnQXBwZW5kUGF0aERhdGEobV9wYXRo
LT52Z1BhdGgoKSwgNCwgcGF0aFNlZ21lbnRzLCBwYXRoRGF0YSk7CisgICAgQVNTRVJUX1ZHX05P
X0VSUk9SKCk7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQoreworICAgIG1fcGF0aC0+Y2xlYXIo
KTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sKKyAgICBtX3BhdGgtPm1ha2VD
b21wYXRpYmxlQ29udGV4dEN1cnJlbnQoKTsKKyAgICByZXR1cm4gIXZnR2V0UGFyYW1ldGVyaSht
X3BhdGgtPnZnUGF0aCgpLCBWR19QQVRIX05VTV9TRUdNRU5UUyk7Cit9CisKK2Jvb2wgUGF0aDo6
aGFzQ3VycmVudFBvaW50KCkgY29uc3QKK3sKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29u
dGV4dEN1cnJlbnQoKTsKKyAgICByZXR1cm4gdmdHZXRQYXJhbWV0ZXJpKG1fcGF0aC0+dmdQYXRo
KCksIFZHX1BBVEhfTlVNX1NFR01FTlRTKSA+IDA7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0
cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5nIGRlYnVnU3RyaW5nID0gIiI7CisKKyAgICAvLyBP
cGVuVkcgcHJvdmlkZXMgbm8gbWVhbnMgdG8gcmV0cmlldmUgcGF0aCBzZWdtZW50IGluZm9ybWF0
aW9uLgorICAgIC8vIFRoaXMgaXMgYSBiaXQgdW5mb3J0dW5hdGUsIHdlIG1pZ2h0IG5lZWQgdG8g
c3RvcmUgdGhlIHNlZ21lbnRzIGluCisgICAgLy8gbWVtb3J5IGlmIHdlIHdhbnQgdG8gaW1wbGVt
ZW50IHRoaXMgZnVuY3Rpb24gcHJvcGVybHkuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAg
IHJldHVybiBkZWJ1Z1N0cmluZzsKK30KKwordm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQ
YXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdAoreworICAgIC8vIE9wZW5WRyBwcm92
aWRlcyBubyBtZWFucyB0byByZXRyaWV2ZSBwYXRoIHNlZ21lbnQgaW5mb3JtYXRpb24uCisgICAg
Ly8gVGhpcyBpcyAqdmVyeSogdW5mb3J0dW5hdGUsIHdlIG1pZ2h0IG5lZWQgdG8gc3RvcmUgdGhl
IHNlZ21lbnRzIGluCisgICAgLy8gbWVtb3J5IGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50IHRoaXMg
ZnVuY3Rpb24gcHJvcGVybHkuCisgICAgLy8gU2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvbWVz
c2FnZV9ib2FyZHMvdmlld3RvcGljLnBocD9mPTYmdD0xODg3CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFu
c2Zvcm1hdGlvbikKK3sKKyAgICBQbGF0Zm9ybVBhdGhPcGVuVkcqIGRzdCA9IG5ldyBQbGF0Zm9y
bVBhdGhPcGVuVkcoKTsKKyAgICAvLyBkc3QtPm1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQo
KSBpcyBjYWxsZWQgYnkgdGhlIHBsYXRmb3JtIHBhdGgKKyAgICAvLyBjb25zdHJ1Y3RvciwgdGhl
cmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBpdCBhZ2FpbiBoZXJlLgorICAgIFBhaW50ZXJP
cGVuVkc6OnRyYW5zZm9ybVBhdGgoZHN0LT52Z1BhdGgoKSwgbV9wYXRoLT52Z1BhdGgoKSwgdHJh
bnNmb3JtYXRpb24pOworICAgIGRlbGV0ZSBtX3BhdGg7CisgICAgbV9wYXRoID0gZHN0OworCisg
ICAgbV9wYXRoLT5tX2N1cnJlbnRQb2ludCA9IHRyYW5zZm9ybS5tYXBQb2ludChtX3BhdGgtPm1f
Y3VycmVudFBvaW50KTsKKyAgICBtX3BhdGgtPm1fc3VicGF0aFN0YXJ0UG9pbnQgPSB0cmFuc2Zv
cm0ubWFwUG9pbnQobV9wYXRoLT5tX3N1YnBhdGhTdGFydFBvaW50KTsKK30KKworCisvLyBQYXRo
OjpsZW5ndGgoKSwgUGF0aDo6cG9pbnRBdExlbmd0aCgpIGFuZCBQYXRoOjpub3JtYWxBbmdsZUF0
TGVuZ3RoKCkgYXJlCisvLyByZWltcGxlbWVudGVkIGhlcmUgaW5zdGVhZCBvZiBpbiBQYXRoLmNw
cCwgYmVjYXVzZSBPcGVuVkcgaGFzIGl0cyBvd24KKy8vIGZ1bmN0aW9ucyBhbmQgUGF0aDo6YXBw
bHkoKSBkb2Vzbid0IHJlYWxseSB3b3JrIGFzIGxvbmcgYXMgd2UgcmVseSBvbiBWR1BhdGgKKy8v
IGFzIHByaW1hcnkgcGF0aCBzdG9yYWdlLgorCitmbG9hdCBQYXRoOjpsZW5ndGgoKQoreworICAg
IG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworICAgIFZHZmxvYXQgbGVu
Z3RoID0gdmdQYXRoTGVuZ3RoKG1fcGF0aC0+dmdQYXRoKCksIDAsIHZnR2V0UGFyYW1ldGVyaSht
X3BhdGgtPnZnUGF0aCgpLCBWR19QQVRIX05VTV9TRUdNRU5UUykpOworICAgIEFTU0VSVF9WR19O
T19FUlJPUigpOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0Zsb2F0UG9pbnQgUGF0aDo6cG9p
bnRBdExlbmd0aChmbG9hdCBsZW5ndGgsIGJvb2wmIG9rKQoreworICAgIFZHZmxvYXQgeCA9IDAs
IHkgPSAwOworICAgIG1fcGF0aC0+bWFrZUNvbXBhdGlibGVDb250ZXh0Q3VycmVudCgpOworCisg
ICAgdmdQb2ludEFsb25nUGF0aChtX3BhdGgtPnZnUGF0aCgpLCAwLCB2Z0dldFBhcmFtZXRlcmko
bV9wYXRoLT52Z1BhdGgoKSwgVkdfUEFUSF9OVU1fU0VHTUVOVFMpLAorICAgICAgICAgICAgICAg
ICAgICAgbGVuZ3RoLCAmeCwgJnksIDAsIDApOworICAgIG9rID0gKHZnR2V0RXJyb3IoKSA9PSBW
R19OT19FUlJPUik7CisgICAgcmV0dXJuIEZsb2F0UG9pbnQoeCwgeSk7Cit9CisKK2Zsb2F0IFBh
dGg6Om5vcm1hbEFuZ2xlQXRMZW5ndGgoZmxvYXQgbGVuZ3RoLCBib29sJiBvaykKK3sKKyAgICBW
R2Zsb2F0IHRhbmdlbnRYLCB0YW5nZW50WTsKKyAgICBtX3BhdGgtPm1ha2VDb21wYXRpYmxlQ29u
dGV4dEN1cnJlbnQoKTsKKworICAgIHZnUG9pbnRBbG9uZ1BhdGgobV9wYXRoLT52Z1BhdGgoKSwg
MCwgdmdHZXRQYXJhbWV0ZXJpKG1fcGF0aC0+dmdQYXRoKCksIFZHX1BBVEhfTlVNX1NFR01FTlRT
KSwKKyAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgMCwgMCwgJnRhbmdlbnRYLCAmdGFuZ2Vu
dFkpOworICAgIG9rID0gKHZnR2V0RXJyb3IoKSA9PSBWR19OT19FUlJPUik7CisgICAgcmV0dXJu
IGF0YW4yZih0YW5nZW50WSwgdGFuZ2VudFgpICogMTgwLjAgLyBwaUZsb2F0OyAvLyBjb252ZXJ0
IHRvIGRlZ3JlZXMKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvUGxhdGZvcm1QYXRoT3BlblZHLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9QbGF0Zm9ybVBhdGhPcGVuVkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi4yODZkYTUzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9vcGVudmcvUGxhdGZvcm1QYXRoT3BlblZHLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS0yMDEwLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtUGF0aE9wZW5WR19oCisjZGVmaW5lIFBs
YXRmb3JtUGF0aE9wZW5WR19oCisKKyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAi
U2hhcmVkUmVzb3VyY2VPcGVuVkcuaCIKKworI2luY2x1ZGUgPG9wZW52Zy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIFBsYXRmb3JtUGF0aE9wZW5WRyA6IHB1YmxpYyBTaGFyZWRS
ZXNvdXJjZU9wZW5WRyB7CitwdWJsaWM6CisgICAgUGxhdGZvcm1QYXRoT3BlblZHKCk7CisgICAg
UGxhdGZvcm1QYXRoT3BlblZHKGNvbnN0IFBsYXRmb3JtUGF0aE9wZW5WRyYpOworICAgIH5QbGF0
Zm9ybVBhdGhPcGVuVkcoKTsKKworICAgIFBsYXRmb3JtUGF0aE9wZW5WRyYgb3BlcmF0b3I9KGNv
bnN0IFBsYXRmb3JtUGF0aE9wZW5WRyYpOworCisgICAgVkdQYXRoIHZnUGF0aCgpIHsgcmV0dXJu
IG1fdmdQYXRoOyB9CisgICAgdm9pZCBjbGVhcigpOworCitwdWJsaWM6CisgICAgRmxvYXRQb2lu
dCBtX2N1cnJlbnRQb2ludDsKKyAgICBGbG9hdFBvaW50IG1fc3VicGF0aFN0YXJ0UG9pbnQ7CisK
K3ByaXZhdGU6CisgICAgdm9pZCBjcmVhdGVQYXRoKCk7CisKKyAgICBWR1BhdGggbV92Z1BhdGg7
Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmE4NDNkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW52Zy9TaGFyZWRSZXNvdXJjZU9wZW5WRy5jcHAKQEAgLTAsMCArMSw0
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAw
OS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNo
YXJlZFJlc291cmNlT3BlblZHLmgiCisKKyNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCisKKyNp
ZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5WRy5oIgorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTaGFyZWRSZXNvdXJjZU9wZW5WRzo6bWFrZVNo
YXJlZENvbnRleHRDdXJyZW50KCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgRUdMRGlzcGxh
eU9wZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9ybVN1cmZhY2UoKS0+bWFrZUN1cnJlbnQo
KTsKKyNlbmRpZgorfQorCit2b2lkIFNoYXJlZFJlc291cmNlT3BlblZHOjptYWtlQ29tcGF0aWJs
ZUNvbnRleHRDdXJyZW50KCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgRUdMRGlzcGxheU9w
ZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9ybVN1cmZhY2UoKS0+bWFrZUNvbXBhdGlibGVD
dXJyZW50KCk7CisjZW5kaWYKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9vcGVudmcvU2hhcmVkUmVzb3VyY2VPcGVuVkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNDM2YWU5MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1NoYXJlZFJlc291cmNlT3BlblZHLmgKQEAgLTAsMCArMSwz
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAw
OS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBTaGFyZWRSZXNvdXJjZU9wZW5WR19oCisj
ZGVmaW5lIFNoYXJlZFJlc291cmNlT3BlblZHX2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBTaGFyZWRSZXNvdXJjZU9wZW5WRyB7CitwdWJsaWM6CisgICAgdm9pZCBtYWtlU2hhcmVk
Q29udGV4dEN1cnJlbnQoKTsKKyAgICB2b2lkIG1ha2VDb21wYXRpYmxlQ29udGV4dEN1cnJlbnQo
KTsKK307CisKK30KKworI2VuZGlmCg==
</data>
<flag name="review"
          id="32559"
          type_id="1"
          status="+"
          setter="krit"
    />
          </attachment>
      

    </bug>

</bugzilla>