<?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>23883</bug_id>
          
          <creation_ts>2009-02-10 16:51:58 -0800</creation_ts>
          <short_desc>Add 3D functions and new TransformOperations to platform/transforms</short_desc>
          <delta_ts>2009-02-11 12:14:30 -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>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>23359</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Marrin">cmarrin</reporter>
          <assigned_to name="Chris Marrin">cmarrin</assigned_to>
          <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>109216</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-02-10 16:51:58 -0800</bug_when>
    <thetext>Needed for higher level 3D functions. Not in play at the moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109222</commentid>
    <comment_count>1</comment_count>
      <attachid>27547</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-02-10 17:14:31 -0800</bug_when>
    <thetext>Created attachment 27547
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109224</commentid>
    <comment_count>2</comment_count>
      <attachid>27547</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-02-10 17:35:45 -0800</bug_when>
    <thetext>Comment on attachment 27547
Patch

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================

&gt; Index: WebCore/WebCore.xcodeproj/project.pbxproj
&gt; ===================================================================

Please run the WebCore.xcodeproj/project.pbxproj file through WebKitTools/Scripts/sort-Xcode-project-file
before committing.

&gt; Index: WebCore/platform/graphics/transforms/IdentityTransformOperation.h
&gt; ===================================================================

&gt;      virtual bool isIdentity() const { return true; }
&gt; +    virtual bool isAffine() const { return true; }

We don&apos;t need isAffine(). You should remove it.

&gt; Index: WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	(revision 0)
&gt; @@ -0,0 +1,54 @@
&gt; +/*
&gt; + * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
&gt; + * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + * This library is free software; you can redistribute it and/or
&gt; + * modify it under the terms of the GNU Library General Public
&gt; + * License as published by the Free Software Foundation; either
&gt; + * version 2 of the License, or (at your option) any later version.
&gt; + *
&gt; + * This library is distributed in the hope that it will be useful,
&gt; + * but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; + * Library General Public License for more details.
&gt; + *
&gt; + * You should have received a copy of the GNU Library General Public License
&gt; + * along with this library; see the file COPYING.LIB.  If not, write to
&gt; + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; + * Boston, MA 02110-1301, USA.
&gt; + *
&gt; + */

This is a new file; it should have the 2-clause apple license, not LGPL.

&gt; +    if (blendToIdentity)
&gt; +        std::swap(fromT, toT);

I think the preferred way is to put a
using namespace std
near the top of the file, and skip the namespace here.

&gt; Index: WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h	(revision 0)
&gt; +++ WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h	(revision 0)
&gt; @@ -0,0 +1,76 @@
&gt; +/*
&gt; + * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
&gt; + *           (C) 2000 Antti Koivisto (koivisto@kde.org)
&gt; + *           (C) 2000 Dirk Mueller (mueller@kde.org)
&gt; + * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
&gt; + * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
&gt; + *
&gt; + * This library is free software; you can redistribute it and/or
&gt; + * modify it under the terms of the GNU Library General Public
&gt; + * License as published by the Free Software Foundation; either
&gt; + * version 2 of the License, or (at your option) any later version.
&gt; + *
&gt; + * This library is distributed in the hope that it will be useful,
&gt; + * but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; + * Library General Public License for more details.
&gt; + *
&gt; + * You should have received a copy of the GNU Library General Public License
&gt; + * along with this library; see the file COPYING.LIB.  If not, write to
&gt; + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; + * Boston, MA 02110-1301, USA.
&gt; + *
&gt; + */

Wrong license.


&gt; +    virtual bool isAffine() const { return m_matrix.isAffine(); }

Remove.

&gt; Index: WebCore/platform/graphics/transforms/MatrixTransformOperation.h

&gt; +    virtual bool isAffine() const { return true; }

Remove

&gt;      virtual bool apply(TransformationMatrix&amp; transform, const IntSize&amp;) const
&gt;      {
&gt;          TransformationMatrix matrix(m_a, m_b, m_c, m_d, m_e, m_f);
&gt; -        transform = matrix * transform;
&gt; +        transform.multLeft(TransformationMatrix(matrix));
&gt;          return false;

I wish it was easier to know what the return value meant.

&gt; Index: WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp	(revision 0)
&gt; @@ -0,0 +1,59 @@
&gt; +/*
&gt; + * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
&gt; + * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
&gt; + *
&gt; + * This library is free software; you can redistribute it and/or
&gt; + * modify it under the terms of the GNU Library General Public
&gt; + * License as published by the Free Software Foundation; either
&gt; + * version 2 of the License, or (at your option) any later version.
&gt; + *
&gt; + * This library is distributed in the hope that it will be useful,
&gt; + * but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; + * Library General Public License for more details.
&gt; + *
&gt; + * You should have received a copy of the GNU Library General Public License
&gt; + * along with this library; see the file COPYING.LIB.  If not, write to
&gt; + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; + * Boston, MA 02110-1301, USA.
&gt; + *
&gt; + */

Wrong license.


&gt; +PassRefPtr&lt;TransformOperation&gt; PerspectiveTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
&gt; +{

&gt; +    if (blendToIdentity)
&gt; +        std::swap(fromP, toP);

Ditto re: swap().

&gt; +    
&gt; +    TransformationMatrix fromT;
&gt; +    TransformationMatrix toT;
&gt; +    fromT.applyPerspective((float) fromP);
&gt; +    toT.applyPerspective((float) toP);

Don&apos;t cast to float.

&gt; Index: WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h	(revision 0)
&gt; +++ WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h	(revision 0)
&gt; @@ -0,0 +1,75 @@
&gt; +/*
&gt; + * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
&gt; + *           (C) 2000 Antti Koivisto (koivisto@kde.org)
&gt; + *           (C) 2000 Dirk Mueller (mueller@kde.org)
&gt; + * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
&gt; + * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
&gt; + *
&gt; + * This library is free software; you can redistribute it and/or
&gt; + * modify it under the terms of the GNU Library General Public
&gt; + * License as published by the Free Software Foundation; either
&gt; + * version 2 of the License, or (at your option) any later version.
&gt; + *
&gt; + * This library is distributed in the hope that it will be useful,
&gt; + * but WITHOUT ANY WARRANTY; without even the implied warranty of
&gt; + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
&gt; + * Library General Public License for more details.
&gt; + *
&gt; + * You should have received a copy of the GNU Library General Public License
&gt; + * along with this library; see the file COPYING.LIB.  If not, write to
&gt; + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
&gt; + * Boston, MA 02110-1301, USA.
&gt; + *
&gt; + */

Wrong license.

&gt; +private:
&gt; +    virtual bool isIdentity() const { return m_p == 0; }
&gt; +    virtual bool isAffine() const { return m_p == 0; }

Remove

&gt; +    virtual bool apply(TransformationMatrix&amp; transform, const IntSize&amp;) const
&gt; +    {
&gt; +        transform.applyPerspective((float)m_p);
&gt; +        return false;

Remove cast.

&gt; Index: WebCore/platform/graphics/transforms/RotateTransformOperation.cpp
&gt; ===================================================================

&gt; +    if (blendToIdentity)
&gt; +        std::swap(fromOp, toOp);

Ditto.

&gt; +    
&gt; +    // Convert that to Axis/Angle form
&gt; +    float x = (float) -decomp.quaternionX;
&gt; +    float y = (float) -decomp.quaternionY;
&gt; +    float z = (float) -decomp.quaternionZ;
&gt; +    float length = sqrtf(x * x + y * y + z * z);
&gt; +    float angle = 0.0f;

Should this math be in doubles?

&gt; Index: WebCore/platform/graphics/transforms/RotateTransformOperation.h
&gt; ===================================================================

&gt; +    virtual bool isAffine() const { return m_x == 0.0 &amp;&amp; m_y == 0.0; }

Remove.

&gt;      virtual bool apply(TransformationMatrix&amp; transform, const IntSize&amp; /*borderBoxSize*/) const
&gt;      {
&gt; -        transform.rotate(m_angle);
&gt; +        transform.rotate3d((float)m_x, (float)m_y, (float)m_z, (float)m_angle);
&gt;          return false;

No need for casts.

&gt; Index: WebCore/platform/graphics/transforms/ScaleTransformOperation.h
&gt; ===================================================================

&gt; +    virtual bool isAffine() const { return m_z == 1; }

Remove

&gt; Index: WebCore/platform/graphics/transforms/SkewTransformOperation.h
&gt; ===================================================================

&gt; +    virtual bool isAffine() const { return true; }

Remove

&gt; Index: WebCore/platform/graphics/transforms/TransformOperation.h
&gt; ===================================================================

&gt; +    virtual bool isAffine() const = 0;

Remove

&gt; Index: WebCore/platform/graphics/transforms/TransformOperations.h
&gt; ===================================================================

&gt; +    // Returns true if the operations can all be represented as affine transforms (even if
&gt; +    // they use 3d operations)
&gt; +    bool isAffine() const
&gt; +    {
&gt; +        for (unsigned i = 0; i &lt; m_operations.size(); ++i)
&gt; +            if (!m_operations[i]-&gt;isAffine())
&gt; +                return false;
&gt; +        return true;

Remove

&gt; Index: WebCore/platform/graphics/transforms/TranslateTransformOperation.h
&gt; ===================================================================

&gt; +    virtual bool isAffine() const { return m_z.calcFloatValue(1) == 0; }
Remove

&gt;      virtual bool apply(TransformationMatrix&amp; transform, const IntSize&amp; borderBoxSize) const
&gt;      {
&gt; -        transform.translate(m_x.calcFloatValue(borderBoxSize.width()), m_y.calcFloatValue(borderBoxSize.height()));
&gt; +        transform.translate3d((float) x(borderBoxSize), (float) y(borderBoxSize), (float) z(borderBoxSize));

No need for casting.


r=me with comments addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109343</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-02-11 12:14:30 -0800</bug_when>
    <thetext>Sending        WebCore/ChangeLog
Sending        WebCore/WebCore.xcodeproj/project.pbxproj
Adding         WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp
Adding         WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h
Sending        WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp
Sending        WebCore/platform/graphics/transforms/MatrixTransformOperation.h
Adding         WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp
Adding         WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h
Sending        WebCore/platform/graphics/transforms/RotateTransformOperation.cpp
Sending        WebCore/platform/graphics/transforms/RotateTransformOperation.h
Sending        WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp
Sending        WebCore/platform/graphics/transforms/ScaleTransformOperation.h
Sending        WebCore/platform/graphics/transforms/TransformOperation.h
Sending        WebCore/platform/graphics/transforms/TransformOperations.h
Sending        WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp
Sending        WebCore/platform/graphics/transforms/TranslateTransformOperation.h
Sending        WebKitTools/ChangeLog
Sending        WebKitTools/Scripts/build-webkit
Transmitting file data ..................
Committed revision 40861.

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27547</attachid>
            <date>2009-02-10 17:14:31 -0800</date>
            <delta_ts>2009-02-10 17:35:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>23883.patch</filename>
            <type>text/plain</type>
            <size>43252</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MDg0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzggQEAKKzIwMDktMDItMTAgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzg4MworCisgICAgICAgIEFk
ZGVkIG5ldyBUcmFuc2Zvcm1PcGVyYXRpb24gc3ViY2xhc3NlcyBhbmQgbWV0aG9kcyB0byBleGlz
dGluZyBvbmVzCisgICAgICAgIHRvIHN1cHBvcnQgM0QuCisKKyAgICAgICAgKiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdHJh
bnNmb3Jtcy9JZGVudGl0eVRyYW5zZm9ybU9wZXJhdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6
SWRlbnRpdHlUcmFuc2Zvcm1PcGVyYXRpb246OmlzQWZmaW5lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy90cmFuc2Zvcm1zL01hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6YmxlbmQp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvTWF0cml4M0RUcmFuc2Zv
cm1PcGVyYXRpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXRyaXgzRFRyYW5zZm9y
bU9wZXJhdGlvbjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdHJpeDNEVHJhbnNmb3Jt
T3BlcmF0aW9uOjppc0lkZW50aXR5KToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdHJpeDNEVHJhbnNm
b3JtT3BlcmF0aW9uOjppc0FmZmluZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbjo6Z2V0T3BlcmF0aW9uVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXRy
aXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6aXNTYW1lVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpN
YXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3Jl
OjpNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6YXBwbHkpOgorICAgICAgICAoV2ViQ29yZTo6
TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246Ok1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL01hdHJpeFRyYW5zZm9ybU9w
ZXJhdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpp
c0FmZmluZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246OmFw
cGx5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1BlcnNwZWN0aXZl
VHJhbnNmb3JtT3BlcmF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQZXJzcGVj
dGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjo6YmxlbmQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3RyYW5zZm9ybXMvUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjppc0lkZW50
aXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpp
c0FmZmluZSk6CisgICAgICAgIChXZWJDb3JlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlv
bjo6Z2V0T3BlcmF0aW9uVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpQZXJzcGVjdGl2ZVRyYW5z
Zm9ybU9wZXJhdGlvbjo6aXNTYW1lVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpQZXJzcGVjdGl2
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpQZXJz
cGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjo6YXBwbHkpOgorICAgICAgICAoV2ViQ29yZTo6UGVy
c3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9u
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1JvdGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246OmJsZW5kKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1JvdGF0
ZVRyYW5zZm9ybU9wZXJhdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6Um90YXRlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Um90YXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOjphbmdsZSk6CisgICAgICAgIChXZWJDb3JlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246OmlzQWZmaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246OmFwcGx5KToKKyAgICAgICAgKFdlYkNvcmU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6
Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90
cmFuc2Zvcm1zL1NjYWxlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpibGVuZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvdHJhbnNmb3Jtcy9TY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5oOgorICAgICAgICAoV2Vi
Q29yZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6eik6CisgICAgICAgIChXZWJDb3JlOjpTY2FsZVRy
YW5zZm9ybU9wZXJhdGlvbjo6aXNJZGVudGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpTY2FsZVRy
YW5zZm9ybU9wZXJhdGlvbjo6aXNBZmZpbmUpOgorICAgICAgICAoV2ViQ29yZTo6U2NhbGVUcmFu
c2Zvcm1PcGVyYXRpb246Om9wZXJhdG9yPT0pOgorICAgICAgICAoV2ViQ29yZTo6U2NhbGVUcmFu
c2Zvcm1PcGVyYXRpb246OmFwcGx5KToKKyAgICAgICAgKFdlYkNvcmU6OlNjYWxlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbik6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvdHJhbnNmb3Jtcy9Ta2V3VHJhbnNmb3JtT3BlcmF0aW9uLmg6CisgICAgICAgIChX
ZWJDb3JlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOjppc0FmZmluZSk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1PcGVyYXRpb24uaDoKKyAgICAgICAg
KFdlYkNvcmU6OlRyYW5zZm9ybU9wZXJhdGlvbjo6KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5z
Zm9ybU9wZXJhdGlvbjo6aXMzRE9wZXJhdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1PcGVyYXRpb25zLmg6CisgICAgICAgIChXZWJDb3JlOjpU
cmFuc2Zvcm1PcGVyYXRpb25zOjppc0FmZmluZSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zv
cm1PcGVyYXRpb25zOjpoYXMzRE9wZXJhdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvdHJhbnNmb3Jtcy9UcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpibGVuZCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24u
aDoKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6eik6Cisg
ICAgICAgIChXZWJDb3JlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmlzSWRlbnRpdHkp
OgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjppc0FmZmlu
ZSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246Om9wZXJh
dG9yPT0pOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjph
cHBseSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OlRy
YW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbik6CisKIDIwMDktMDItMTAgIERhdmlkIEh5YXR0ICA8
aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJlbmFtZSB4UG9zKCkgYW5kIHlQb3MoKSBvbiBS
ZW5kZXJMYXllciB0byB4KCkgYW5kIHkoKSB0byBtYXRjaCBSZW5kZXJCb3guICBSZW5hbWUgc2V0
UG9zIHRvIHNldExvY2F0aW9uLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHJldmlzaW9uIDQwODM4KQorKysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTY1NSw2ICs2NTUsMTAgQEAKIAkJ
NDk4MzkxNTkwRjFFNzc2OTAwQzIzNzgyIC8qIFdlYktpdENTU01hdHJpeC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDk4MzkxNTYwRjFFNzc2OTAwQzIz
NzgyIC8qIFdlYktpdENTU01hdHJpeC5oICovOyB9OwogCQk0OTgzOTE2MzBGMUU4RUUxMDBDMjM3
ODIgLyogSlNXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OTgzOTE2MTBGMUU4RUUxMDBDMjM3ODIgLyog
SlNXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3Rvci5jcHAgKi87IH07CiAJCTQ5ODM5MTY0MEYxRThF
RTEwMEMyMzc4MiAvKiBKU1dlYktpdENTU01hdHJpeENvbnN0cnVjdG9yLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OTgzOTE2MjBGMUU4RUUxMDBDMjM3
ODIgLyogSlNXZWJLaXRDU1NNYXRyaXhDb25zdHJ1Y3Rvci5oICovOyB9OworCQk0OUQ1REMyQjBG
NDIzQTczMDA4RjIwRkQgLyogTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlENURDMjcwRjQyM0E3MzAw
OEYyMEZEIC8qIE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLzsgfTsKKwkJNDlENURD
MkMwRjQyM0E3MzAwOEYyMEZEIC8qIE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUQ1REMyODBGNDIzQTcz
MDA4RjIwRkQgLyogTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uaCAqLzsgfTsKKwkJNDlENURD
MkQwRjQyM0E3MzAwOEYyMEZEIC8qIFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5RDVEQzI5MEY0
MjNBNzMwMDhGMjBGRCAvKiBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5jcHAgKi87IH07
CisJCTQ5RDVEQzJFMEY0MjNBNzMwMDhGMjBGRCAvKiBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJh
dGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlE
NURDMkEwRjQyM0E3MzAwOEYyMEZEIC8qIFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgg
Ki87IH07CiAJCTQ5RTkxMUMzMEVGODZENDcwMDlEMENBRiAvKiBUcmFuc2Zvcm1hdGlvbk1hdHJp
eC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUU5
MTFCMzBFRjg2RDQ3MDA5RDBDQUYgLyogVHJhbnNmb3JtYXRpb25NYXRyaXguY3BwICovOyB9Owog
CQk0OUU5MTFDNDBFRjg2RDQ3MDA5RDBDQUYgLyogVHJhbnNmb3JtYXRpb25NYXRyaXguaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5RTkxMUI0MEVGODZE
NDcwMDlEMENBRiAvKiBUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oICovOyBzZXR0aW5ncyA9IHtBVFRS
SUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTQ5RTkxMUM1MEVGODZENDcwMDlEMENBRiAv
KiBJZGVudGl0eVRyYW5zZm9ybU9wZXJhdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gNDlFOTExQjUwRUY4NkQ0NzAwOUQwQ0FGIC8qIElkZW50aXR5
VHJhbnNmb3JtT3BlcmF0aW9uLmggKi87IH07CkBAIC01NTc5LDYgKzU1ODMsMTAgQEAKIAkJNDk4
MzkxNTcwRjFFNzc2OTAwQzIzNzgyIC8qIFdlYktpdENTU01hdHJpeC5pZGwgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0
ZXh0OyBwYXRoID0gV2ViS2l0Q1NTTWF0cml4LmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJNDk4MzkxNjEwRjFFOEVFMTAwQzIzNzgyIC8qIEpTV2ViS2l0Q1NTTWF0cml4Q29uc3Ry
dWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNXZWJLaXRD
U1NNYXRyaXhDb25zdHJ1Y3Rvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ5
ODM5MTYyMEYxRThFRTEwMEMyMzc4MiAvKiBKU1dlYktpdENTU01hdHJpeENvbnN0cnVjdG9yLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTV2ViS2l0Q1NTTWF0cml4Q29uc3Ry
dWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlENURDMjcwRjQyM0E3MzAw
OEYyMEZEIC8qIE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmNwcDsgcGF0
aCA9IHRyYW5zZm9ybXMvTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQk0OUQ1REMyODBGNDIzQTczMDA4RjIwRkQgLyogTWF0cml4M0RU
cmFuc2Zvcm1PcGVyYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gTWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uaDsgcGF0aCA9IHRyYW5zZm9ybXMvTWF0cml4M0RUcmFu
c2Zvcm1PcGVyYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlENURDMjkw
RjQyM0E3MzAwOEYyMEZEIC8qIFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFBlcnNwZWN0aXZlVHJhbnNmb3JtT3Bl
cmF0aW9uLmNwcDsgcGF0aCA9IHRyYW5zZm9ybXMvUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRp
b24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0OUQ1REMyQTBGNDIzQTczMDA4
RjIwRkQgLyogUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBuYW1lID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaDsgcGF0aCA9
IHRyYW5zZm9ybXMvUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJNDlFOTExQjMwRUY4NkQ0NzAwOUQwQ0FGIC8qIFRyYW5zZm9ybWF0
aW9uTWF0cml4LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFRyYW5z
Zm9ybWF0aW9uTWF0cml4LmNwcDsgcGF0aCA9IHRyYW5zZm9ybXMvVHJhbnNmb3JtYXRpb25NYXRy
aXguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0OUU5MTFCNDBFRjg2RDQ3MDA5
RDBDQUYgLyogVHJhbnNmb3JtYXRpb25NYXRyaXguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBuYW1lID0gVHJhbnNmb3JtYXRpb25NYXRyaXguaDsgcGF0aCA9IHRyYW5zZm9ybXMvVHJhbnNm
b3JtYXRpb25NYXRyaXguaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDlFOTExQjUw
RUY4NkQ0NzAwOUQwQ0FGIC8qIElkZW50aXR5VHJhbnNmb3JtT3BlcmF0aW9uLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IElkZW50aXR5VHJhbnNmb3JtT3BlcmF0aW9uLmg7IHBh
dGggPSB0cmFuc2Zvcm1zL0lkZW50aXR5VHJhbnNmb3JtT3BlcmF0aW9uLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CkBAIC05NzMyLDYgKzk3NDAsMTAgQEAKIAkJNDlFOTExQjIwRUY4NkQy
NzAwOUQwQ0FGIC8qIHRyYW5zZm9ybXMgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNo
aWxkcmVuID0gKAorCQkJCTQ5RDVEQzI3MEY0MjNBNzMwMDhGMjBGRCAvKiBNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbi5jcHAgKi8sCisJCQkJNDlENURDMjgwRjQyM0E3MzAwOEYyMEZEIC8qIE1h
dHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmggKi8sCisJCQkJNDlENURDMjkwRjQyM0E3MzAwOEYy
MEZEIC8qIFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLywKKwkJCQk0OUQ1REMy
QTBGNDIzQTczMDA4RjIwRkQgLyogUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCAqLywK
IAkJCQk0OUU5MTFCNTBFRjg2RDQ3MDA5RDBDQUYgLyogSWRlbnRpdHlUcmFuc2Zvcm1PcGVyYXRp
b24uaCAqLywKIAkJCQk0OUU5MTFCNjBFRjg2RDQ3MDA5RDBDQUYgLyogTWF0cml4VHJhbnNmb3Jt
T3BlcmF0aW9uLmNwcCAqLywKIAkJCQk0OUU5MTFCNzBFRjg2RDQ3MDA5RDBDQUYgLyogTWF0cml4
VHJhbnNmb3JtT3BlcmF0aW9uLmggKi8sCkBAIC0xNjc1Nyw2ICsxNjc2OSw4IEBACiAJCQkJMkUz
QUM4NEUwRjNEMDZEMTAwNjMzRjA0IC8qIFdvcmtlckNvbnRleHRQcm94eS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMkUzQUM4NTAwRjNEMDZGNzAwNjMzRjA0IC8qIFdvcmtlck9iamVjdFByb3h5Lmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBODgzREYyODBGM0QwNDVEMDBGMTlCRjYgLyogVmlzaWJsZVNl
bGVjdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDlENURDMkMwRjQyM0E3MzAwOEYyMEZEIC8q
IE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQk0OUQ1REMy
RTBGNDIzQTczMDA4RjIwRkQgLyogUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCBpbiBI
ZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Npbmcg
PSAwOwogCQl9OwpAQCAtMTg3NDMsNiArMTg3NTcsOCBAQAogCQkJCUJDQzA2NTg3MEYzQ0UyQTcw
MENEMkQ4NyAvKiBKU0NsaWVudFJlY3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNDMDY1ODkw
RjNDRTJBNzAwQ0QyRDg3IC8qIEpTQ2xpZW50UmVjdExpc3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQTg4M0RGMjcwRjNEMDQ1RDAwRjE5QkY2IC8qIFZpc2libGVTZWxlY3Rpb24uY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJNDlENURDMkIwRjQyM0E3MzAwOEYyMEZEIC8qIE1hdHJpeDNEVHJhbnNm
b3JtT3BlcmF0aW9uLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTQ5RDVEQzJEMEY0MjNBNzMwMDhG
MjBGRCAvKiBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9JZGVudGl0eVRyYW5z
Zm9ybU9wZXJhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
dHJhbnNmb3Jtcy9JZGVudGl0eVRyYW5zZm9ybU9wZXJhdGlvbi5oCShyZXZpc2lvbiA0MDgzOCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9JZGVudGl0eVRyYW5zZm9y
bU9wZXJhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBAIHB1YmxpYzoKICAg
ICAgICAgCiBwcml2YXRlOgogICAgIHZpcnR1YWwgYm9vbCBpc0lkZW50aXR5KCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0FmZmluZSgpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KICAgICB2aXJ0dWFsIE9wZXJhdGlvblR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpIGNv
bnN0IHsgcmV0dXJuIElERU5USVRZOyB9CiAgICAgdmlydHVhbCBib29sIGlzU2FtZVR5cGUoY29u
c3QgVHJhbnNmb3JtT3BlcmF0aW9uJiBvKSBjb25zdCB7IHJldHVybiBvLmdldE9wZXJhdGlvblR5
cGUoKSA9PSBJREVOVElUWTsgfQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Ry
YW5zZm9ybXMvTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9NYXRyaXgzRFRyYW5zZm9ybU9wZXJh
dGlvbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5z
Zm9ybXMvTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2
aXN0b0BrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAy
MDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorCisjaWYgRU5BQkxF
KDNEX1RSQU5TRk9STVMpCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUGFzc1JlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+IE1hdHJpeDNEVHJhbnNmb3Jt
T3BlcmF0aW9uOjpibGVuZChjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb24qIGZyb20sIGRvdWJsZSBw
cm9ncmVzcywgYm9vbCBibGVuZFRvSWRlbnRpdHkpCit7CisgICAgaWYgKGZyb20gJiYgIWZyb20t
PmlzU2FtZVR5cGUoKnRoaXMpKQorICAgICAgICByZXR1cm4gdGhpczsKKworICAgIC8vIENvbnZl
cnQgdGhlIFRyYW5zZm9ybU9wZXJhdGlvbnMgaW50byBtYXRyaWNlcworICAgIEludFNpemUgc2l6
ZTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBmcm9tVDsKKyAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCB0b1Q7CisgICAgaWYgKGZyb20pCisgICAgICAgIGZyb20tPmFwcGx5KGZyb21ULCBzaXpl
KTsKKworICAgIGFwcGx5KHRvVCwgc2l6ZSk7CisKKyAgICBpZiAoYmxlbmRUb0lkZW50aXR5KQor
ICAgICAgICBzdGQ6OnN3YXAoZnJvbVQsIHRvVCk7CisKKyAgICB0b1QuYmxlbmQoZnJvbVQsIHBy
b2dyZXNzKTsKKyAgICByZXR1cm4gTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh0
b1QpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoM0Rf
VFJBTlNGT1JNUykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9N
YXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9NYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL01hdHJpeDNE
VHJhbnNmb3JtT3BlcmF0aW9uLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAg
ICAgICAoQykgMjAwMCBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAg
ICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKKyAqIENvcHlyaWdo
dCAoQykgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR3JhaGFtIERlbm5pcyAoZ3JhaGFtLmRl
bm5pc0BnbWFpbC5jb20pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uX2gK
KyNkZWZpbmUgTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb25faAorCisjaW5jbHVkZSAiVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCisKKyNpZiBFTkFCTEUoM0RfVFJBTlNGT1JNUykKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbiA6IHB1YmxpYyBU
cmFuc2Zvcm1PcGVyYXRpb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPE1hdHJp
eDNEVHJhbnNmb3JtT3BlcmF0aW9uPiBjcmVhdGUoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IG1hdHJpeCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgTWF0cml4M0RUcmFu
c2Zvcm1PcGVyYXRpb24obWF0cml4KSk7CisgICAgfQorCitwcml2YXRlOiAgICAKKyAgICB2aXJ0
dWFsIGJvb2wgaXNJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmlzSWRlbnRpdHko
KTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0FmZmluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4
LmlzQWZmaW5lKCk7IH0KKworICAgIHZpcnR1YWwgT3BlcmF0aW9uVHlwZSBnZXRPcGVyYXRpb25U
eXBlKCkgY29uc3QgeyByZXR1cm4gTUFUUklYXzNEOyB9CisgICAgdmlydHVhbCBib29sIGlzU2Ft
ZVR5cGUoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9uJiBvKSBjb25zdCB7IHJldHVybiBvLmdldE9w
ZXJhdGlvblR5cGUoKSA9PSBNQVRSSVhfM0Q7IH0KKworICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRv
cj09KGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbiYgbykgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghaXNTYW1lVHlwZShvKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29u
c3QgTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24qIG0gPSBzdGF0aWNfY2FzdDxjb25zdCBNYXRy
aXgzRFRyYW5zZm9ybU9wZXJhdGlvbio+KCZvKTsKKyAgICAgICAgcmV0dXJuIG1fbWF0cml4ID09
IG0tPm1fbWF0cml4OworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBhcHBseShUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBJbnRTaXplJikgY29uc3QKKyAgICB7CisgICAg
ICAgIHRyYW5zZm9ybS5tdWx0TGVmdChUcmFuc2Zvcm1hdGlvbk1hdHJpeChtX21hdHJpeCkpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFRy
YW5zZm9ybU9wZXJhdGlvbj4gYmxlbmQoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9uKiBmcm9tLCBk
b3VibGUgcHJvZ3Jlc3MsIGJvb2wgYmxlbmRUb0lkZW50aXR5ID0gZmFsc2UpOworICAgIAorICAg
IE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBt
YXQpCisgICAgeworICAgICAgICBtX21hdHJpeCA9IG1hdDsKKyAgICB9CisKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBtX21hdHJpeDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIEVOQUJMRSgzRF9UUkFOU0ZPUk1TKQorCisjZW5kaWYgLy8gTWF0cml4M0RUcmFu
c2Zvcm1PcGVyYXRpb25faApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zv
cm1zL01hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9NYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaAkocmV2
aXNpb24gNDA4MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvTWF0
cml4VHJhbnNmb3JtT3BlcmF0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDYgKzQ0LDggQEAg
cHVibGljOgogCiBwcml2YXRlOgogICAgIHZpcnR1YWwgYm9vbCBpc0lkZW50aXR5KCkgY29uc3Qg
eyByZXR1cm4gbV9hID09IDEgJiYgbV9iID09IDAgJiYgbV9jID09IDAgJiYgbV9kID09IDEgJiYg
bV9lID09IDAgJiYgbV9mID09IDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNBZmZpbmUoKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9CisKICAgICB2aXJ0dWFsIE9wZXJhdGlvblR5cGUgZ2V0T3BlcmF0
aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIE1BVFJJWDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1Nh
bWVUeXBlKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbiYgbykgY29uc3QgeyByZXR1cm4gby5nZXRP
cGVyYXRpb25UeXBlKCkgPT0gTUFUUklYOyB9CiAKQEAgLTU5LDcgKzYxLDcgQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIGJvb2wgYXBwbHkoVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwg
Y29uc3QgSW50U2l6ZSYpIGNvbnN0CiAgICAgewogICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBtYXRyaXgobV9hLCBtX2IsIG1fYywgbV9kLCBtX2UsIG1fZik7Ci0gICAgICAgIHRyYW5zZm9y
bSA9IG1hdHJpeCAqIHRyYW5zZm9ybTsKKyAgICAgICAgdHJhbnNmb3JtLm11bHRMZWZ0KFRyYW5z
Zm9ybWF0aW9uTWF0cml4KG1hdHJpeCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQog
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUGVyc3BlY3RpdmVU
cmFuc2Zvcm1PcGVyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvdHJhbnNmb3Jtcy9QZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUGVyc3BlY3Rp
dmVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3Jn
KQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorCisjaWYgRU5BQkxFKDNEX1RSQU5T
Rk9STVMpCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
UGFzc1JlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+IFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0
aW9uOjpibGVuZChjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb24qIGZyb20sIGRvdWJsZSBwcm9ncmVz
cywgYm9vbCBibGVuZFRvSWRlbnRpdHkpCit7CisgICAgaWYgKGZyb20gJiYgIWZyb20tPmlzU2Ft
ZVR5cGUoKnRoaXMpKQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICAKKyAgICBpZiAoYmxlbmRU
b0lkZW50aXR5KQorICAgICAgICByZXR1cm4gUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246
OmNyZWF0ZShtX3AgKyAoMS4gLSBtX3ApICogcHJvZ3Jlc3MpOworICAgIAorICAgIGNvbnN0IFBl
cnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uKiBmcm9tT3AgPSBzdGF0aWNfY2FzdDxjb25zdCBQ
ZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbio+KGZyb20pOworICAgIGRvdWJsZSBmcm9tUCA9
IGZyb21PcCA/IGZyb21PcC0+bV9wIDogMDsKKyAgICBkb3VibGUgdG9QID0gbV9wOworICAgIAor
ICAgIGlmIChibGVuZFRvSWRlbnRpdHkpCisgICAgICAgIHN0ZDo6c3dhcChmcm9tUCwgdG9QKTsK
KyAgICAKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBmcm9tVDsKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCB0b1Q7CisgICAgZnJvbVQuYXBwbHlQZXJzcGVjdGl2ZSgoZmxvYXQpIGZyb21QKTsK
KyAgICB0b1QuYXBwbHlQZXJzcGVjdGl2ZSgoZmxvYXQpIHRvUCk7CisgICAgdG9ULmJsZW5kKGZy
b21ULCBwcm9ncmVzcyk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXg6OkRlY29tcG9zZWRUeXBl
IGRlY29tcDsKKyAgICB0b1QuZGVjb21wb3NlKGRlY29tcCk7CisgICAgCisgICAgcmV0dXJuIFBl
cnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoZGVjb21wLnBlcnNwZWN0aXZlWiA/
IC0xLjAgLyBkZWNvbXAucGVyc3BlY3RpdmVaIDogMC4wKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKDNEX1RSQU5TRk9STVMpCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRp
b24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMv
UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9QZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlv
bi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDAgQW50
dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDAgRGly
ayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUs
IDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEdyYWhhbSBEZW5uaXMgKGdyYWhhbS5kZW5uaXNAZ21haWwuY29tKQor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2lmbmRlZiBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbl9oCisjZGVmaW5lIFBlcnNw
ZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uX2gKKworI2luY2x1ZGUgIlRyYW5zZm9ybU9wZXJhdGlv
bi5oIgorCisjaWYgRU5BQkxFKDNEX1RSQU5TRk9STVMpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24gOiBwdWJsaWMgVHJhbnNmb3Jt
T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxQZXJzcGVjdGl2ZVRy
YW5zZm9ybU9wZXJhdGlvbj4gY3JlYXRlKGRvdWJsZSBwKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbihwKSk7CisgICAgfQor
ICAgIAorcHJpdmF0ZToKKyAgICB2aXJ0dWFsIGJvb2wgaXNJZGVudGl0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fcCA9PSAwOyB9CisgICAgdmlydHVhbCBib29sIGlzQWZmaW5lKCkgY29uc3QgeyByZXR1
cm4gbV9wID09IDA7IH0KKyAgICB2aXJ0dWFsIE9wZXJhdGlvblR5cGUgZ2V0T3BlcmF0aW9uVHlw
ZSgpIGNvbnN0IHsgcmV0dXJuIFBFUlNQRUNUSVZFOyB9CisgICAgdmlydHVhbCBib29sIGlzU2Ft
ZVR5cGUoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9uJiBvKSBjb25zdCB7IHJldHVybiBvLmdldE9w
ZXJhdGlvblR5cGUoKSA9PSBQRVJTUEVDVElWRTsgfQorCisgICAgdmlydHVhbCBib29sIG9wZXJh
dG9yPT0oY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9uJiBvKSBjb25zdAorICAgIHsKKyAgICAgICAg
aWYgKCFpc1NhbWVUeXBlKG8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBj
b25zdCBQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbiogcCA9IHN0YXRpY19jYXN0PGNvbnN0
IFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uKj4oJm8pOworICAgICAgICByZXR1cm4gbV9w
ID09IHAtPm1fcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgYXBwbHkoVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgSW50U2l6ZSYpIGNvbnN0CisgICAgeworICAgICAg
ICB0cmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgoZmxvYXQpbV9wKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFuc2Zvcm1PcGVyYXRp
b24+IGJsZW5kKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbiogZnJvbSwgZG91YmxlIHByb2dyZXNz
LCBib29sIGJsZW5kVG9JZGVudGl0eSA9IGZhbHNlKTsKKworICAgIFBlcnNwZWN0aXZlVHJhbnNm
b3JtT3BlcmF0aW9uKGRvdWJsZSBwKQorICAgICAgICA6IG1fcChwKQorICAgIHsKKyAgICB9CisK
KyAgICBkb3VibGUgbV9wOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gRU5BQkxFKDNEX1RSQU5TRk9STVMpCisKKyNlbmRpZiAvLyBQZXJzcGVjdGl2ZVRyYW5zZm9y
bU9wZXJhdGlvbl9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMv
Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcAkocmV2
aXNpb24gNDA4MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUm90
YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMTEgKzMwLDY5
IEBAIFBhc3NSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBSb3RhdGVUcmEKICAgICAgICAgcmV0
dXJuIHRoaXM7CiAgICAgCiAgICAgaWYgKGJsZW5kVG9JZGVudGl0eSkKLSAgICAgICAgcmV0dXJu
IFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1fYW5nbGUgLSBtX2FuZ2xlICogcHJv
Z3Jlc3MsIG1fdHlwZSk7CisgICAgICAgIHJldHVybiBSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246
OmNyZWF0ZShtX3gsIG1feSwgbV96LCBtX2FuZ2xlIC0gbV9hbmdsZSAqIHByb2dyZXNzLCBtX3R5
cGUpOwogICAgIAogICAgIGNvbnN0IFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbiogZnJvbU9wID0g
c3RhdGljX2Nhc3Q8Y29uc3QgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKj4oZnJvbSk7Ci0gICAg
ZG91YmxlIGZyb21BbmdsZSA9IGZyb21PcCA/IGZyb21PcC0+bV9hbmdsZSA6IDA7Ci0gICAgcmV0
dXJuIFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGZyb21BbmdsZSArIChtX2FuZ2xl
IC0gZnJvbUFuZ2xlKSAqIHByb2dyZXNzLCBtX3R5cGUpOworICAgIAorICAgIC8vIE9wdGltaXpl
IGZvciBzaW5nbGUgYXhpcyByb3RhdGlvbgorICAgIGlmICghZnJvbU9wIHx8IChmcm9tT3AtPm1f
eCA9PSAwICYmIGZyb21PcC0+bV95ID09IDAgJiYgZnJvbU9wLT5tX3ogPT0gMSkgfHwgCisgICAg
ICAgICAgICAgICAgICAgKGZyb21PcC0+bV94ID09IDAgJiYgZnJvbU9wLT5tX3kgPT0gMSAmJiBm
cm9tT3AtPm1feiA9PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAoZnJvbU9wLT5tX3ggPT0g
MSAmJiBmcm9tT3AtPm1feSA9PSAwICYmIGZyb21PcC0+bV96ID09IDApKSB7CisgICAgICAgIGRv
dWJsZSBmcm9tQW5nbGUgPSBmcm9tT3AgPyBmcm9tT3AtPm1fYW5nbGUgOiAwOworICAgICAgICBy
ZXR1cm4gUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoZnJvbU9wID8gZnJvbU9wLT5t
X3ggOiBtX3gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZnJvbU9wID8gZnJvbU9wLT5tX3kgOiBtX3ksIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wID8gZnJvbU9wLT5tX3ogOiBtX3osIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUFuZ2xlICsg
KG1fYW5nbGUgLSBmcm9tQW5nbGUpICogcHJvZ3Jlc3MsIG1fdHlwZSk7CisgICAgfQorCisgICAg
Y29uc3QgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKiB0b09wID0gdGhpczsKKyAgICAKKyAgICBp
ZiAoYmxlbmRUb0lkZW50aXR5KQorICAgICAgICBzdGQ6OnN3YXAoZnJvbU9wLCB0b09wKTsKKyAg
ICAKKyAgICAvLyBDcmVhdGUgdGhlIDIgcm90YXRpb24gbWF0cmljZXMKKyAgICBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCBmcm9tVDsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0b1Q7CisgICAgZnJv
bVQucm90YXRlM2QoKGZsb2F0KShmcm9tT3AgPyBmcm9tT3AtPm1feCA6IDApLAorICAgICAgICAg
ICAgICAgICAgIChmbG9hdCkoZnJvbU9wID8gZnJvbU9wLT5tX3kgOiAwKSwKKyAgICAgICAgICAg
ICAgICAgICAoZmxvYXQpKGZyb21PcCA/IGZyb21PcC0+bV96IDogMSksCisgICAgICAgICAgICAg
ICAgICAgKGZsb2F0KShmcm9tT3AgPyBmcm9tT3AtPm1fYW5nbGUgOiAwKSk7CisKKyAgICB0b1Qu
cm90YXRlM2QoKGZsb2F0KSh0b09wID8gdG9PcC0+bV94IDogMCksCisgICAgICAgICAgICAgICAg
IChmbG9hdCkodG9PcCA/IHRvT3AtPm1feSA6IDApLAorICAgICAgICAgICAgICAgICAoZmxvYXQp
KHRvT3AgPyB0b09wLT5tX3ogOiAxKSwKKyAgICAgICAgICAgICAgICAgKGZsb2F0KSh0b09wID8g
dG9PcC0+bV9hbmdsZSA6IDApKTsKKyAgICAKKyAgICAvLyBCbGVuZCB0aGVtCisgICAgdG9ULmJs
ZW5kKGZyb21ULCBwcm9ncmVzcyk7CisgICAgCisgICAgLy8gRXh0cmFjdCB0aGUgcmVzdWx0IGFz
IGEgcXVhdGVybmlvbgorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpEZWNvbXBvc2VkVHlwZSBk
ZWNvbXA7CisgICAgdG9ULmRlY29tcG9zZShkZWNvbXApOworICAgIAorICAgIC8vIENvbnZlcnQg
dGhhdCB0byBBeGlzL0FuZ2xlIGZvcm0KKyAgICBmbG9hdCB4ID0gKGZsb2F0KSAtZGVjb21wLnF1
YXRlcm5pb25YOworICAgIGZsb2F0IHkgPSAoZmxvYXQpIC1kZWNvbXAucXVhdGVybmlvblk7Cisg
ICAgZmxvYXQgeiA9IChmbG9hdCkgLWRlY29tcC5xdWF0ZXJuaW9uWjsKKyAgICBmbG9hdCBsZW5n
dGggPSBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOworICAgIGZsb2F0IGFuZ2xlID0gMC4w
ZjsKKyAgICAKKyAgICBpZiAobGVuZ3RoID4gMC4wMDAwMWYpIHsKKyAgICAgICAgeCAvPSBsZW5n
dGg7CisgICAgICAgIHkgLz0gbGVuZ3RoOworICAgICAgICB6IC89IGxlbmd0aDsKKyAgICAgICAg
YW5nbGUgPSAoZmxvYXQpKGFjb3MoZGVjb21wLnF1YXRlcm5pb25XKSAqIDIuMCAqIDM2MC4wIC8g
TV9QSSAvIDIuMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB4ID0gMC4wZjsKKyAgICAg
ICAgeSA9IDAuMGY7CisgICAgICAgIHogPSAxLjBmOworICAgIH0KKyNpZiBFTkFCTEUoM0RfVFJB
TlNGT1JNUykKKyAgICByZXR1cm4gUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoeCwg
eSwgeiwgYW5nbGUsIFJPVEFURV8zRCk7CisjZWxzZQorICAgIHJldHVybiBSb3RhdGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCB6LCBhbmdsZSwgUk9UQVRFX1opOworI2VuZGlmCiB9
CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvdHJhbnNmb3Jtcy9Sb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvUm90YXRlVHJhbnNmb3JtT3BlcmF0
aW9uLmgJKHJldmlzaW9uIDQwODM4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFu
c2Zvcm1zL1JvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMywx
MCArMzMsMjAgQEAgY2xhc3MgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uIDogcHVibGljIAogcHVi
bGljOgogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbj4gY3Jl
YXRlKGRvdWJsZSBhbmdsZSwgT3BlcmF0aW9uVHlwZSB0eXBlKQogICAgIHsKLSAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24oYW5nbGUsIHR5cGUpKTsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24oMCwg
MCwgMSwgYW5nbGUsIHR5cGUpKTsKICAgICB9CiAKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSb3Rh
dGVUcmFuc2Zvcm1PcGVyYXRpb24+IGNyZWF0ZShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6
LCBkb3VibGUgYW5nbGUsIE9wZXJhdGlvblR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZihuZXcgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKHgsIHksIHosIGFuZ2xlLCB0
eXBlKSk7CisgICAgfQorCisgICAgZG91YmxlIGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gbV9hbmds
ZTsgfQorCitwcml2YXRlOgogICAgIHZpcnR1YWwgYm9vbCBpc0lkZW50aXR5KCkgY29uc3QgeyBy
ZXR1cm4gbV9hbmdsZSA9PSAwOyB9CisgICAgdmlydHVhbCBib29sIGlzQWZmaW5lKCkgY29uc3Qg
eyByZXR1cm4gbV94ID09IDAuMCAmJiBtX3kgPT0gMC4wOyB9CisKICAgICB2aXJ0dWFsIE9wZXJh
dGlvblR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQogICAg
IHZpcnR1YWwgYm9vbCBpc1NhbWVUeXBlKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbiYgbykgY29u
c3QgeyByZXR1cm4gby5nZXRPcGVyYXRpb25UeXBlKCkgPT0gbV90eXBlOyB9CiAKQEAgLTQ1LDI2
ICs1NSwzNSBAQCBwdWJsaWM6CiAgICAgICAgIGlmICghaXNTYW1lVHlwZShvKSkKICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgY29uc3QgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9u
KiByID0gc3RhdGljX2Nhc3Q8Y29uc3QgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKj4oJm8pOwot
ICAgICAgICByZXR1cm4gbV9hbmdsZSA9PSByLT5tX2FuZ2xlOworICAgICAgICByZXR1cm4gbV94
ID09IHItPm1feCAmJiBtX3kgPT0gci0+bV95ICYmIG1feiA9PSByLT5tX3ogJiYgbV9hbmdsZSA9
PSByLT5tX2FuZ2xlOwogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBhcHBseShUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBJbnRTaXplJiAvKmJvcmRlckJveFNpemUqLykg
Y29uc3QKICAgICB7Ci0gICAgICAgIHRyYW5zZm9ybS5yb3RhdGUobV9hbmdsZSk7CisgICAgICAg
IHRyYW5zZm9ybS5yb3RhdGUzZCgoZmxvYXQpbV94LCAoZmxvYXQpbV95LCAoZmxvYXQpbV96LCAo
ZmxvYXQpbV9hbmdsZSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBibGVuZChjb25zdCBUcmFuc2Zvcm1P
cGVyYXRpb24qIGZyb20sIGRvdWJsZSBwcm9ncmVzcywgYm9vbCBibGVuZFRvSWRlbnRpdHkgPSBm
YWxzZSk7CiAKLSAgICBkb3VibGUgYW5nbGUoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlOyB9Ci0K
LXByaXZhdGU6Ci0gICAgUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKGRvdWJsZSBhbmdsZSwgT3Bl
cmF0aW9uVHlwZSB0eXBlKQotICAgICAgICA6IG1fYW5nbGUoYW5nbGUpCisgICAgUm90YXRlVHJh
bnNmb3JtT3BlcmF0aW9uKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHosIGRvdWJsZSBhbmds
ZSwgT3BlcmF0aW9uVHlwZSB0eXBlKQorICAgICAgICA6IG1feCh4KQorICAgICAgICAsIG1feSh5
KQorICAgICAgICAsIG1feih6KQorICAgICAgICAsIG1fYW5nbGUoYW5nbGUpCiAgICAgICAgICwg
bV90eXBlKHR5cGUpCiAgICAgeworI2lmIEVOQUJMRSgzRF9UUkFOU0ZPUk1TKQorICAgICAgICBB
U1NFUlQodHlwZSA9PSBST1RBVEVfWCB8fCB0eXBlID09IFJPVEFURV9ZIHx8IHR5cGUgPT0gUk9U
QVRFX1ogfHwgdHlwZSA9PSBST1RBVEVfM0QpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUKHR5cGUg
PT0gUk9UQVRFX1opOworICAgICAgICBBU1NFUlQoeCA9PSAwICYmIHkgPT0gMCk7CisjZW5kaWYK
ICAgICB9CiAKKyAgICBkb3VibGUgbV94OworICAgIGRvdWJsZSBtX3k7CisgICAgZG91YmxlIG1f
ejsKICAgICBkb3VibGUgbV9hbmdsZTsKICAgICBPcGVyYXRpb25UeXBlIG1fdHlwZTsKIH07Cklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvU2NhbGVUcmFuc2Zvcm1P
cGVyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJh
bnNmb3Jtcy9TY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5jcHAJKHJldmlzaW9uIDQwODM4KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1NjYWxlVHJhbnNmb3JtT3BlcmF0
aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMTIgKzMwLDE3IEBAIFBhc3NSZWZQdHI8VHJh
bnNmb3JtT3BlcmF0aW9uPiBTY2FsZVRyYW4KICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgCiAg
ICAgaWYgKGJsZW5kVG9JZGVudGl0eSkKLSAgICAgICAgcmV0dXJuIFNjYWxlVHJhbnNmb3JtT3Bl
cmF0aW9uOjpjcmVhdGUobV94ICsgKDEuIC0gbV94KSAqIHByb2dyZXNzLCBtX3kgKyAoMS4gLSBt
X3kpICogcHJvZ3Jlc3MsIG1fdHlwZSk7CisgICAgICAgIHJldHVybiBTY2FsZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKG1feCArICgxLiAtIG1feCkgKiBwcm9ncmVzcywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV95ICsgKDEuIC0gbV95KSAqIHBy
b2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X3ogKyAoMS4gLSBtX3opICogcHJvZ3Jlc3MsIG1fdHlwZSk7CiAgICAgCiAgICAgY29uc3QgU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24qIGZyb21PcCA9IHN0YXRpY19jYXN0PGNvbnN0IFNjYWxlVHJh
bnNmb3JtT3BlcmF0aW9uKj4oZnJvbSk7CiAgICAgZG91YmxlIGZyb21YID0gZnJvbU9wID8gZnJv
bU9wLT5tX3ggOiAxLjsKICAgICBkb3VibGUgZnJvbVkgPSBmcm9tT3AgPyBmcm9tT3AtPm1feSA6
IDEuOwotICAgIHJldHVybiBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGZyb21YICsg
KG1feCAtIGZyb21YKSAqIHByb2dyZXNzLCBmcm9tWSArIChtX3kgLSBmcm9tWSkgKiBwcm9ncmVz
cywgbV90eXBlKTsKKyAgICBkb3VibGUgZnJvbVogPSBmcm9tT3AgPyBmcm9tT3AtPm1feiA6IDEu
OworICAgIHJldHVybiBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGZyb21YICsgKG1f
eCAtIGZyb21YKSAqIHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZyb21ZICsgKG1feSAtIGZyb21ZKSAqIHByb2dyZXNzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21aICsgKG1feiAtIGZyb21aKSAqIHBy
b2dyZXNzLCBtX3R5cGUpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24uaAkocmV2aXNpb24gNDA4MzgpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzMsMTQgKzMzLDIyIEBAIGNsYXNzIFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9u
IDogcHVibGljIFQKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTY2FsZVRyYW5zZm9y
bU9wZXJhdGlvbj4gY3JlYXRlKGRvdWJsZSBzeCwgZG91YmxlIHN5LCBPcGVyYXRpb25UeXBlIHR5
cGUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNjYWxlVHJhbnNmb3JtT3Bl
cmF0aW9uKHN4LCBzeSwgdHlwZSkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNjYWxl
VHJhbnNmb3JtT3BlcmF0aW9uKHN4LCBzeSwgMSwgdHlwZSkpOworICAgIH0KKworICAgIHN0YXRp
YyBQYXNzUmVmUHRyPFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uPiBjcmVhdGUoZG91YmxlIHN4LCBk
b3VibGUgc3ksIGRvdWJsZSBzeiwgT3BlcmF0aW9uVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbihzeCwgc3ksIHN6LCB0
eXBlKSk7CiAgICAgfQogCiAgICAgZG91YmxlIHgoKSBjb25zdCB7IHJldHVybiBtX3g7IH0KICAg
ICBkb3VibGUgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgIGRvdWJsZSB6KCkgY29uc3Qg
eyByZXR1cm4gbV96OyB9CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sIGlzSWRlbnRpdHko
KSBjb25zdCB7IHJldHVybiBtX3ggPT0gMSAmJiAgbV95ID09IDE7IH0KKyAgICB2aXJ0dWFsIGJv
b2wgaXNJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1feCA9PSAxICYmICBtX3kgPT0gMSAmJiAg
bV96ID09IDE7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNBZmZpbmUoKSBjb25zdCB7IHJldHVybiBt
X3ogPT0gMTsgfQorCiAgICAgdmlydHVhbCBPcGVyYXRpb25UeXBlIGdldE9wZXJhdGlvblR5cGUo
KSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNTYW1lVHlwZShj
b25zdCBUcmFuc2Zvcm1PcGVyYXRpb24mIG8pIGNvbnN0IHsgcmV0dXJuIG8uZ2V0T3BlcmF0aW9u
VHlwZSgpID09IG1fdHlwZTsgfQogCkBAIC00OSwyNiArNTcsMzQgQEAgcHJpdmF0ZToKICAgICAg
ICAgaWYgKCFpc1NhbWVUeXBlKG8pKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg
ICBjb25zdCBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbiogcyA9IHN0YXRpY19jYXN0PGNvbnN0IFNj
YWxlVHJhbnNmb3JtT3BlcmF0aW9uKj4oJm8pOwotICAgICAgICByZXR1cm4gbV94ID09IHMtPm1f
eCAmJiBtX3kgPT0gcy0+bV95OworICAgICAgICByZXR1cm4gbV94ID09IHMtPm1feCAmJiBtX3kg
PT0gcy0+bV95ICYmIG1feiA9PSBzLT5tX3o7CiAgICAgfQogCiAgICAgdmlydHVhbCBib29sIGFw
cGx5KFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEludFNpemUmKSBjb25z
dAogICAgIHsKLSAgICAgICAgdHJhbnNmb3JtLnNjYWxlTm9uVW5pZm9ybShtX3gsIG1feSk7Cisg
ICAgICAgIHRyYW5zZm9ybS5zY2FsZTNkKG1feCwgbV95LCBtX3opOwogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgfQogCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlv
bj4gYmxlbmQoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9uKiBmcm9tLCBkb3VibGUgcHJvZ3Jlc3Ms
IGJvb2wgYmxlbmRUb0lkZW50aXR5ID0gZmFsc2UpOwogCi0gICAgU2NhbGVUcmFuc2Zvcm1PcGVy
YXRpb24oZG91YmxlIHN4LCBkb3VibGUgc3ksIE9wZXJhdGlvblR5cGUgdHlwZSkKKyAgICBTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbihkb3VibGUgc3gsIGRvdWJsZSBzeSwgZG91YmxlIHN6LCBPcGVy
YXRpb25UeXBlIHR5cGUpCiAgICAgICAgIDogbV94KHN4KQogICAgICAgICAsIG1feShzeSkKKyAg
ICAgICAgLCBtX3ooc3opCiAgICAgICAgICwgbV90eXBlKHR5cGUpCiAgICAgeworI2lmIEVOQUJM
RSgzRF9UUkFOU0ZPUk1TKQorICAgICAgICBBU1NFUlQodHlwZSA9PSBTQ0FMRV9YIHx8IHR5cGUg
PT0gU0NBTEVfWSB8fCB0eXBlID09IFNDQUxFX1ogfHwgdHlwZSA9PSBTQ0FMRSB8fCB0eXBlID09
IFNDQUxFXzNEKTsKKyNlbHNlCisgICAgICAgIEFTU0VSVCh0eXBlID09IFNDQUxFX1ggfHwgdHlw
ZSA9PSBTQ0FMRV9ZIHx8IHR5cGUgPT0gU0NBTEUpOworICAgICAgICBBU1NFUlQoc3ogPT0gMSk7
CisjZW5kaWYKICAgICB9CiAgICAgICAgIAogICAgIGRvdWJsZSBtX3g7CiAgICAgZG91YmxlIG1f
eTsKKyAgICBkb3VibGUgbV96OwogICAgIE9wZXJhdGlvblR5cGUgbV90eXBlOwogfTsKIApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1NrZXdUcmFuc2Zvcm1PcGVy
YXRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9y
bXMvU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oCShyZXZpc2lvbiA0MDgzOCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9Ta2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgJKHdv
cmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDcgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIHZp
cnR1YWwgYm9vbCBpc0lkZW50aXR5KCkgY29uc3QgeyByZXR1cm4gbV9hbmdsZVggPT0gMCAmJiBt
X2FuZ2xlWSA9PSAwOyB9CisgICAgdmlydHVhbCBib29sIGlzQWZmaW5lKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgT3BlcmF0aW9uVHlwZSBnZXRPcGVyYXRpb25UeXBlKCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU2FtZVR5cGUoY29u
c3QgVHJhbnNmb3JtT3BlcmF0aW9uJiBvKSBjb25zdCB7IHJldHVybiBvLmdldE9wZXJhdGlvblR5
cGUoKSA9PSBtX3R5cGU7IH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFu
c2Zvcm1zL1RyYW5zZm9ybU9wZXJhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1PcGVyYXRpb24uaAkocmV2aXNpb24gNDA4
MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtT3Bl
cmF0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDkgKzM5LDE4IEBAIHB1YmxpYzoKICAgICBl
bnVtIE9wZXJhdGlvblR5cGUgewogICAgICAgICBTQ0FMRV9YLCBTQ0FMRV9ZLCBTQ0FMRSwgCiAg
ICAgICAgIFRSQU5TTEFURV9YLCBUUkFOU0xBVEVfWSwgVFJBTlNMQVRFLCAKLSAgICAgICAgUk9U
QVRFLCAKKyAgICAgICAgUk9UQVRFLAorICAgICAgICBST1RBVEVfWiA9IFJPVEFURSwKICAgICAg
ICAgU0tFV19YLCBTS0VXX1ksIFNLRVcsIAotICAgICAgICBNQVRSSVgsIElERU5USVRZLCBOT05F
CisgICAgICAgIE1BVFJJWCwKKyNpZiBFTkFCTEUoM0RfVFJBTlNGT1JNUykKKyAgICAgICAgU0NB
TEVfWiwgU0NBTEVfM0QsCisgICAgICAgIFRSQU5TTEFURV9aLCBUUkFOU0xBVEVfM0QsCisgICAg
ICAgIFJPVEFURV9YLCBST1RBVEVfWSwgUk9UQVRFXzNELAorICAgICAgICBNQVRSSVhfM0QsCisg
ICAgICAgIFBFUlNQRUNUSVZFLAorI2VuZGlmCisgICAgICAgIElERU5USVRZLCBOT05FCiAgICAg
fTsKIAogICAgIHZpcnR1YWwgflRyYW5zZm9ybU9wZXJhdGlvbigpIHsgfQpAQCAtNTAsNiArNTks
NyBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlv
biYgbykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvKTsgfQogCiAgICAgdmlydHVhbCBib29s
IGlzSWRlbnRpdHkoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzQWZmaW5lKCkgY29u
c3QgPSAwOwogCiAgICAgdmlydHVhbCBib29sIGFwcGx5KFRyYW5zZm9ybWF0aW9uTWF0cml4Jiwg
Y29uc3QgSW50U2l6ZSYgYm9yZGVyQm94U2l6ZSkgY29uc3QgPSAwOwogCkBAIC01Nyw2ICs2Nywy
MiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIE9wZXJhdGlvblR5cGUgZ2V0T3BlcmF0aW9uVHlw
ZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTYW1lVHlwZShjb25zdCBUcmFuc2Zv
cm1PcGVyYXRpb24mKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIAorI2lmIEVOQUJMRSgz
RF9UUkFOU0ZPUk1TKQorICAgIGJvb2wgaXMzRE9wZXJhdGlvbigpIGNvbnN0CisgICAgeworICAg
ICAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IGdldE9wZXJhdGlvblR5cGUoKTsKKyAgICAgICAg
cmV0dXJuIG9wVHlwZSA9PSBTQ0FMRV9aIHx8CisgICAgICAgICAgICAgICBvcFR5cGUgPT0gU0NB
TEVfM0QgfHwKKyAgICAgICAgICAgICAgIG9wVHlwZSA9PSBUUkFOU0xBVEVfWiB8fAorICAgICAg
ICAgICAgICAgb3BUeXBlID09IFRSQU5TTEFURV8zRCB8fAorICAgICAgICAgICAgICAgb3BUeXBl
ID09IFJPVEFURV9YIHx8CisgICAgICAgICAgICAgICBvcFR5cGUgPT0gUk9UQVRFX1kgfHwKKyAg
ICAgICAgICAgICAgIG9wVHlwZSA9PSBST1RBVEVfM0QgfHwKKyAgICAgICAgICAgICAgIG9wVHlw
ZSA9PSBNQVRSSVhfM0QgfHwKKyAgICAgICAgICAgICAgIG9wVHlwZSA9PSBQRVJTUEVDVElWRTsK
KyAgICB9CisjZW5kaWYKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1PcGVyYXRpb25zLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9y
bU9wZXJhdGlvbnMuaAkocmV2aXNpb24gNDA4MzgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtT3BlcmF0aW9ucy5oCSh3b3JraW5nIGNvcHkpCkBAIC00
Nyw2ICs0NywyOCBAQCBwdWJsaWM6CiAgICAgICAgICAgICBtX29wZXJhdGlvbnNbaV0tPmFwcGx5
KHQsIHN6KTsKICAgICB9CiAgICAgCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRp
b25zIGNhbiBhbGwgYmUgcmVwcmVzZW50ZWQgYXMgYWZmaW5lIHRyYW5zZm9ybXMgKGV2ZW4gaWYK
KyAgICAvLyB0aGV5IHVzZSAzZCBvcGVyYXRpb25zKQorICAgIGJvb2wgaXNBZmZpbmUoKSBjb25z
dAorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fb3BlcmF0aW9ucy5z
aXplKCk7ICsraSkKKyAgICAgICAgICAgIGlmICghbV9vcGVyYXRpb25zW2ldLT5pc0FmZmluZSgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICAgIAorI2lmIEVOQUJMRSgzRF9UUkFOU0ZPUk1TKQorICAgIC8vIFJldHVybiB0cnVl
IGlmIGFueSBvZiB0aGUgb3BlcmF0aW9uIHR5cGVzIGFyZSAzRCBvcGVyYXRpb24gdHlwZXMgKGV2
ZW4gaWYgdGhlCisgICAgLy8gdmFsdWVzIGRlc2NyaWJlIGFmZmluZSB0cmFuc2Zvcm1zKQorICAg
IGJvb2wgaGFzM0RPcGVyYXRpb24oKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fb3BlcmF0aW9ucy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGlmICht
X29wZXJhdGlvbnNbaV0tPmlzM0RPcGVyYXRpb24oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorICAgIAogICAgIFZl
Y3RvcjxSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiA+JiBvcGVyYXRpb25zKCkgeyByZXR1cm4g
bV9vcGVyYXRpb25zOyB9CiAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxUcmFuc2Zvcm1PcGVyYXRp
b24+ID4mIG9wZXJhdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX29wZXJhdGlvbnM7IH0KIApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zbGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90
cmFuc2Zvcm1zL1RyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5jcHAJKHJldmlzaW9uIDQwODM4
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zbGF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDEyICszMCwxNSBAQCBQYXNz
UmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gVHJhbnNsYXRlCiAgICAgICAgIHJldHVybiB0aGlz
OwogICAgIAogICAgIGlmIChibGVuZFRvSWRlbnRpdHkpCi0gICAgICAgIHJldHVybiBUcmFuc2xh
dGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShMZW5ndGgobV94LnR5cGUoKSkuYmxlbmQobV94
LCBwcm9ncmVzcyksIExlbmd0aChtX3kudHlwZSgpKS5ibGVuZChtX3ksIHByb2dyZXNzKSwgbV90
eXBlKTsKKyAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KExlbmd0aChtX3gudHlwZSgpKS5ibGVuZChtX3gsIHByb2dyZXNzKSwgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgobV95LnR5cGUoKSku
YmxlbmQobV95LCBwcm9ncmVzcyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTGVuZ3RoKG1fei50eXBlKCkpLmJsZW5kKG1feiwgcHJvZ3Jlc3Mp
LCBtX3R5cGUpOwogCiAgICAgY29uc3QgVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uKiBmcm9t
T3AgPSBzdGF0aWNfY2FzdDxjb25zdCBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24qPihmcm9t
KTsKICAgICBMZW5ndGggZnJvbVggPSBmcm9tT3AgPyBmcm9tT3AtPm1feCA6IExlbmd0aChtX3gu
dHlwZSgpKTsKICAgICBMZW5ndGggZnJvbVkgPSBmcm9tT3AgPyBmcm9tT3AtPm1feSA6IExlbmd0
aChtX3kudHlwZSgpKTsKLSAgICByZXR1cm4gVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUobV94LmJsZW5kKGZyb21YLCBwcm9ncmVzcyksIG1feS5ibGVuZChmcm9tWSwgcHJvZ3Jl
c3MpLCBtX3R5cGUpOworICAgIExlbmd0aCBmcm9tWiA9IGZyb21PcCA/IGZyb21PcC0+bV96IDog
TGVuZ3RoKG1fei50eXBlKCkpOworICAgIHJldHVybiBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRp
b246OmNyZWF0ZShtX3guYmxlbmQoZnJvbVgsIHByb2dyZXNzKSwgbV95LmJsZW5kKGZyb21ZLCBw
cm9ncmVzcyksIG1fei5ibGVuZChmcm9tWiwgcHJvZ3Jlc3MpLCBtX3R5cGUpOwogfQogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5z
Zm9ybXMvVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bi5oCShyZXZpc2lvbiA0MDgzOCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNm
b3Jtcy9UcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzQs
MTQgKzM0LDIyIEBAIGNsYXNzIFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbiA6IHB1YmwKIHB1
YmxpYzoKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24+
IGNyZWF0ZShjb25zdCBMZW5ndGgmIHR4LCBjb25zdCBMZW5ndGgmIHR5LCBPcGVyYXRpb25UeXBl
IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFRyYW5zbGF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbih0eCwgdHksIHR5cGUpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24odHgsIHR5LCBMZW5ndGgoMCwgRml4ZWQpLCB0
eXBlKSk7CisgICAgfQorCisgICAgc3RhdGljIFBhc3NSZWZQdHI8VHJhbnNsYXRlVHJhbnNmb3Jt
T3BlcmF0aW9uPiBjcmVhdGUoY29uc3QgTGVuZ3RoJiB0eCwgY29uc3QgTGVuZ3RoJiB0eSwgY29u
c3QgTGVuZ3RoJiB0eiwgT3BlcmF0aW9uVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24odHgsIHR5LCB0eiwgdHlw
ZSkpOwogICAgIH0KIAogICAgIGRvdWJsZSB4KGNvbnN0IEludFNpemUmIGJvcmRlckJveFNpemUp
IGNvbnN0IHsgcmV0dXJuIG1feC5jYWxjRmxvYXRWYWx1ZShib3JkZXJCb3hTaXplLndpZHRoKCkp
OyB9CiAgICAgZG91YmxlIHkoY29uc3QgSW50U2l6ZSYgYm9yZGVyQm94U2l6ZSkgY29uc3QgeyBy
ZXR1cm4gbV95LmNhbGNGbG9hdFZhbHVlKGJvcmRlckJveFNpemUuaGVpZ2h0KCkpOyB9CisgICAg
ZG91YmxlIHooY29uc3QgSW50U2l6ZSYpIGNvbnN0IHsgcmV0dXJuIG1fei5jYWxjRmxvYXRWYWx1
ZSgxKTsgfQogCiBwcml2YXRlOgotICAgIHZpcnR1YWwgYm9vbCBpc0lkZW50aXR5KCkgY29uc3Qg
eyByZXR1cm4gbV94LmNhbGNGbG9hdFZhbHVlKDEpID09IDAgJiYgbV95LmNhbGNGbG9hdFZhbHVl
KDEpID09IDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJu
IG1feC5jYWxjRmxvYXRWYWx1ZSgxKSA9PSAwICYmIG1feS5jYWxjRmxvYXRWYWx1ZSgxKSA9PSAw
ICYmIG1fei5jYWxjRmxvYXRWYWx1ZSgxKSA9PSAwOyB9CisgICAgdmlydHVhbCBib29sIGlzQWZm
aW5lKCkgY29uc3QgeyByZXR1cm4gbV96LmNhbGNGbG9hdFZhbHVlKDEpID09IDA7IH0KKwogICAg
IHZpcnR1YWwgT3BlcmF0aW9uVHlwZSBnZXRPcGVyYXRpb25UeXBlKCkgY29uc3QgeyByZXR1cm4g
bV90eXBlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU2FtZVR5cGUoY29uc3QgVHJhbnNmb3JtT3Bl
cmF0aW9uJiBvKSBjb25zdCB7IHJldHVybiBvLmdldE9wZXJhdGlvblR5cGUoKSA9PSBtX3R5cGU7
IH0KIApAQCAtNTAsMjYgKzU4LDMzIEBAIHByaXZhdGU6CiAgICAgICAgIGlmICghaXNTYW1lVHlw
ZShvKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgY29uc3QgVHJhbnNsYXRl
VHJhbnNmb3JtT3BlcmF0aW9uKiB0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHJhbnNsYXRlVHJhbnNm
b3JtT3BlcmF0aW9uKj4oJm8pOwotICAgICAgICByZXR1cm4gbV94ID09IHQtPm1feCAmJiBtX3kg
PT0gdC0+bV95OworICAgICAgICByZXR1cm4gbV94ID09IHQtPm1feCAmJiBtX3kgPT0gdC0+bV95
ICYmIG1feiA9PSB0LT5tX3o7CiAgICAgfQogCiAgICAgdmlydHVhbCBib29sIGFwcGx5KFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEludFNpemUmIGJvcmRlckJveFNpemUp
IGNvbnN0CiAgICAgewotICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKG1feC5jYWxjRmxvYXRW
YWx1ZShib3JkZXJCb3hTaXplLndpZHRoKCkpLCBtX3kuY2FsY0Zsb2F0VmFsdWUoYm9yZGVyQm94
U2l6ZS5oZWlnaHQoKSkpOworICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlM2QoKGZsb2F0KSB4
KGJvcmRlckJveFNpemUpLCAoZmxvYXQpIHkoYm9yZGVyQm94U2l6ZSksIChmbG9hdCkgeihib3Jk
ZXJCb3hTaXplKSk7CiAgICAgICAgIHJldHVybiBtX3gudHlwZSgpID09IFBlcmNlbnQgfHwgbV95
LnR5cGUoKSA9PSBQZXJjZW50OwogICAgIH0KIAogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFu
c2Zvcm1PcGVyYXRpb24+IGJsZW5kKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbiogZnJvbSwgZG91
YmxlIHByb2dyZXNzLCBib29sIGJsZW5kVG9JZGVudGl0eSA9IGZhbHNlKTsKIAotICAgIFRyYW5z
bGF0ZVRyYW5zZm9ybU9wZXJhdGlvbihjb25zdCBMZW5ndGgmIHR4LCBjb25zdCBMZW5ndGgmIHR5
LCBPcGVyYXRpb25UeXBlIHR5cGUpCisgICAgVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uKGNv
bnN0IExlbmd0aCYgdHgsIGNvbnN0IExlbmd0aCYgdHksIGNvbnN0IExlbmd0aCYgdHosIE9wZXJh
dGlvblR5cGUgdHlwZSkKICAgICAgICAgOiBtX3godHgpCiAgICAgICAgICwgbV95KHR5KQorICAg
ICAgICAsIG1feih0eikKICAgICAgICAgLCBtX3R5cGUodHlwZSkKICAgICB7CisjaWYgRU5BQkxF
KDNEX1RSQU5TRk9STVMpCisgICAgICAgIEFTU0VSVCh0eXBlID09IFRSQU5TTEFURV9YIHx8IHR5
cGUgPT0gVFJBTlNMQVRFX1kgfHwgdHlwZSA9PSBUUkFOU0xBVEVfWiB8fCB0eXBlID09IFRSQU5T
TEFURSB8fCB0eXBlID09IFRSQU5TTEFURV8zRCk7CisjZWxzZQorICAgICAgICBBU1NFUlQodHlw
ZSA9PSBUUkFOU0xBVEVfWCB8fCB0eXBlID09IFRSQU5TTEFURV9ZIHx8IHR5cGUgPT0gVFJBTlNM
QVRFKTsKKyNlbmRpZgogICAgIH0KIAogICAgIExlbmd0aCBtX3g7CiAgICAgTGVuZ3RoIG1feTsK
KyAgICBMZW5ndGggbV96OwogICAgIE9wZXJhdGlvblR5cGUgbV90eXBlOwogfTsKIApJbmRleDog
V2ViS2l0VG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL0NoYW5nZUxv
ZwkocmV2aXNpb24gNDA4NDApCisrKyBXZWJLaXRUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wMi0xMCAgQ2hyaXMgTWFycmluICA8Y21hcnJpbkBh
cHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgKiBTY3JpcHRzL2J1aWxkLXdlYmtpdDoKKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM4ODMKKworICAgICAgICBBZGRlZCBzdXBwb3J0IC0tM2Qt
dHJhbnNmb3Jtcy4gRGVmYXVsdHMgdG8gb2ZmCisKIDIwMDktMDItMTAgIEFkYW0gUm9iZW4gIDxh
cm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBCdWcgMjM4Njk6IFBpeGVsIHRlc3RzIGNh
bid0IGJlIHJ1biBvbiBXaW5kb3dzCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdl
YmtpdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdAkocmV2
aXNpb24gNDA4MzgpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL2J1aWxkLXdlYmtpdAkod29ya2lu
ZyBjb3B5KQpAQCAtNjEsNiArNjEsNyBAQCBteSAkc2hvd0hlbHAgPSAwOwogbXkgJGNsZWFuID0g
MDsKIG15ICRidWlsZFVuaXZlcnNhbCA9IDA7CiBteSAkYnVpbGRTaXh0eUZvdXJCaXQgPSAwOwor
bXkgJHRocmVlRFRyYW5zZm9ybXNTdXBwb3J0ID0gMDsKIAogbXkgJHByb2dyYW1OYW1lID0gYmFz
ZW5hbWUoJDApOwogbXkgJHVzYWdlID0gPDxFT0Y7CkBAIC03MSw2ICs3Miw3IEBAIFVzYWdlOiAk
cHJvZ3JhbU5hbWUgW29wdGlvbnNdIFtvcHRpb25zIHQKICAgLS1jbGVhbiAgICAgICAgICAgICAg
ICAgICAgICAgQ2xlYW51cCB0aGUgYnVpbGQgZGlyZWN0b3J5CiAgIC0tdW5pdmVyc2FsICAgICAg
ICAgICAgICAgICAgIEJ1aWxkIDItd2F5IHVuaXZlcnNhbCAoUFBDIGFuZCBJbnRlbCAzMi1iaXQp
CiAgIC0tNjQtYml0ICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIDY0LWJpdCwgY29tYmluZSB3
aXRoIC0tdW5pdmVyc2FsIHRvIGJ1aWxkIDQtd2F5IHVuaXZlcnNhbAorICAtLVtuby1dM2QtdHJh
bnNmb3JtcyAgICAgICAgICBUb2dnbGUgM0QgVHJhbnNmb3JtcyBzdXBwb3J0IChkZWZhdWx0OiAk
dGhyZWVEVHJhbnNmb3Jtc1N1cHBvcnQpCiAgIC0tW25vLV1jaGFubmVsLW1lc3NhZ2luZyAgICAg
ICAgICBUb2dnbGUgTWVzc2FnZUNoYW5uZWwgYW5kIE1lc3NhZ2VQb3J0IHN1cHBvcnQgKGRlZmF1
bHQ6ICRjaGFubmVsTWVzc2FnaW5nU3VwcG9ydCkKICAgLS1bbm8tXW9mZmxpbmUtd2ViLWFwcGxp
Y2F0aW9ucyAgIFRvZ2dsZSBPZmZsaW5lIFdlYiBBcHBsaWNhdGlvbiBTdXBwb3J0IChkZWZhdWx0
IDogJG9mZmxpbmVXZWJBcHBsaWNhdGlvblN1cHBvcnQpCiAgIC0tW25vLV1kYXRhYmFzZSAgICAg
ICAgICAgICAgIFRvZ2dsZSBEYXRhYmFzZSBTdXBwb3J0IChkZWZhdWx0OiAkZGF0YWJhc2VTdXBw
b3J0KQpAQCAtOTEsNyArOTMsOSBAQCBVc2FnZTogJHByb2dyYW1OYW1lIFtvcHRpb25zXSBbb3B0
aW9ucyB0CiAgIC0tW25vLV1jb3ZlcmFnZSAgICAgICAgICAgICAgIFRvZ2dsZSBjb2RlIGNvdmVy
YWdlIHN1cHBvcnQgKGRlZmF1bHQ6ICRjb3ZlcmFnZVN1cHBvcnQpCiBFT0YKIAotR2V0T3B0aW9u
cygnY2hhbm5lbC1tZXNzYWdpbmchJyA9PiBcJGNoYW5uZWxNZXNzYWdpbmdTdXBwb3J0LAorR2V0
T3B0aW9ucygKKyAgICAgICAgICAgJzNkLXRyYW5zZm9ybXMhJyA9PiBcJHRocmVlRFRyYW5zZm9y
bXNTdXBwb3J0LAorICAgICAgICAgICAnY2hhbm5lbC1tZXNzYWdpbmchJyA9PiBcJGNoYW5uZWxN
ZXNzYWdpbmdTdXBwb3J0LAogICAgICAgICAgICAnZGF0YWJhc2UhJyA9PiBcJGRhdGFiYXNlU3Vw
cG9ydCwKICAgICAgICAgICAgJ2RvbS1zdG9yYWdlIScgPT4gXCRkb21TdG9yYWdlU3VwcG9ydCwK
ICAgICAgICAgICAgJ2ljb24tZGF0YWJhc2UhJyA9PiBcJGljb25EYXRhYmFzZVN1cHBvcnQsCkBA
IC0xMzksNiArMTQzLDcgQEAgaWYgKGlzV3goKSkgewogbXkgJHByb2R1Y3REaXIgPSBwcm9kdWN0
RGlyKCk7CiBteSBAb3ZlcnJpZGVGZWF0dXJlRGVmaW5lc09wdGlvbiA9ICgpOwogCitwdXNoIEBv
dmVycmlkZUZlYXR1cmVEZWZpbmVzT3B0aW9uLCAiRU5BQkxFXzNEX1RSQU5TRk9STVMiIGlmICR0
aHJlZURUcmFuc2Zvcm1zU3VwcG9ydDsKIHB1c2ggQG92ZXJyaWRlRmVhdHVyZURlZmluZXNPcHRp
b24sICJFTkFCTEVfQ0hBTk5FTF9NRVNTQUdJTkciIGlmICRjaGFubmVsTWVzc2FnaW5nU3VwcG9y
dDsKIHB1c2ggQG92ZXJyaWRlRmVhdHVyZURlZmluZXNPcHRpb24sICJFTkFCTEVfREFUQUJBU0Ui
IGlmICRkYXRhYmFzZVN1cHBvcnQ7CiBwdXNoIEBvdmVycmlkZUZlYXR1cmVEZWZpbmVzT3B0aW9u
LCAiRU5BQkxFX0RPTV9TVE9SQUdFIiBpZiAkZG9tU3RvcmFnZVN1cHBvcnQ7Cg==
</data>
<flag name="review"
          id="13342"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>